170327、Java微信支付中的扫码支付

微信支付现在已经变得越来越流行了,随之也出现了很多以可以快速接入微信支付为噱头的产品,不过方便之余也使得我们做东西慢慢依赖第三方,丧失了独立思考的能力,这次打算分享下我之前开发过的微信支付。

一 H5公众号支付

要点:正确获取openId以及统一下单接口,正确处理支付结果通知,正确配置支付授权目录

H5的支付方式是使用较为广泛的方式,这种支付方式主要用于微信内自定义菜单的网页,依赖手机上安装的微信客户端,高版本的微信才支持微信支付,下面按我的流程注意说明

 

1  编写用于支付的页面,由于是测试用就写的简单了点

 

[html] view plain copy

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  

  2. <%  

  3. String path = request.getContextPath();  

  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  

  5. %>  

  6.   

  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

  8. <html>  

  9.   <head>  

  10.     <base href="<%=basePath%>">  

  11.       

  12.     <title>微信支付样例</title>  

  13.       

  14.     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">  

  15.     <!-- 

  16.     <link rel="stylesheet" type="text/css" href="styles.css"> 

  17.     -->  

  18.   

  19.   </head>  

  20.     

  21.   <body>  

  22.     <form action="oauthServlet" method="POST">  

  23.              订单号:<input type="text" name="orderNo" />  

  24.       <input type="submit" value="H5支付"/>  

  25.     </form>  

  26.     </br></br>  

  27.      <form action="scanCodePayServlet?flag=createCode" method="POST">  

  28.              订单号:<input type="text" name="orderNo" />  

  29.       <input type="submit" value="扫码支付"/>  

  30.     </form>  

  31.   </body>  

  32. </html>  

 

 

2  编写一个servlet用于通过Oauth获取code

 

[java] view plain co

  1. package com.debug.weixin.servlet;  

  2.   

  3. import java.io.IOException;  

  4. import java.io.PrintWriter;  

  5.   

  6. import javax.servlet.RequestDispatcher;  

  7. import javax.servlet.ServletException;  

  8. import javax.servlet.http.HttpServlet;  

  9. import javax.servlet.http.HttpServletRequest;  

  10. import javax.servlet.http.HttpServletResponse;  

  11.   

  12. import com.debug.weixin.util.CommonUtil;  

  13. import com.debug.weixin.util.ServerConfig;  

  14.   

  15. public class OauthServlet extends HttpServlet {  

  16.   

  17.       

  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)  

  19.             throws ServletException, IOException {  

  20.   

  21.         this.doPost(request, response);  

  22.     }  

  23.   

  24.     public void doPost(HttpServletRequest request, HttpServletResponse response)  

  25.             throws ServletException, IOException {  

  26.   

  27.          String orderNo=request.getParameter("orderNo");  

  28.          //调用微信Oauth2.0获取openid  

  29.          String redirectURL=ServerConfig.SERVERDOMAIN+"/BasicWeixin/payServletForH5?orderNo="+orderNo;  

  30.          String redirectURI="";  

  31.          try {  

  32.              redirectURI=CommonUtil.initOpenId(redirectURL);  

  33.          } catch (Exception e) {  

  34.             // TODO Auto-generated catch block  

  35.             e.printStackTrace();  

  36.          }  

  37.          //System.out.println(redirectURI);  

  38.          //RequestDispatcher dis= request.getRequestDispatcher(redirectURI);  

  39.          //dis.forward(request, response);  

  40.          response.sendRedirect(redirectURI);  

  41.     }  

  42.   

  43. }  


3 获取到code后,通过REDIRECTURI获取openId,调用统一下单接口

 

 

