zoukankan      html  css  js  c++  java
  • 微信公众号支付--错误记录

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

    /**
         * 获取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;
        }
  • 相关阅读:
    HTML、CSS、JS 复习——序
    HTML + CSS短标题(二,三,四文字长度)两端对齐的方式
    Supper关键字
    java的重写
    java重载
    Java继承
    JAVA访问权限控制
    (转)java类初始化顺序
    Java 数组和集合
    Java 方法签名
  • 原文地址:https://www.cnblogs.com/hedongfei/p/7995059.html
Copyright © 2011-2022 走看看