最近小程序在码界里嫌弃腥风血雨,每一个码奴都感觉世界给自己又多开一个扇窗,本菜鸟也眼红不已,就尝试着写了一个小程序,今天跟大家分享一下自己在写消息模版时候遇到的坑,希望能帮助每一位路过踩坑的道友;
文章目录
- 1.写小程序消息模版第一步:配置消息推送
- 2.消息模板
- 3.发送模板消息
1.写小程序消息模版第一步:配置消息推送
1.1 登录微信公众平台,选择左侧侧边栏==>设置==>开发设置==>消息推送==> 启用
1.2 配置消息推送
url:小程序使用URL与小程序接口同;例如:https://www.1314520.com/api/checkSiginature
Token(令牌): 自己定义Token值;要与后端代码中Token同
EncodingAESKey:随机生成就好,自定义也可
消息加密方式:简易兼容模式
数据格式:JOSN与XML根据个人习惯
后端php 验证代码如下:
private function checkSignature()
{$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];$token = TOKEN;$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr, SORT_STRING);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if($tmpStr == $signature){return $_GET['echostr']}else{return false}
}
2.消息模板
2.1.申请新消息模板
消息模板只有在我的模板中才可以使用,首先我们可以根据自己需求在模板库中查找适合自己的,如果没有,就申请新的模板,选择模板时要注意,至少选择两个参数
2.2.选用已存在的模板
3.发送模板消息
模板消息不能根据自己的想法任意发送,使用一个触发性事件;有两种情况触发
1.表单提交(获取formid)
2.支付(获取prepay_id)
3.1 获取模板ID
(1)通过模版消息管理接口获取模版ID(详见模版消息管理)
(2)在微信公众平台手动配置获取模版ID(模块2.2,点击我的模板==>点击详情==>点击复制或手动复制写入代码中)
3.2 获取formId 或 prepay_id
页面的 组件,属性report-submit=true时,可以声明为需发模板消息,此时点击按钮提交表单可以获取formId,用于发送模板消息。或者当用户完成支付行为,可以获取prepay_id用于发送模板消息。
注意:
因为我们是在开发者工具中测试,所以得到的formId值为the formId is a mock one。在真机中我们可以得到一个具体的值,利用该值结合其他参数就可以发送模板消息啦,所以测试真实场景务必在真机中测试
<form bindsubmit="formSubmit" report-submit='true'><view class="section"><view class="section__title">input</view><input name="input" placeholder="please input here" /><view>{{san}}</view></view><view class="btn-area"><button formType="submit">Submit</button></view>
</form>
formSubmit: function (e) {//获取formIdconsole.log(e.detail.formId);},
3.3 调用接口下发模板消息
解释官方文档参数:
1.touser 用户在登录小程序获取,用户在小程序的唯一标示------openid
2.template_id 所需下发的模板消息ID(模块3.1获取的模板ID)
3.page 点击模板卡片后跳转的页面
4.form_id 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id(模块3.2获取)
5.data 模板内容,不填下发为空,对应模板消息参数
6.color 模板内容颜色(非必填)
7.emphasis_keyword 模板需要放大的关键词,不填则默认无放大(非必填)
以php代码为例,啥都不说。。。。放码过来:
获取小程序token
private function getToken(){$appid = '小程序appid';$secret = '小程序secret';$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";return $data = $this->curlGet($url);}
通过post请求发送消息模板
private function getHttpArray($url,$post_data) {$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //没有这个会自动输出,不用print_r();也会在后面多个1curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);$output = curl_exec($ch);curl_close($ch);$out = json_decode($output);return $out;}
通过get请求发送消息模板
private function curlGet($url) {//1.初始化Curl$curl = curl_init();//设置curl传输选项curl_setopt($curl, CURLOPT_URL, $url);//访问ip地址curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//设置为FALSE 禁止 cURL 验证对等证书curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置为1或true时,获取的信息以字符串返回$data = curl_exec($curl); //返回值curl_close($curl);$out = json_decode($data,true);return $out;}
发送模板消息
public function smallWXmessage(){
$data = <<<END
{"touser": "OPENID","template_id": "TEMPLATE_ID","page": "index","form_id": "FORMID","data": {"keyword1": {"value": "339208499"},"keyword2": {"value": "2015年01月05日 12:30"},"keyword3": {"value": "粤海喜来登酒店"} ,"keyword4": {"value": "广州市天河区天河路208号"}},"emphasis_keyword": "keyword1.DATA"
}
END;$access = json_decode($this->getToken(),true); //获取token$access_token= $access['access_token'];$url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=" . $access_token;$data = $this->getHttpArray($url,$data); //post请求urlreturn $data;}
php中
<<<END END
定义字符串要注意,
1.以<<<END
开始标记开始,以END结束标记结束,结束标记必须**顶头写
**,不能有缩进和空格,且在结束标记末尾要有分号 。
2.开始标记和开始标记相同;但是不只限于END;比如常用大写的EOT、EOD、EOF来表示
3.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。
好了,我们去请求一下试试,哇,哇,成功了,舒服。。。。。。看图
好;我们现在已经成功发送了一个小程序消息,
但是我想无线发送小程序模板消息可不可以呢?
答案:在巨大的限制下
是可以实现的
限制1: 小程序发送消息必须由表单提交事件获取formid或者支付prepay_id才能推送
限制2: formid、prepay_id的有效期都是7天,也就是说超过7天后,formid失效无法再发送。
限制3: 一个formid有效期内只能发送一条模板消息给用户,一个prepay_id有效期内只能发送三条模板消息给用户
实现方式:当用户使用小程序时,产生的formid、prepay_id我们根据用户id进行存储,如果用户活跃的情况下,我们可以实现无线发送小程序模板消息
希望能帮助每一个愿意在程序世界遨游的道友,喜欢的小伙伴可收藏,感谢您的观赏
不对的地方还希望多多批评和指出