前言
前段时间由于项目需求, 移除了项目中的微信支付 SDK 和支付宝支付 SDK, 这种情况下需要自己搞定支付, 第一时间考虑到的是使用 openshare, 但是当下载 openshare 下来后发现, openshare 的支付接口, 并不能直接替换官方 SDK 支付接口,
官方 SDK 的实现逻辑是后台订单签名完成后, 客服端传签名信息及参数给支付 SDK, 支付 SDK 生成协议 url, 然后拉起第三方支付 APP,
而 openshare 的支付接口是直接传拉起支付的协议 url 地址, 将生成协议 url 地址的操作也交给后台来生成, 这样的话后台需要修改代码,
能否不修改后台代码, 弄一个支付接口直接替换官方 SDK 支付接口, 实现无缝对接呢, 于是就研究了下微信和支付宝支付时 APP 间通讯关系, 最后封装成 XHPayKit.
特性:
1.XHPayKit 拥有和官方 SDK 类似接口, 可以直接替换官方 SDK 支付接口, 如果你使用过官方 SDK, 那么转换为本库你只需花费极短时间.
2.XHPayKit 只有 10kb 大小, 不用导入任何依赖库, 便可实现微信支付支付宝支付, 如果你想为项目瘦身或由于某种原因, 不想使用官方 SDK 实现支付功能, 此库将是一个不错的选择.
3.XHPayKit 使用时, 不需要配置微信等平台 appid 等信息, 服务端配置就可以了, 因为后台签名订单时会返回 appid 等信息给客户端.
注意:
1. 先在微信支付宝开放平台注册你的应用, 并获得支付能力
2. 导入此库, 并请将 weixin alipay 字段添加到 info.plist 白名单
3. 添加自己 APP URL Schemes, 和微信回调 URL Schemes, 详见 README 文档
使用方法:
1. 微信支付
- // 微信支付参数, 下面 7 个参数, 由后台签名订单后生成, 并返回给客服端 (与官方 SDK 一致)
- // 注意: 请将下面参数设置为你自己真实订单签名后服务器返回参数, 便可进行实际支付
- XHPayWxReq *req = [[XHPayWxReq alloc] init];
- req.openID = @"";
- req.partnerId = @"";
- req.prepayId = @"";
- req.nonceStr = @"";
- req.timeStamp = 1518156229;
- req.package = @"";
- req.sign = @"";
- // 传入订单模型, 拉起微信支付
- [[XHPayKit defaultManager] wxpayOrder:req completed:^(NSDictionary *resultDict) {
- NSLog(@"支付结果:\n%@",resultDict);
- NSInteger code = [resultDict[@"errCode"] integerValue];
- if(code == 0){// 支付成功
- }
- }];
2. 支付宝支付
- // 支付宝订单签名, 此签名由后台签名订单后生成, 并返回给客户端 (与官方 SDK 一致)
- // 注意: 请将下面值设置为你自己真实订单签名, 便可进行实际支付
- NSString *orderSign = @"很长的一串支付宝订单签名";
- // 传入支付宝订单签名 和 自己 App URL Scheme, 拉起支付宝支付
- [[XHPayKit defaultManager] alipayOrder:orderSign fromScheme:@"XHPayKitExample" completed:^(NSDictionary *resultDict) {
- NSLog(@"支付结果:\n%@",resultDict);
- NSInteger status = [resultDict[@"ResultStatus"] integerValue];
- if(status == 9000){// 支付成功
- }
- }];
3. 在 Appdelegate 中添加以下代码 - 处理第三方支付跳回商户 app 携带的支付结果 Url
- #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
- /** iOS9 及以后 */
- - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
- {
- BOOL result = [[XHPayKit defaultManager] handleOpenURL:url];
- if (!result) {// 这里处理其他 SDK(例如 QQ 登录, 微博登录等)
- }
- return result;
- }
- #endif
- /** iOS9 以下 */
- - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
- {
- BOOL result = [[XHPayKit defaultManager] handleOpenURL:url];
- if (!result) {// 这里处理其他 SDK(例如 QQ 登录, 微博登录等)
- }
- return result;
- }
其它接口:
- /**
- 是否安装微信
- @return 已安装 YES, 未安装 NO
- */
- +(BOOL)isWxAppInstalled;
- /**
- 是否安装支付宝
- @return 已安装 YES, 未安装 NO
- */
- +(BOOL)isAliAppInstalled;
支付结果 resultDict 释义:
微信
- {
- "errCode": 0,
- "errStr": "成功"
- }
- // 以下状态码含义与官方 SDK 一致
- errCode = 0,
成功 errCode = -1,
普通错误类型 errCode = -2,
用户点击取消并返回 errCode = -3,
发送失败 errCode = -4,
授权失败 errCode = -5,
微信不支持
支付宝
- {
- "result":"","resultStatus":"9000","memo":" 支付成功 "
- }
- // 以下状态码含义与官方 SDK 一致
resultStatus = 9000, 支付成功
resultStatus = 8000, 正在处理中, 支付结果未知 (有可能已经支付成功), 请查询商户订单列表中订单的支付状态
resultStatus = 4000, 支付失败
resultStatus = 5000, 重复请求
resultStatus = 6001, 用户中途取消
resultStatus = 6002, 网络连接出错
resultStatus = 6004, 支付结果未知 (有可能已经支付成功), 请查询商户订单列表中订单的支付状态
小结:
XHPayKit 的实现非常简单, 感兴趣的同学可以下载下来研究下支付时 APP 间通讯.
代码地址: github.com/CoderZhuXH/
来源: https://juejin.im/post/5a90dd3a6fb9a0634912b755