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

一 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. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

  7. <html>

  8. <head>

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

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

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

  12. <!--

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

  14. -->

  15. </head>

  16. <body>

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

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

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

  20. </form>

  21. </br></br>

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

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

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

  25. </form>

  26. </body>

  27. </html>

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

[java] view plain co

  1. package com.debug.weixin.servlet;

  2. import java.io.IOException;

  3. import java.io.PrintWriter;

  4. import javax.servlet.RequestDispatcher;

  5. import javax.servlet.ServletException;

  6. import javax.servlet.http.HttpServlet;

  7. import javax.servlet.http.HttpServletRequest;

  8. import javax.servlet.http.HttpServletResponse;

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

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

  11. public class OauthServlet extends HttpServlet {

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

  13. throws ServletException, IOException {

  14. this.doPost(request, response);

  15. }

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

  17. throws ServletException, IOException {

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

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

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

  21. String redirectURI="";

  22. try {

  23. redirectURI=CommonUtil.initOpenId(redirectURL);

  24. } catch (Exception e) {

  25. // TODO Auto-generated catch block

  26. e.printStackTrace();

  27. }

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

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

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

  31. response.sendRedirect(redirectURI);

  32. }

  33. }

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

[java] view plain cop

  1. package com.debug.weixin.servlet;

  2. import java.io.IOException;

  3. import java.io.PrintWriter;

  4. import java.util.SortedMap;

  5. import java.util.TreeMap;

  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. import com.debug.weixin.pojo.WeixinOauth2Token;

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

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

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

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

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

  17. public class PayServletForH5 extends HttpServlet {

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

  19. throws ServletException, IOException {

  20. this.doPost(request, response);

  21. }

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

  23. throws ServletException, IOException {

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

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

  26. //获取AccessToken

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

  28. String openId=token.getOpenId();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  48. System.out.println(result);

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

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

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

  52. String payJSON="";

  53. try {

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

  55. } catch (Exception e) {

  56. // TODO Auto-generated catch block

  57. e.printStackTrace();

  58. }

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

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

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

  62. dis.forward(request, response);

  63. }

  64. }

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

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

170327、Java微信支付中的扫码支付的更多相关文章

  1. 微信支付(PC扫码支付和H5公众号支付)

    最近在做微信支付,微信支付比较坑,官方居然只有.NET.C#.PHP的demo居然没有java的demo.然后微信支付是不提供测试账号的需要直接用正式的公众号.首先来介绍下微信扫码支付吧,微信扫码有两 ...

  2. 支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结

    前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付 ...

  3. Java微信公众平台开发之扫码支付模式一

    官方文档点击查看准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败)借鉴了很多大神的文章,在此先谢过了大体过程:先扫码(还没有确定实际要支付的金额),这个码是商品的二维码,再生 ...

  4. Java SpringMVC实现PC端网页微信扫码支付完整版

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微 ...

  5. 微信扫码支付功能详细教程————Java

    前言  首先声明 我并非原创 原创是 http://blog.csdn.net/wangqiuyun/article/details/51241064 我只是在前辈的基础 加以解释说明 还有自己的一些 ...

  6. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  7. C# 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付            今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候 ...

  8. PHP PC端微信扫码支付【模式二】详细教程-附带源码(转)

    博主写这破玩意儿的时候花了大概快两天时间才整体的弄懂逻辑,考虑了一下~还是把所有代码都放出来给大家~抱着开源大无私的精神!谁叫我擅长拍黄片呢?同时也感谢我刚入行时候那些无私帮过我的程序员们! 首先还是 ...

  9. asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1

    2018-08-13更新生成二维码的方法 在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付.H5支付.公众号支付.App支付等,本人使用的是asp.net mvc c ...

随机推荐

  1. layui更新表格单元格数据口,更新单元格的内容

    //监听工具条 table.on('tool(edit)', function(obj){ var data = obj.data; if(obj.event === 'getinvitation') ...

  2. 点滴积累【other】---HTTP 错误 404.13 - Not Found,请求筛选模块被配置为拒绝超过请求内容长度的请求(转载)

    此文参考来源:http://blog.csdn.net/tiantian1980/article/details/6577499 问题:HTTP 错误 404.13 - Not Found,请求筛选模 ...

  3. Makefile 使用小结

    Makefile的基本格式 #目标:依赖(条件) # 命令 #all: add.c sub.c dive.c mul.c main.c # gcc add.c sub.c div.c mul.c ma ...

  4. Redis 面试题(持续更新)

    前言 看了一圈,发现Redis的面试题主要问的是如下几块: 原理 用处(缓存/队列 包括Pub.Sub/计数器/排行榜等) 基本操作与数据类型 消息队列 且与其它消息队列的区别 主从备份 宕机如何处理 ...

  5. C# Dictionary 复制

    Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictionary.Add(" ...

  6. saveFileDialog对话框

    private void button1_Click(object sender, EventArgs e) { saveFileDialog1.Filter = "*.txt|*.txt| ...

  7. signal基础

    signal man 7 signal 1.kill -l 显示所有信号 kill -signal PID killall -signal name 2.产生信号 ctrl+c => SIGIN ...

  8. [算法]滴滴笔试题——求最大子串和(O(n)复杂度)

    扫描法.一次扫描数组即可得出答案,复杂度O(n).这种方法用文字描述不容易说清楚,下面用每一步运算的图示来表达.伪代码如下: maxsofar=end=; ,n) end=max(end+x[i],) ...

  9. 绑定内网和安全redis和mongo以及MQ

    redis允许局域网访问其实很简单.网上一堆都不怎么靠谱. 特此记录一下. 可参考此篇 假设A B 两台机器 在B(ip:192.168.1.99)机器上修改redis配置文件 bind 192.16 ...

  10. VC++ GetSafeHwnd()和GetSafeHandle()

    GetSafeHwnd()和GetSafeHandle()的主要区别: 使用者不同: (1)窗体使用:GetSafeHwnd()用于获取窗体的安全句柄(即HWND),有了HWND我们就可以方便的对HW ...