微信小程序订阅消息指的是用户在你的小程序中进行了一些操作,你的小程序可以在某一个时间点向该用户发送消息,通知用户操作的结果。比如用户想要小程序在某一天通知他去买票,在小程序中授予通知权限之后,小程序在固定的时间点(该天)给用户发送一个通知,通知上写着该买票了。

这种订阅消息在各种APP上都有,比如订餐时取餐通知,购物时商品发货通知、收货通知等等。具体效果如下:

需要实现这种功能,应该满足以下几个步骤:

  1. 获取订阅消息模板ID

  2. 获取消息通知权限

  3. 获取用户openid

  4. 获取接口调用凭证并使用用户openid调用接口

  5. 设置详情点击路径让用户收到通知后可以直接进入小程序

一、获取订阅消息模板ID

首先进入微信公众平台上选择适合自己的订阅模板,如果找不到合适自己的,可以随意搜索一个没有的模板,点击完善模板库,设计自己的模板。

当然,申请自己的模板流程比较长,需要进行机器审核与人工审核,如果不过审会通知你,让你重新修改后再提交申请,知道最后满足条件后就可以使用你自己设计的模板了。

申请到模板后,唯一需要记住的就是模板id了,模板id绑定着你的这个模板,在进行权限申请和消息通知的时候需要用到:

二、获取用户openid

获取用户openid需要两步,首先在微信小程序中调用wx.login请求用户同意,用户同意之后则可获得微信服务器返回的一个code,将此code作为参数请求自己的服务器,在自己的服务器中将此code,以及appId,secret一起作为参数发送请求给微信服务器,微信服务器验证无误后会返回一个该用户的open_id。此open_id是用户在微信中的唯一标识,而且不会改变,建议作为数据保存到自己的数据库中,之后消息通知也需要用到此open_id。

具体流程如下:

微信小程序内:

index.js

