JAVA微信扫码支付模式二功能实现完整例子
概述
本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付。实现从点击付费按钮、到弹出二维码、到用户用手机微信扫码支付、到手机上用户付费成功、web网页再自动调整到支付成功后的页面,这一个过程。
详细
一、准备工作
先开通微信公众号,再开通微信公众号里面的微信支付功能,这些是前提条件,多说一句,申请开通微信公众号需要等待审核,然后在开通微信支付功能,还得等待审核,前前后后耗时得好几天。
关于准备工作,再看看微信官方关于“微信支付”的介绍,官方地址 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 。这个是文档的准备,大概可以理解到微信支付有哪些模式,然后大概是怎样一个东东。
然后重点看看如下几个,实际上需要准备的东西,红色花掉的部分(PayConfigUtil类里面),需要根据自己的实际情况填写:
其中APP_ID和APP_SECRET可以在公众平台找着,MCH_ID和API_KEY则在商户平台找到,特别是API_KEY要在商户平台设置好,对于“微信扫码支付模式二”(支付与回调)实际只会用到APP_ID、MCH_ID和API_KEY,其他的都不用。
二、程序实现
这里使用spring mvc做一个购买商品,微信扫码支付的演示。先项目代码截图,
以下摘取重点环节的代码说明下:
1、首先是接入微信接口,获取微信支付二维码。
|
以上代码会按照微信支付的协议,生成类似这样格式的URL:weixin://wxpay/bizpayurl?pr=pIxXXXX
2、根据以上方法所产生的URL生成二维码,这里采用我采用的是google的core.jar包来生成二维码
|
上面代码中涉及到几个工具类:PayConfigUtil、PayCommonUtil、HttpUtil和XMLUtil,其中PayConfigUtil放的就是上面提到一些配置及路径,PayCommonUtil涉及到了获取当前事件、产生随机字符串、获取参数签名和拼接xml几个方法,代码如下:
|
HttpUtil类如下:
|
XMLUtil4jdom类如下:
|
2、支付回调
支付完成后,微信会把相关支付结果和用户信息发送到我们上面指定的那个回调地址,我们需要接收处理,并返回应答。对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
关于支付回调接口,我们首先要对于支付结果通知的内容进行签名验证,然后根据支付结果进行相应的处理流程即可。
支付回调需要在微信公众号的微信支付里面设置回调地址:
|
3、支付后网页自动跳转
web页面弹出二维码后,就开启轮询,询问系统后台支付有微信平台的成功支付返回了,如果有,则跳转到支付成功的页面。
|
三、运行效果
项目导入eclipse后,发表到tomcat中运行,或者通过jetty运行,跑起来后,访问:
点击微信支付:
这个时候在手机上用微信扫码:
支付成功后:
然后web网页会跳转到购买成功的页面,这里需要注意,微信支付回调接口,最好部署在公网的服务器上,这样能被回调,我本地使用改hosts的方法来让支付回调,不成功。
四、注意点
本例子为了演示,所以一些业务逻辑特别简单,例如:订单号的生产,这里只是简单的用当前时间long数字来表示:
|
实际开发的时候需要考虑并且情况下的订单号的唯一性。
还有,回调接口,考虑很简单:
|
实际开发,要把支付成功DB保存下来,以及回调信息log下来等等
五、关于微信支付xml外部实体注入漏洞
参考文章:
http://www.cnblogs.com/hero123/p/9282753.html
本例子对应改动:改写读取XML的逻辑。
加入防注入属性设定:
|
整个类的代码如下:
|
该实现方式来源网络仅供参考。