调微信App支付接口

来源:互联网 发布:乐视手机没有4g网络 编辑:程序博客网 时间:2024/04/30 07:54
public Map<String, Object> appWxPay(String body, String out_trade_no, String total_fee, String trade_type, String notify_url,String ip) {        Map<String, Object> resultMap = new HashMap<String, Object>();        SortedMap<String, String> parameters = new TreeMap<String, String>();        parameters.put("appid", AppWeChatConfigs.getAppID()); //应用ID        parameters.put("mch_id", AppWeChatConfigs.getMchId());//商户号        parameters.put("nonce_str", PayCommonUtil.CreateNoncestr());//随机字符串        parameters.put("body", body);//订单名字        parameters.put("out_trade_no", out_trade_no);//订单号        parameters.put("fee_type", "CNY");//币种        parameters.put("total_fee", total_fee);//价格        parameters.put("spbill_create_ip", ip);//用户端实际ip        parameters.put("notify_url", notify_url);//回调方法        parameters.put("trade_type", trade_type);//默认是 APP        /**         * 设置签名         */        String sign = PayCommonUtil.createSign("UTF-8", parameters);        parameters.put("sign", sign);        /**         * 封装请求参数结束         */        String requestXML = PayCommonUtil.getRequestXml(parameters);        /**         * 调用统一下单接口         */        String result = PayCommonUtil.httpsRequest(AppWeChatConfigs.UNIFIED_ORDER_URL, "POST", requestXML);        System.out.println("\n" + result);        try {            /**             * 统一下单接口返回正常的prepay_id,             * 再按签名规范重新生成签名后,             * 将数据传输给APP。             * 参与签名的字段名为 appId,partnerId,prepayId,nonceStr,timeStamp,package。             * 注意:package的值格式为Sign=WXPay             */            Map<String, String> map = XMLUtil.doXMLParse(result);            SortedMap<String, String> parameterMap2 = new TreeMap<String, String>();            parameterMap2.put("appid", AppWeChatConfigs.getAppID());            parameterMap2.put("partnerid", AppWeChatConfigs.getMchId());            parameterMap2.put("prepayid", map.get("prepay_id"));            parameterMap2.put("package", "Sign=WXPay");            parameterMap2.put("noncestr", PayCommonUtil.CreateNoncestr());            /**             * 本来生成的时间戳是13位,但是ios必须是10位,所以截取了一下             */            parameterMap2.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000).substring(0, 10));            String sign2 = PayCommonUtil.createSign("UTF-8", parameterMap2);            parameterMap2.put("sign", sign2);            resultMap.put("code", "200");            parameterMap2.put("packageValue",parameterMap2.get("package"));            resultMap.put("msg", parameterMap2);        } catch (JDOMException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return resultMap;    }


//签名

public static String createSign(String characterEncoding,SortedMap<String,String> parameters){        StringBuffer sb = new StringBuffer();        Set es = parameters.entrySet();        Iterator it = es.iterator();        while(it.hasNext()) {            Map.Entry entry = (Map.Entry)it.next();            String k = (String)entry.getKey();            Object v = entry.getValue();            if(null != v && !"".equals(v)                    && !"sign".equals(k) && !"key".equals(k)) {                sb.append(k + "=" + v + "&");            }        }        sb.append("key="+AppWeChatConfigs.getApiKey());        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();        return sign;    }

//封装请求参数 转为XML

public static String getRequestXml(SortedMap<String,String> parameters){        StringBuffer sb = new StringBuffer();        sb.append("<xml>");        Set es = parameters.entrySet();        Iterator it = es.iterator();        while(it.hasNext()) {            Map.Entry entry = (Map.Entry)it.next();            String k = (String)entry.getKey();            String v = (String)entry.getValue();            if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)) {                sb.append("<"+k+">"+"<![CDATA["+v+"]]></"+k+">");            }else {                sb.append("<"+k+">"+v+"</"+k+">");            }        }        sb.append("</xml>");        return sb.toString();    }

//发送请求

public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {        try {            // 创建SSLContext对象,并使用我们指定的信任管理器初始化            TrustManager[] tm = { new MyX509TrustManager() };            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");            sslContext.init(null, tm, new java.security.SecureRandom());            // 从上述SSLContext对象中得到SSLSocketFactory对象            SSLSocketFactory ssf = sslContext.getSocketFactory();            URL url = new URL(requestUrl);            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();            //conn.setSSLSocketFactory(ssf);            conn.setDoOutput(true);            conn.setDoInput(true);            conn.setUseCaches(false);            // 设置请求方式(GET/POST)            conn.setRequestMethod(requestMethod);            conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");            // 当outputStr不为null时向输出流写数据            if (null != outputStr) {                OutputStream outputStream = conn.getOutputStream();                // 注意编码格式                outputStream.write(outputStr.getBytes("UTF-8"));                outputStream.close();            }            // 从输入流读取返回内容            InputStream inputStream = conn.getInputStream();            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);            String str = null;            StringBuffer buffer = new StringBuffer();            while ((str = bufferedReader.readLine()) != null) {                buffer.append(str);            }            // 释放资源            bufferedReader.close();            inputStreamReader.close();            inputStream.close();            inputStream = null;            conn.disconnect();            return buffer.toString();        } catch (ConnectException ce) {//          log.error("连接超时:{}", ce);        } catch (Exception e) {//          log.error("https请求异常:{}", e);        }        return null;    }

//解析XML

public static Map doXMLParse(String strxml) throws JDOMException, IOException {        strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");        if(null == strxml || "".equals(strxml)) {            return null;        }        Map m = new HashMap();        InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));        SAXBuilder builder = new SAXBuilder();        Document doc = builder.build(in);        Element root = doc.getRootElement();        List list = root.getChildren();        Iterator it = list.iterator();        while(it.hasNext()) {            Element e = (Element) it.next();            String k = e.getName();            String v = "";            List children = e.getChildren();            if(children.isEmpty()) {                v = e.getTextNormalize();            } else {                v = XMLUtil.getChildrenText(children);            }            m.put(k, v);        }        //关闭流        in.close();        return m;    }