V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
delavior
V2EX  ›  问与答

微信 JS SDK 中的添加卡券问题

  •  
  •   delavior · 2015-06-24 11:15:44 +08:00 · 4032 次点击
    这是一个创建于 3471 天前的主题,其中的信息可能已经有所发展或是发生改变。

    添加卡券是随便就可以加吗?还是需要什么东西?
    测试添加卡券,显示"system error"

    js代码如下:

    function addCard() {
        wx.addCard({
            cardList: [{
                cardId: '100001',
                cardExt:'{"code":"","openid":"","nonceStr":"${api_nonceStr}", "timestamp": ${timestamp}, "signature":"${signature}"}'
            }],
            success: function (res) {
                alert('已添加卡券:' + JSON.stringify(res.cardList));
            }
        });
    }
    

    生成签名的后台代码如下:

    public static String makeApiSignature(String api_ticket, String timestamp, String nonce_str) {
        String card_id = "100001";
        String[] values = {api_ticket, timestamp, card_id, nonce_str};
        Arrays.sort(values);
        String sourceStr = "";
        for (int i = 0; i < values.length; i++) {
            sourceStr += values[i];
        }
    
        LOGGER.info("source:" + sourceStr);
        String signature = "";
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.reset();
            md.update(sourceStr.getBytes("UTF-8"));
            signature = byteToHex(md.digest());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return signature.toUpperCase();
    }
    
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
    

    其中nonce_str用的是randomUUID截取前16位

    请问是啥原因啊

    13 条回复    2015-07-25 10:20:53 +08:00
    defia
        1
    defia  
       2015-06-24 11:22:22 +08:00
    我看了一下我这里生产环境下用的代码,CardExt里首先code openid压根都没写,其次压根没有nonceStr
    defia
        2
    defia  
       2015-06-24 11:23:21 +08:00
    也就是说,CardExt里只有timestamp和signature
    delavior
        3
    delavior  
    OP
       2015-06-24 11:24:44 +08:00
    @defia 但是微信js sdk里关于cardext的说明中nonceStr是必填的啊
    defia
        4
    defia  
       2015-06-24 11:39:25 +08:00
    @delavior 可能是新加的,以前没这个。。。另外我看了下api,字段名不是叫nonce_str么,你代码里缺少了下划线
    defia
        5
    defia  
       2015-06-24 11:42:38 +08:00
    @delavior 还有就是你这个CardId是正确的吧,这个指的是这类卡的id,不是发给用户的序号
    crs0910
        6
    crs0910  
       2015-06-24 11:56:59 +08:00
    @defia 请问下 signature 这个是怎么算出来的,微信的文档里面写的是把几个参数的值按照字典序排序然后加密,但是官方下面给的例子又不是按照字典序排序来的。
    crs0910
        7
    crs0910  
       2015-06-24 12:05:55 +08:00
    lz 是江大神么?
    delavior
        8
    delavior  
    OP
       2015-06-24 13:01:47 +08:00
    @defia 字段名确实写错了,不过改了还是同样的错;至于卡,我没有啊,我就是想问,要测试添加卡券需要什么前提条件。。。
    delavior
        9
    delavior  
    OP
       2015-06-24 13:02:52 +08:00
    @crs0910 你是问@defia吧,我不是大神,我也不姓江,/汗
    defia
        10
    defia  
       2015-06-24 13:34:53 +08:00   ❤️ 1
    @delavior 。。。。这。。。你先要有卡券权限。。。然后用卡券接口去创建卡券,获得卡券ID,才能用这个api发给用户。。卡券功能可能是还在内测中,具体的申请方法我就不知道了。。关于card_ext里的nonce_Str,我问了微信那边的人,确实是新加入的

    @crs0910 你仔细看看,签名有好几个,方式有2种,一种是按值的字典序,一种是按字段名的字段序(腾讯该死)
    mgcnrx11
        11
    mgcnrx11  
       2015-06-24 19:54:12 +08:00
    @defia 哈哈,又是时候喊一句,腾讯去死了
    LuckyHJH
        12
    LuckyHJH  
       2015-06-24 21:21:34 +08:00
    搞腾讯的东西真的蛋疼得要死,想当初搞微信卡券的时候,最后变成直接弃用,然后自己生成兑换码,再做了个网页来验证 - -
    daylight890307
        13
    daylight890307  
       2015-07-25 10:20:53 +08:00
    我也是遇到了这个问题 请问楼主解决了吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3034 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:17 · PVG 21:17 · LAX 05:17 · JFK 08:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.