login:function () {var self = this;wx.login({success(res) {if (res.code) {//发起网络请求wx.request({//URL代表服务器地址url: 'https://服务器域名/wxOpenId.php',data: {//传入参数为codecode: res.code},success(res){console.log(res.data.openid)self.setData({'openid': res.data.openid})}})} else {console.log('登录失败!' + res.errMsg)}}})},

在服务器中的/var/www/html目录下创建一个wxOpenId.php文件,内容为:

<?php$code = $_GET["code"];$appid = "你的appid";$secret = "你的secret";$api = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";//请求网络function curl_get($url, &$httpCode = 0){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);$file_contents = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);return $file_contents;}$str = curl_get($api);echo $str;
?>

appid与secret获取途径如下:

微信公众平台

appid直接可以明文复制,小程序密钥如果不记得,可以点击重置。最后放入php文件的对应位置,再在微信小程序中调用login方法,即可在控制台上的输出上看见openid内容:

三、获取消息通知权限

由于目前微信不对个人开发者开放长期订阅消息的功能,我们只能使用一次性订阅的功能,即每一次发送消息都需要获得一次用户允许的权限,当然,这种允许的次数是可以无限叠加的,但是每发送一次消息都会减少一次允许次数。直到次数减少到0,就无法再发送消息了,除非用户再去触发允许通知增加次数。

而触发通知权限的方法也很简单,在js中添加如下方法:

js

wx.requestSubscribeMessage({tmplIds: ['你的模板id'],
})

在tmplIds中填入你想要用户授予权限的订阅消息模板id。当用户触发此方法时,微信小程序界面会出现如下提示:

当用户点击允许了,该模板对该用户的通知次数就增加1.

四、调用通知接口

通过如上操作,我们拿到了订阅消息模板Id、需通知的用户openid以及通知权限,接下来就要获取最后一项,通知凭证,通知凭证不像前面几项,他是有有效期的,而且有效期比较短,因此建议在调用通知接口之前获取每一次的通知凭证,用完之后就丢弃,下一次通知时再重新获取通知凭证。

通知凭证可以直接使用服务器去访问微信服务器获取,需要提供自己的appid以及secret,微信服务器验证无误后就会返回通知凭证:

<?phpfunction curl_get($url) {$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 2);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);$file_contents = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);$res = curl_multi_getcontent($ch);curl_close($ch);return $res;}function get_access_token() {$appid = "你的appid";$secret = "你的secret";$api="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";$str = curl_get($api);return $str;}
?>

appid与secret的获取方式上面已经说过了,此处就不再赘述了。

所有的东西都拿到了,接下来就是根据订阅消息模板构造消息体并发送到对应用户的微信上了

比如我的订阅消息的消息体是:

{{amount1.DATA}}
{{amount2.DATA}}
{{amount3.DATA}}
{{thing4.DATA}}
{{thing5.DATA}}

因此根据此构造消息体并发送消息:

在服务器的/var/www/html目录下创建notify.php文件

<?phpinclude("/var/www/html/accessToken.php");$token_string = get_access_token(); //获取实时通知凭证$token_res_list = array();$token_res_list = explode("\"", $token_string);$access_token = $token_res_list[3];$user_open_id = "你的openid";$current_price = 2820;$avg_price = 2820;$low_price = 2820;$flight = "FM9203";$company = "上海航空";$template_id = "你的模板ID";$data = array();$data['touser'] = $user_open_id;$data['template_id'] = $template_id;$data['page'] = "/pages/detail/detail"; #你的详情页面路径$data['miniprogram_state'] = "developer";$data['lang'] = "zh_CN";$data_in = array();$data_value_1 = array();$data_value_1['value'] = $current_price;$data_in['amount1'] = $data_value_1;$data_value_2 = array();$data_value_2['value'] = $avg_price;$data_in['amount2'] = $data_value_2;$data_value_3 = array();$data_value_3['value'] = $low_price;$data_in['amount3'] = $data_value_3;$data_value_4 = array();$data_value_4['value'] = $flight;$data_in['thing4'] = $data_value_4;$data_value_5 = array();$data_value_5['value'] = $company;$data_in['thing5'] = $data_value_5;$data['data'] = $data_in;$data = json_encode($data);$api = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={$access_token}";function http_request($url, $data = null, $headers = array()) {$curl = curl_init();if (count($headers) >= 1) {curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);}curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 2);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);if(!empty($data)) {curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($curl);curl_close($curl);return $output;}$str = http_request($api,$data);echo 1;
?>

将需要的数据填好,在服务器端的/var/www/html目录下执行php notify.php就可以直接通知到对应用户的微信上,效果如下:

五、设置详情点击路径

在上面第四步中有一个详情页面路径设置$data['page'] = "/pages/detail/detail"; #你的详情页面路径。这是指当你的通知信息发送到用户的微信上时,通知卡片的最后一行有一个进入小程序查看,如果没有设置这个路径,用户点击通知卡片就会直接返回一个404找不到页面的结果,极大的影响了用户体验。

因此我们可以在微信小程序中创建一个detail页面文件夹,页面中展示用户接收到通知后需要查看的详细信息。

同时,发送消息通知时,路径后面还可以添加相关参数,比如将消息的id作为参数放在url后面,那么用户点击进入详情页后,微信小程序通过传递过来的消息id可以识别到用户想要看哪条消息的详细信息,从而更好的将消息展示在用户眼前。

设置如下:

$data['page'] = "/pages/detail/detail?message_id='{$message_id}'";

再在微信小程序中的detail.js文件中创建onLoad方法,在进入页面之时获取到message_id信息并向服务器发送请求,获取数据。

onLoad: function (options) {var self = this;var message_id = options.message_idwx.showLoading({title: "加载中…"})wx.request({url: '请求地址',data: {"message_id": message_id},success(res) {self.setData({message: message,})},complete() {wx.hideLoading()}})},

最终效果如下:

【微信小程序】(三)订阅消息实现相关推荐

  1. 微信小程序之订阅消息实现

    微信小程序基于微信用户群体,以轻量级无需下载的优势,取代了众多笨重的APP. 而微信小程序的订阅消息,是开发者常用的功能,适用于小程序功能推广,提高用户粘性. 这里我的权限只能使用一次订阅消息,以一次 ...

  2. 微信小程序之订阅消息之PHP。

    一.准备 需要在小程序的订阅消息中申请订阅消息的模板, 模板申请完成后(申请模板和模板排序简单,省略),后面用到的只有模板id. 二.发起 模板id申请好了,怎么发起呢? 先看下官方发起文档 然后在对 ...

  3. 微信小程序实现订阅消息功能

    * 源码已经上传到资源处,需要的话点击跳转下载 |  源码下载 小程序中的订阅内容在日常中大家都会使用到,一般在支付的时候,会收到支持成功的消息,里面有一些基础信息花费多少以及是使用在什么地方,订阅消 ...

  4. 微信小程序之订阅消息推送

    目录 1.开通订阅消息 2.请求用户授权 2.1.wx.requestSubscribeMessage(Object object) 2.2.wx.requestSubscribeDeviceMess ...

  5. 微信小程序-一次性订阅消息推送

    前置条件: 1.登录微信公众号平台 完善小程序信息,小程序类目. 2.配置自己的消息模板或者使用公共的消息模板. 3.存在正确的openid. 执行步骤: 1.获取已配置好的模板id 2.获取订阅消息 ...

  6. 微信小程序清除订阅消息授权数据

    问题描述 在做小程序订阅消息开发的过程中发现,如果是长期订阅消息的类型,一旦用户授权后,后面就不会再弹出申请改订阅消息的授权弹窗,这对于开发过程中是很不方便的 发现如果是在模拟器上调试,是可以通过清除 ...

  7. 微信小程序授权订阅消息判断用户取消或允许

    wx.requestSubscribeMessage({tmplIds: ["brWVvPuoLPI9_i1qo_37LPVLK2jDyTGLuGqLK9Ur9PA"],succe ...

  8. 微信小程序客服消息(带流程图)

    微信小程序客服消息 功能介绍 调用客服消息接口发送客服消息 填写消息推送配置 网页版客服工具与移动端小程序客服工具 使用说明(后台接入消息服务) 一.在页面使用客服消息 二.后台接入消息服务 三.接收 ...

  9. 微信小程序客服消息授权给第三方Udesk

    微信小程序客服消息授权给第三方Udesk 一.必须是微信认证过的微信小程序 登录微信小程序后台-设置-基本设置 链接:https://mp.weixin.qq.com/ 下面有一栏:微信认证(看是否认 ...

  10. 微信小程序转发动态消息的问题

    最近项目中需要用到微信小程序转发动态消息的功能,遇到了一些坑,最终测试成功了,现在分享给大家. 微信官方的动态消息参考文档在这里:https://developers.weixin.qq.com/mi ...

最新文章

  1. Android 图片(ImageView)设置透明的方法
  2. .net wap强制输出WML
  3. c#五子棋实验报告_C#五子棋完整项目
  4. 分享jQuery对象和Javascript对象之间的转换代码
  5. mysql plugin filed_MySQL启动时报Plugin 'InnoDB' registration as a STORAGE ENGINE failed.错误
  6. 编程的精髓:发现问题,解决问题
  7. 【百度飞浆】YOLO系列目标检测算法详解
  8. SAS宏保存以便快速调用的三种解决方案(转载)
  9. 深度学习之 OHEM (Online Hard Example Mining)
  10. python显示代码行数_python实现的代码行数统计代码
  11. java 线程的理解_Java多线程基础理解
  12. SQL2008--SQL语句-存储过程-触发器-事务处理-基本语法-函数
  13. 【java】随机数的阶乘
  14. Uva 12657 Boxes in a Line 双向链表
  15. 机器学习模型之集成算法
  16. python条形图y轴_python 中条形图绘制
  17. Ubuntu 下eclipse安装
  18. 硕盟SM-H2V1 HDMI转VGA高清转换器
  19. Y400双硬盘安装WIN10和Ubuntu
  20. (vector)堆积木

热门文章

  1. VST 2.4 工程创建
  2. Postgresql 归档失败
  3. unity官方资源包Standard Assets导入错误的解决方法
  4. 微软加速器:打造“超级合作”生态,360度刷新创业未来
  5. 基于自适应神经模糊推理系统的乳腺癌分类
  6. 工厂智能电表远程抄表系统项目,成功案例
  7. STC89C52RC 单片机读取DHT22温湿度传感器串口显示程序调试经验总结
  8. 微信安卓版8.0内测(附链接)
  9. 阿里云图像搜索服务--以图搜图,拍立淘功能实现
  10. 牛津大学数学与计算机科学课程,牛津大学数学与计算机科学基础硕士.pdf