调微信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; }
阅读全文
0 0
- 调微信App支付接口
- 支付宝支付接口 APP
- 支付宝APP支付接口-PHP
- C#支付宝支付接口APP版
- app接入支付宝接口
- APP微信支付接口
- 微信APP支付接口
- 支付宝支付之APP支付接口 服务器端
- iOS app支付宝接口调用
- APP接入微信支付接口
- 微信APP支付接口文档
- android app如何调用支付宝接口
- PHP开发APP微信支付接口
- App微信支付 php后台接口
- PHP开发APP微信支付接口
- 微信app开发支付接口相关
- 微信APP支付接口业务流程
- php 开发微信app支付接口
- jstl自定义标签实现jsp页面元素权限控制
- mybatis 中的批量添加、删除、修改
- hibernate.cfg.xml配置全解
- XZ_Swift之苹果原生自动布局的使用
- Angular 内置结构型指令
- 调微信App支付接口
- 动态规划--矩阵连乘
- Linux网络编程之UDP
- oracle官方培训地址
- XMLHttpRequest对象
- github部署到生产环境
- Web前端开发精品课HTML CSS JavaScript基础教程第九章课后编程题答案
- SQL数据库查询练习题及答案(四十五道题)
- 线程从零开始