小程序開放個人申請已經(jīng)有個幾天了,踩了無數(shù)的坑…折騰了半個多小時終于搞定了模板消息的推送,在這兒 share 一下咯
一砰识、名詞解釋
首先谴供,發(fā)送模板消息需要準(zhǔn)備幾樣?xùn)|西块茁,先解釋一下他們都是啥:
1. formId 或 prepay_id:
用戶必須得提交了表格或進行了支付才能推送模板消息,表格提交后能得到 formId,支付完成能得到 prepay_id数焊,而且一個 formId 或 prepay_id 只能推送一條消息永淌。
支付
當(dāng)用戶在小程序內(nèi)完成過支付行為,可允許開發(fā)者向用戶在 7 天內(nèi)推送有限條數(shù)的模板消息(1 次支付可下發(fā) 1 條佩耳,多次支付下發(fā)條數(shù)獨立仰禀,互相不影響)
提交表單
當(dāng)用戶在小程序內(nèi)發(fā)生過提交表單行為且該表單聲明為要發(fā)模板消息的,開發(fā)者需要向用戶提供服務(wù)時蚕愤,可允許開發(fā)者向用戶在7天內(nèi)推送有限條數(shù)的模板消息(1次提交表單可下發(fā)1條答恶,多次提交下發(fā)條數(shù)獨立,相互不影響)
2. openID:
“推送給誰”的用戶標(biāo)識符
3. template_id:
模板消息的模板編號萍诱,可在微信小程序的后臺申請
4. access_token:
access_token 是全局唯一接口調(diào)用憑據(jù)悬嗓,開發(fā)者調(diào)用各接口時都需使用 access_token,請妥善保存裕坊。access_token 的存儲至少要保留512個字符空間包竹。access_token 的有效期目前為2個小時,需定時刷新籍凝,重復(fù)獲取將導(dǎo)致上次獲取的 access_token 失效周瞎。
二、獲取 formID
首先饵蒂,個人小程序是無法進行支付的声诸,所以只好用提交 form 的辦法了:
<!-- submit.wxml -->
<form bindsubmit="submit" report-submit="true">
<!--這里是表單的各種 <input>-->
<button formType="submit">提交</button>
</form>
然后,在 JS 里接收 form 的 formID
// submit.js
submit: function (e) {
var formID = e.detail.formId;
// 這里用 wx.request 把數(shù)據(jù)提交給后端
}
三退盯、發(fā)送模板消息
獲取 access_token
access_token 需要用到自己小程序的 appId 和 appsecret彼乌,并調(diào)用微信的 API,PHP 腳本如下:
注:我自己是把關(guān)于小程序的方法都封裝在了一個 Utility
類里渊迁,這里就當(dāng)作單獨的函數(shù)列出了慰照。
// getAccessToken.php
function getAccessToken ($appid, $appsecret) {
$url='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
$html = file_get_contents($url);
$output = json_decode($html, true);
$access_token = $output['access_token'];
return $access_token;
}
發(fā)送模板消息
// sendNotice.php
require_once('getAccessToken.php');
// 根據(jù)你的模板對應(yīng)的關(guān)鍵字建立數(shù)組
// color 屬性是可選項目,用來改變對應(yīng)字段的顏色
$data_arr = array(
'keyword1' => array( "value" => $value, "color" => $color )
);
$post_data = array (
// 用戶的 openID琉朽,可用過 wx.getUserInfo 獲取
"touser" => $openid,
// 小程序后臺申請到的模板編號
"template_id" => $templateid,
// 點擊模板消息后跳轉(zhuǎn)到的頁面毒租,可以傳遞參數(shù)
"page" => "/pages/check/result?orderID=".$orderID,
// 第一步里獲取到的 formID
"form_id" => $formid,
// 數(shù)據(jù)
"data" => $data_arr,
// 需要強調(diào)的關(guān)鍵字,會加大居中顯示
"emphasis_keyword" => "keyword2.DATA"
);
// 發(fā)送 POST 請求的函數(shù)
// 你也可以用 cUrl 或者其他網(wǎng)絡(luò)庫箱叁,簡單的請求這個函數(shù)就夠用了
function send_post( $url, $post_data ) {
$options = array(
'http' => array(
'method' => 'POST',
// header 需要設(shè)置為 JSON
'header' => 'Content-type:application/json',
'content' => $post_data,
// 超時時間
'timeout' => 60
)
);
$context = stream_context_create( $options );
$result = file_get_contents( $url, false, $context );
return $result;
}
// 這里替換為你的 appID 和 appSecret
$url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=".getAccessToken ($appid, $appsecret);
// 將數(shù)組編碼為 JSON
$data = json_encode($post_data, true);
// 這里的返回值是一個 JSON墅垮,可通過 json_decode() 解碼成數(shù)組
$return = send_post( $url, $data);
var_dump($return);
四、返回值(直接復(fù)制疼訓(xùn)爸爸的原話咯)
返回碼 | 說明 |
---|---|
0 | 一切正常蝌蹂,推送成功 |
40037 |
template_id 不正確 |
41028 |
form_id 不正確噩斟,或者過期 |
41029 |
form_id 已被使用 |
41030 |
page 不正確 |
45009 | 接口調(diào)用超過限額(目前默認每個帳號日調(diào)用限額為100萬) |
最終推送出來的效果如下: