微信支付系列之——统一下单

137 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

之前有很多朋友私信我,问我能不能出一系列关于微信支付的文章。

这应部分朋友的请求,输出微信支付系列——统一下单,首先来看看接口文档:

看着这一串接口,是不是有一种头疼欲裂的感觉,不用怕,咱们一个个解决他,首先来看一下统一下单接口。

文档还是很详细的(就是微信支付团队有时文档跟不上代码的节奏^_^)

告诉了我们应用场景、接口清酒地址、是否需要证书、证书参数、返回结果、错误码等一系列接口该有的全部在这里都能够体现出来。

其实,这里面最难搞的也就是请求参数这一坨。剥离开来,请求参数中比较复杂的就是签名加密。

这就带大家来揭开这个签名的神秘面纱。

首先,我们把所有参数按照字典排序,按照键值对的顺序排列成一个新的字符串。其中空参数的要过滤掉。

其次,将我们设置的秘钥拼接到上面的字符串后面做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;
    }

好了,这样即可完成微信支付系列之——统一下单操作,觉得有帮助,帮小编点个赞吧!

喜欢,请关注公众号《coder练习生》