微信小程序wx.addCard領(lǐng)取卡券“簽名錯誤”的解決(云開發(fā))

小程序領(lǐng)券

這里主要貼一下 我在小程序中領(lǐng)取卡券 如何解決 “簽名錯誤” 這個問題的鹏往。在折騰過程中,我也是看了很多帖子,對照著弄也沒搞對絮姆。所以你的問題可能與我的也會不一樣,但可以做個參考秩霍,對比一下自己是哪一步?jīng)]整對篙悯。

要在小程序內(nèi)領(lǐng)取卡券,按照官方文檔铃绒,確保你這些準備工作已經(jīng)弄好了:
1鸽照、開發(fā)者須有一個有卡券權(quán)限的公眾號和認證后的小程序賬號;
2颠悬、開發(fā)者須申請一個開放平臺賬號矮燎,并將小程序和公眾號綁定在同一個開放平臺賬號下,

小程序領(lǐng)取卡券官方文檔:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/card/wx.addCard.html

官方示例代碼:

wx.addCard({
  cardList: [
    {
      cardId: '',
      cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
    }, {
      cardId: '',
      cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
    }
  ],
  success (res) {
    console.log(res.cardList) // 卡券添加結(jié)果
  }
})

小程序端與卡券打通椿疗,簡直不要太簡單哦漏峰,簡單到官方連文檔都不想寫。
你倒是稍微告訴我一下cardExt這一個個的參數(shù)是什么意思呀届榄,從哪里來的呀浅乔!

cardExt 參數(shù)說明


code : 自定義的卡券code,這個看創(chuàng)建卡券文檔就知道怎么來的铝条。但是靖苇,我沒自定義呀, 沒有就不填班缰!
openid: 這個好理解嘛贤壁,我是用了小程序的云開發(fā),所以獲取很方便埠忘。
timestamp: 時間戳
signature: 簽名

前三個參數(shù)都知道了脾拆,剩下就是簽名怎么簽了馒索。

生成簽名需要哪些參數(shù)?


當我弄完名船,再回去翻文檔绰上,抱歉我沒找到,都忘記在哪里看到的了渠驼,直接貼代碼:

簽名需要的參數(shù):

card_id: 'xxxxxx',
timestamp: Date.now() / 1000,
nonce_str: 'AlcnewLJ', // 隨機字符串
api_ticket:  'Ipk_aslwelkw...' // 通過jsapi獲得的ticket

如果你的是指定的code指定的openid就需要這兩個參數(shù)蜈块,我沒用到所以沒試過。
這里的時間戳:到秒就夠了百揭,不要到毫秒,用數(shù)字類型的

獲取api_ticket


ticket就是jsapi里面那套東西了
第一步:通過app_id和app_secret獲取到access_token
第二步:根據(jù)access_token獲取到ticket

生成簽名


微信卡券JSAPI簽名校驗工具 這里詳細說明了产镐,簽名怎么生成癣亚,自己生成的簽名可以扔進去測試下述雾。
這里一定要注意:
1唆缴、將所有參數(shù)的value值進行字典序排序面徽,不要key,也不要用&拼接
2、使用sha1加密暖释,得到signature,不需要進行大寫轉(zhuǎn)換

組裝wx.addCard的參數(shù)


先看代碼

{
     cardId: 'xlssfkljalwejrlw',
     cardExt: JSON.stringify({
          code: '',
          openid:  '',
          nonce_str: 'xxxxxx',
          timestamp: 1592808195,
          signature: 'xxxxx'
     })
}

折騰老久一直報“簽名錯誤”,為什么?
最后發(fā)現(xiàn)窄瘟,我就卡在openid這個上面,因為云開發(fā)獲取它太容易了,我就很自然的傳了過去竣况。因為沒有用到code和openid鸭蛙,所以這兩個傳空晒哄!

注意贪磺!注意=儆场!注意!!!

按照上面的方式處理了code和openid毅访,仍然報“簽名錯誤”,因為沒有傳nonce_str盘榨,隨機字符串你也得加到cardExt中喻粹。
你去看看官方示例代碼,cardExt中有這個nonce_str字段嗎=下A赘振愿!

后來突然反應過來:簽名用到了哪些參數(shù)捷犹,對應就傳哪些參數(shù)
我等渣渣看文檔都看懵了,還得揣摩參數(shù)該怎么傳冕末,真的......只能怪自己菜.


最后貼出完整代碼
我用的是云開發(fā) 就是nodejs 看關(guān)鍵地方萍歉,上面文字沒看明白的,就看看代碼里的注釋档桃,很詳細了枪孩。

云函數(shù)代碼:

// 用到的兩個庫
const crypto = require('crypto')
const urllib = require('urllib')

// Buffer轉(zhuǎn)字符用到的
const StringDecoder = require('string_decoder').StringDecoder
const decoder = new StringDecoder('utf8')

// 這里云函數(shù)的東西
const cloud = require('wx-server-sdk')
const TcbRouter = require('tcb-router')
cloud.init()

// 這里的是發(fā)券方的app_id和app_secret,也就是公眾號的
const appId = 'xxxxx'
const appSecret = 'xxxxxxx'

