微信小程序領取卡券
標簽(空格分隔): php
開發前需要准備的工作
1 小程序和公眾號要有綁定
2 小程序和該公眾號要綁定到同一個開發平台下 [https://open.weixin.qq.com/]
3 公眾號開通微信卡券功能
4 卡券是在公眾號上生成的
5 小程序領取公眾號上的卡券
看官方文檔
公眾號平台卡券文檔[https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432]
小程序卡券文檔[https://developers.weixin.qq.com/miniprogram/dev/api/card.html]
簡單說一下創建卡券:
我使用的是[創建會議門票]
接口:http請求方式: POSTURL:https://api.weixin.qq.com/card/create?access_token=ACCESS_TOKEN
參數:
1 access_token 調用接口憑證
2 POST數據 JSON數據
POST數據格式:
1 card_type string(24) 會議門票類型。
2 base_info JSON結構 基本的卡券數據,見下表,所有卡券通用。
3 meeting_detail string(3072) 本次會議於2015年5月10號在廣州舉行,會場地點:xxxx。 會議詳情。
主要就是填充base_info信息自己看文檔就明白了
返回值:
{
"errcode":0,
"errmsg":"ok",
"card_id":"p1Pj9jr90_SQRaVqYI239Ka1erkI"
}
**記得把card_id保存**
小程序領取卡券:
前端發起請求:wx.addCard(OBJECT)
后端把需要的參數給前端
參數:
cardList: [
{
cardId: '',
cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
}, {
cardId: '',
cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
}
]
cardId : 生成卡券返回的cardId
cardExt : json字符串
code : 每一張卡券都有一個code[創建時自己生成的code,這個code有特殊符號限制,和長度限制,自己去感受下微信的坑]
openid : 用戶的openid
timestamp : 時間戳/秒
signature : 簽名
回調:
處理你領取成功的業務邏輯
示例代碼
小程序領取卡券:
# 領取卡券
public function receiveCard()
{
# 小程序appid
$appId = input('appid');
# openid
$openId = input('openid);
# 訂單id
$orderId = input('order_id');
$list = $this->getInfo($appId, $openId, $orderId);
# 返回前端json數據格式
return $list;
}
public function getInfo($appId, $openId, $orderId)
{
# 業務處理[比如:是否開啟卡券功能 | 是否綁定了公眾號 等等等.....]
if () xxxxxxxxx;
# 查詢訂單獲取保存的 cardId 和 每張卡券的唯一標識 code
$orderInfo = Db::table('')->field('code, card_id')->where()->select();
# 獲取ApiTicket 主要用於生成簽名
1 [簽名文檔] : [https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115]
2 [獲取access_token] : [https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$config['appid']."&secret=".$config['secret'];]
3 [獲取api_ticket] : [https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card]
注意:appid 和 secret 是公眾號的,通過小程序的appid查詢對應公眾號的配置。apiTicket 和 accessToken 應該緩存或者是個公共的方法,避免多個地方使用失效。
# 處理數據返回數據
foreach ($orderInfo as $key => $value) {
# 生成簽名的參數
# nonce_str 自己生成的隨機字符串31位
$params = [
'code' => $value['code'],
'api_ticket' => $apiTicket,
'timestamp' => time(),
'nonce_str' => sp_random_string(31),
'card_id' => $value['card_id'],
'openid' => $openId
];
$signature = $this->getSignature($params);
$value['openid'] = $params['openid'];
$value['timestamp'] = $params['timestamp'];
$value['signature'] = $signature;
$data[] = $value;
}
}
# 生成簽名
public function getSignature($params)
{
sort($params, SORT_STRING);
return sha1(implode($params));
}
# 回調
public function cardCallBack()
{
# $_POST 和 input('post.') 竟然接收不到數據 沒辦法只能用 $GLOBALS['HTTP_RAW_POST_DATA']
$postData = $GLOBALS['HTTP_RAW_POST_DATA'];
$postData = json_decode($postData, true);
$cardList = $postData['card_list'];
# 把數據轉數組
foreach ($cardList as $k => $v) {
$v['cardExt'] = json_decode($v['cardExt'], true);
$data[] = $v;
}
foreach ($data as $key => $value) {
# 業務處理
}
}