描述
接入支付宝和微信支付详情参阅官网,需要注意的是支付宝支付可以使用开发环境进行测试,但是微信支付是不可以的。官网传送门:
设计思路
使用策略+工厂方法模式,工厂方法用于创建不同场景下的策略,本文中即创建不同商户的支付策略,具体的策略实现类有其不同的算法逻辑。
类图如下:
策略接口IPayStrategy定义了需要子类实现的方法 ,每一种支付方式即为支付策略,场景类通过枚举类获取策略类型,通过PayFactory创建场景类需要的支付策略,工厂方法可以创建默认商户的支付策略,也可以在工厂方法里再写一个使用指定商户id或第三方支付的沙箱环境的方法 ,payBaseModel为一些业务参数,例如标题,描述,回调接口以及支付完的跳转页面等。
代码
准备工作
核心包:
1 | <dependency> |
注意:由于微信最新的支付sdk在maven仓库里已经没有,合并为了weixin-java-tools里的一个模块,详见https://gitee.com/binary/weixin-java-tools。本文所使用的微信支付sdk是官网下载后自己编译的。
策略接口
1 | public interface IPayStrategy { |
业务参数
1 | public class PayBaseModel implements Serializable { |
支付策略实现
支付宝APP支付:
1 | /** |
支付宝网页H5支付:
1 | /** |
微信APP支付:
1 | /** |
微信网页支付:包括微信公众号内跳转支付(或者小程序支付)、微信外H5页面跳转支付,由于微信小程序支付的请求逻辑和公众号内支付基本一致,唯一不同的就是appid和appSecret不同(appSecret用于公众号内和小程序内或者用户的openId,即使同一商家,公众号和小程序的appID和appSecret也不一致,而由此获得的同一个用户的openID也不一致),因此可以和公众号内使用相同的逻辑。
1 | /** |
相关工具类
1 | public final class PayUtil { |
策略枚举
1 | public enum PayAlgorithm { |
策略工厂
工厂创建策略时,需要传入策略所需的一些配置参数,本文中商户只有一个,因此只有一个创建默认商户的支付策略。
1 | /** |
调用方式
1 | IPayStrategy strategy = PayFactory.createDefaultTubituStrategy(PayAlgorithm.WX_WEB,""); |
前端js
这是从前端那里偷过来的公众号内支付js,之所以记录是因为H5页面的支付和小程序的支付官方都提供了案例,而且只有一种调用方式。但是公众号内支付有两种调用方式。
第一种:调用微信浏览器的js-api:
1 | function onBridgeReady(){ |
第二种:先引入http://res.wx.qq.com/js/jwexin-1.2.0.js
,然后代码如下:
1 | wx.config({ |
注意:实际过程中前端发现,即使是调用jsapi的方式,也需要引入js-sdk的那个js。具体原因暂时未知,官方文档也没有提到。
第二种方式里的signature的获取也并不复杂:
- 获取AccessToken
- 获取jsapi_ticket
- 生成signature
下面提供一种解决方案参考:
1 | /** |
回调函数
1 | /** |
注意:由于设置redirect_url后,回跳指定页面的操作可能发生在:1,微信支付中间页调起微信收银台后超过5秒 2,用户点击“取消支付“或支付完成后点“完成”按钮。因此无法保证页面回跳时,支付流程已结束,所以商户设置的redirect_url地址不能自动执行查单操作,应让用户去点击按钮触发查单操作