您的位置:首页 > 移动开发 > 微信开发

【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也是这个错误。第三天再次运行也是这个错误。百度没有答案,最后只能去银联论坛发帖求助了。

总结

敲代码之前明确目的;

分析三类支付之间的异同点;

集成之前就要知道,封装是为了好用,便于维护。

继续努力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: