• iOS支付宝支付集成 2018-02-21 08:58:11
    iOS支付宝支付集成

    概述

    iOS支付宝支付集成

    详细

    支付宝和微信都是业界的老大哥,相信大家都有所觉得文档、SDK都是各种坑吧(纯粹吐槽而已),本文先整理支付宝支付集成。

    一、准备工作

    1、向支付宝”签约" 成为支付宝的”商户”, 签约完成后, 支付宝会提供一些必要的数据给我们(商户ID-partner,帐号ID-支付宝帐号)

    注意:签约成为支付宝商户,需要提供公司营业执照[http://act.life.alipay.com/shopping/before/help/index.html](http://act.life.alipay.com/shopping/before/help/index.html)

    2、获取支付相关的 '私钥' 和 '密钥'

    [https://doc.open.alipay.com/doc2/detail?treeId=44&articleId=103242&docType=1](https://doc.open.alipay.com/doc2/detail?treeId=44&articleId=103242&docType=1)

    3、下载支付的SDK

    [https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1](https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1)

    二、集成支付宝SDK步骤

    1、从官方Demo中把红色标注的文件添加进入项目中,记得选copy;

    576025-11a009c49e80a9d7.png.jpeg


    2、

    点击项目名称,点击“Build Phases”选项卡,在“Link Binary with Librarles” 选项中,新增“AlipaySDK.framework”和“SystemConfiguration.framework” 两个系统库文件。如果项目中已有这两个库文件,可不必再增加;

    添加下图中的库:

    576025-96e1a7c6a53aecb6.png.jpeg

    localhost:alipay mac$ ls
    APAuthV2Info.h        Order.h            libssl.a
    APAuthV2Info.m        Order.m            openssl
    AlipaySDK.bundle    Util
    AlipaySDK.framework    libcrypto.a
    导入系统库
    SystemConfiguration.framework


    3、

    添加Pch文件新建pch成功后,在pch文件中添加#import然后按照下图所示,进行修改pch的文件路径

    也可以不设置,我这个是我需要设置#import <UIKit/UIKit.h> #import <Foundation/Foundation.h>,也可以不用使用,只在当前文件里添加相对应的使用即可,但是这样针对整个项目来说方便些

    576025-ed9304eb37840edf.png


    4、

    修改SDK路径完成以上两步之后,会发现出现了一个经典的错误,找不到:#include解决这个问题,需要在Header Search Path中配置SDK中的点a(libssl.a/libcrypto.a)文件所在的路径,找到之后设置好正确的路径

    576025-405b7b528143bbed.png

    点击项目名称,点击“Build Settings”选项卡,在搜索框中,以关键字“search” 搜索,对“Header Search Paths”增加头文件路径:“$(SRCROOT)/项目名称/IntegratedAlipay/AlipayFiles”(注意:不包括引号,如果不是放到项目根目录下,请在项目名称后面加上相应的目录名);

    576025-d672c7034c31c881.png.jpeg

    根据你文件位置,我的是:

    “$(SRCROOT)/QTXStudent/Classes/Alipay/AlipayFiles”


    5、 为URL Types 添加支付宝回调scheme

    点击项目名称,点击“Info”选项卡,在URL types里面添加一项,Identifier可以不填,URL schemes必须和appScheme的值相同,用于支付宝处理回到应用的事件;

    为URL Types 添加支付宝回调scheme

    576025-2698bcd1d3dde04a.png.jpeg


    6、在工程项目的plist文件中添加

    iOS 9以后的系统需要添加支付宝分享的scheme到白名单中,scheme名为alipayshare

    按如下形式添加即可:

    576025-eb9a74995d62b951.png.jpeg


    7、在AppDelegate中处理事件回调:

    /**
     这里处理微信/支付宝支付完成之后跳转回来
     */
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
        //如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK
        if ([url.host isEqualToString:@"safepay"]) {
            //跳转支付宝钱包进行支付,处理支付结果
            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"支付宝客户端支付结果result = %@",resultDic);
                if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {
                    
                    // 发通知带出支付成功结果
                    [[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnSucceedPayNotification object:resultDic];
                } else {
                    
                    // 发通知带出支付失败结果
                    [[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnFailedPayNotification object:resultDic];
                }
                
            }];
        }
        
        if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode
            [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"支付宝网页版result = %@",resultDic);
                if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {
                    
                    // 发通知带出支付成功结果
                    [[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnSucceedPayNotification object:resultDic];
                } else {
                    
                    // 发通知带出支付失败结果
                    [[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnFailedPayNotification object:resultDic];
                }
            }];
        }
        
        return YES;
    }
    
    // NOTE: 9.0以后使用新API接口
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
    {
        
        //如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK
        if ([url.host isEqualToString:@"safepay"]) {
            //跳转支付宝钱包进行支付,处理支付结果
            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"支付宝客户端支付结果result = %@",resultDic);
                if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {
                    
                    // 发通知带出支付成功结果
                    [[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnSucceedPayNotification object:resultDic];
                } else {
                    
                    // 发通知带出支付失败结果
                    [[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnFailedPayNotification object:resultDic];
                }
            }];
        }
        
        if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode
            [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"支付宝网页版result = %@",resultDic);
                if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {
                    
                    // 发通知带出支付成功结果
                    [[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnSucceedPayNotification object:resultDic];
                } else {
                    
                    // 发通知带出支付失败结果
                    [[NSNotificationCenter defaultCenter] postNotificationName:ZLAliReturnFailedPayNotification object:resultDic];
                }
            }];
        }
        
        return YES;
    }


    8、 在需要用的地方导入“AlipayHeader.h”,并使用“[AlipayRequestConfig alipayWithPartner:...”方法进行支付;

    /**
     *  配置请求信息,仅有变化且必要的参数
     *
     *  @param partner            合作者身份ID 以 2088 开头由 16 位纯数字组成的字符串。
     *  @param sellerID           卖家支付宝账号 以 2088 开头由 16 位纯数字组成的字符串。
     *  @param outTradeNO         商户网站唯一订单号
     *  @param subject            商品名称
     *  @param body               商品详情
     *  @param totalFee           总金额
     *  @param notifyURL          服务器异步通知页面路径
     *  @param itBPay             未付款交易的超时时间
     */
    + (void)alipayWithPartner:(NSString *)partner
                     sellerID:(NSString *)sellerID
                   outTradeNO:(NSString *)outTradeNO
                      subject:(NSString *)subject
                         body:(NSString *)body
                     totalFee:(NSString *)totalFee
                    notifyURL:(NSString *)notifyURL;

    仅含有变化的参数:

    + (void)alipayWithPartner:(NSString *)partner
                     sellerID:(NSString *)sellerID
                   outTradeNO:(NSString *)outTradeNO
                      subject:(NSString *)subject
                         body:(NSString *)body
                     totalFee:(NSString *)totalFee
                    notifyURL:(NSString *)notifyURL {
        
        [self alipayWithPartner:partner sellerID:sellerID outTradeNO:outTradeNO subject:subject body:body totalFee:totalFee notifyURL:aliNotifyURL service:@"mobile.securitypay.pay" paymentType:@"1" inputCharset:@"utf-8" itBPay:@"30m" privateKey:aliPrivateKey appScheme:aliAppScheme];
        
    }

    包含所有必要的参数:

    + (void)alipayWithPartner:(NSString *)partner
                     sellerID:(NSString *)sellerID
                      outTradeNO:(NSString *)outTradeNO
                      subject:(NSString *)subject
                         body:(NSString *)body
                     totalFee:(NSString *)totalFee
                    notifyURL:(NSString *)notifyURL
                      service:(NSString *)service
                  paymentType:(NSString *)paymentType
                 inputCharset:(NSString *)inputCharset
                       itBPay:(NSString *)itBPay
                   privateKey:(NSString *)privateKey
                    appScheme:(NSString *)appScheme {
        
        Order *order = [Order order];
        order.partner = partner;
        order.sellerID = sellerID;
        order.outTradeNO = outTradeNO;
        order.subject = subject;
        order.body = body;
        order.totalFee = totalFee;
        order.notifyURL = notifyURL;
        order.service = service;
        order.paymentType = paymentType;
        order.inputCharset = inputCharset;
        order.itBPay = itBPay;
        
        
        // 将商品信息拼接成字符串
        NSString *orderSpec = [order description];
        
        // 获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循 RSA 签名规范, 并将签名字符串 base64 编码和 UrlEncode
        
        NSString *signedString = [self genSignedStringWithPrivateKey:aliPrivateKey OrderSpec:orderSpec];
        
        // 调用支付接口
        [self payWithAppScheme:appScheme orderSpec:orderSpec signedString:signedString];
    }

    生成signedString:

    + (NSString *)genSignedStringWithPrivateKey:(NSString *)privateKey OrderSpec:(NSString *)orderSpec {
        
        // 获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循 RSA 签名规范, 并将签名字符串 base64 编码和 UrlEncode
        id<DataSigner> signer = CreateRSADataSigner(privateKey);
        return [signer signString:orderSpec];
    }

    支付:

    + (void)payWithAppScheme:(NSString *)appScheme orderSpec:(NSString *)orderSpec signedString:(NSString *)signedString {
        
        // 将签名成功字符串格式化为订单字符串,请严格按照该格式
        NSString *orderString = nil;
        if (signedString != nil) {
            orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"", orderSpec, signedString, @"RSA"];
            [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { // 网页版
                NSLog(@"支付宝支付结果 reslut = %@", resultDic);
                
                // 返回结果需要通过 resultStatus 以及 result 字段的值来综合判断并确定支付结果。 在 resultStatus=9000,并且 success="true"以及 sign="xxx"校验通过的情况下,证明支付成功。其它情况归为失败。较低安全级别的场合,也可以只通过检查 resultStatus 以及 success="true"来判定支付结果
                
                if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {
                    
                    // 发通知带出支付成功结果
                    [ZLNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic];
                } else {
                    
                    // 发通知带出支付失败结果
                    [ZLNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic];
                }
            }];
        }
        
    }


    9、

    在本头文件中设置aliPartnerID、aliSellerAccount、aliNotifyURL、aliAppScheme和aliPrivateKey的值(所有的值在支付宝回复的邮件里面:注意,建议除appScheme以外的字段都从服务器请求);

    这时候,我们支付就直接一句话搞定:

        // 支付宝支付
        [AlipayRequestConfig alipayWithPartner:aliPartnerID sellerID:aliSellerAccount outTradeNO:[self generateTradeNO] subject:@"测试" body:@"支付宝支付" totalFee:@"0.01" notifyURL:aliNotifyURL]; // notifyURL: 回调url@"http://www.xxx.com"
        
        [ZLNotificationCenter addObserver:self selector:@selector(paySucceed) name:ZLAliReturnSucceedPayNotification object:nil];
        [ZLNotificationCenter addObserver:self selector:@selector(payFailed) name:ZLAliReturnFailedPayNotification object:nil];


    10、建议除appScheme以外的字段都从服务器请求!

    建议除appScheme以外的字段都从服务器请求!建议除appScheme以外的字段都从服务器请求!

    PS:重要的事情说三遍!!!

    上面的第七步和第八步建议不要使用,直接用第九步去替代!建议除appScheme以外的字段都从服务器请求!


    如果后台给你一个接口返回那些参数了,你就不用客户端去加密算法,只负责请求后台拿到这些参数再去请求支付宝即可.

    下面例子是支付宝的拼接方式,请按照当前版本的相对应的拼接方式来.

    // 支付宝支付
    - (void)alipayPay {
        
        NSMutableDictionary *params = [NSMutableDictionary dictionary];
        params[@"orderNo"] = self.orderNo; // 订单号
        params[@"realAmt"] =  [NSString stringWithFormat:@"%.2lf", self.realAmt]; // 金额
        
        __weak __typeof(self) weakSelf = self;
        [QTXHttpTool post:QTX_aliPay_url params:params success:^(id json) {
            QTXLog(@"支付宝支付返回参数接口 请求成功-%@", json);
            
            if ([json[@"success"] isEqual:@(YES)]) {
                
                // 返回生成订单信息及签名
                NSString *signedString = json[@"data"][@"sign"];
                NSString *orderInfoEncoded = json[@"data"][@"orderInfo"];
                
                // NOTE: 如果加签成功,则继续执行支付
                if (signedString != nil) {
                    // NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
    //                NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@&sign_type=RSA", orderInfoEncoded, signedString];
                    NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                                   orderInfoEncoded, signedString, @"RSA"];
                    
                    // NOTE: 调用支付结果开始支付
                    [[AlipaySDK defaultService] payOrder:orderString fromScheme:XHHAppScheme callback:^(NSDictionary *resultDic) {
                       QTXLog(@"reslut = %@",resultDic);
                        
                        if ([resultDic[@"resultStatus"] intValue] == 9000) {
                            
                            [QTXNotificationCenter addObserver:self selector:@selector(paySucceed) name:QTXWXReturnSucceedPayNotification object:nil];
                        } else {
                            
                            [QTXNotificationCenter addObserver:self selector:@selector(payFailed) name:QTXWXReturnFailedPayNotification object:nil];
                        }
                    }];
                    
                }
                
            } else {
                [MBProgressHUD showError:[NSString stringWithFormat:@"%@", json[@"errorMessage"]]];
            }
            
        } failure:^(NSError *error) {
            
            [MBProgressHUD showError:@"暂无网络,稍后再试"];
            QTXLog(@"支付宝支付返回参数接口 请求失败-%@", error);
        }];
        
    }


    11、支付宝集成失败相关问题

    1. 报错 AL159

    查看金额是否是两位小数,切不可拼接"元"

    2. 报错“创建交易异常,请重新创建后再付款”

    返回的状态码是“6001”,取消支付

    当是用公司注册支付宝App时分配的商户账号登陆的支付宝,进行支付测试的。支付宝那边检测到是商户而不是普通的支付账号,商户支付给商户自己,所以支付失败!

    三、其他补充

    1、压缩文件截图

    压缩文件.png

    2、Alipay 包截图

    alipay.png


    目前是项目中直接操作, 在AlipayHeader.h文件里补充上你们项目的aliPartnerID, aliSellerAccount, aliNotifyURL, 具体可参考代码, 项目则能够直接运行!


    注:本文著作权归作者,由demo大师(http://www.demodashi.com)宣传,拒绝转载,转载需要作者授权


    展开全文
  • 首先在集成支付宝SDK时就各种的错误,同时也感受到了支 付宝开放平台对这一块的官方文档做的也有所欠妥,为什么 说欠妥呢,是因为他让我们这些开发者找里面的一些相关东 西,不怎么好找,而且一些紧要的对于我们来说...
  • ios 集成 支付宝 遇到的错误解决方法最近做项目过程中,需要用到支付宝,但是支付宝集成非常操蛋,官方就给了一个Demo就完事了,我把我遇到的错误和解决方案,拿出来给大家分享下。 *1.缺少SystemConfiguration....
  • iOS支付宝使用总结 2017-04-20 09:56:52
    iOS支付宝使用总结 导入SDK 导入依赖库 错误情况 调用支付宝接口支付 调用客户端,防止app被kill 一、在后台进行签名, 前端只负责调起客户端进行支付(1)导入需要的SDK如果在签名后台进行,前端只负责调起客户端...
  • 在测试demo的支付宝支付时 直接返回错误 看日志发现返回的错误码为4000 找了资料之后发现 是有个activity忘记配置了 android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|...
  • iOS 支付宝手机网站支付 2018-01-05 11:27:52
    后台提供的是一个可以使用webView加载的URL, URL的返回值为一个带有订单信息的from表单, 只有是这种类型,才能沿用...步骤1 集成支付宝SDK 步骤2 在加载webView的界面这样写 - (void)viewDidLoad { [super viewDid
  • 授权参数通过请求的方式从服务器获取 授权参数列表详情传送门 ...手机端安装了支付宝 [[AlipaySDK defaultService] auth_V2WithInfo: infoStr fromScheme:schemeStr callback:^(NSDictionary *resultDic) { ...
  • 支付宝集成现在越来越普通,很多应用都会集成,但是支付宝集成非常操蛋,官方就给了一个Demo就完事了,我把我集成支付宝遇到的问题做个总结给大家参考一 。新建一个aliPaySDK文件夹,将支付宝SDK包中以下文件放到此...
  • iOS支付宝回调状态码 2017-07-25 10:13:15
    支付宝,回调,状态,状态码,方便大家找寻 {  case 6001:  {  isPaySuccess = @"0";  msg = @"用户中途取消";  }  break;    
  • m ...2.自己集成支付宝SDK时的错误 这个也是路径错误, 解决办法:在自己工程文件夹里建一个文件夹,随便起什么名字。把支付宝所需要的东西都拷贝进去,然后add files,然后找到TARGETS-
  • iOS 支付宝详细集成总结 2016-03-22 10:21:06
    iOS 支付宝详细集成总结 字数1098 阅读123 评论2 喜欢0 前提是你已经在支付宝平台上创建了应用,并且已经获得了移动支付的能。如果没有就自己去支付宝开放平台,申请注册。支付宝开放平台 1.Mac生成...
  • ios支付宝客户端集成流程 2016-11-22 22:15:42
    这个其实开发者们都应该懂,就是在支付宝这里挂个号,然后进行下一步业务的申请。 创建应用的链接 创建应用界面 开发者只需要按照指示一步一步添加内容就可以。 2、申请移动支付 这个就需要一些...
  • iOS 集成支付宝支付 2016-12-29 09:16:24
    首先我们需要支付宝的商家服务平台上进行我们的产品签约,并通过审核,然后根据步骤得到PID Key等信息。 2.在项目中集成支付宝SDK: 以支付宝的Demo为例,当我们在App端调用支付接口的时候,是通过以下...
  • iOS支付宝支付基于https 2015-12-28 11:43:32
    支付宝支付 -- 适配iOS9 首先我们一起看一下,最终调起支付宝完成支付的必要参数和方法(Order类由支付宝demo中提供) 1 Order *order = [Order new]; 2 order.partner = kAliPayPartner; 3 order.seller = ...
  • iOS 支付宝ALI40247问题 2016-12-14 14:10:49
    支付宝调用SDK 的时候返回ALI40247,检查后order对象中属性也都无误,私钥没有给,签名后的sign是后台给返回的数据,在掉SDK 的时候,传入的三个参数,不需要签名的字符串直接传入,后台传过来的sign经过UTF-8 编码...
  • iOS支付宝接口调用总结 2016-02-15 17:43:12
    其实就是调用了了一下支付宝的sdk,主要是细节方面的问题。 1、导入以下framework和文件,bundle里的素材自行选取; 2、需要加密的话,可以尝试demo里的方法,导入;   3、点击项目名称,点击“Build ...
  • 接入支付宝的大致流程如下: 1.向支付宝申请, 与支付宝签约,获得商户ID(partner)和账号ID(seller)和私钥(privateKey) (1)生成公钥和秘钥的方法 打开终端 生成私钥pem,执行命令 openssl genrsa -...
  • iOS - 支付宝支付详解 2016-10-25 15:10:37
    1.支付宝支付 在说完了微信支付之后,下面我们来说一说支付宝支付,支付宝支付相对微信支付而言要简单很多,下面大家就一起来研究一下。
  • iOS支付宝、微信支付 2018-03-12 20:55:09
    微信支付:1.获取的数据有:(红色的一定要知道,因为生成签名会用到)参数注释例如appid应用IDwx3ff3d1fc2ff83937mch_id商户号1448474102APP_KEY954d05bee14a4443da66df49c20fac15WX_APPSecret1b887f214421222e1b6a...
1 2 3 4 5 ... 20
收藏数 5,002
精华内容 2,000