小程序发送模板消息详细步骤

步骤一:获取模板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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43687896/article/details/86140849