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

    技术2024-03-21  107

    一、准备

    需要在小程序的订阅消息中申请订阅消息的模板, 模板申请完成后(申请模板和模板排序简单,省略),后面用到的只有模板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不唯一,是在模板详情中查看 还有一个,在使用开发者工具调试时,注意调试库的基础版本哦,要不然是不会发起的。

    Processed: 0.010, SQL: 10