前段时间因为项目需求,移除了项目中的微信支付SDK和支付宝支付SDK,这种状况下须要本身搞定支付,第一时间考虑到的是使用openshare,可是当下载openshare下来后发现,openshare的支付接口,并不能直接替换官方SDK支付接口,
官方SDK的实现逻辑是后台订单签名完成后,客服端传签名信息及参数给支付SDK,支付SDK生成协议url,而后拉起第三方支付APP,
而openshare的支付接口是直接传拉起支付的协议url地址,将生成协议url地址的操做也交给后台来生成, 这样的话后台须要修改代码,
可否不修改后台代码,弄一个支付接口直接替换官方SDK支付接口,实现无缝对接呢,因而就研究了下微信和支付宝支付时APP间通信关系,最后封装成XHPayKit.git
1.XHPayKit拥有和官方SDK相似接口,能够直接替换官方SDK支付接口,若是你使用过官方SDK,那么转换为本库你只需花费极短期.
2.XHPayKit只有10kb大小,不用导入任何依赖库,即可实现微信支付、支付宝支付,若是你想为项目瘦身或因为某种缘由,不想使用官方SDK实现支付功能,此库将是一个不错的选择.
3.XHPayKit使用时,不须要配置微信等平台appid等信息,服务端配置就能够了,由于后台签名订单时会返回appid等信息给客户端.github
1.先在微信、支付宝开放平台注册你的应用,并得到支付能力
2.导入此库,并请将 weixin 、 alipay 字段添加到info.plist白名单
3.添加本身APP URL Schemes,和微信回调URL Schemes,详见README文档服务器
//微信支付参数,下面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){//支付成功
}
}];
复制代码
//支付宝订单签名,此签名由后台签名订单后生成,并返回给客户端(与官方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){//支付成功
}
}];
复制代码
#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;
复制代码
{
"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/…微信