【iOS】集成支付宝支付/银联支付/微信支付
2016-04-23 14:23
846 查看
前言
前些时一个朋友做了 一个swift版本的Demo,集成了支付宝支付、银联支付和微信支付。swift版本–传送门但是在github上面问题他,怎么不搞一个OC版本的。后来我就自己做了一个。利用下班的时间,集成起来也还是很快的。OC版本–传送门。欢迎star欢迎Issues。基本思路
1.在理清基本思路之前,我们需要知道三类支付的异同点。微信支付,需要在AppDelegate里面注册,在AppDelegate里面处理回调;
银联支付,需要在AppDelegate处理回调;
支付宝支付,可以在AppDelegate里面处理回调,也可以在调用支付的方法里面处理,实际测试发现,不需要在AppDelegate里面处理。
2.怎么把AppDelegate里面回调的url传递出来。
我是使用一个单例处理的,通过单例传值的方式,把url传递到支付类HGDQPay里面处理的。
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{ [HGDQPay shareHGDQPay].callBackURL = url; return YES; }
在支付类HGDQPay里面的处理
/** * callBackURL的set方法 * * @param callBackURL 银联支付成功回调 */ - (void)setCallBackURL:(NSURL *)callBackURL{ NSLog(@"host = %@",callBackURL.host); // 支付宝 不走这个回调 if ([callBackURL.host isEqualToString:@"safepay"]) { //跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:callBackURL standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; } // 银联 else if([callBackURL.host isEqualToString:@"uppayresult"]){ [self upPay:callBackURL]; } // 微信 else if ([callBackURL.host isEqualToString:@"pay"]){ id idSelf = self; [WXApi handleOpenURL:callBackURL delegate:idSelf]; } }
在这个setter方法里面的做的就是通过host区分三类支付,然后调用不同的支付回调。其中微信的是关联代理。
3.发起支付
这个就是把支付封装成相关的方法即可。问题在怎么把支付后的状态等数据传递出去。我使用的是block的方式。
我们先看看在调用的地方的使用,就知道block的好处了。
/** * 支付宝支付 * * @param sender sender description */ - (IBAction)alipayBtnClick:(UIButton *)sender { [HGDQPay HGDQPayWithAlipay:[HGDQPay getProductData] AlipayCallBack:^(HGDQPayStatus payStatus,NSDictionary *resultDic) { switch (payStatus) { case AlipayStatusSuccess: NSLog(@"AlipayStatusSuccess"); break; case AlipayStatusFail: NSLog(@"AlipayStatusFail"); break; case AlipayStatusDoing: NSLog(@"AlipayStatusDoing"); break; case AlipayStatusCancel: NSLog(@"AlipayStatusCancel"); break; case AlipayStatusNetError: NSLog(@"AlipayStatusNetError"); break; default: break; } NSLog(@"支付宝支付结果:resultDic = %@",resultDic); }]; }
其他支付也是一样的,区别就是微信支付只有状态。
4.怎么样通过block把值传递出去
例如微信支付,首先要给block赋值
/** * 微信支付成功回调 * * @param resp resp description */ - (void)onResp:(BaseResp *)resp { HGDQPayStatus payStatus; switch (resp.errCode) { case WXSuccess: payStatus = WXPayStatusSuccess; break; case WXErrCodeCommon: payStatus = WXPayStatusErrCodeCommon; break; case WXErrCodeUserCancel: payStatus = WXPayStatusErrCodeUserCancel; break; case WXErrCodeSentFail: payStatus = WXPayStatusErrCodeSentFail; break; case WXErrCodeAuthDeny: payStatus = WXPayStatusErrCodeAuthDeny; break; case WXErrCodeUnsupport: payStatus = WXPayStatusErrCodeUnsupport; break; default: payStatus = 2016; break; } [HGDQPay shareHGDQPay].wxPayCallBackBlock(payStatus); }
接下来在类方法里面
/** * 微信支付 * * @param wxPayCallBackBlock 支付回调 */ + (void)HGDQPAyWithWXPayCallBack:(WXpayCallBack)wxPayCallBackBlock{ HGDQPay *hg = [HGDQPay shareHGDQPay]; hg.scene = WXSceneSession; hg.token_time = 0; [hg wxpay]; hg.wxPayCallBackBlock = ^(HGDQPayStatus payStatus){ wxPayCallBackBlock(payStatus); }; }
给方法参数的block赋值。
关于block的声明等这个不做说明。
集成中遇见的坑
1.集成支付宝的过程中,各种报错,最后直接使用了支付宝的Demo;2.微信和银联的集成还好,就是银联有这错误8100453。
这个问题,集成使用的是银联的测试账号。第一天集成的时候什么问题都没有,集成完了就关机睡觉了。第二天再来运行工程,发现这个提示。不知道怎么解决。最后运行银联提供的Demo也是这个错误。第三天再次运行也是这个错误。百度没有答案,最后只能去银联论坛发帖求助了。
总结
敲代码之前明确目的;分析三类支付之间的异同点;
集成之前就要知道,封装是为了好用,便于维护。
继续努力。
相关文章推荐
- 实现微信布局的四种方式(二)
- 微信支付Native扫码支付模式二之CodeIgniter集成篇
- OD调试一个小程序的思考总结
- iOS开发之微信自动抢红包功能
- 微信公众号支付失败的各种原因
- discuz 微信扫描论坛二维码提示“接口错误(ERR05)”
- 微信公众号如何做情感营销?
- 微信学习_01_开发环境搭建
- 实现微信布局的四种方式(一)
- 微信公众号第三方开发之三创建一键登录页授权给第三方平台
- Java公众号推荐 - BeJavaGod
- 判断浏览器(微信、微博、QQ)、操作系统、横竖屏等
- 培训机构微信在线报名
- 微信支付后默认关注公众号
- iOS- 微信支付 (服务器调起支付 )以及回调不成功的原因 不看后悔
- 微信支付:curl出错,错误码:60
- 微信刷步の悦动圈
- 微信电脑版2016 v2.0.0.80 官方正式版
- 毕设 微信分享
- file_get_contents微信头像等待时间过长的原因