最近在做小程序卡卷,真是一個(gè)接一個(gè)的坑胖烛,不僅網(wǎng)上的資料不多眼姐,官方文檔更是混亂,搞了好幾天才搞定佩番,這里說說過程中遇到的坑众旗,基本上這些坑90%都出在簽名上。
卡卷簽名主要用到以下幾個(gè)參數(shù):
- api_ticket (調(diào)用卡券相關(guān)接口的臨時(shí)票據(jù))
- timestamp (時(shí)間戳趟畏,單位為:秒)
- card_id (卡卷創(chuàng)建后獲得的卡卷ID)
- code (卡券code碼贡歧,相當(dāng)于用戶領(lǐng)取的那張卡卷的卡卷號)
- openid (指定領(lǐng)取用戶的opeind)
- nonce_str (32位隨機(jī)字符串)
因?yàn)槲沂窃谖⑿殴娖脚_(tái)創(chuàng)建卡卷的,所以code和openid并不需要用到拱镐,所以實(shí)際參與簽名的是api_ticket艘款、timestamp持际、card_id沃琅、nonce_str這4個(gè),card_id在公眾平臺(tái)創(chuàng)建卡卷的時(shí)候就能看到蜘欲,timestamp和nonce_str這兩個(gè)時(shí)間戳和隨機(jī)數(shù)生成就不用說了很簡單益眉,這里重點(diǎn)說一下api_ticket 。
api_ticket的獲取比較麻煩姥份,我們首先需要獲取到access_token郭脂,然后再用access_token換取api_ticket
獲取access_token的接口地址是下面這個(gè):
這里重點(diǎn)來了,我就是在這里被坑了幾天澈歉,請求接口中需要我們添加appid和secret展鸡,而這里使用的是公眾號的appid和secret!0D选莹弊!公眾號的!公眾號的涡尘!重要的事情說三遍忍弛,記住是公眾號的appid而不是小程序的!?汲细疚!
另外還有一點(diǎn),就是獲取access_token的服務(wù)器地址還必須先加入公眾號的白名單川梅,不然會(huì)提示獲取不了的疯兼,在微信公眾平臺(tái)里面點(diǎn)【安全中心】就能看到IP白名單的選項(xiàng)然遏,在里面添加你服務(wù)器的ip地址,哦對了吧彪,ip白名單在啟用前要先啟用開發(fā)者密碼啦鸣,這個(gè)在【基本配置】那里,將開發(fā)者密碼啟用后来氧,Ip白名單才能添加地址诫给。
好了,正常下來應(yīng)該能獲取到access_token了啦扬,然后我們需要用它去換取api_ticket
獲取api_ticket的接口地址是下面這個(gè):
這里值得注意的是中狂,兩個(gè)接口在短時(shí)間內(nèi)頻繁調(diào)用可能會(huì)受限,所以api_ticket獲取到后要進(jìn)行緩存扑毡,避免重復(fù)調(diào)用接口胃榕,api_ticket的有效期為2個(gè)小時(shí)。
好了瞄摊,到這里簽名所用到的參數(shù)都齊了勋又,之后就是生成簽名,官方說明是這樣:
貼一下自己的代碼换帜,PHP端:
最后返回的3個(gè)參數(shù)將返回給小程序楔壤,作為wx.addCard()--cardList--cardExt的值,當(dāng)然惯驼,在賦值前我們還必須把這三個(gè)參數(shù)json序列化字符串蹲嚣,cardExt接收的是一個(gè)字符串而不是對象,那么到這里祟牲,卡卷的流程基本就是這樣了隙畜。
總結(jié)一下幾個(gè)要注意的地方:
- 獲取access_token時(shí),使用的appid是公眾號的而非小程序的
- 服務(wù)器ip地址需要在微信公眾平臺(tái)加入ip白名單
- api_ticket在獲取到后要進(jìn)行緩存说贝,因?yàn)轭l繁調(diào)用接口有可能會(huì)受限议惰。
- 小程序wx.addCard()中,cardExt參數(shù)是一個(gè)字符串而不是對象乡恕,所以要將簽名連同其他參數(shù)轉(zhuǎn)為字符串后再賦值言询。
- cardExt字符串里的字段參數(shù)必須和參與簽名的參數(shù)一致(card_id除外,這個(gè)是寫在wx.addCard()--cardList--cardId)
基本上就是這些了几颜,最后吐槽一下官方開發(fā)文檔真夠亂的倍试,有些地方還說得不明不白!5翱蕖O叵啊!
本文作者:kauthy
原文地址:聊一聊卡卷簽名的那些坑-教程-小程序社區(qū)-微信小程序-微信小程序開發(fā)社區(qū)-小程序開發(fā)論壇-微信小程序聯(lián)盟