java微信支付接入详细流程

背景

由于项目是采用Java编写的,微信包括微信支付大都是PHP相关,于是微信支付官方文档对java的支持就不是很友好,在网上找了很多文章,基本上没有一篇是真正跑的通的,经过一番整理,先将java接入微信支付详细流程总结出来以便后续使用。

步骤一

准备阶段:已认证微信号,且通过微信支付认证,这个可以看微信文档,很详细,这里就不再重复。

 

java微信支付接入详细流程java微信支付接入详细流程

步骤二

配置授权目录,官方推荐使用https类型的url,不知道http能不能行,个人也推荐使用https的保证不会错。

 java微信支付接入详细流程java微信支付接入详细流程

配置授权域名

 java微信支付接入详细流程java微信支付接入详细流程

java微信支付接入详细流程

 java微信支付接入详细流程java微信支付接入详细流程

java微信支付接入详细流程

步骤三

微信支付二次开发所需要的参数:

APP_ID,APP_KEY,PARTNER,PARTNER_KEY(AppSecret)

 java微信支付接入详细流程java微信支付接入详细流程java微信支付接入详细流程java微信支付接入详细流程

APP_IDPARTNER_KEY(AppSecret)

 java微信支付接入详细流程java微信支付接入详细流程

PARTNER

 java微信支付接入详细流程java微信支付接入详细流程java微信支付接入详细流程java微信支付接入详细流程

APP_KEY(自行设置32位字符)

步骤四

4.1通过页面跳转到确认支付页面,其中的redirect_uri必须是配置授权目录下的

  1. <html>  
  2.   <head>  
  3.     <title>支付测试</title>  
  4.   </head>  
  5.   <body>  
  6.     <a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx619890d997071358&redirect_uri=https%3A%2F%2Fm.yangji.com%2Fpay%2FpayTest.jsp&response_type=code&scope=snsapi_base&state=123#wechat_redirect">支付测试</a>  
  7.   </body>  
  8. </html>  

4.2 获取到openid,再经服务器向微信请求获取prepay_id,封装字段并进行签名后通过jsapi调起微信支付

网页端

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  3. <html>  
  4. <head>  
  5. <meta charset="utf-8" />  
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />  
  7. <meta name="apple-mobile-web-app-capable" content="yes" />  
  8. <meta name="apple-mobile-web-app-status-bar-style" content="black" />  
  9. <meta name="format-detection" content="telephone=no" />  
  10. <title>测试支付</title>  
  11. <link href="../css/css.css?v=1.0" rel="stylesheet" type="text/css">  
  12. </head>  
  13. <body>  
  14.     <div class="index_box">  
  15.         <div class="apply_name">微信js支付测试</div>  
  16.         <div class="branch_con">  
  17.             <ul>  
  18.                 <li><span class="name">测试支付信息[]</span></li>  
  19.             </ul>  
  20.             <p class="cz_btn"><a href="javascript:pay();" class="btn_1">立即支付</a></p>  
  21.         </div>  
  22.     </div>  
  23. <%  
  24. String code = request.getParameter("code");  
  25.  %>  
  26. <input type="text" id="code" value="<%out.print(code); %>"/>  
  27. <input type="text" id="path" value="${pageContext.request.contextPath}"/>  
  28. <div><hr/>  
  29.     code:<%out.print(code); %>  
  30. </div>  
  31.     <script type="text/javascript">  
  32.         var appId,timeStamp,nonceStr,pg,signType,paySign;  
  33.       function onBridgeReady(){  
  34.            WeixinJSBridge.invoke(  
  35.                'getBrandWCPayRequest', {  
  36.                    "appId" : appId,     //公众号名称,由商户传入       
  37.                    "timeStamp": timeStamp,         //时间戳,自1970年以来的秒数       
  38.                    "nonceStr" : nonceStr, //随机串       
  39.                    "package" : "prepay_id=" + pg,       
  40.                    "signType" : signType,         //微信签名方式:       
  41.                    "paySign" : paySign    //微信签名   
  42.                },  
  43.                function(res){       
  44.                    if(res.err_msg == "get_brand_wcpay_request:ok" ) {  
  45.                          
  46.                        alert("支付成功");  
  47.                    }   
  48.                }  
  49.            );   
  50.         }  
  51.         function pay(){  
  52.             var code = document.getElementById("code").value;  
  53.             var path = document.getElementById("path").value;  
  54.             send_request(function(value){  
  55.                 var json = eval("(" + value + ")");  
  56.                 if(json.length > 0){  
  57.                     appId = json[0].appId;  
  58.                     timeStamp = json[0].timeStamp;  
  59.                     nonceStr = json[0].nonceStr;  
  60.                     pg = json[0].pg;  
  61.                     signType = json[0].signType;  
  62.                     paySign = json[0].paySign;  
  63.                     if (typeof WeixinJSBridge == "undefined"){  
  64.                        if( document.addEventListener ){  
  65.                            document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);  
  66.                        }else if (document.attachEvent){  
  67.                            document.attachEvent('WeixinJSBridgeReady', onBridgeReady);   
  68.                            document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);  
  69.                        }  
  70.                     }else{  
  71.                        onBridgeReady();  
  72.                     }   
  73.                 }  
  74.             },path+"/pay/payparm.htm?openId="+code, true);  
  75.         }  
  76. function send_request(callback, urladdress,isReturnData){        
  77.     var xmlhttp = getXMLHttpRequest();  
  78.     xmlhttp.onreadystatechange = function(){  
  79.             if (xmlhttp.readyState == 4) {  
  80.                     try{  
  81.                     if(xmlhttp.status == 200){  
  82.                         if(isReturnData && isReturnData==true){  
  83.                             callback(xmlhttp.responseText);  
  84.                         }  
  85.                     }else{  
  86.                         callback("页面找不到!"+ urladdress +"");  
  87.                     }  
  88.                 } catch(e){  
  89.                     callback("请求发送失败,请重试!" + e);  
  90.                 }  
  91.            }  
  92.     }  
  93.     xmlhttp.open("POST", urladdress, true);  
  94.     xmlhttp.send(null);  
  95. }  
  96. function getXMLHttpRequest() {  
  97.     var xmlhttp;  
  98.     if (window.XMLHttpRequest) {  
  99.         try {  
  100.             xmlhttp = new XMLHttpRequest();  
  101.             xmlhttp.overrideMimeType("text/html;charset=UTF-8");  
  102.         } catch (e) {}  
  103.     } else if (window.ActiveXObject) {  
  104.         try {  
  105.             xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");  
  106.         } catch (e) {  
  107.             try {  
  108.                 xmlhttp = new ActiveXObject("Msxml2.XMLHttp");  
  109.             } catch (e) {  
  110.                 try {  
  111.                     xmlhttp = new ActiveXObject("Msxml3.XMLHttp");  
  112.                 } catch (e) {}  
  113.             }  
  114.         }  
  115.     }  
  116.     return xmlhttp;  
  117. }  
  118.     </script>  
  119. </body>  
  120. </html>  

