• 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. }  


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

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

  • 相关阅读:
    前台的ID不能与后台的变量重命名,否则发布后会出现 Ambiguous match found.
    Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
    Scala入门指南
    大数据的关键技术
    大数据技术的发展趋势
    大数据——大价值、大机遇、大变革(全彩)
    大数据与云计算
    Android系统源代码情景分析
    Android硬件抽象层(HAL)概要介绍和学习计划
    Android进程间通信(IPC)机制Binder简要介绍和学习计划
  • 原文地址:https://www.cnblogs.com/zrbfree/p/6709012.html
Copyright © 2020-2023  润新知