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

一 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. Mysql User表权限字段说明全介绍

    一:mysql权限表user字段详解: Select_priv.确定用户是否可以通过SELECT命令选择数据. Insert_priv.确定用户是否可以通过INSERT命令插入数据. Update_p ...

  2. php AES加密解密的例子

    一共有两个文件:AES.php(aes算法类文件)和aesDemo.php(应用实例文件) aesDemo.php:例子, <?php require_once('./AES.php'); // ...

  3. sass 的使用

    普通变量 ? 1 $fontSize:12px; 默认变量 ? 1 $fontSize:12px; !default; 变量覆盖:只需要在默认变量之前重新声明下变量即可 ? 1 2 $fontSize ...

  4. 在无法单步调试的情况下找Bug的技巧

    比如说你有一个大的模块A,其组成部分有B,C,D这3个小的模块,现在A出了一个BUG,因为某种原因的限制你无法单步调试.怎么较快地定位BUG发生的根源? 这里记录一下刚才我在找BUG的时候采用的思路, ...

  5. Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署

    Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署 系统版本:CentOS Linux release 7.4.1708 (Core) 最小化安装 内核版本:3.10.0-693. ...

  6. Bootstrap学习笔记(7)--轮播

    说明: 1. 幻灯片效果,外面的div有个id="myppt",class="carousel slide"这个是有图片滑动效果,不加就是直接瞬间换图片,dat ...

  7. Hive入门笔记---2.hive函数大全

    Hive函数大全–完整版 现在虽然有很多SQL ON Hadoop的解决方案,像Spark SQL.Impala.Presto等等,但就目前来看,在基于Hadoop的大数据分析平台.数据仓库中,Hiv ...

  8. linphone 在am335x的编译过程

    环境变量: export PREFIX=/usr export HOSTTPL=arm-linux-gnueabihf export INSTALLDIR=/home/elinux/linphone/ ...

  9. selenuim爬虫实战 (下)

    SuperLOFTERDownloader7.java package test; import java.io.IOException; import java.util.ArrayList; im ...

  10. Spring.Net框架一:Spring.Net简介

    一.Spring.Net简介 Spring.NET为建立企业级应用提供了一套轻量级的解决方案.通过Spring.NET,我们可以用统一且透明的方式来配置应用程序.Spring.NET的重点是为中间层提 ...