iOS支付宝、微信支付整合封装

微信、支付宝支付SDK安装

添加podFile文件
若还未使用cocoaPads的同学可以去微信支付宝的开放平台去下载相关的SDK,相关地址放在下面了

pod 'WechatOpenSDK'

pod 'AlipaySDK-iOS'
环境配置
  • 微信支付
添加URLTypes
> 单击项目 -> Info -> URL TypesURL SchemesAPPID

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNTT30pa-1590415090409)(http://blog.ailschn.com/upload/2019/9/15500200-10980e50830859dc-fdcf531151d5430a9d1f84026690d2b5.png)]

  • 支付宝支付

同微信,新添加一个URLTypes,URLSchemes 需设置唯一字符串

支付类整合

直接上代码

  • AppDelegate.m
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([url.host isEqualToString:@"safepay"]) {
        // 支付跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            [[PayManagger shareManage] alipayResp:resultDic];
        }];
        
        // 授权跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
            // 解析 auth code
            NSString *result = resultDic[@"result"];
            NSString *authCode = nil;
            if (result.length>0) {
                NSArray *resultArr = [result componentsSeparatedByString:@"&"];
                for (NSString *subResult in resultArr) {
                    if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
                        authCode = [subResult substringFromIndex:10];
                        break;
                    }
                }
            }
            NSLog(@"授权结果 authCode = %@", authCode?:@"");
        }];
    }
    return YES;
}

// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
    if ([url.host isEqualToString:@"safepay"]) {
        // 支付跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
//            NSLog(@"result = %@",resultDic);
            [[PayManagger shareManage] alipayResp:resultDic];
        }];
        
        // 授权跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
            // 解析 auth code
            NSString *result = resultDic[@"result"];
            NSString *authCode = nil;
            if (result.length>0) {
                NSArray *resultArr = [result componentsSeparatedByString:@"&"];
                for (NSString *subResult in resultArr) {
                    if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
                        authCode = [subResult substringFromIndex:10];
                        break;
                    }
                }
            }
            NSLog(@"授权结果 authCode = %@", authCode?:@"");
        }];
    }
    return YES;
}
  • PayManagger.h
//
//  PayManagger.h
//  JY
//
//  Created by 王杰 on 2020/02/21.
//  Copyright © 2020 zrgj. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <AlipaySDK/AlipaySDK.h>
#import <WechatOpenSDK/WXApi.h>

typedef NS_ENUM(NSUInteger, PayType) {
    Alipay = 1,//支付宝支付
    WXPay,//微信支付
    OtherPay
};

typedef void(^PayBlock)(BOOL success,NSString * _Nonnull msg);

NS_ASSUME_NONNULL_BEGIN

@interface PayManagger : NSObject <WXApiDelegate>

+ (instancetype)shareManage;

/**
 拉起支付
 
 @param orderString 拉起支付所用数据
 @param type 支付方式
 @param resBlock 支付回调
 */
- (void)pushPaymentWithOrdersign:(id)orderString WithType:(PayType)type Block:(PayBlock)resBlock;


/// 支付宝回调处理
/// @param resultDic 响应结果
- (void)alipayResp:(NSDictionary *)resultDic;

@end

NS_ASSUME_NONNULL_END
  • PayManagger.m
//
//  PayManagger.m
//  JY
//
//  Created by 王杰 on 2020/02/21.
//  Copyright © 2020 飞鱼旅行. All rights reserved.
//

#import "PayManagger.h"

@interface PayManagger ()

@property (nonatomic ,copy)PayBlock block;

@end

@implementation PayManagger

/***
 * 单例设计
 */
static PayManagger *_manager = nil;

+(instancetype)shareManage{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (_manager == nil) {
            _manager = [[PayManagger alloc] init];
        }
    });
    return _manager;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (_manager == nil) {
            _manager = [super allocWithZone:zone];
        }
    });
    return _manager;
}

-(id)copy{
    return _manager;
}

-(id)mutableCopy{
    return _manager;
}

/**
拉起支付

@param orderString 拉起支付所用数据
@param type 支付方式
@param resBlock 支付回调
*/
- (void)pushPaymentWithOrdersign:(id)orderString WithType:(PayType)type Block:(nonnull PayBlock)resBlock{
    if (type == Alipay) { //支付宝
        NSString *orderStr = orderString;
        if (StringIsNullOrEmpty(orderStr)) {
            resBlock(NO,@"订单数据异常");
            return;
        }
        LMJWeakSelf(self);
        if (@available(iOS 13.0,*)) {
            [[AlipaySDK defaultService] payOrder:orderStr dynamicLaunch:YES fromScheme:@"aliPayForTaiyue" callback:^(NSDictionary *resultDic) {
                [weakself alipayResp:resultDic];
            }];
        }
        else{
            [[AlipaySDK defaultService] payOrder:orderStr fromScheme:@"aliPayForTaiyue" callback:^(NSDictionary *resultDic) {
                [weakself alipayResp:resultDic];
            }];
        }
    }
    else if (type == WXPay){
        PayReq *req = [[PayReq alloc] init];
        req = [PayReq mj_setKeyValues:orderString];
        //注:以下数据为假数据,实际使用请换上自己的数据
//        req.openID = @""; //APPID
//        req.partnerId = @"";//商户号
//        req.prepayId = @"wx20095458581091526e83463d33545855302";//预支付交易会话ID
//        req.nonceStr = @"pvtLXJB9vKOB32MHvwBmQOnv0czr4upk";//随机字符串
//        req.package = @"Sign=WXPay";//扩展字段
//        req.timeStamp = 1545271179;//时间戳
//        req.sign = @"A37DE7C64DA8C4CEB9E2EC2B6A38B56689EB9B43C2CF1CB7C81E64288990FF1F";//签名
        [WXApi sendReq:req completion:^(BOOL success) {
            if (!success) {
                resBlock(NO,@"没有安装维修");
            }
        }];
    }
    else{
        
    }
    
    self.block = resBlock;
}

//支付宝回调处理
- (void)alipayResp:(NSDictionary *)resultDic{
    NSString *resultStatus = resultDic[@"resultStatus"];
    switch ([resultStatus integerValue]) {
        case 9000: //订单支付成功
        {
            self.block(YES,@"订单支付成功");
        }
            break;
        case 8000: //正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
        {
            self.block(NO,@"订单处理中,请稍后查询订单列表");
        }
            break;
        case 4000: //订单支付失败
        {
            self.block(NO,@"订单支付失败");
        }
            break;
        case 5000: //重复请求
        {
            self.block(NO,@"请勿重复请求支付");
        }
            break;
        case 6001: //用户中途取消
        {
            self.block(NO,@"中途取消支付");
        }
            break;
        case 6002: //网络连接出错
        {
            self.block(NO,@"网络连接出错,请检查网络");
        }
            break;
        case 6004: //支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
        {
            self.block(NO,@"订单处理中,请稍后查询订单列表");
        }
            break;

        default:{
            
        }
            break;
    }
}

//微信支付回调
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp*)resp{
    if([resp isKindOfClass:[PayResp class]])
    {
        //支付返回结果,实际支付结果需要去微信服务器端查询
        PayResp *response = (PayResp*)resp;
        switch (response.errCode) {
            case WXSuccess:
            {
                NSLog(@"微信支付-成功");
                self.block(YES,@"订单支付成功");
                break;
            }
            case WXErrCodeUserCancel:
            {
                NSLog(@"微信支付-用户点击取消");
                self.block(NO,@"中途取消支付");
                break;
            }
            default:
                self.block(NO,@"订单处理中,订单状态未知");
                break;
        }
    }
}

@end

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值