之前有很多朋友私信我,问我能不能出一系列关于微信支付的文章。
这应部分朋友的请求,输出微信支付系列——统一下单,首先来看看接口文档:
看着这一串接口,是不是有一种头疼欲裂的感觉,不用怕,咱们一个个解决他,首先来看一下统一下单接口。
文档还是很详细的(就是微信支付团队有时文档跟不上代码的节奏^_^)
告诉了我们应用场景、接口清酒地址、是否需要证书、证书参数、返回结果、错误码等一系列接口该有的全部在这里都能够体现出来。
其实,这里面最难搞的也就是请求参数这一坨。剥离开来,请求参数中比较复杂的就是签名加密。
这就带大家来揭开这个签名的神秘面纱。
首先,我们把所有参数按照字典排序,按照键值对的顺序排列成一个新的字符串。其中空参数的要过滤掉。
其次,将我们设置的秘钥拼接到上面的字符串后面做MD5加密,然后转为大写,这样签名即搞定了,来我们直接看代码是如何搞定的:
/**
* 微信支付MD5加密
* @param infoIds 字典序后的集合
* @return
* @throws Exception
*/
public static String createSign(List<Map.Entry<String, Object>> infoIds, String apiKey) throws Exception {
StringBuffer sb = new StringBuffer();
for (Map.Entry<String, Object> entry : infoIds) {
String key = entry.getKey();
Object value = entry.getValue();
if(null != value && !"".equals(value) && !"sign".equals(key) && !"key".equals(key)){
sb.append(key+"="+value+"&");
}
}
sb.append("key="+apiKey);
String sign = signMD5(sb.toString());
logger.info("【签名结果】{}",sign);
return sign;
}
封装统一请求类,具体代码实现如下
/**
* 微信统一下单接口
* 接口文档地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1
* @param unifiedOrderReq 统一下单请求
* @return
* @throws BaseException
*/
public ApiResult uniformorder(UnifiedOrderReq unifiedOrderReq) throws BaseException{
logger.info("【统一下单请求入参:】{}",unifiedOrderReq.toString());
String uniformorderXml = wechatPayCommon.unifiedOrderReqSplicingParam(unifiedOrderReq);
logger.info("【统一下单封装微信请求参数:】{}",uniformorderXml);
String content = HttpUtils.httpsRequest(baseWechatPay.getUniformOrder(),HttpUtils.POST, uniformorderXml);
logger.info("【统一下单微信返回内容:】{}",content);
ApiResult apiResult = handleReturnCommon.handleUnifiedOrderReturnContent(content, unifiedOrderReq.getTradeType(), unifiedOrderReq.getOutTradeNo());
logger.info("【统一下单返回报文:】{}",apiResult.toString());
return apiResult;
}
好了,这样即可完成微信支付系列之——统一下单操作,觉得有帮助,帮小编点个赞吧!