图 6.9 原生支付模式二时序图
业务流程说明:
(1)商户后台系统根据用户选购的商品生成订单.
(2)用户确认支付后调用微信支付[统一下单 API] 生成预支付交易;
(3)微信支付系统收到请求后生成预支付交易单, 并返回交易会话的二维码链接 code_url.
(4)商户后台系统根据返回的 code_url 生成二维码.
(7)用户在微信客户端输入密码, 确认支付后, 微信客户端提交授权.
(8)微信支付系统根据用户授权完成支付交易.
(9)微信支付系统完成支付交易后给微信客户端返回交易结果, 并将交易结果通过短信, 微信消息提示用户. 微信客户端展示支付交易结果页面.
(10)微信支付系统通过发送异步消息通知商户后台系统支付结果. 商户后台系统需回复接收情况, 通知微信后台系统不再发送该单的支付通知.
(11)未收到支付通知的情况, 商户后台系统调用[查询订单 API] .
(12)商户确认订单已支付后给用户发货.
3, 和微信支付交互方式
1,post 方式提交
2,xml 格式的协议
3, 签名算法 MD5
具体开发;
1. 封装工具类, 比如 md5 加密, 和 xml 转 map map 转 xml 等 , 可以去从微信开发者文档获取部分代码 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1 改造下就行
2. 首先调用统一下单接口
微信开发文档有明确的说明, 需要穿什么参数(比如: appid,mch_id, 微信回调 url) 而且需要按照参数名 ASCII 码从小到大排序(字典序), 使用 URL 键值对的格式, 所以我们使用 sortMap 集合来放参数, 等等 要求
其中, 有个参数叫着 sign(签名), 我们可以通过封装的 工具类获得, 获得后我们可以通过工具去校验 sign 是否正确, 然后吧获取的 sign 在保存到 map 中去, 然后子啊通过工具类 将 map 转成 xml,
第一步, 讲开发文档要求携带的参数 (:appid,mch_id, 微信回调 url) 放在集合 M 中, 因为开发文档有要求, 将集合 M 内非空参数值的参数按照参数名 ASCII 码从小到大排序(字典序), 所以我们使用 sortMap 来装.
第二步, 其中我们需要得到一个 sign(签名), 我们可以通过上面定义的集合得到, 这可以写一个工具类, 具体怎么得到, 开发文档上写的有, 大致是把上面的 map 按开发文档得到一个 string(key value 形式的), 然后在进行 MD5 加密和字符串转大写, 这样就得到了 sign(签名),
然后在吧 sign 放到 sortMap 中
第三步, 然后将得到的 map 转成 xml, 然后在调用微信统一下单提供的连接 把上面得到的 xml 传给微信客户端 , 成功后微信客户端会返回一个 xml , 然后我们在吧 xml 装成 map 获取 位置支付的二维码连接 url, 然后通过谷歌二维码生成工具生成一个二维码. 用户扫码以后, 微信会进行验证, 用户是不是付过款, 支付完成后, 微信会把相关支付结果及用户信息通过数据流的形式发送给商户(这个请求 url 就是上面我们往 sortmap 中放的回调 url), 商户需要接收处理, 并按文档规范返回应答., 然后, 我们获取我们想要的信息, 进行业务处理. 同时我们也要返回信息给微信, 告诉他我们知道用户付款成功了, 不需要推送信息了, 不然微信支付系统一直会给我们推送, 告诉用户付款成功的信息.
代码去我的 GitHub 上下载去: https://github.com/wangbensen/wx_review.git 现在项目我变成私有的了, 因为有人搞坏, 想要的联系就是了.
来源: http://www.bubuko.com/infodetail-2960644.html