小程序发送通模板消息详细步骤
步骤一:获取模板id
登录https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。
步骤二:页面的form组件,属性report-submit为true时,可以声明为需发模板消息,此时点击按钮提交表单可以获取formId,用于发送模板消息。或者当用户完成支付行为,可以获取prepay_id用于发送模板消息。
用formid举例:
注意:有的时候我们可能遇到某些情况,希望一次点击获取多个formid,此时请参考此文(https://www.jianshu.com/p/84dd9cd6eaed),我们只用修改wxml和wxss就行,js获取方式不变,不用改。
1、wxml页面确认订单按钮如下来获取一个formid
<form bindsubmit="subBuy" report-submit='true'>
<button class='foot-wrapper' form-type='submit'>确定</button>
</form>
2、js获取formid并且请求get_form_id接口,把formid保存
subBuy:function(e){
wx.request({
url: app.globalData.url + '/routine/auth_api/get_form_id?uid=' + app.globalData.uid,
method: 'GET',
data: {
formId: e.detail.formId
},
})
}
3、在get_form_id接口里接收formid并组装数据存到数据库
/**
* 收集发送模板信息的formID
* @param string $formId
*/
public function get_form_id($formId = ''){
if((int)$formId == '' || $formId == 'the formId is a mock one') return JsonService::fail('no');
$data['form_id'] = $formId;
$data['uid'] = $this->userInfo['uid'];
$data['status'] = 1; //未使用状态是1
$data['stop_time'] = bcadd(time(),bcmul(6,86400,0),0);
RoutineFormId::set($data);
return JsonService::successful();
}
通过上面的get_form_id接口,数据库获得如下数据:
字段说明:
uid 就是用户id,一般就是当前操作(下单用户)的uid;
formid 相当于权限,只有拥有formid,才有资格给用户发送通知
stop_time 是失效时间,自己设定,一般是6或7天,如果当前时间大于这个时间,就不能发送通知了;
status 是状态,表示这个formid是否使用过,未使用是1,使用过是2,也就是在发送通知的时候使用,使用后就要把1改为2。
步骤三:调用接口下发模板消息
拿订单支付成功的消息来说,我们的模板消息如下:
单号{{keyword1.DATA}}
下单时间 {{keyword2.DATA}}
订单状态{{keyword3.DATA}}
支付金额 {{keyword4.DATA}}
支付方式{{keyword5.DATA}}
1、在用户支付成功的接口里我们调用如下的接口,把模板消息里需要的这5个数据都通过订单id获取到,赋值给data。然后再请求RoutineTemplateService::sendTemplate()。
/**
* 订单支付成功发送模板消息
* @param string $orderId 订单id
*/
public static function sendOrderSuccess($orderId = ''){
if($orderId == '') return ;
$order = StoreOrder::where('order_id',$orderId)->find();
$formId = RoutineFormId::getFormIdOne($order['uid']);//该方法获取数据库已存的未使用的formid
$data['keyword1']['value'] = $orderId;
$data['keyword2']['value'] = date('Y-m-d H:i:s',time());
$data['keyword3']['value'] = '已支付';
$data['keyword4']['value'] = $order['pay_price'];
$data['keyword5']['value'] = '线下支付';
RoutineFormId::delFormIdOne($formId);//该方法更新该formid的status为2,就是已使用
RoutineTemplateService::sendTemplate('这里是openid','这里是你选择的模板id','',$data,$formId);
}
2、在RoutineTemplateService::sendTemplate()里获取参数,获取access_token。然后用RoutineServer::curlPost发起请求。
/**
* 发送模板消息
* @$openId 接收者(用户)的 openid
* @$templateId 所需下发的模板消息的id
* @$link 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
* @$formId 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
* @param array $dataKey 模板内容,不填则下发空模板
* @$emphasisKeyword 模板需要放大的关键词,不填则默认不放大
*/
public static function sendTemplate($openId = '',$templateId = '',$link = '',$dataKey = array(),$formId = '',$emphasisKeyword = ''){
if($openId == '' || $templateId == '' || $formId == '') return false;
$accessToken = RoutineServer::get_access_token();
$url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=".$accessToken;
$data['touser'] = $openId;
$data['template_id'] = $templateId;
$data['page'] = $link;
$data['form_id'] = $formId;
$data['data'] = $dataKey;
$data['emphasis_keyword'] = $emphasisKeyword;
return json_decode(RoutineServer::curlPost($url,json_encode($data)),true);
}
RoutineServer::curlPost方法如下:
public static function curlPost($url = '', $postData = '', $options = array())
{
if (is_array($postData)) {
$postData = http_build_query($postData);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}