iOS 支付宝、微信支付的集成记录

一、前言

  最近项目需求需要集成支付宝和微信支付,以前没有接触过,这次正好乘着这次机会了解下。

  总的来说,客户端的工作不多,无非就是就是集成SDK,然后获取后端传来的参数,吊起支付,回调处理等。

  先附上官方文档链接:

  支付宝:https://docs.open.alipay.com/204

  微信支付:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1

  废话不多说,开始吧。

二、支付宝

  1、先集成SDK

pod ‘AlipaySDK-iOS‘

  2、导入头文件

#import <AlipaySDK/AlipaySDK.h>

  3、构造支付宝管理类,方便项目调用

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface BYAlipayManager : NSObject

//生成支付宝单例类
+ (id)sharePayManager;

//支付宝支付
//aParam 后端返回支付信息
- (void)handleOrderPayWithParams:(NSString *)aParam;

@end

NS_ASSUME_NONNULL_END
#import "BYAlipayManager.h"

@implementation BYAlipayManager

+ (id)sharePayManager{
    static BYAlipayManager *asAlixPay = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        asAlixPay = [[BYAlipayManager alloc] init];
    });
    return asAlixPay;
}

- (void)handleOrderPayWithParams:(NSString *)aParam{
    NSLog(@"aParm = %@",aParam);
    NSString *appScheme = @"alipayBYVideopay";//appScheme是你在项目中添加的URL Type(别写错)
    NSString *orderString = aParam;//aParam[@"payInfo"];

    // NOTE: 调用支付结果开始支付
    [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
        NSLog(@"reslut = %@",resultDic);
        int statusCode = [resultDic[@"resultStatus"]  intValue];

        if (statusCode == 9000){
            //订单支付
            [kKeyWindow makeToast:@"支付成功"];
            [[NSNotificationCenter defaultCenter] postNotificationName:KFNNotificationAlipay_paySuccess object:nil];

        }else{
            //交易失败
            [kKeyWindow makeToast:@"支付异常"];
            [[NSNotificationCenter defaultCenter] postNotificationName:KFNNotificationAlipay_payFaile object:nil];

        }
    }];
}

  说明:

  • 实际支付的时候,后端会给前端一个很长的字符串,里面是特殊处理过的数据,客户端拿到这份数据之后就可以直接调用支付宝的SDK,然后处理回调事件就好了。
  • appScheme 这个字符串是一段特殊的字符串,自取,标明自身APP的,需要添加到项目的 info --->  URL Types 里面,见截图

    

  4、AppDelegate设置

#pragma mark - openURL Delegate

- (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) {
            [self disposeAilyPayResultWith:resultDic];
        }];

        // 授权跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            [self disposeAilyPayResultWith: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?:@"");
        }];
    } else if ([url.scheme containsString:WeiXinPayKey]) {
        if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://pay", WeiXinPayKey]]) {
            return [BYWeiXinPayManager handleOpenUrl:url];
        } else if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://oauth?", WeiXinPayKey]]) {
            return [BYWeiXinPayManager handleOpenUrl:url];
        }
    }
    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) {
            [self disposeAilyPayResultWith:resultDic];
        }];

        // 授权跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            [self disposeAilyPayResultWith: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?:@"");
        }];
    } else if ([url.scheme containsString:WeiXinPayKey]) {
        if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://pay", WeiXinPayKey]]) {
            return [BYWeiXinPayManager handleOpenUrl:url];
        } else if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://oauth?", WeiXinPayKey]]) {
            return [BYWeiXinPayManager handleOpenUrl:url];
        }
    }
    return YES;
}

- (void)disposeAilyPayResultWith:(NSDictionary *)resultDic {
    NSLog(@"支付宝支付跳转 result = %@",resultDic);
    int statusCode = [resultDic[@"resultStatus"]  intValue];

    if (statusCode == 9000){
        //订单支付
        [kKeyWindow makeToast:@"支付成功"];
        [[NSNotificationCenter defaultCenter] postNotificationName:KFNNotificationAlipay_paySuccess object:nil];

    }else{
        //交易失败
         [[NSNotificationCenter defaultCenter] postNotificationName:KFNNotificationAlipay_payFaile object:nil];
        [kKeyWindow makeToast:@"支付异常"];
    }
}

  说明:直接拷贝就行,这块代码是不变的。

  5、调用支付

[[BYAlipayManager sharePayManager] handleOrderPayWithParams:responseBody];

  说明:responseBody :后端传过来的支付参数

  6、处理通知

