一、准备
需要在小程序的订阅消息中申请订阅消息的模板,
模板申请完成后(申请模板和模板排序简单,省略),后面用到的只有模板id。
二、发起
模板id申请好了,怎么发起呢?
先看下官方发起文档
然后在对照这看下示例:
注意:发起模板消息,一次最多只可以发起三个。(这里我介绍 “支付成功通知” ,原理一样)
为了后续有部分页面的使用,把所有的模板id写在了APP.JS方便调取
APP.JS:
App({
//全局变量
globalData: {
pushReservationTmplIds: {
zhifu_success: '对应的模板id',//支付成功通知
order_confirm: '对应的模板id',
jine_tx: '对应的模板id'
}
},
发起页面:(注意!2.8.2 版本开始,用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面)
<text wx:if="{{shoppingAddAct=='order'}}" bindtap="onShoppingAdd" data-act='ok' class='anniu'>立即购买</text>
onShoppingAddCallback: function (e) {
var that = this;
var shoppingAddAct = event.currentTarget.dataset.act;
if(shoppingAddAct== "ok"){
var tmplIds = app.globalData.pushReservationTmplIds;//获取订阅模板id
if (wx.requestSubscribeMessage) {//订阅消息有版本限制,先判断下版本
wx.requestSubscribeMessage({
tmplIds: [tmplIds.zhifu_success],//绑定模板id
success(res) {//成功时
console.log(111)
},
fail(res) {//失败时
console.log(0)
},
});
} else {
wx.showToast({
title: '请更新您微信版本,来获取订阅消息功能',
icon: 'none'
});
}
//这里要重点说下,发起订阅消息的页面必须是支付的前一个页面。比如说A跳转到B,B是支付页面,那么发起要写在A页面。
wx.navigateTo({//跳转页面,这个是发起支付的页面
url: '../../shopping/shopping-order/shopping-order?id=' + goUrls
//这里微信返回后端的文件自己定义,处理数据的PHP文件名为shop-order.php
})
}
三、PHP处理数据
在处理之前呢,需要做模板消息发送前的准备,
整体的思路就是,当前的模板消息,通过官方给的链接反馈到微信,和支付接口差不多
!!创建订阅消息数组
$wxapp_template = array(
'open' => true,//ture是开启,false关闭
'template_id' => array(
'zhifu_success' => "对应的模板id", //【支付成功提醒】[支付成功](订单编号,下单时间,支付时间,订单金额,订单说明)
'order_confirm' => "对应的模板id", //【订单确认收货提醒】[订单确认收货](订单编号,商户名称,订单状态,确认收货时间)
'jine_tx' => "对应的模板id", //【提现审核通知】[账户余额提现申请结果](提现金额,提现时间、提现状态、备注)
'aaabbbccc' => "" //占位置的[没用]
)
);
!!创建发起链接函数
链接是官方链接
//curl发送post数据
function curl_post($url , $data=array()){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POST, 1);// POST数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);// 把post的变量加上
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
//发送订阅消息(一次性)
function send_template($template){
$url= "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . access_token() . "";
$res = curl_post($url,urldecode($template));
return $res;
}
access_token值获取参考微信小程序文档
!!数据处理
当支付成功后执行下面的代码
//整合模板数据
if(formip()!="127.0.0.1" && $wxapp_template["open"] && $wxapp_template["template_id"]["zhifu_success"] && $rm["WXopenid"]){
//判断当前订阅消息是否开启,支付成功通知的模板id是否为空,当前微信用户的openid是否为空。
$adminContent = "可在我的-我的订单中查看订单详情!";
$pageUrl = "pages/member/member";//这个是指定模板消息的进入页面
$template = array(
'touser'=>''.$rm["WXopenid"].'', //用户openid
'template_id'=>''.$wxapp_template["template_id"]["zhifu_success"].'', //在公众号下配置的模板id
'page'=>''.$pageUrl.'', //点击模板消息会跳转的链接
'data'=>array(
//下面的character_string1,date5,date7,amount2。不是唯一的。我会在最后截图说明
'character_string1'=>array('value'=>urlencode(''.$rsDG["danhao"].'')), //订单号
'date5'=>array('value'=>urlencode(''.$rsDG["adddate"].'')), //下单时间
'date7'=>array('value'=>urlencode(''.$formdate.'')), //支付时间
'amount2'=>array('value'=>urlencode(''.$ShopJine.'')),//订单金额
)
);
//登记日志
$logStr = "【支付成功提醒-提交数据】【".$rm["name"]."】:\r\n".json_encode($template, true);
log_result($logStr,"log_wxmp",date("Ymd")."_template.txt");
//发送模板信息
$template = json_encode($template);
$res = send_template($template);
//登记日志
$logStr = "【支付成功提醒-反馈结果】【".$rm["name"]."】:\r\n".json_encode($res, true);
log_result($logStr,"log_wxmp",date("Ymd")."_template.txt");
//更新数据,记录已发送
$formIdNum = $rsDG["formIdNum"] + 1;
$sqlEdit="update shop_order set formIdNum='{$formIdNum}' where id='{$rsDG["id"]}'";
$resultEdit = mysqli_query($conn,$sqlEdit);
}
上面说的character_string1,date5,date7,amount2不唯一,是在模板详情中查看
还有一个,在使用开发者工具调试时,注意调试库的基础版本哦,要不然是不会发起的。