{"error":400,"message":"over quota"} 微信小程序模板消息推送功能实现与详解——云诺说
云诺说 - 小程序开发 - 软件定制
当前位置: 毕设小程序 > 微信小程序模板消息推送功能实现与详解

微信小程序模板消息推送功能实现与详解

2019-12-24 08:42 分类:毕设小程序 作者:云诺 阅读(4278)

版权声明:本文为博主原创文章,如果转载请给出原文链接:http://doofuu.com/article/4156224.html

微信小程序模板消息推送是微信为开发者提供的可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的使用体验。所以这个功能是微信小程序开发中必不可少的功能之一了。这不在跟客户开发小程序中也需要添加这一小程序能力。翻了翻微信小程序开发文档,发现也不复杂。今天天下小雨,不能出去浪。所以借此机会总结下自己实现模板消息推送功能的经验和自己踩过的坑。方便自己以后复习也给碰到问题的朋友一个参考。屁话不多说,先打开微信小程序文档找到模板消息的相关说明!(文档才是最重要的)。

准备工作

步骤一:获取模板 ID

获取模板ID的方式有两种,通过模板消息管理接口获取模板 ID和在微信公众平台手动配置获取模板 ID,我就是在微信公众平台手动配置获取模板 ID的,这种最简单(简单既是好,何必花里胡哨为难自己呢)。添加好适合自己需求的模板就行了。

步骤二:获取发送模板消息的必要参数formId或者prepay_id

formId和prepay_id只要获取一个就可以了,formId是通过页面的 form 组件,设置form组件的属性 report-submit 为 true 时,可以声明为需要发送模板消息,此时点击按钮提交表单可以获取 formId,例如

<form bindsubmit='submitForm' report-submit='true'>
submitForm:function(e){ 
    //获取formid    
    var fromId = e.detail.formId; 
}

获取到formId后只需要在提交这个表单的时候把formId一起带到后台然后进行使用数据库进行保存就可以了。保存formId时最好把获取时间一起加上,这样可以方便查询已经过了七天失效的formId。

prepay_id是当用户完成支付时可以获取的到,具体看wx.requestPayment(Object object)的文档说明吧。

步骤三:获取小程序AccessToken

access_token 是小程序全局唯一后台接口调用凭据,调用绝大多数后台接口时都需使用。开发者可以通过 https://api.weixin.qq.com/cgi-bin/token接口获取。这个accessToken只有2小时的时效性,每获取一次上次的的accessToken就会失效。文档在这里

步骤四:都准备好了,可以发送模板消息了

具体代码如下:

class NoticeController extends Controller {
    public function sendMaster($user){
        //小程序后台对应的模板字段要发送的内容,按循序对应
        $sendData = [
            "keyword1"=>[ "value"=>"校长您好!", "color"=>"#cccccc" ],
            "keyword2"=>[ "value"=>"你有新的监考信息", "color"=>"#cccccc" ],
            "keyword3"=>[ "value"=>"收到信息请前往小程序点击确认", "color"=>"#cccccc" ]
        ];
        $appId = "小程序appId";
        $appSecret = "小程序secret";
        $data = array(
            "grant_type"=>"client_credential",
            "appid"=>$appId,
            "secret"=>$appSecret);
        $r = $this->http_request("https://api.weixin.qq.com/cgi-bin/token",$data); //返回的是字符串,需要用json_decode转换成数组 $data = json_decode($r,true);
        $result = json_decode($r,true);
        $accessToken= $result['access_token']; //ACCESS_TOKEN
        $this->do_notice($user['form_id'],$user['openid'],$accessToken,$sendData);
    }

    public function do_notice($formId,$openid,$accessToken,$sendData){
        
        $data = [
            "touser"=>$openid,//用户的openid
            "template_id"=>"tTP0uvMe2ADAiwpglIYeezHoWoOTRtdZWUhd6GWTKJyns", //小程序后台添加的模板id
            "form_id"=>$formId."",
            "data"=>$sendData
        ];
        $data = json_encode($data);
        return $this->http_request("https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=".$accessToken, $data,"json");
    }

    // HTTP请求(支持HTTP/HTTPS,支持GET/POST)
    public function http_request($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;

    }

代码逻辑不复杂,只要按照文档的要求传入正确的参数就可以了。

最后总结:

1、小程序AccessToken有2小时实效性,所以获取到AccessToken之后保存起来,实效后再去请求更新

2、用户的form_id只能使用一次,发送过消息之后就实效了。

3、form_id也有时间限制,一般是7天,过期实效

4、template_id一定要设置成对应的正确的模板id

5、设置form_id时一定要是字符串,最好这样$formId."",(这里是我遇到的坑,不这样我发现一直返回form_id不合法的错误),最好自己注意一下。

6、发送的参数数据一定要json_encode处理

7、一定要看清官方文档的参考案例代码,参数一定不能错,不要随意发挥。这很重要!

这应该是世界上最啰嗦的博文了。如果看了这篇文章还是各种问题,那么你该好好想想了~(手动狗头)


 

祝生活愉快!

「创作不易,你的支持是本站持续更新最大的动力!」

赞(0) 打赏

谢谢你请我喝奶茶*^_^*

支付宝
微信
1

谢谢你请我喝奶茶*^_^*

支付宝
微信

上一篇:

下一篇:

共有 0 条评论 - 微信小程序模板消息推送功能实现与详解

博客简介

云诺说是一个致力于分享互联网编程技术交流、小程序开发、小程序源码分享、软件服务定制和生活记录的技术服务型学习博客网站。

微信 :LGY178888

职业 :小程序开发、软件定制

现居 :广东省-广州市-天河区

友情链接

欢迎与本博客交换友情链接,本博客对交换链接的网站没有要求。如果您是本博客的友情链接网站,在遇到网站运行问题时,可以随时联系,我们将免费提供技术类支持! 申请交换友链

站点统计

  • 文章总数:155 篇
  • 草稿数目:0 篇
  • 分类数目:14 个
  • 独立页面:165 个
  • 评论总数:0 条
  • 访问总量: 636396次
  • 最近更新:2024年07月27日