之前工作需求,需要开发微信小程序,现在一段时间没做都快忘记了,今天记录一下!!!
首先,小程序的定时推送消息是有限制的,如果用户主动触发小程序1次,小程序可在7天内向用户主动推送1条模版消息,如果用户通过小程序完成支付,小程序可在7天内向用户主动推送3条模版消息,对于这句话的理解就是:用户触发一次,就会向后台发送一个formid来向用户推送模板消息,但是这个formid有效期只有7天,且只能使用一次。那么如何推送消息?又有什么要求呢?
首先,讲讲要求,想要推送模板消息,就需要用户的openid、小程序的accesstoken 和 触发表单的formid
01、获取用户的openid
官方文档说可以通过用户登录向后台发送 res.code 到后台换取 openId, sessionKey, unionId,利用提供的组件wx.login({}),直接上代码:
前端代码发送code给后台,返回openid,全局app.js
wx.login({ success: res = { // 发送 res.code 到后台换取 openId, sessionKey, unionId var code = res.code; if (code) { wx.request({ url: ‘后台地址’, method: "POST", data: { code: code, }, header: { 'Content-Type': 'application/x-www-form-urlencoded' }, success(res) { that.globalData.openid = res.data.openid;//存储到全局 } }) } else { console.log('获取code失败') } } })后台PHP代码:
$code = $_POST['code'];//接收前端code$APPID = "APPID";//小程序后台管理提供的id$APPSECRET = "APPSECRET";//小程序后台管理提供的秘钥,很重要,首次生成后记好,不要随便更改,如果重新生成秘钥后,需要修改已发布的项目,否则会报错 /** * openid */ function getOpenId($APPID,$APPSECRET,$code) {//$url是小程序提供的接口 $url = "https://api.weixin.qq.com/sns/jscode2session?appid=".$APPID."&secret=".$APPSECRET."&js_code=".$code."&grant_type=authorization_code"; $res = httpRequest($url); $res = json_decode($res,true); return $res;}/** * curl获取指定网页内容 */ function httpRequest($url, $data='', $method='GET'){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_AUTOREFERER, 1); if($method=='POST') { curl_setopt($curl, CURLOPT_POST, 1); if ($data != '') { curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } } curl_setopt($curl, CURLOPT_TIMEOUT, 30); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); curl_close($curl); return json_decode($result,true); } 02、获取小程序的accesstoken
注意:目前小程序的access_token有效期期是2小时,也就是7200秒,所以需要定时刷新,重复刷新会导致上次获取的 access_token 失效,建议开发者统一获取和刷新 access_token,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;
/** * 获取accessToken */function accessToken($APPID,$APPSECRET) { $tokenFile = __DIR__."xxxx.txt";//存储access_token的文件 //缓存文件名 $data = json_decode(file_get_contents($tokenFile)); //判断时间是否过期或不存在 if ($data-expire_time time() || !$data-expire_time) { //小程序提供的获取accesstoken的接口 $access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$APPID."&secret=".$APPSECRET; $res = httpRequest($access_token); $res = json_decode($res,true); $access_token = $res['access_token']; if ($access_token) { //设置过期时间 $jsonstr['expire_time'] = time() + 7000; //设置 $access_token $jsonstr['access_token'] = $access_token; $fp = fopen($tokenFile, "w");//打开文件 fwrite($fp, json_encode($jsonstr));//写入文件 fclose($fp);//关闭文件 } } else { //未过期直接从文件中读取accesstoken $access_token = $data-access_token; } return $access_token;}$token = accessToken($APPID,$APPSECRET);03、获取表单的formid
既然是表单的id,当然就是form+button了,直接上代码
//wxml代码form bindsubmit="getformid" report-submit="{{true}}" button formType="submit" bindtap='close' data-title='hb' class='HB_des'取消/button/form//js代码 //获取用户唯一标识 formid,推送模板消息 getformid: function (e) { if (e.detail.formId != "the formId is a mock one") { var formId_str = e.detail.formId; wx.request({ url: '后台地址', method: 'POST', header: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: { formid: formId_str, openid: app.globalData.openid,//用户id,上面获取 expire: parseInt(new Date().getTime() / 1000) + 604800,//计算7天后的过期时间时间戳-秒,存储需要 }, success: function (res) { console.log('成功'); console.log(res); }, fail: function (err) { console.log('request fail ', err); }, }) } },该获取的都获取了,现在来推送模板消息
$formid= $_POST['formid'];$openid= $_POST['openid'];$token= $_POST['token'];//accesstoken不需要返回前端,在后直接使用,这里为了方便,获取请看上文/** * 发送模板消息 */ function sendTemMsg($formid,$openid,$token){//小程序提供发布模板的接口 $url='https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$token; $temid='Dwme7pfbGkfh87394p0tkOrYhKpMbeok27CFP3-BDjU';//小程序后台管理模板id,下文介绍 $page='pages/index/index';//小程序首页 //以下提供的模板样式,根据项目需求,手动添加 $data = array( "touser"=$openid, "template_id"=$temid, "page"=$page, "form_id"=$formid, "data"=array( "keyword1"=array( "value"='自定义内容', "color"="#173177" ), "keyword2"=array( "value"='好文章分享!', "color"="#173177" ), "keyword3"=array( "value"='好文章分享!'













