当我们的小程序在支付成功,或者其它的有需要和用户进行友好提示时,我们可以使用小程序的模板消息
首先查看小程序的模板消息的接口,可以看到发送模板消息要使用 accessToken ,所以我们要先调用获取accessToken的接口
https://developers.weixin.qq.com/miniprogram/dev/api-backend/auth.getAccessToken.html
拿到accesstoken 后 ,要妥善保管, 因为有请求次数的限制,它的过期时间是 7200秒,所在,要么存入数据库,并且记录一个过期时间, 要么写入缓存,给一个过期时间刚好是 7200秒 如果过期了再重新请求 accessToken 这个不是今天的重点
发送模板消息
https://developers.weixin.qq.com/miniprogram/dev/api/notice.html
https://developers.weixin.qq.com/miniprogram/dev/api-backend/templateMessage.send.html
这里要注意的问题是,发送模板消息 必须要在之前有一个form 表单的 formid来做参数,如果是支付的情况下的交互,也可以拿支付时的prepare_id来充当formid
prepare_id 和 formId是一样的用,但是使用次数上是有点小区别的 小程序的文档如下
1. 支付
当用户在小程序内完成过支付行为,可允许开发者向用户在7天内推送有限条数的模板消息(1次支付可下发3条,多次支付下发条数独立,互相不影响)
2. 提交表单
当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在7天内推送有限条数的模板消息(1次提交表单可下发1条,多次提交下发条数独立,相互不影响)
从上面可以看到 formid只能用一次,也就是发送一个模板消息给用户
支付的 prepare_id 可以发送3次
别的不说了,上代码
public function getTestFormTemplate(){
$name = request()->param("name");
$age = request()->param("age");
$height = request()->param("height");
$color = request()->param("color");
$formId = request()->param("formId");
//以上是前端传来的参数 其中主要的就是 formId; (只有在手机上使用formid才有效,微信开发者工具中的 formid是不会获取到的)
//发送模板消息,首先要获得 access_token
$access_token = RoutineServer::get_access_token();
$mini_open_id = WechatUser::getOpenId($this->userInfo["uid"]);
//这里得到模板消息发送对象的open_id
$url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=".$access_token;
//发送模板消息请求的url
$template_id = "CUiIAcQb9qWOhmtwbnh2exkep9as4Jk";
//在微信公众平台上配置的
//这里是小程序后台配置好的 模板的 id
$data = [
"touser"=>$mini_open_id,
"template_id"=>$template_id,
"page"=>"www.baidu.com",
"form_id"=>$formId,
"data"=>[
'keyword1'=>[
"value"=>$name
],
'keyword2'=>[
"value"=>$age
],
'keyword3'=>[
"value"=>$height,
],
'keyword4'=>[
"value"=>$color,
],
'keyword5'=>[
"value"=>"haha",
],
'keyword'=>[
"value"=>"点我跳百度"
]
]
];
$data = json_encode($data);
$result = HttpService::postRequest($url,$data);
}
以上是php服务器端的代码
小程序的界面如下
小程序的wxml代码,关于form的如下
<view class="wrapper">
<view class="title">这是一个标题</view>
<form report-submit="true" bindsubmit="formSubmit" bindreset='formReset'>
//这里,这里,这里 只有report-submit= true 的时候,event.detail中才会出现 formId
<view class="list-wrapper">
<text>姓名:</text>
<view class="v-input">
<input bindinput='nameinput' name= "name" value="{{name}}" placeholder='请输入名称' />
</view>
</view>
<view class="list-wrapper">
<text>年龄:</text>
<view class="v-input">
<input bindinput="ageinput" name="age" value="{{age}}" placeholder='请输入年龄' />
</view>
</view>
<view class="list-wrapper">
<text>身高:</text>
<view class="v-input">
<input bindinput="heightinput" name="height" value="{{height}}" placeholder='请输入身高' />
</view>
</view>
<view class="list-wrapper">
<text>人种:</text>
<view class="v-input">
<input bindinput="colorinput" name="color" value="{{color}}" placeholder='请输入人种' />
</view>
</view>
<view class="list-wrapper">
<button form-type="submit">提交</button>
</view>
</form>
</view>
下面是小程序的js 代吗
formSubmit(e){
console.log(e.detail.value);
console.log(e);
let data = Object.assign({}, {"formId": e.detail.formId},e.detail.value);
//这里通过 Es6语法的 Object.assign方法把两个对象合并成一个对象
wx.request({
url: app.globalData.url + '/routine/auth_api/getTestFormTemplate?uid=' + 19,
data:data
})
},
之后在真机上测试就可以了,这只是一个测试用例,实际使用时的流程不是这个样子的,当前端把 formid传给后台时,后台会把formId存 入数据库中,当有需要的时候才去调用它