用Java实现【微信】扫码支付

前提

以下内容是基于模式二开发,在开发之前需要先到微信支付官网注册账号,并获取到以下信息

appid:wx1137939101111111(公众账号id)

mch_id:1438111111 (商户号)

key:4Inn0va1eSxOnl1neqsxwuhan1111111 (密钥)

send_url:https://api.mch.weixin.qq.com/pay/unifiedorder(统一下单API)

notify_url:http://127.0.0.1:8080/sop/order/notify/wechat(支付成功回调地址)

官网

微信支付官网: https://pay.weixin.qq.com/

扫码支付开发者文档:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1

模式

需要在公众平台后台设置支付回调URL ,用于接收用户扫码后微信支付系统回调的productid和openid

直接调用统一下单API 即可,相对于模式一更为简洁

一、定义接口对象

根据统一下单接口API 定义四个对象,用于发送和接收数据 UnifiedOrderRequest.java 统一下单请求参数(必填项)。

UnifiedOrderResponse.java统一下单请求参数(非必填项)。

UnifiedOrderRequestExt.java统一下单返回参数(必填项)。
在这里插入图片描述
UnifiedOrderResponseExt.java统一下单返回参数(非必填项)。
在这里插入图片描述

二、定义一个标签用于显示二维码

调用统一下单API成功后,会返回一系列XML数据,其中code_url表示返回的预支付交易链接,可将其生成二维码图片。
在这里插入图片描述

三、根据统一下单 API 生成订单

将系统内部订单号传入请求参数的out_trade_no中,用于后续操作的唯一标识符;

请求参数中的sign是验证参数合法性的唯一标识,需要根据微信支付签名算法来生成;

使用XStream将对象转换为XML,由于微信的请求参数中大量使用下划线,但下划线在XStream中是关键字,因此需要把下划线转换为双下划线,避免报错;

生成32位随机数,方式为当前时间加随机数;

拼接签名数据;

按照签名算法生成签名。

四、调用统一下单 API

将生成的订单发送给微信,同时接收微信的返回参数,读取其中的code_url

如果发送的订单信息不符合要求,则会在返回参数中告知问题:

订单合法,返回参数中:

return_code=SUCCESS return_msg=OK result_code=SUCCESS

订单不合法,返回参数中:

return_code=FAIL return_msg=具体错误原因
在这里插入图片描述
在这里插入图片描述

五、根据返回的 code_url 生成二维码图片

二维码的生成:
https://github.com/zxing/zxing/tree/zxing-3.0.0

-需要准备的包信息

六、接收回调

-用户通过微信扫描二维码并支付成功后,微信会根据之前订单中的notify_url回调地址进行回执;

-此处提供给微信的回调地址必须是外网可访问的,否则无法正常接收回执信息;

-由于回执时并没有携带用户信息,所以如果使用了诸如shiro等安全框架的,需要给予该回执地址一个访问许可,否则会被安全框架屏蔽;

-发送回执是异步进行,由于网络等不确定因素,微信不保证回执一定成功;

-微信会通过一定的策略定期重启发送通知,通知频率为:

15/15/30/180/1800/1800/1800/1800/3600(单位:秒);

-虽然是异步回执,但并不需要采用ajax异步接收的方式来接收数据。
在这里插入图片描述

七、处理回执内容

-数据是通过IO流发送,所以也需要通过IO流接收;

-微信发送回执用户接收后,需要通过IO流的方式告知微信接收成功,否则微信认为回执失败;

-接收到回执信息后,最关键是验证签名来确保信息的有效性和安全性,验签的方式和发送订单签名的方式一致;

-验签成功,且回执信息中 result_code=SUCCESS 表示回执信息有效;

-从回执信息中可获取到out_trade_no,这是之前发送的用户订单唯一标识符,通过该信息可以继续处理用户订单;

-所有流程处理完毕后,必须以XML格式编写回执信息,并通过IO流的方式告知微信回执接收成功。
在这里插入图片描述
-从IO流中读取回执信息;
在这里插入图片描述
-读取的回执信息时XML格式需要通过jDom的SAXBuilder解析为Map。

八、轮询订单状态,实现支付完成后页面自动跳转

-由于支付回执是异步的,所以即使捕获到异步回执也无法实现支付页面的自动跳转;

-因此需要在支付页面打开时设置一个ajax轮询订单状态,一旦订单状态更新,则进行页面跳转。

END
查看更多文章请关注【实训在线】微信公众号
原文首发:http://asing1elife.com/


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部