一、配置

1、开通"大众年夜众平台支付功能

商户号

pc微信支付phpJAVA PC端扫码付出一微信付出 Ruby

微信支付功能先要申请微信(企业)"大众平台,然后开通企业"大众年夜众平台付功能。
下图为微信(企业)公众平台页面,可以看到商户号等信息

微信公众号APPID

从开拓-基本配置中获取APPID

2、微信商户平台干系配置

微信商户平台干系配置

由于微信"大众平台调度,"大众平台微信支付公众号支付授权目录、扫码支付回调URL配置入口于2017年8月1日迁移至商户平台(pay.weixin.qq.com),以是微信支付配置和干系信息要登录商户平台才能拿到。
(估计是微信想要把"大众年夜众号的管理功能和开拓功能分离)

回调链接

从微信商户平台的产品中央-开拓配置-支付配置配置扫码回调链接(扫码回调链接便是你项目中微信支付回调函数名称,这里须要的是加了项目域名的函数全称,必须担保能从公网访问。
为什么须要一个回调函数呢?这属于微信支付的回调机制:当用户利用微信支付完成后,你从本地是无法得知是否支付成功的,而微信这边在获取到支付完成的状态后,主动去访问你所设置的回调函数地址,将支付状态等干系信息返回,我们只要在回调函数中止定支付状态,就能够便捷的进行下一步操作!

设置API密钥

下载微信sdk

微信sdk是微信官方给出的微信支付demo,个中有很多好用的工具类,demo本身也可以为我们的支付接口开拓供应参考(https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1)

把sdk导入到项目中

二、开拓

紧张业务流程

紧张业务流程

(1)商户后台系统根据用户选购的商品天生订单。

(2)用户确认支付后调用微信支付【统一下单API】天生预支付交易;

(3)微信支付系统收到要求后天生预支付交易单,并返复活意营业会话的二维码链接code_url(code_url便是微信支付地址)。

(4)商户后台系统根据返回的code_url天生二维码(用第三方插件天生二维码)。

(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。

(6)微信支付系统收到客户端要求,验证链接有效性后发起用户支付,哀求用户授权。

(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。

(8)微信支付系统根据用户授权完成支付交易。

(9)微信支付系统完成支付交易后给微信客户端返复活意营业结果,并将交易结果通过短信、微信提示用户。
微信客户端展示支付交易结果页面。

(10)微信支付系统通过发送异步关照商户后台系统支付结果。
商户后台系统需回答吸收情形,关照微信后台系统不再发送该单的支付关照。

这是官方给出的文档,这里再梳理一下。
纯挚做PC端扫一扫开拓很大略,紧张是向微信支付的【统一下单API】要求,发送订单信息和署名(署名比较麻烦,可能前期测试会报多次署名缺点,不过官方SDK中有天生署名的方法,当然,自己也可以写),要求成功微信支付返回二维码链接code_url,把稳这是微信支付的链接,不是二维码!
不是二维码!
不是二维码!
二维码须要自己天生,不要直接就把code_url挂在页面上~

要求【统一下单API】的参数列表

好了,上代码~

与支付无关的业务逻辑

与支付无关的业务逻辑

这里我单独创建一个类PayController来写自己的业务逻辑,天生业务订单啊,业务订单保存在数据库啊,查询订单信息啊,验证是否支付完成啊等等,我的业务逻辑比较大略,仅供参考~

微信支付逻辑

微信支付逻辑

1、天生署名,然后打包成【统一下单API】哀求格式的订单(参数列表),微信支付哀求为XMl格式

2、调用【统一下单API】微信接口,将我们打包好XMl格式的参数列表发送给【统一下单接口】,调用成功会吸收到XMl格式的返回值,解析成我们须要的格式,判断是否要求 成功,成功的话是会返回code_url的

3、然后我们把code_url天生二维码展现给用户就OK了!

4、用户支付完成后,微信会访问我们的回调接口,根据返回的结果修正数据库支付状态

要求【统一下单API】返回参数列表

将微信支付所须要的固定参数封装到类WXpayConfig中

封装固定参数

WXPayController,主掌握器

如果要求【统一下单接口】的参数精确,署名也没有报错,那我们就能成功获取到code_url,从而天生二维码,让用户扫码支付了。

天生二维码工具类QRCodeUtil

利用了第三方工具类zxing,这里用到的zxing依赖包请自行下载

前端轮询

当用户支付完成后,微信成功调用了我们的回调方法,数据库订单状态修正为“已支付”,Java后真个事情就基本完成了,那前端怎么知道用户完成了支付呢?现在普遍的办法是,前端写方法轮询支付状态,限定韶光内查询到支付状态为“已支付”就进行下一步操作,限定韶光后未支付就做支付超时的操作。
本项目用户查询支付状态的代码已经写在了之前“与支付无关的业务逻辑”中了~