刚对接完微信支付分,对接过程还是有点小坑,微信官方的接口文档写的比较粗略,代码示例比较少,网上的相关技术博客少之又少,前期还是有点小困难的,所以决定把对接过程梳理一下,希望能帮到需要的人。
APIv3版本的接口和之前的API接口有几个重要的区别:
1.使用JSON作为数据交互的格式,不再使用XML
2.使用基于非对称密钥的SHA256-RSA的数字签名算法,不再使用MD5或HMAC-SHA256
3.使用AES-256-GCM,对回调中的关键信息进行加密保护
一、请求签名
所有请求微信方的接口都要使用SHA256-RSA签名算法,生成签名。签名需要用到商户的API证书,在获取商户的API证书之前需要对API证书进行升级。签名过程还会用到商户API证书序列号serial_no和商户号。构造签名串的过程描述可以查看微信文档,生成签名。
生成签名代码如下:
//method(请求类型GET、POST url(请求url) body(请求body,GET请求时body传"",POST请求时body为请求参数的json串) merchantId(商户号) certSerialNo(API证书序列号) keyPath(API证书路径)
public static String getToken(String method,String url, String body,String merchantId,String certSerialNo,String keyPath) throws Exception {
String signStr = "";
HttpUrl httpurl = HttpUrl.parse(url);
String nonceStr = getNonceStr();
long timestamp = System.currentTimeMillis() / 1000;
if(StringUtils.isEmpty(body)){
body = "";
}
String message = buildMessage(method, httpurl, timestamp, nonceStr, body);
String signature = sign(message.getBytes("utf-8"),keyPath);
signStr = "mchid=\"" + merchantId
+ "\",nonce_str=\"" + nonceStr
+ "\",timestamp=\"" + timestamp
+ "\",serial_no=\"" + certSerialNo
+ "\",signature=\"" + signature + "\"";
logger.info("Authorization Token:" +signStr);
return signStr;
}
public static S