- (void)addNotionAction {
    [kNotificationCenter addObserver:self
                            selector:@selector(ailyPaySuccessAction)
                                name:KFNNotificationAlipay_paySuccess
                              object:nil];
    [kNotificationCenter addObserver:self
                            selector:@selector(ailyPayFaileAction)
                                name:KFNNotificationAlipay_payFaile
                              object:nil];
}

- (void)dealloc
{
    [kNotificationCenter removeObserver:self];
}

- (void)ailyPaySuccessAction {
    //处理支付结果
}

- (void)ailyPayFaileAction {
    //支付异常
}

  说明:支付宝的支付系统还是比较简单的,客户端能做的事情不多。一般只需要处理下支付成功的回调。

三、微信支付

  1、集成SDK

pod ‘WechatOpenSDK‘

  2、导入头文件

#import <WXApi.h>

  3、在AppDeletegate 注册

//注册微信
    BOOL isSuccess = [WXApi registerApp:WeiXinPayKey universalLink:WeiXinLinks];
    if (isSuccess) {
        NSLog(@"微信API注册成功");
    } else {
        NSLog(@"微信API注册失败");
    }

  说明:WeiXinPayKey:APP在微信开发者网站上申请的Key。WeiXinLinks:微信开发者Universal Link(这个有点麻烦,后面会详细说明,先把集成过程讲完)。

  4、构造支付管理类

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface BYWeiXinPayManager : NSObject

+ (BYWeiXinPayManager *)getInstance;

+ (BOOL)handleOpenUrl:(NSURL *)url;

+ (void)hangleWeiXinPayWith:(PayReq *)req;

@end

NS_ASSUME_NONNULL_END
#import "BYWeiXinPayManager.h"

static BYWeiXinPayManager *weiXinPayInstance = nil;

@interface BYWeiXinPayManager ()<WXApiDelegate>

@end

@implementation BYWeiXinPayManager

+ (BYWeiXinPayManager *)getInstance {
    if (weiXinPayInstance == nil) {
        weiXinPayInstance = [[BYWeiXinPayManager alloc] init];
    }
    return weiXinPayInstance;
}

+ (BOOL)handleOpenUrl:(NSURL *)url {
    return [WXApi handleOpenURL:url delegate:[BYWeiXinPayManager getInstance]];
}

+ (void)hangleWeiXinPayWith:(PayReq *)req {
    [WXApi sendReq:req completion:^(BOOL success) {
        if (success) {
            [kKeyWindow makeToast:@"微信支付成功"];
        } else {
            [kKeyWindow makeToast:@"微信支付异常"];
        }
    }];
}

///微信支付回调
- (void)onResp:(BaseResp *)resp {
    if ([resp isKindOfClass:[PayResp class]]){
        /*
         enum  WXErrCode {
         WXSuccess           = 0,    < 成功
         WXErrCodeCommon     = -1,  < 普通错误类型
         WXErrCodeUserCancel = -2,   < 用户点击取消并返回
         WXErrCodeSentFail   = -3,   < 发送失败
         WXErrCodeAuthDeny   = -4,   < 授权失败
         WXErrCodeUnsupport  = -5,   < 微信不支持
         };
         */

        PayResp *response = (PayResp*)resp;
        switch (response.errCode) {
            case WXSuccess:
            {
                [kKeyWindow makeToast:@"微信支付成功"];
                [[NSNotificationCenter defaultCenter] postNotificationName:KFNNotificationAlipay_paySuccess
                                                                    object:nil
                                                                  userInfo:nil];
            }
                break;

            case WXErrCodeCommon:
            {
                [kKeyWindow makeToast:@"微信支付异常"];
            }
                break;

            case WXErrCodeUserCancel:
            {
                [kKeyWindow makeToast:@"用户取消支付"];
            }
                break;

            case WXErrCodeSentFail:
            {
                [kKeyWindow makeToast:@"发送支付信息失败"];
            }
                break;

            case WXErrCodeAuthDeny:
            {
                [kKeyWindow makeToast:@"微信授权失败"];
            }
                break;

            case WXErrCodeUnsupport:
            {
                [kKeyWindow makeToast:@"微信版本暂不支持"];
            }
                break;

            default:

                break;
        }

    }
}

  说明:可以看到这里的支付成功回调我用的通知是和支付宝支付成功的通知一样,不需要单独再写一个微信支付成功的通知。

  5、AppDeletage 处理支付SDK回调