// access_token 和 ticket要自己緩存下藻肄,如果有后端就最好讓后端給蔑舞,我這里是演示流程
// 本地云函數(shù)測試獲取access_token時,要將本地IP設(shè)置為白名單嘹屯。位置在公眾號中:開發(fā)>基本配置>IP白名單 
const tokenUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appId + '&secret=' + appSecret
const ticketUrl = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card&access_token='

exports.main = async (event, context) => {
    const app = new TcbRouter({ event })

    app.router('card', async (ctx) => {
        // 獲取token, 這里得到的是buffer對象攻询,要轉(zhuǎn)下
        let tokenRes = await urllib.request(tokenUrl)
        let token = JSON.parse(decoder.write(tokenRes.data)).access_token
        
        // 根據(jù)token獲取ticket
        let ticketRes = await urllib.request(ticketUrl + token)
        let ticket = JSON.parse(decoder.write(ticketRes.data)).ticket

        // 用于簽名的參數(shù)
        let signParams = {
            card_id: 'pL21MxLSzQdBA3s3gcU6huSIyKcs',
            timestamp: Date.now() / 1000, //到秒就夠了
            nonce_str: generate(),
            api_ticket: ticket
        }
        // 生成簽名
        // 第一步: 進行字典排序,注意不需要key和&拼接
        // 第二步: 使用sha1加密州弟,加密結(jié)果不用轉(zhuǎn)為大寫
        let sign = sha1(valueToString(signParams)) 
        
        // 返回領(lǐng)券的參數(shù)
        // 1钧栖、注意每個字段的名字低零、大小寫,不要寫錯了拯杠。
        // 2掏婶、cardExt是個json字符串
        ctx.body = {
            cardId: signParams.card_id,
            cardExt: JSON.stringify({
                // 這兩個沒有用到,就傳空
                code: '',
                openid: '',
                // 簽名中用到了隨機字符串潭陪,所以這個也要傳過去
                nonce_str: signParams.nonce_str,
                timestamp: signParams.timestamp,
                signature: sign
            })
        }
    })

    return app.serve()
}

// 生成隨機字符串
const generate = (length = 16) => {
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    let noceStr = '', maxPos = chars.length;
    while (length--) noceStr += chars[Math.random() * maxPos | 0];
    return noceStr;
}
// 排序
const valueToString = (obj) => Object.values(obj).sort().join('')
// 加密
const sha1 = (str, encoding ='utf8') => crypto.createHash('sha1').update(str, encoding).digest('hex')

小程序端用wx.addCard調(diào)用下返回的參數(shù)雄妥,這個就不用貼了吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末依溯,一起剝皮案震驚了整個濱河市茎芭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌誓沸,老刑警劉巖梅桩,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拜隧,居然都是意外死亡宿百,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門洪添,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垦页,“玉大人,你說我怎么就攤上這事干奢∪福” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵忿峻,是天一觀的道長薄啥。 經(jīng)常有香客問我,道長逛尚,這世上最難降的妖魔是什么垄惧? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绰寞,結(jié)果婚禮上到逊,老公的妹妹穿的比我還像新娘。我一直安慰自己滤钱,他們只是感情好觉壶,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著件缸,像睡著了一般铜靶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上停团,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天旷坦,我揣著相機與錄音掏熬,去河邊找鬼。 笑死秒梅,一個胖子當著我的面吹牛旗芬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捆蜀,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疮丛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辆它?” 一聲冷哼從身側(cè)響起誊薄,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锰茉,沒想到半個月后呢蔫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡飒筑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年片吊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片协屡。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡俏脊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肤晓,到底是詐尸還是另有隱情爷贫,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布补憾,位于F島的核電站漫萄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏余蟹。R本人自食惡果不足惜卷胯,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望威酒。 院中可真熱鬧,春花似錦挺峡、人聲如沸葵孤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尤仍。三九已至,卻和暖如春狭姨,著一層夾襖步出監(jiān)牢的瞬間宰啦,已是汗流浹背苏遥。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赡模,地道東北人田炭。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像漓柑,于是被迫代替她去往敵國和親教硫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這個問題我相信很多人都碰到過辆布,我也不另外瞬矩。遇到這個問題的時候,也上網(wǎng)搜索過锋玲,可惜景用,網(wǎng)上的答案都是千篇一律,沒辦法我...
    陳楠酒肆閱讀 2,820評論 3 1
  • 先說明一下我是用mpvue來寫的小程序惭蹂,但是其實和小程序直接寫也差不多丛肢,然后后端是使用php(直接面向過程原生寫的...
    董原愷閱讀 2,320評論 0 0
  • 前言 這篇是一邊做預研一邊寫的,因為是預研剿干,所有的代碼都是在小程序中進行的蜂怎,并沒有交給后臺。 前期準備 小程序內(nèi)領(lǐng)...
    dlihasa閱讀 9,747評論 5 4
  • 昨天寫小程序的時候發(fā)現(xiàn)置尔,無論怎樣寫簽名杠步,都會簽名錯誤。網(wǎng)上各種查資料也沒研究出個所以然榜轿,最后還是一個字一個字研究官...
    Mr_dreamer閱讀 1,352評論 2 1
  • 開發(fā)前需準備 1:申請微信公眾號 和 微信小程序幽歼,這是兩個不同的東西,都需要單獨申請谬盐、不同的帳號甸私; 2:微信公眾號...
    zx一個胖子閱讀 4,056評論 5 1