小程序领取微信卡券“签名错误”解决小结

在开发一个小程序,需要在小程序中领取卡券,因为官方文档写的比较粗糙,遇到一些小问题,特此记录。首选简述开发流程。

1 开通公众号的卡券功能,通过微信公众平台的卡券api创建卡券。

2 申请开放平台账号,将小程序与公众号绑定在同一个开放平台下

3 在小程序中通过wx.addCard添加领取卡券接口,重点说下接口的扩展字段参数

cardExt: ‘{“timestamp”:”‘ + dataInfo.timestamp + ‘”,”signature”:”‘ + dataInfo.signature + ‘”,”nonce_str”:”‘ + dataInfo.nonceStr + ‘”}’

如果你有自定义code,并且指定了领取人的openid,那么也要传入这个两个字段,这些字段都是从后端获取的,并这些字段都是用于签名的字段,重点说下签名,调用微信卡券需要签名,签名规则官方文档有,这里给出简单示例

public String ByteToHexString(byte[] data)
    {
        StringBuilder str = new StringBuilder();
        for (byte b : data)
        {
            String hv = Integer.toHexString(b & 0xFF);
            if( hv.length() < 2 )
                str.append("0");
            str.append(hv);
        }
        return str.toString();
    }

    public String getTheSignature(ArrayList<String> param_sign)
    {
        Collections.sort(param_sign);
        StringBuilder string_to_sign = new StringBuilder();
        for (String str : param_sign)
        {
            string_to_sign.append(str);
        }

        try
        {
            MessageDigest hasher = MessageDigest.getInstance("SHA-1");
            byte[] digest = hasher.digest(string_to_sign.toString().getBytes());
            return ByteToHexString(digest);
        } catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
            return e.getMessage();
        }
    }

这里主要一定要排序,否则会有问题,这里有个坑,就是官方给出的签名验证工具没有对参数进行排序,导致正确的签名验证不通过,误导了许多人,这里注意了。

Avatar photo

About Blackford

这是个最好的时代,这是个最坏的时代,这是个充满希望的春天,这是个令人绝望的冬天,我们前面什么都有,我们前面什么都没有。梦想,让我们一次次的走远,又一次次的回头,一个关于人生的梦想还在不断奔跑,带着喜悦和疼痛,不过一切才刚刚开始,并且直到今天也远远没有结束
This entry was posted in 移动开发. Bookmark the permalink.

发表评论

电子邮件地址不会被公开。 必填项已用*标注