数字签名
概述
微信支付, 是基于微信客户端提供的支付服务功能。 同时向商户提供销售经营分析、 账户和资金管理的功能支持。 用户通过扫描二维码、 反扫二维码等多种方式调起微信支付模块完成支付。
原始签名字符串
无论是请求还是应答, 签名原始串按以下方式组装成字符串:
1、 除 sign 字段外, 所有参数按照字段名的 ascii 码从小到大排序后使用 QueryString 的格式(即key1=value1&key2=value2…) 拼接而成, 空值不传递, 不参与签名组串。
2、 签名原始串中, 字段名和字段值都采用原始值, 不进行 URL Encode。
例如:
调用某个接口, 接口有如下字段:
正确的签名字段排序为:
签名算法
目前暂只支持 MD5 签名
MD5 是一种摘要生成算法, 通过在签名原始串后加上商户通信密钥的内容, 进行 MD5 运算, 形成的摘要字符串即为签名结果。 为了方便比较, 签名结果统一转换为大写字符。
注意: 签名时将字符串转化成字节流时指定的编码字符集应与参数 charset 一致。
MD5 签名计算公式:
sign = Md5(原字符串&key=商户密钥). toUpperCase
原始签名字符串
参数方法
/**
* @author TangRen
* @param args
* @time 2016-7-8
*/
private static String out_trade_no;// 商户订单号
public static String getswept_parmas(String pay_code) {
//请求的xml数据,不解释
String xmlString;
//模拟订单号,时间日期+五位随机数
out_trade_no = Util.OrderNo();
//SrotedMap集合可以自动排序安装规则
SortedMap<Object, Object> map = new TreeMap<Object, Object>();
//请求参数、参与签名的参数
map.put("auth_code", pay_code);
map.put("body", "优衣库衣服");
map.put("charset", "UTF-8");
map.put("mch_create_ip", Util.localIp());
map.put("nonce_str", Util.Random(15));
map.put("mch_id", Config.mch_id);
map.put("total_fee", "1");
map.put("service", "unified.trade.micropay");
map.put("out_trade_no", out_trade_no);
//签名的工具类SignUtil
String sign = SignUtil.createSign("UTF-8", map);
map.put("sign", sign);
Logger.d("sign签名:" + sign);
//xml的工具类XMlUtil
xmlString = XMlUtil.changeMapToXml(map);
Logger.d(xmlString);
return xmlString;
}
签名工具类:SignUtil.java
@SuppressLint("DefaultLocale")
@SuppressWarnings("rawtypes")
public static String createSign(String characterEncoding,
SortedMap<Object, Object> parameters) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();// 所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k)
&& !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key="+Config.key);
String sign = MD5.MD5Encode(sb.toString(), characterEncoding)
.toUpperCase();
System.out.println("签名:"+sign);
return sign;
}
XML工具类:SignUtil.java
public static String changeMapToXml(SortedMap<Object, Object> param) {
Set<Entry<Object, Object>> set = param.entrySet();
Iterator<Entry<Object, Object>> it = set.iterator();
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("<xml>");
while (it.hasNext()) {
Entry<Object, Object> entry = it.next();
sBuilder.append("<" + entry.getKey() + ">");
sBuilder.append(entry.getValue());
sBuilder.append("</" + entry.getKey() + ">");
}
sBuilder.append("</xml>");
try {
return new String(sBuilder.toString().getBytes(), "UTF-8");
} catch (UnsupportedEncodingException e) {
// e.printStackTrace();
}
return "";
}
以上就是生成签名以及支付请求的XML,在log中可以看到生成的签名跟XML,可以在
这里进行下载调试工具,微信支付签名篇到此就结束了,后面我还将继续更新关于微信支付的其他内容!