前面提到了,因为Sham做的小程序是用来提交反馈给供应商,然后让供应商处理的,目的是增加反馈效率,这里如果能添加一个消息提醒就更好了,于是查找资料,进坑出坑,终于搞定了,唯一美中不足的就是,1个formid只能推送1次,而且7天有效,这个是微信设置的,没办法。
开始上代码前,先说明下,消息推送用到的formid是对应微信用户openid的,如果不存储用户的formid,直接提交表单的话,只能自己受到信息,所以需要将用户提交表单时,将formid一起存入数据库,以便供应商反馈的时候推送信息。 下面就直接上代码 。
wxml部分,需要 给form添加 report-submit=’true’ ,这样我们就可以获取到当前的formid,用于消息推送,以新建的默认程序为例
!--index.wxml--view class="container" view class="userinfo" button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo" 获取头像昵称 /button block wx:else image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"/image text class="userinfo-nickname"{{userInfo.nickName}}/text /block /view!--以下是推送的form表单(你也可以直接在现有的form中添加 report-submit='true',并添加获取openid-- view class="usermotto" form bindsubmit="FormSubmit" bindreset="formReset" report-submit='true' input type='text' value='{{openid}}' name="openid" style="display:none;"/input input type='text' value='{{userInfo.nickName}}' name="nickname" style="display:none;"/input button formType="submit" 点我提交信息推送测试/button /form /view/view然后就是JS中,在提交表单的同时,添加消息推送请求:
//index.js//获取应用实例const app = getApp()Page({ data: { userInfo: {}, hasUserInfo: false, canIUse: wx.canIUse('button.open-type.getUserInfo') }, //事件处理函数 bindViewTap: function() { wx.navigateTo({ url: '../logs/logs' }) }, onLoad: function () { if (app.globalData.userInfo) { this.setData({ userInfo: app.globalData.userInfo, hasUserInfo: true }) } else if (this.data.canIUse){ // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回 // 所以此处加入 callback 以防止这种情况 app.userInfoReadyCallback = res = { this.setData({ userInfo: res.userInfo, hasUserInfo: true }) } } else { // 在没有 open-type=getUserInfo 版本的兼容处理 wx.getUserInfo({ success: res = { app.globalData.userInfo = res.userInfo this.setData({ userInfo: res.userInfo, hasUserInfo: true }) } }) } //读取openid var that = this; wx.login({ success: function (res) { console.log(res.code) //发送请求 wx.request({ url: 'https://你的网址/getopenid.php', //接口地址 data: { code: res.code }, header: { 'content-type': 'application/json' //默认值 }, success: function (res) { console.log(res.data) that.setData({ openid: res.data.openid, }) } }) } }); }, getUserInfo: function(e) { console.log(e) app.globalData.userInfo = e.detail.userInfo this.setData({ userInfo: e.detail.userInfo, hasUserInfo: true }) },//消息推送FormSubmit: function (e) { var that = this; var formid = e.detail.formId;//开发工具里调试的时候显示的是the formId is a mock one,要到真机才能看到formid的值 var tarPage = "/pages/index/index";//点击消息跳转的界面 var openid = e.detail.value.openid; var nickname = e.detail.value.nickname; console.log(e); wx.request({ url: 'https://你的网址/message.php',//服务器地址 data: { formid: formid, nickname: nickname, openid: openid,//要获取用户的openid才能发送,如果还不会建议看上篇; }, header: { "Content-type": "application/json", }, success: function (res) { console.log(res.data); }, fail: function (err) { console.log(err); } }) },})这样,小程序端就完成了,下面就是在服务器端接送请求并返回数据(代码直接使用的是网友分享的,如有侵权,请告知我):
首先是获取当前用户的openid:
?php//声明CODE,获取小程序传过来的CODE$code = $_GET["code"];//配置appid$appid = "你的小程序APPID";//配置appscret$secret = "你的小程序SECRET";//api接口$api = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";//获取GET请求function httpGet($url){ $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res;}//发送$str = httpGet($api);echo $str;?然后就是接受小程序传来的请求,然后返回数据给小程序用于推送消息
?phptemMsg();function temMsg(){ $nickname = $_GET['nickname']; //微信名 $formid = $_GET['formid']; $fbdate = date("Y年m月d日"); $temid = '你的模板ID'; //这个是模板的ID $page = '/pages/index/index'; //这个是用户点击消息后跳转到的小程序页面 $openid = $_GET['openid']; if(!$openid||!$formid)die('failed!'); $key1 = $nickname;//发送的消息 $key2 = $fbdate; $key3 = '我们已经收到您提交的反馈,将尽快处理并答复'; $access_token = returnAssKey(); $url = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$access_token; $data = array(//这里一定要按照微信给的格式 "touser"=$openid, "template_id"=$temid, "page"=$page, "form_id"=$formid, "data"=array( "keyword1"=array( "value"=$key1, "color"="#173177" ), "keyword2"=array( "value"=$key2, "color"="#173177" ), "keyword3"=array( "value"=$key3, "color"="#173177" ) ), "emphasis_keyword"="keyword1.DATA", //需要进行加大的消息 ,如不需要,去除就行; ); $res = postCurl($url,$data,'json');//将data数组转换为json数据 if($res){ echo json_encode(array('state'=4,'msg'=$res)); }else{ echo json_encode(array('state'=5,'msg'=$res)); }}function returnAsskey(){ $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的小程序APPID&secret=你的小程序SECRET'; $ass_key = curl_get($url); $a1 = $ass_key-access_token; return $a1;}function postCurl($url,$data,$type){ if($type == 'json'){ $data = json_encode($data);//对数组进行json编码 $header= array("Content-type: application/json;charset=UTF-8","Accept: application/json","Cache-Control: no-cache", "Pragma: no-cache"); } $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,$url); curl_setopt($curl,CURLOPT_POST,1); curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false); if(!empty($data)){ curl_setopt($curl,CURLOPT_POSTFIELDS,$data); } curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl,CURLOPT_HTTPHEADER,$header); $res = curl_exec($curl); if(curl_errno($curl)){ echo 'Error+'.curl_error($curl); } curl_close($curl); return $res;}function curl_get($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); $err = curl_error($curl); curl_close($curl); return json_decode($data);//对数据进行json解码}?这样,推送功能就完成了,但是因为小程序设计工具里无法获取formid,需要真机上运行才有效,所以需要上传小程序服务器,然后使用体验版或者正式版,赶紧去试试吧。
文章最后,说明下,因为前面提到formid是与openid对对应的,而且如果是表单推送的话,formid只能使用一次,及如果在你提交表单的时候,使用过推送功能,那么,如果当管理员处理你的反馈只有,就无法再使用该formid推送消息了。
网上有方法来避免这种事情,一种是在用户提交的时候,一次提交多个formid给服务器备用,另外一种添加一个功能,让用户另外点击别的表单来提交formid。
但是因为目前小程序formid还有个限制,就是7天内有效,所以Sham在设计小程序的时候,在用户提交反馈的时候,使用发送邮件来通知管理员有人提交反馈了,然后将该formid存入反馈数据库内,如果管理员7天内给出反馈的话,那么,用户就能收到消息推送,知道管理员已经处理,当然也能同时添加邮件推送,防止7天过期。
以上就是Sham关于小程序消息推送的记录分享,作为一个“伸手党”,知道“伸手党”的需求,如果需要下载完整代码,请移步我的网站吧。
我是一个想做码农的行政文员













