后台微信支付(亲测可用)

微信支付这块确实有点坑,文档不全,例子也报错,预定单都下成功了,app端掉不起微信。经过了无数的坑后,终于成功

                paytype=ParkObject.Depositlog_wechat;
                WxPayModel wxPayModel=new WxPayModel();
                wxPayModel.setOutTradeNo(outtradeno);
                wxPayModel.setNotifyUrl("http://123.159.193.22:9175/AppWeChatNotify");
                wxPayModel.setTotalFee(Integer.valueOf((int) (money*100))+"");
                wxPayModel.setBody("充值");
                wxPayModel.setFeeType("CNY");
                wxPayModel.setTradeType("APP");
                wxPayModel.setDeviceInfo("");
                wxPayModel.setProductId("12");

                wxPayModel.setSpbillCreateIp("123.12.12.123");
                Map<Object, Object> unifiedOrder = wxPayService.getWxPay(wxPayModel, "");
                jsonObject= (com.alibaba.fastjson.JSONObject) JSONObject.toJSON(unifiedOrder);
    @Override
    public Map<Object, Object> getWxPay(WxPayModel wsxPayModel,String ip) {
        try {
            SortedMap<Object, Object> parameters = PayCommonUtil2.getWXPrePayID(); // 获取预付单,此处已做封装,需要工具类

            parameters.put("body", wsxPayModel.getBody());

            parameters.put("spbill_create_ip",ip);
            parameters.put("out_trade_no", wsxPayModel.getOutTradeNo()); // 订单id这里我的订单id生成规则是订单id+时间
            parameters.put("total_fee", wsxPayModel.getTotalFee()); // 测试时,每次支付一分钱,微信支付所传的金额是以分为单位的,因此实际开发中需要x100
            // parameters.put("total_fee", wsxPayModel.getTotalFee()*100); 
            // 上线后,将此代码放开

            // 设置签名
            String sign = PayCommonUtil2.createSign("UTF-8", parameters);
            parameters.put("sign", sign);
            // 封装请求参数结束
            String requestXML = PayCommonUtil2.getRequestXml(parameters); // 获取xml结果
            System.out.println("封装请求参数是:" + requestXML);
            // 调用统一下单接口
            String result = PayCommonUtil2.httpsRequest(ConfigUtil.UNIFIED_ORDER_URL, "POST",
                    requestXML);
            System.out.println("调用统一下单接口:" + result);
            SortedMap<Object, Object> parMap = PayCommonUtil2.startWXPay(result);
            System.out.println("最终的map是:" + parMap.toString());
            return parMap;
        } catch (Exception e) {
            e.printStackTrace();
            Map<Object, Object> errMap = new HashMap<>();
            errMap.put("errMsg", e.getMessage());
            return errMap;
        }
    }
/**
     * 再次签名,支付
     */
    public static SortedMap<Object, Object> startWXPay(String result) {
        try {
            Map<String, String> map = XMLUtil.doXMLParse(result);
            SortedMap<Object, Object> parameterMap = new TreeMap<Object, Object>();
            parameterMap.put("appid", ConfigUtil.APPID);
            parameterMap.put("partnerid", ConfigUtil.MCH_ID);
            parameterMap.put("prepayid", map.get("prepay_id"));
            parameterMap.put("package", "Sign=WXPay");
            parameterMap.put("noncestr", PayCommonUtil2.CreateNoncestr());
            // 本来生成的时间戳是13位,但是ios必须是10位,所以截取了一下
            parameterMap.put("timestamp",
                    Long.parseLong(String.valueOf(System.currentTimeMillis()).toString().substring(0, 10)));
            String sign = PayCommonUtil2.createSign("UTF-8", parameterMap);
            parameterMap.put("sign", sign);
            return parameterMap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 创建随机数
     * 
     * @param length
     * @return
     */
    public static String CreateNoncestr() {
        String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        String res = "";
        for (int i = 0; i < 16; i++) {
            Random rd = new Random();
            res += chars.charAt(rd.nextInt(chars.length() - 1));
        }
        return res;
    }

猜你喜欢

转载自blog.csdn.net/u011747152/article/details/79628059