[java] view plain cop

  1. package com.debug.weixin.servlet;  

  2.   

  3. import java.io.IOException;  

  4. import java.io.PrintWriter;  

  5. import java.util.SortedMap;  

  6. import java.util.TreeMap;  

  7.   

  8. import javax.servlet.RequestDispatcher;  

  9. import javax.servlet.ServletException;  

  10. import javax.servlet.http.HttpServlet;  

  11. import javax.servlet.http.HttpServletRequest;  

  12. import javax.servlet.http.HttpServletResponse;  

  13.   

  14. import com.debug.weixin.pojo.WeixinOauth2Token;  

  15. import com.debug.weixin.pojo.WeixinQRCode;  

  16. import com.debug.weixin.util.AdvancedUtil;  

  17. import com.debug.weixin.util.CommonUtil;  

  18. import com.debug.weixin.util.ConfigUtil;  

  19. import com.debug.weixin.util.PayCommonUtil;  

  20.   

  21. public class PayServletForH5 extends HttpServlet {  

  22.   

  23.       

  24.     public void doGet(HttpServletRequest request, HttpServletResponse response)  

  25.             throws ServletException, IOException {  

  26.   

  27.         this.doPost(request, response);  

  28.     }  

  29.   

  30.     public void doPost(HttpServletRequest request, HttpServletResponse response)  

  31.             throws ServletException, IOException {  

  32.          String orderNo=request.getParameter("orderNo");  

  33.          String code=request.getParameter("code");  

  34.            

  35.          //获取AccessToken  

  36.            

  37.          WeixinOauth2Token token=AdvancedUtil.getOauth2AccessToken(ConfigUtil.APPID, ConfigUtil.APP_SECRECT, code);  

  38.            

  39.          String openId=token.getOpenId();  

  40.            

  41.          //调用微信统一支付接口  

  42.          SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();  

  43.         parameters.put("appid", ConfigUtil.APPID);  

  44.   

  45.         parameters.put("mch_id", ConfigUtil.MCH_ID);  

  46.         parameters.put("device_info", "1000");    

  47.         parameters.put("body", "我的测试订单");  

  48.         parameters.put("nonce_str", PayCommonUtil.CreateNoncestr());  

  49.           

  50.                

  51.         parameters.put("out_trade_no", orderNo);  

  52.         //parameters.put("total_fee", String.valueOf(total));  

  53.         parameters.put("total_fee", "1");  

  54.         parameters.put("spbill_create_ip", request.getRemoteAddr());  

  55.         parameters.put("notify_url", ConfigUtil.NOTIFY_URL);  

  56.         parameters.put("trade_type", "JSAPI");  

  57.         parameters.put("openid", openId);  

  58.   

  59.         String sign = PayCommonUtil.createSign("UTF-8", parameters);  

  60.         parameters.put("sign", sign);  

  61.   

  62.         String requestXML = PayCommonUtil.getRequestXml(parameters);  

  63.   

  64.         String result = CommonUtil.httpsRequestForStr(ConfigUtil.UNIFIED_ORDER_URL,"POST", requestXML);  

  65.         System.out.println("----------------------------------");  

  66.         System.out.println(result);  

  67.         System.out.println("----------------------------------");  

  68.           

  69.         request.setAttribute("orderNo", orderNo);  

  70.         request.setAttribute("totalPrice", "0.01");  

  71.         String payJSON="";  

  72.         try {  

  73.             payJSON=CommonUtil.getH5PayStr(result,request);  

  74.               

  75.         } catch (Exception e) {  

  76.             // TODO Auto-generated catch block  

  77.             e.printStackTrace();  

  78.         }  

  79.         //System.out.println(payJSON);  

  80.         request.setAttribute("unifiedOrder",payJSON);  

  81.           

  82.         RequestDispatcher dis= request.getRequestDispatcher("h5Pay.jsp");  

  83.         dis.forward(request, response);  

  84.     }  

  85.   

  86. }  


调用微信统一下单接口,需要注意签名算法,只有签名计算正确才能顺利支付

 

最终看下公众号支付和扫码支付的微信配置:

 

posted @ 2017-04-14 15:12  目标奔雷手  阅读(206)  评论(0编辑  收藏  举报