微信公众号支付--错误记录

Posted 何年何月生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信公众号支付--错误记录相关的知识,希望对你有一定的参考价值。

微信公众号支付调用统一下单接口时,微信返回的数据一定要二次组装再给前台,否则会有问题的,正确示范如下:

/**
     * 获取weixin支付的返回信息
     * @param payOrderId
     * @return
     */
    @Override
    public String getPayInfo(String payOrderId,String openid,String orderType) {
        //返回结果
        String res = "";
        double total_fee_money = 0;
        //0代表普通车支付,1代表活动支付
        if ("0".equals(orderType)) {

            //payOrderId即订单的id亦是订单表的主键
            Order_main omm = orderMainService.fetch(payOrderId);
            if (omm == null) {
                res = "订单不存在";
                return res;
            }
            //如果已支付状态为1的话
            if (OrderPayStatusEnum.PAYALL.getKey() == omm.getPayStatus()) {
                res = "订单已支付";
                return res;
            }
            total_fee_money = omm.getFrontMoney();
        } else {
            //clueId即Clue_main的id
            //update by zhangyi 2017-12-1
            ActivityPayRecord activityPayRecord = activitypayrecordService.fetch(payOrderId);
            if (activityPayRecord == null) {
                res = "活动定金支付记录不存在";
                return res;
            }
            //如果已支付状态为1的话
            if (1 == activityPayRecord.getPayStatus()) {
                res = "活动定金已支付";
                return res;
            }
            total_fee_money = activityPayRecord.getFrontMoney();
        }


//         double total_fee_money= 1;
        // 总金额以分为单位,不带小数点
        // 格式转换
        DecimalFormat dformat = new DecimalFormat("0");
        String totalFee = dformat.format(total_fee_money);

        if ("true".equals(config.get("isTest", ""))) {
            totalFee = "1";
        }
        // 把请求参数打包成数组
        HashMap<String, String> sParaTemp = new HashMap<String, String>();
        String body = "长城二手车";
        //订单生成的机器 IP
        String exter_invoke_ip = this.localIp();
        sParaTemp.put("appid", WeixinConfig.appid);
        sParaTemp.put("mch_id", WeixinConfig.mch_id);
        sParaTemp.put("notify_url", WeixinConfig.notify_url);
        sParaTemp.put("trade_type", WeixinConfig.trade_type);
        sParaTemp.put("sign_type", WeixinConfig.sign_type);
        sParaTemp.put("openid", openid);
        String nonce_str = String.valueOf(new Date().getTime());
        sParaTemp.put("nonce_str", WXPayUtil.generateNonceStr());
        sParaTemp.put("spbill_create_ip", exter_invoke_ip);
        sParaTemp.put("out_trade_no", payOrderId);
        sParaTemp.put("total_fee", totalFee);
        sParaTemp.put("body", body);
        sParaTemp.put("timeStamp", nonce_str);
        //add by zhangyi 付款类型 0代表普通车支付,1代表活动支付
        sParaTemp.put("attach", orderType);

        try {
            sParaTemp.put("sign", WXPayUtil.generateSignature(sParaTemp, WeixinConfig.key, WeixinConfig.sign_type));

            String reqBody = WXPayUtil.mapToXml(sParaTemp);
            String resp = wXPayRequest.requestWithoutCert(WeixinConfig.req_url, nonce_str, reqBody, WeixinConfig.connectTimeoutMs, WeixinConfig.readTimeoutMs, true);

            //验证签名是否正确
            if (WXPayUtil.isSignatureValid(WXPayUtil.xmlToMap(resp), WeixinConfig.key, WeixinConfig.sign_type)) {
                //将返参转为map
                Map<String, String> resultmap = WXPayUtil.xmlToMap(resp);
                //resultmap.put("timeStamp",nonce_str);
                //System.out.println(JSON.toJSONString(resultmap));
                //return JSON.toJSONString(resultmap);
                //return JSON.toJSONString(WXPayUtil.xmlToMap(resp).put("timeStamp",nonce_str));

                //二次签名
                String paySign = WXPayUtil.MD5("appId=" + WeixinConfig.appid + "&nonceStr=" + resultmap.get("nonce_str") + "&package=prepay_id=" + resultmap.get("prepay_id") + "&signType=MD5&timeStamp=" + nonce_str + "&key=" + WeixinConfig.key);
                //重新组装返参
                Map resultmap1 = new HashMap();
                resultmap1.put("timeStamp", nonce_str);
                resultmap1.put("nonceStr", resultmap.get("nonce_str"));
                resultmap1.put("package", "prepay_id=" + resultmap.get("prepay_id"));
                resultmap1.put("paySign", paySign);
                resultmap1.put("signType", WeixinConfig.sign_type);
                resultmap1.put("orderType", orderType);

                System.out.println(JSON.toJSONString(resultmap1));
                //将支付参数返给前端
                return JSON.toJSONString(resultmap1);
            } else {
                return "fail";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        return res;
    }

 

以上是关于微信公众号支付--错误记录的主要内容,如果未能解决你的问题,请参考以下文章

有关微信公众号和H5支付的一些记录

微信扫码支付~公众号检查红包状态问题

2017-9月微信公众号支付-Java详解

微信公众号支付之付款

微信支付摔个两次坑

微信支付公众号支付redirect_uri域名与后台配置不一致,错误码10003