服务器端

  1. @RequestMapping("/pay/payparm")  
  2.     public void payparm(HttpServletRequest request, HttpServletResponse response){  
  3.         try {  
  4.             // 获取openid  
  5.             String openId = (String) request.getSession().getAttribute("openId");  
  6.             if (openId == null) {  
  7.                 openId = getUserOpenId(request);  
  8.             }  
  9.   
  10.             String appid = WXConfig.APP_ID;  
  11.             String paternerKey = WXConfig.PERTNER_KEY;  
  12.               
  13.             String out_trade_no = getTradeNo();  
  14.             Map<String, String> paraMap = new HashMap<String, String>();  
  15.             paraMap.put("appid", appid);  
  16.             paraMap.put("attach""测试");  
  17.             paraMap.put("body""测试购买支付");  
  18.             paraMap.put("mch_id", WXConfig.PARTNER);  
  19.             paraMap.put("nonce_str", create_nonce_str());  
  20.             paraMap.put("openid", openId);  
  21.             paraMap.put("out_trade_no", out_trade_no);  
  22.             paraMap.put("spbill_create_ip", getAddrIp(request));  
  23.             paraMap.put("total_fee""1");  
  24.             paraMap.put("trade_type""JSAPI");  
  25.             paraMap.put("notify_url""http://m.ebiaotong.com/WXPay/notify");// 此路径是微信服务器调用支付结果通知路径  
  26.             String sign = getSign(paraMap, paternerKey);  
  27.             paraMap.put("sign", sign);  
  28.             // 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder  
  29.             String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";  
  30.   
  31.             String xml = ArrayToXml(paraMap);  
  32.   
  33.             String xmlStr = HttpKit.post(url, xml);  
  34.   
  35.             // 预付商品id  
  36.             String prepay_id = "";  
  37.   
  38.             if (xmlStr.indexOf("SUCCESS") != -1) {  
  39.                 Map<String, String> map = doXMLParse(xmlStr);  
  40.                 prepay_id = (String) map.get("prepay_id");  
  41.             }  
  42.   
  43.             String timeStamp = create_timestamp();  
  44.             String nonceStr = create_nonce_str();  
  45.             Map<String, String> payMap = new HashMap<String, String>();  
  46.             payMap.put("appId", appid);  
  47.             payMap.put("timeStamp", timeStamp);  
  48.             payMap.put("nonceStr", nonceStr);  
  49.             payMap.put("signType""MD5");  
  50.             payMap.put("package""prepay_id=" + prepay_id);  
  51.             String paySign = getSign(payMap, paternerKey);  
  52.               
  53.             payMap.put("pg", prepay_id);  
  54.             payMap.put("paySign", paySign);  
  55.               
  56.             // 拼接并返回json  
  57.             StringBuilder sBuilder = new StringBuilder("[{");  
  58.             sBuilder.append("appId:'").append(appid).append("',")  
  59.                         .append("timeStamp:'").append(timeStamp).append("',")  
  60.                         .append("nonceStr:'").append(nonceStr).append("',")  
  61.                         .append("pg:'").append(prepay_id).append("',")  
  62.                         .append("signType:'MD5',")  
  63.                         .append("paySign:'").append(paySign).append("'");  
  64.             sBuilder.append("}]");  
  65.             response.getWriter().print(sBuilder.toString());  
  66.             response.getWriter().close();  
  67.         } catch (Exception e) {  
  68.             e.printStackTrace();  
  69.         }  
  70.     }  


测试结果

java微信支付接入详细流程   java微信支付接入详细流程java微信支付接入详细流程         java微信支付接入详细流程