小程序发送通模板消息详细步骤
- 步骤一:获取模板id
- 步骤二:页面的form组件,属性report-submit为true时,可以声明为需发模板消息,此时点击按钮提交表单可以获取formId,用于发送模板消息。或者当用户完成支付行为,可以获取prepay_id用于发送模板消息。
- 1、wxml页面确认订单按钮如下来获取一个formid
- 2、js获取formid并且请求get_form_id接口,把formid保存
- 3、在get_form_id接口里接收formid并组装数据存到数据库
- 步骤三:调用接口下发模板消息
- 1、在**用户支付成功的接口**里我们调用如下的接口,把模板消息里需要的这5个数据都通过订单id获取到,赋值给data。然后再请求RoutineTemplateService::sendTemplate()。
- 2、在RoutineTemplateService::sendTemplate()里获取参数,[获取access_token](https://mp.csdn.net/mdeditor/86238048#)。然后用RoutineServer::curlPost发起请求。
步骤一:获取模板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 /form2、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;}













