微信小程序添加卡券跳坑

3,803 阅读3分钟

引言

应公司业务需求,用户可以在我方小程序里面领取合作方卡券到卡包。开发过程中发现,微信对于卡券的文档说明过于简单凌乱,以至于中间遇到了很多坑,这里做一个整理记录一下。

需求

这次需求主要是,合作方创建卡券,在我方小程序进行领取。这篇文章是基于卡券已经成功创建的基础上进行开发的。如何创建卡券,请参考微信文档-创建卡券

tips:卡券不是会员卡,如果需要领取激活会员卡参考其他文章微信小程序领取激活会员卡

正文

刚接到这个需求的时候,查看了一下微信文档,发现微信提供了一个添加卡券的API

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

乍一看,感觉很简单,只要传cardId和cardExt就好了。

但是cardExt是什么呢?文档只是提了一句cardExt 是卡券的扩展参数,其值是一个 JSON 字符串。

看得我一脸懵逼,于是去找了公众号的官方文档,在附录4找到了cardExt的说明。

其他字段都比较好理解,但是signature怎么获取呢?别急,文档也做了说明

# 签名说明

1.将 api_ticket、timestamp、card_id、code、openid、nonce_str的value值进行字符串的字典序排序。

2.将所有参数字符串拼接成一个字符串进行sha1加密,得到signature。

3.signature中的timestamp,nonce字段和card_ext中的timestamp,nonce_str字段必须保持一致。

好不容易知道签名怎么生成,结果又出现了api_ticket这个不知道从哪里冒出来的参数。好在文档也进行了说明

卡券 api_ticket 是用于调用卡券相关接口的临时票据,有效期为 7200 秒,通过 access_token 来获取。这里要注意与 jsapi_ticket 区分开来。由于获取卡券 api_ticket 的 api 调用次数非常有限,频繁刷新卡券 api_ticket 会导致 api 调用受限,影响自身业务,开发者必须在自己的服务全局缓存卡券 api_ticket 。

1.参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html

2.用第一步拿到的access_token 采用http GET方式请求获得卡券 api_ticket(有效期7200秒,开发者必须在自己的服务全局缓存卡券 api_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card

简单来说就是get请求这个地址获取api_ticket

https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=创建卡券公众号的ACCESSTOKEN&type=wx_card,

ok,api_ticket已经拿到了,下面就是生成签名了。这里微信提供了一个官方校验工具做调试,把参数(这里注意,timestamp的单位是秒,不是毫秒)都填进去就可以生成签名了

拿到签名之后,再把它套进cardExt对象进行序列化,然后再放入wx.addCard里面就可以了

到这里基本添加卡券所需要的参数就都能获取到了,顺利的话,应该可以在小程序顺利调用添加卡券的API,得到以下页面

常见错误

如果按照以上步骤进行依旧不能成功调用的话,别急,微信还出了一个文档总结了常见错误:卡券签名错误排查方法 大家跟着文章说到的问题慢慢排查,基本都能成功的。