收藏
回答

【求助】小程序打通卡券

我们小程序有自己的会员卡,现在希望将已有的会员卡添加到微信卡包中。在开发前,我们通过接口模拟测试流程,遇到了下面的问题:

  1. 我们通过调用API成功创建了card_id为“pPnu0v7ONhI3LLp98L9Pv2mvp8ic”的会员卡(bind_openid与use_custom _code均未传递,根据文档应该默认为false)

  2. 通过微信卡券的签名校验工具生成了签名,参与签名参数如下:

    api_ticket:"IpK_1T69hDhZkLQTlwsAXz9C5S2e5MsdnwpsQNrxZDxyY6MMK991lU8Tgn2FN83C5upfCutOpIR9GuegKNMa6w",

    timestamp:"1550026547",

    nonce_str:"zxcvbnmasd",

    card_id:"pPnu0v7ONhI3LLp98L9Pv2mvp8ic".

    最终签名结果为:1f83c0511ac9591754a2c433f508561ddcb86270

  3. 小程序端参数写死,如下:

    var cardExt = {};
      cardExt.nonce_str = "zxcvbnmasd";
      cardExt.timestamp = "1550026547";
      cardExt.signature ="1f83c0511ac9591754a2c433f508561ddcb86270";
      console.log(JSON.stringify(cardExt))
      wx.addCard({
        cardList: [
          {
            cardId:"pPnu0v7ONhI3LLp98L9Pv2mvp8ic",
            cardExt: JSON.stringify(cardExt)
          }
        ]
      })
  4. 但测试发现小程序端始终报“签名错误”(如图):


    麻烦各位帮忙看一下,实在是找不出原因了

回答关注问题邀请回答
收藏

1 个回答

  • 微信支付技术助手7
    微信支付技术助手7
    2019-02-13

    您好,请参考:https://mp.weixin.qq.com/s/WhYpWmfuhUBw2wseTXdt2A

    2019-02-13
    有用
    回复 6
    • 仲春来
      仲春来
      2019-02-13

      你发的这个我逐条对比了呀。我生成签名用的是api_ticket、timestamp、nonce_strcard_id这四个字段。

      意思是小程序端cardExt里我也要把api_ticketcard_id这两个传进去吗?可是这种情况我也试过同样是不行。

      能麻烦帮忙看一下,说的细一点吗,谢谢了,卡了一天了在这里

      2019-02-13
      回复
    • 微信支付技术助手7
      微信支付技术助手7
      2019-02-13回复仲春来

      您好,请根据那个排错文档仔细排错,api_ticket (调用卡券相关接口的临时票据)timestamp (时间戳,单位为:秒)card_id (卡卷创建后获得的卡卷ID)code (卡券code码,相当于用户领取的那张卡卷的卡卷号)openid (指定领取用户的opeind)nonce_str (32位随机字符串)

      因为我是在微信公众平台创建卡卷的,所以code和openid并不需要用到,所以实际参与签名的是api_ticket、timestamp、card_id、nonce_str这4个,card_id在公众平台创建卡卷的时候就能看到,timestamp和nonce_str这两个时间戳和随机数生成就不用说了很简单,这里重点说一下api_ticket 。

      api_ticket的获取比较麻烦,我们首先需要获取到access_token,然后再用access_token换取api_ticket

      另外就是获取access_token的服务器地址还必须先加入公众号的白名单,不然会提示获取不了的,在微信公众平台里面点【安全中心】就能看到IP白名单的选项,在里面添加你服务器的ip地址,哦对了,ip白名单在启用前要先启用开发者密码,这个在【基本配置】那里,将开发者密码启用后,Ip白名单才能添加地址。

      好了,正常下来应该能获取到access_token了,然后我们需要用它去换取api_ticket

      这里值得注意的是,两个接口在短时间内频繁调用可能会受限,所以api_ticket获取到后要进行缓存,避免重复调用接口,api_ticket的有效期为2个小时。 

      最后返回的3个参数将返回给小程序,作为wx.addCard()--cardList--cardExt的值,当然,在赋值前我们还必须把这三个参数json序列化字符串,cardExt接收的是一个字符串而不是对象,那么到这里,卡卷的流程基本就是这样了。

      总结一下几个要注意的地方:

      获取access_token时,使用的appid是公众号的而非小程序的服务器ip地址需要在微信公众平台加入ip白名单api_ticket在获取到后要进行缓存,因为频繁调用接口有可能会受限。小程序wx.addCard()中,cardExt参数是一个字符串而不是对象,所以要将签名连同其他参数转为字符串后再赋值。cardExt字符串里的字段参数必须和参与签名的参数一致(card_id除外,这个是写在wx.addCard()--cardList--cardId)


      2019-02-13
      1
      回复
    • 仲春来
      仲春来
      2019-02-22回复微信支付技术助手7

      过来回复一句,之前一直用接口测试工具跑的流程,后来从头把代码自己写了一遍,已经可以了。谢谢帮助!

      2019-02-22
      1
      回复
    • 四天
      四天
      2019-02-22回复仲春来

      请问一下具体是怎么解决的呢?

      2019-02-22
      回复
    • 仲春来
      仲春来
      2019-02-22回复四天

      你可以参考一下这个https://www.cnblogs.com/w53064/p/9771232.html,写的挺好的,按流程顺下来应该没问题,不过我的会员卡是调接口创建的,其他的都一样。签名用官方提供的demo就可以。

      2019-02-22
      回复
    查看更多(1)
登录 后发表内容