- (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) {
            [self disposeAilyPayResultWith:resultDic];
        }];

        // 授权跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            [self disposeAilyPayResultWith: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?:@"");
        }];
    } else if ([url.scheme containsString:WeiXinPayKey]) {
        if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://pay", WeiXinPayKey]]) {
            return [BYWeiXinPayManager handleOpenUrl:url];
        } else if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://oauth?", WeiXinPayKey]]) {
            return [BYWeiXinPayManager handleOpenUrl:url];
        }
    }
    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) {
            [self disposeAilyPayResultWith:resultDic];
        }];

        // 授权跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            [self disposeAilyPayResultWith: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?:@"");
        }];
    } else if ([url.scheme containsString:WeiXinPayKey]) {
        if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://pay", WeiXinPayKey]]) {
            return [BYWeiXinPayManager handleOpenUrl:url];
        } else if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://oauth?", WeiXinPayKey]]) {
            return [BYWeiXinPayManager handleOpenUrl:url];
        }
    }
    return YES;
}

- (void)disposeAilyPayResultWith:(NSDictionary *)resultDic {
    NSLog(@"支付宝支付跳转 result = %@",resultDic);
    int statusCode = [resultDic[@"resultStatus"]  intValue];

    if (statusCode == 9000){
        //订单支付
        [kKeyWindow makeToast:@"支付成功"];
        [[NSNotificationCenter defaultCenter] postNotificationName:KFNNotificationAlipay_paySuccess object:nil];

    }else{
        //交易失败
         [[NSNotificationCenter defaultCenter] postNotificationName:KFNNotificationAlipay_payFaile object:nil];
        [kKeyWindow makeToast:@"支付异常"];
    }
}

  说明:代码和上面支付宝的代码一样的,微信URL判断是看是否包含 微信Key这个字段

  6、URL - Types 设置

  说明:schemes 这个字段直接填微信平台上的APPID就好。

  7、调用支付

NSDictionary *dict = [arg objectOrNilForKey:@"retData"];
PayReq* req             = [[PayReq alloc] init];
req.nonceStr            = [dict objectForKey:@"noncestr"];
req.timeStamp           = [[dict objectForKey:@"timestamp"] intValue];
req.package             = [dict objectForKey:@"package"];
req.partnerId           = [dict objectForKey:@"partnerid"];
req.prepayId            = [dict objectForKey:@"prepayid"];
req.sign                = [dict objectForKey:@"sign"];
[BYWeiXinPayManager hangleWeiXinPayWith:req];

  说明:

/** 商家向财付通申请的商家id */
@property (nonatomic, copy) NSString *partnerId;
/** 预支付订单 */
@property (nonatomic, copy) NSString *prepayId;
/** 随机串,防重发 */
@property (nonatomic, copy) NSString *nonceStr;
/** 时间戳,防重发 */
@property (nonatomic, assign) UInt32 timeStamp;
/** 商家根据财付通文档填写的数据和签名 */
@property (nonatomic, copy) NSString *package;
/** 商家根据微信开放平台文档对数据做的签名 */
@property (nonatomic, copy) NSString *sign;

  8、最后处理下支付成功的通知即可。

  9、微信开发者Universal Link的构造

    1、Universal Link是什么?这个暂不多说,简单来说就是一个地址,通过这个地址可以来让你的APP被微信识别(就这么理解吧)。

    2、格式:一般是公司APP的官网即可,要以https开头,以 / 结尾。举例:https://wechat.dtslb.com/

    3、先在微信开发者官网上填好该地址,然后再Xcode -->  Signing & Capabilities  添加 Associated Domains ,格式是以 applinks: 开头,后面接上公司官网,举例:applinks:https://wechat.dtslb.com

    4、生成 apple-app-site-association 文件格式,这个文件是没有格式的,你可以新建一个TXT文件,然后把文件名改为这个,文件格式删掉。编辑里面的内容

{
    "applinks":  {
        "apps": [],
        "details": [
            { "appID": "TemaID.BoundleID",
              "paths": [ "*" ]
            }
        ]
    }
}        

    说明:APPID的格式就是 开发者账号的 团队ID.自己APP的boundle Id

    5、将该文件发给后端,放到公司官网的根目录下。确实麻烦,这步搞完就大功告成了。

四、总结

  1、支付宝支付需要向SDK传入sign字符串,而危险则是传微信参数对象,大致相同。

  2、要和后端做好订单支付的确认操作,一般在客户端收到支付成功的回调之后要再去调用一个确认订单状态的接口,来确保支付的正常完成。

  3、更多的事情下次再说吧

参考文档链接:

https://www.cnblogs.com/guoshaobin/p/11164000.html

原文地址:https://www.cnblogs.com/qiyiyifan/p/11922910.html

时间: 2024-11-06 13:29:39

iOS 支付宝、微信支付的集成记录的相关文章

iOS开发集成支付宝支付、支付宝&amp;微信支付

