微信普通商户红包接口生成签名Java实现
2017-11-21 17:24
357 查看
微信普通商户红包接口生成签名Java实现
1、
官网签名生成步骤描述地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3签名算法
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
◆ key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
举例:
假设传送的参数如下:
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接API密钥:
stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key为商户平台设置的密钥key
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5签名方式
sign=hash_hmac("sha256",stringSignTemp,key).toUpperCase()="6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6" //注:HMAC-SHA256签名方式
最终得到最终发送的数据:
<xml>
<appid>wxd930ea5d5a258f4f</appid>
<mch_id>10000100</mch_id>
<device_info>1000<device_info>
<body>test</body>
<nonce_str>ibuaiVcKdpRxkhJA</nonce_str>
<sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>
<xml>
微信提供相关接口在线签名验证工具地址:https://pay.weixin.qq.com/wiki/tools/signverify/。
入参为map时Java生成签名代码
/** * 生成红包接口签名 * * @param parametersMap 入参 * @return */ public static String redEnvelopeSign(Map<String, String> parametersMap) { List<String> emptKeys = new ArrayList<>(); parametersMap.forEach((k, v) -> { if (StringUtils.isEmpty(v)) { emptKeys.add(k); } }); //移除值为空的键值对 emptKeys.forEach(k -> { parametersMap.remove(k); }); List<Map.Entry<String, String>> infoIds = new ArrayList<>(parametersMap.entrySet()); //将集合内非空参数值的参数按照参数名ASCII码从小到大排序(字典序) Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() { public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) { return (o1.getKey()).toString().compareTo(o2.getKey()); } }); String strA = infoIds.toString(); //入参格式化为URL键值对的格式 strA = strA.substring(1, strA.length() - 1); strA = strA.replace(", ", "&"); //添加腾讯为商户平台设置的密钥key strA = strA + "&key=" + RedEnvelopeConstant.KEY; String sign=MD5Util.getMD532Str(strA).toUpperCase(); return sign; }
/** * 加密签名接口(小写) * * @param str 加密参数 * @return */ public static String getMD532Str(String str) { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("MD5"); messageDigest.reset(); messageDigest.update(str.getBytes("UTF-8")); } catch (NoSuchAlgorithmException e) { System.out.println("NoSuchAlgorithmException caught!"); System.exit(-1); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } byte[] byteArray = messageDigest.digest(); StringBuffer md5StrBuff = new StringBuffer(); for (int i = 0; i < byteArray.length; i++) { if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i])); else md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i])); } return md5StrBuff.toString(); }
相关文章推荐
- 微信红包高级接口JAVA实现
- 纯Java实现数字证书生成签名
- 普通java类(排序)实现Comparable接口重写CompareTo方法
- 【java微信开发】红包接口调用
- PHP用抛物线的模型实现微信红包生成算法的程序源码
- jetty+xfire实现的webservice接口(maven普通java工程)
- 自动生成Jni中Java调用C语言实现的签名函数名
- Java仿实现微信红包分配算法
- 普通java类(排序)实现Comparable接口重写CompareTo方法
- 微信红包签名算法 C#代码实现
- java/php/c#版rsa签名以及java验签实现openssl生成
- WSDL2Java通过WSDL文件生成java服务接口并实现
- Java实现仿微信红包分配规则
- Java微信开发之现金红包接口
- java 微信分享签名生成方法
- 微信商户发放红包接口调试经验总结
- 微信公共平台验证接口JAVA实现
- 微信红包签名算法 C#代码实现
- 微信公共平台接口开发--Java实现
- 微信公众账号开发接口实现 - java servlet