【iOS】集成支付宝支付/银联支付/微信支付

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuming3834/article/details/51226056

前言

前些时一个朋友做了 一个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。
8100453

这个问题,集成使用的是银联的测试账号。第一天集成的时候什么问题都没有,集成完了就关机睡觉了。第二天再来运行工程,发现这个提示。不知道怎么解决。最后运行银联提供的Demo也是这个错误。第三天再次运行也是这个错误。百度没有答案,最后只能去银联论坛发帖求助了。

总结

  • 敲代码之前明确目的;
  • 分析三类支付之间的异同点;
  • 集成之前就要知道,封装是为了好用,便于维护。
  • 继续努力。

猜你喜欢

转载自blog.csdn.net/zhuming3834/article/details/51226056
今日推荐