支付宝支付: 参考链接:https://www.jianshu.com/p/60175e525c0e https://blog.csdn.net/zhonggaorong/article/details/51750341 https://www.jianshu.com/p/5dd22475d6f3 支付宝&微信支付: 参考链接:https://www.jianshu.com/p/23a7a61f8e89 https://www.jianshu.com/p/057ff761a6cc 微信分享&

IOS更换64位支付宝 微信支付 SDK

14年的时候苹果就下发通知:新的上线项目必须适配64-bit,更新的项目在2015年的六月一号以后也必须适配64-bit刚开始的时候没注意到这个问题,当打包完自己项目的时候,居然在适配64-bit的时候出现了一个警告, 看了一下,大概的意思也就是说,我的项目没有适配64-bit,我勒个去,上个版本还没有提示这个,这个版本居然冒出这个警告了.眼看着六月一号也即将到来,十天时间,以苹果的审核进度不一定过的了,万一中间再出个小插曲,估计上线得一个月了,加速审核苹果不一定买帐.迟早要做64bit的适配的

iOS开发微信支付

现在基本所有的App都会接入支付宝支付以及微信支付,也有很多第三方提供给你 SDK帮你接入,但是这种涉及到支付的东西还是自己服务器搞来的好一些,其实搞懂了 逻辑非常的简单,下面直接给大家说说下基本流程和接入需要注意的东西. 支付宝详细爬坑接入指南传送门   前期准备(这个东西一般来讲我们不需要来操心,但是还是稍微介绍下) 1.到微信开放平台注册账号点击打开链接 2.进入管理中心------移动应用------创建移动应用----根据页面完善应用资料 3.审核过后,通过应用详情页面,查看应用详情,

微信支付V3集成过程(Native)

长话短说,微信支付V3版本相比V2版本,简化许多接口,大大降低了商户的接入代价,只不过由于相关的集成说明文档写的过于笼统,细节描述不够具体,demo版本不够完善等等原因,被大家诟病. 最近基于业务需要,完成了微信支付的接入,选择的是公众号扫码支付(Native模式).在此把集成的大致过程贴出来,希望能对正在困扰的各位有所帮助. 整个交互过程分为四步: 1.商户:生成微信支付二维码 2.微信:扫描二维码,获取商户订单信息 3.微信:确认支付,调起微信支付模块,完成支付,回调商户通知接口 4.商户:

IOS开发--微信支付

前言:下面介绍微信支付的开发流程的细节,图文并茂,你可以按照我的随笔流程过一遍代码.包你也学会了微信支付.而且支付也是面试常问的内容. 正文: 1.首先在开始使用微信支付之前,有一些东西是开发者必须要知道的,打开下面链接: https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=3_1 然后可以看到下面的页面,这个就是微信支付商户平台的开发文档,很多东西是可以查阅和了解的,在开发使用微信SDK支付功能的时候,遇到了问题也可以到这找找相关须知信

关于IOS调用微信支付jsapi不起作用的解决方法

微信支付时,安卓机调用 jsapi可以支付,IOS就不行,点击立即支付,直接返回原立即支付页面,跟刷新页面差不多,解决方案很简单:两句话而已. 不得不说,微信支付坑太多了,我擦..... <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <asp:Button ID="btnSubmit" runat="server" Text

支付宝 微信支付 移动支付 网站支付 开发

支付接口开发博客 IJPay 让支付触手可及,封装了微信支付.支付宝支付.银联支付常用的支付方式以及各种常用的接口.不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里. 微信开发平台资源中心 原文地址:https://www.cnblogs.com/jing1617/p/9342988.html

iOS开发微信支付的介绍与实现

1.前期准备 1) 到微信开放平台注册账号 需要登录邮箱验证 填写您的商户信息 2) 进入管理中心 --- 移动应用 --- 创建移动应用 --- 根据页面完善应用资料 3) 审核过后,通过应用详情页面,查看应用详情,查看AppID和AppSecret相关信息 4) 创建这些是没有支付能力的,需要额外申请,还是根据提示一步步填写,填写完之后会发一封邮件到您的预留的邮箱,然后到商户平台点击打开链接填写资料,最主要的是验证下开户收款账号,会收到一波几分钱的巨额财产,那么这个时候如果你填写的是你的开户

iOS SDK微信支付填坑!(跳转微信支付,只有确定按钮)

这两天接微信支付的SDK,遇到了一个天坑,微信文档里面不写清楚,demo里面也没有,参数少了一个无法支付啊有没有!有没有!有没有! 最后调试成功,得知真相的我眼泪掉下来... 先让我们看看是什么情况: --------------------------------------------------------我是分割线-------------------------------------------------------- 预支付订单那块就不说了,基本上都没问题,服务器会返回一个pre