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

一 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. 飘逸的python - ord和chr以及unichr

    ord是unicode ordinal的缩写,即编号 chr是character的缩写,即字符 ord和chr是互相相应转换的. 可是因为chr局限于ascii,长度仅仅有256. 于是又多了个uni ...

  2. 5.1 Zend_Log_Writer

    22.2.2. 写入到数据库 22.2.3. 踩熄Writer 22.2.4. 測试 Mock 22.2.5. 组合Writers

  3. struts2防止表单重复提交的解决方案

    一.造成重复提交主要的两个原因:    在平时的开发过程中,经常可以遇到表单重复提交的问题,如做一个注册页面,如果表单重复提交,那么一个用户就会注册多次,重复提交主要由于两种原因. 1. 一是,服务器 ...

  4. 56. Two Sum【easy】

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  5. 封装locaostorage

    const ls = localStorage export default { setItem(name, value) { ls.setItem(name, JSON.stringify(valu ...

  6. Python处理文件以及文件夹常用方法

    1.创建文件并且写入 2.多行读取文件的方式 readlines() 3.一次读取全部内容 4.文件的删除 5.shutil 模块实现文件的复制 6.文件的重命名 7.获取文件的后缀名 8.pytho ...

  7. excel 笔记

    1.复制公式到整列(至文件尾): 当你想复制公式到整列(至文件尾)可选中有公式的单元格,待出现黑色填充柄时,双击即可

  8. org.apache.hadoop.hbase.DoNotRetryIOException: Class org.apache.phoenix.coprocessor.MetaDataEndpointImpl cannot be loaded Set hbase.table.sanity.checks to false at conf or table descriptor if you want

    https://stackoverflow.com/questions/38495331/apache-phoenix-unable-to-connect-to-hbase 这个坑不该啊 首选配置hb ...

  9. ajax——实现三级联动下拉列表

    数据库: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  10. golang :连接数据库闲置断线的问题

    golang在进行数据库操作,一般来说我们使用Open函数创建一个数据库(操作)句柄:func Open(driverName, dataSourceName string) (*DB, error) ...