摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在作的过程当中也遇到些问题,因此如今总结梳理一下,分享给有须要的人,也为本身之后回顾留个思路。php
一:微信支付接入准备工做:html
首先,微信支付,只支持企业用户,我的用户是不能接入微信支付的,因此要想接入微信支付,首先须要有微信公众号,这个的企业才能申请。有了微信公众号,就能申请微信支付的相关内容,因此在准备开始写代码以前须要先把下面的这些参数申请好:公众帐号ID、微信支付商户号、API密钥、AppSecret是APPID对应的接口密码、回调地址(回调必须保证外网能访问到此地址)、发起请求的电脑IPjava
二:微信支付流程说明:git
有了上面提到的这些参数,那咱们就能够接入微信支付了,下面我来看下微信支付的官方文档(https://pay.weixin.qq.com/wiki/doc/api/index.html)、访问该地址能够看到有多种支付方式能够选择,咱们这里选择扫码支付的方式(https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1)web
这里咱们选择模式二,下面看下模式二的时序图,以下图:spring
模式二与模式一相比,流程更为简单,不依赖设置的回调支付URL。商户后台系统先调用微信支付的统一下单接口,微信后台系统返回连接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时,过时后扫码不能再发起支付。api
业务流程说明:安全
(1)商户后台系统根据用户选购的商品生成订单。springboot
(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;服务器
(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码连接code_url。
(4)商户后台系统根据返回的code_url生成二维码。
(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
(6)微信支付系统收到客户端请求,验证连接有效性后发起用户支付,要求用户受权。
(7)用户在微信客户端输入密码,确认支付后,微信客户端提交受权。
(8)微信支付系统根据用户受权完成支付交易。
(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果经过短信、微信消息提示用户。微信客户端展现支付交易结果页面。
(10)微信支付系统经过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收状况,通知微信后台系统再也不发送该单的支付通知。
(11)未收到支付通知的状况,商户后台系统调用【查询订单API】。
(12)商户确认订单已支付后给用户发货。
三:微信支付所须要的maven依赖:
<!--生成二维码jar--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.1</version> </dependency>
四:微信支付调用统一下单接口的核心代码
3.1:微信支付工具类:
HttpUtil.java
package com.micai.springboot.util.pay.wx; public class PayConfigUtil { //初始化 // public final static String APP_ID = "11111111111"; //公众帐号appid(改成本身实际的) // public final static String APP_SECRET = ""; // public final static String MCH_ID = "111111"; //商户号(改成本身实际的) // public final static String API_KEY = "11111111111"; //(改成本身实际的)key设置路径:微信商户平台(pay.weixin.qq.com)-->帐户设置-->API安全-->密钥设置 //统一下单 public final static String UFDODER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // public final static String NOTIFY_URL = "http://xxxxxxx"; //微信支付回调接口,就是微信那边收到(改成本身实际的) // //企业向我的帐号付款的URL // public final static String SEND_EED_PACK_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; // // public final static String CREATE_IP = "113.69.246.11";//发起支付ip(改成本身实际的) }
package com.micai.springboot.util.pay.wx; import com.google.zxing.common.BitMatrix; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.OutputStream; /** * 二维码生产工具类 */ public class QRUtil { private static final int BLACK = 0xFF000000; private static final int WHITE = 0xFFFFFFFF; private QRUtil() {} public static BufferedImage toBufferedImage(BitMatrix matrix) { int width = matrix.getWidth(); int height = matrix.getHeight(); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE); } } return image; } public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException { BufferedImage image = toBufferedImage(matrix); if (!ImageIO.write(image, format, file)) { throw new IOException("Could not write an image of format " + format + " to " + file); } } public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException { BufferedImage image = toBufferedImage(matrix); if (!ImageIO.write(image, format, stream)) { throw new IOException("Could not write an image of format " + format); } } }
访问支付url返回微信二维码,以下图:
使用微信的扫一扫,扫码支付,以下图:
微信支付回调,以下图:
这里对于回调只是简单输出了日志,你能够根据本身的实际状况选择作相应的处理,通常都是对订单的支付状态作更新。
六:总结:
通过上面的因此流程,相信你们都明白了微信支付的流程,这里咱们对上面的流程作个总结,要想接入微信支付,必须是企业用户才行,我的用户不支持,因此在开始写代码以前,要和公司的相关负责人申请好微信支付的相关配置参数,有了这些才能进行下面的工做,这里最重要的一点就是微信支付的回调了,回调,在生产环境必须配置能够外网访问的URL,同时域名必须是备案过的,二级域名也能够,这里咱们为了方便测试,因此就使用了内网穿透工具natapp,该工具既有免费通道也有收费通道,收费通道也很便宜,若是只是测试,免费通道就够用了,另外还有一点要注意,就是微信支付的回调,默认微信是回调好几回的,因此会有重复回调的问题,这里留给你们一个思考,怎么防止微信的屡次回调,以避免影响业务,但愿有兴趣的小伙伴能够留言交流。以上就是微信支付(扫码支付模式二)的所有内容了,有想要彻底源代码的小伙伴,能够加群交流,群号:715224124。