PayPal iOS 集成攻略

作者: yzhxcql | 来源:发表于2016-05-12 14:24 被阅读5499次
    这两天在研究如何在项目中集成PayPal的iOS SDK 但是百度到的资料很少,研究了两天拿出来和大家分享下,共同讨论共同成长。

    这里以PayPal的官方demo为例,sdk和demo地址在这里:paypal

    • 安装流程建议使用CocoaPods,喜欢配置依赖库的小伙伴自行百度

    准备事项

    • 预先善其事,必先利其器

    首先你得注册个paypal账号,连账号都没有谁给你钱啊

    1. 登录paypal开发者网站。 点这里
    2. 右上角看到了没有,不上图了。有账号的登录,没账号的注册。
    3. 在上面的 DASHBOARD 页面下,找到 Creat APP ,点它!创建一个阿啪啪出来。 创建一个阿啪啪
    4. 我们来到创建阿啪啪的页面,这里需要输入一个阿啪啪名字以及选择一个账户,名字没问题,可是这个账户怎么来的?这个稍后说,选上就行了。名字填好后,点击Creat App
    5. 来到我们的阿啪啪页面,这里是查看你的应用信息的地方。右上角分别对应着你的应用的测试模式真实交易模式,点击切换会看到不同的API CREDENTIALS 内容,分别是在测试模式真实交易模式下不同的AccountClient IDSecret。这里掏出小本本,记下测试模式下的Client ID,之后会用到。
    6. 接下来,选择右边的SandboxAccounts选项。Sandbox就是测试环境,其中包含了你的账户信息、通知消息、交易记录等等。。(其实我不知道后面那三个干嘛的,因为没用到)。
      而在现在所看到的Accounts中,你会看到两个账号,第一个就是测试模式下,你的商家账号。在你的阿啪啪中产生的所有虚拟交易,其金额都会流入到这个账号下。而第二个,不用说你也猜到,就是在虚拟交易中扮演顾客的账号。右上角可以添加账号,具体玩法自行摸索,这里不多说了。
    7. 轻轻的点下你的商家账号。弹出的框选择Profile。展示的是这个账号的Account Details,第一个就是你的账号基本信息,包括你的邮箱、密码、电话号、账号类型、状态和城市。
    • 上面的标签随便看看就好。其中的 Funding 包含了你的虚拟商家账号的信用卡信息和 Balance 我的理解就是paypal余额。此时Balance 后面应该是没有余额的。
    • 同样的,点开顾客账号的Profile。展示的是你的顾客的账户信息。此时我建议点击Change password修改一个好记的交易密码。不改的话就是你创建账号时候的密码,我猜的。同样的, Funding 包含了你的虚拟商家账号的信用卡信息和 Balance,此时Balance 后面的数字应该是$9999.9。

    准备工作基本上是完成了,下面看看如何进行虚拟支付

    • 现在我当做你已经把paypal的sdk pod到你的项目中去了。
    • 正如所有sdk一样,一定要做的是事情是什么??没错,就是导入头文件!!!
    • 然后,来到AppDelegate.m文件的didFinishLaunchingWithOptions
     [PayPalMobile initializeWithClientIdsForEnvironments:@{PayPalEnvironmentProduction : @"你的真实交易模式ClientID",PayPalEnvironmentSandbox : @"你的测试模式ClientID"}]; 
    
    • 填好你的测试模式ClientID后我们继续

    简单交代下集成paypal的支付流程:

    1. 配置paypal SDK连接环境如:测试环境、真实环境
    2. 配置paypal一些参数如:商家名字、地址选项、商家隐私政策和用户协议网址等
    3. 配置支付相关如:订单总额、货币类型和订单描述等
    4. 提交订单,通过代理回调支付状态

    老司机要开车了,请坐稳

    简单说下原理,paypal的支付并不唤起客户端,也就是说并不要求用户安装 paypal APP,支付的流程产生在paypal的sdk中已经封装好的VC中。你要做的就是设置参数和弹出paypal的VC以及处理后续的回调。

    天才纸尿裤,我是第一步:

    • 首先,我建议你要有一个订单处理类。你的生成订单VC传进订单总额(有需要的话传进商品数组)给订单处理类,这个类会提供block完成后续的操作如:订单VC弹出PayPal的VC,支付完成后订单VCdismiss掉paypal的VC以及用户取消付款订单VC处理事情等等。

    • 现在就简单点,先让订单VC把所有的事都干了。

    - 配置支付环境
    [PayPalMobile preconnectWithEnvironment:PayPalEnvironmentSandbox];
    
    
    • 以下是环境说明
    /// 真实交易环境-也就是上架之后的环境
    extern NSString * _Nonnull const PayPalEnvironmentProduction;
    /// 模拟环境-也就是沙盒环境
    extern NSString * _Nonnull const PayPalEnvironmentSandbox;
    /// 无网络连接环境-具体用处,咳咳,自行摸索
    extern NSString * _Nonnull const PayPalEnvironmentNoNetwork;
    

    第二步:paypal配置

    首先让你的订单VC有一个属性

    @property(nonatomic, strong) PayPalConfiguration *payPalConfig;
    

    然后配置它

    //是否接受信用卡
     _payPalConfig.acceptCreditCards = NO;
     
     //商家名称
     _payPalConfig.merchantName = @"商家名";
     
     //商家隐私协议网址和用户授权网址-说实话这个没用到
     _payPalConfig.merchantPrivacyPolicyURL = [NSURL URLWithString:@"https://www.paypal.com/webapps/mpp/ua/privacy-full"];
      _payPalConfig.merchantUserAgreementURL = [NSURL URLWithString:@"https://www.paypal.com/webapps/mpp/ua/useragreement-full"];
      
      //设置地址选项-在支付页面可选择账户地址信息
      typedef NS_ENUM(NSInteger, PayPalShippingAddressOption) {
      //不展示地址信息
      PayPalShippingAddressOptionNone = 0,
      //这个没试过,自行查阅
      PayPalShippingAddressOptionProvided = 1,
      //paypal账号下的地址信息
      PayPalShippingAddressOptionPayPal = 2,
      //全选
      PayPalShippingAddressOptionBoth = 3,
    };
    
      //paypal账号下的地址信息
      _payPalConfig.payPalShippingAddressOption = PayPalShippingAddressOptionPayPal;
      
      //配置语言环境
      _payPalConfig.languageOrLocale = [NSLocale preferredLanguages][0];
    

    第三步:配置支付相关信息

    • 这里只写下简单版,如果想要把订单中所有商品信息添加进去自行查看官方demo吧,很简单的
    PayPalPayment *payment = [[PayPalPayment alloc] init];
    
    //订单总额
    payment.amount = [NSDecimalNumber decimalNumberWithString:@"100"];
    
    //货币类型-RMB是没用的
    payment.currencyCode = @"USD";
    
    //订单描述
    payment.shortDescription = @"Hipster clothing";    
    

    第四步:提交订单-最重要也是最简单的一步

    //生成paypal控制器,并模态出来(push也行)
    //将之前生成的订单信息和paypal配置传进来,并设置订单VC为代理 
    PayPalPaymentViewController *paymentViewController = [[PayPalPaymentViewController alloc] initWithPayment:payment                                                                                            configuration:self.payPalConfig                                                                                                  delegate:self];
     
    //模态展示
    [self presentViewController:paymentViewController animated:YES completion:nil];
    
    之后就是顾客账户上场了
    • 找到你的顾客账号,记着不是商家账号。拿到邮箱和密码。邮箱是上面显示的buyer的邮箱。密码如果修改过就是修改后的密码,没改过应该就是注册时填的登陆密码。�

    • 在付款页面登陆你的账号。登陆成功之后,你会看到你即将支付的订单总额,你的账号名字以及你的paypal支付方式选项,默认是余额Balance支付。如果你开通了信用卡支付,可选择信用卡。

    • 最后,毫不犹豫的点下那个蓝色的Pay

    • 不出意外都会支付成功的

    最后:监测订单状态

    • 你的订单VC要遵从 PayPalPaymentDelegate 协议
    • 实现协议的方法如下:
    //订单支付完成后回调此方法
    - (void)payPalPaymentViewController:(PayPalPaymentViewController *)paymentViewController didCompletePayment:(PayPalPayment *)completedPayment {
      NSLog(@"PayPal Payment Success!");
    }
    
    //用户取消支付回调此方法
    - (void)payPalPaymentDidCancel:(PayPalPaymentViewController *)paymentViewController {
      NSLog(@"PayPal Payment Canceled");
    }
    
    到这里支付流程就完成了,但是你可能还需要向服务器发送一些东西,让服务器验证本次订单有效性
    //回调的 PayPalPayment 的 confirmation 属性包含此次订单的状态信息包括校验码,服务器可已通过该校验码验证交易真实性。
    //返回数据 - id所对应的就是校验码。
    {
        client =     {
            environment = sandbox;
            "paypal_sdk_version" = "2.14.2";
            platform = iOS;
            "product_name" = "PayPal iOS SDK";
        };
        response =     {
            "create_time" = "2016-05-12T03:25:49Z";
            id = "PAY-6BG56850AF923584SK4Z7PNQ";
            intent = sale;
            state = approved;
        };
        "response_type" = payment;
    }
    

    最后的最后:

    有小伙伴在关心之前在阿啪啪中产生的交易怎么知道呢?

    来到paypal开发者网站,登陆后向左看。选择Sandbox中的Notification选择。这里就是所有的交易通知,包括商家账户和顾客账户。

    以上,就是模拟环境下进行paypal支付的全过程。如果要进行真实交易,就要先注册business账户。总的来说,只要得到真实交易模式下的clientID就能够发起真实交易了。

    全文完。

    相关文章

      网友评论

      • 完全:创建项目的时候输入中文 说是特殊字符咋回事啊
      • F麦子:大哥,PayPal集成难不难啊,我下个项目要写,有点害怕,只集成过微信和iOS,
      • ChrisPaulss:写的特别详细 很棒!很赞。
      • 巧克力色可可:楼主的阿啪啪是真的骚
      • LiWeiJ:你好 我在支付完成后返回的回调里state却不是approved,而是state = created,请问这是什么问题呢
        bb4cf902bdbc:@Adoma 楼主你好,我这边在集成的时候,如何和自己的服务器关联呢,我看本文章介绍 ,是在贝宝支付成功后,回调服务器做一个验证,这时候如果贝宝支付成功,但是验证服务器失败了怎么办呢?
        LiWeiJ:@Adoma dead
        yzhxcql:用id反查下订单状态看看是什么
      • skylor:请问客户端怎么与自己都服务端关联起来呢?官网上看到还有个令牌token,客户端拿到这个token,但PayPal的SDK没有地方来接收这个token呢?谢谢
        f036ff039df0:嗯嗯,我现在用braintree
        skylor:@CoderMI 这种集成方式没有关联的 换个其它的
        f036ff039df0:你好,我也碰到这个问题了,请问你是怎么解决的?
      • 这孩子有点傻:楼主有的demo会集成opencv_core.a ,请问一下opencv_core主要是用在paypal 哪些方面的?
        yzhxcql:@这孩子有点傻 哪个是有的?paypal的官方demo吗
      • Riven2018:创建app的按钮是灰色点不了,怎么回事。。。
        Riven2018:@Adoma 今天亮了,可能是需要时间的吧
        yzhxcql:@WYX_a1d9 没有提示啥的么。。
      • Guow110:楼主,我现在是测试已经OK了,公司也有收款账户 ,怎么创建app呢
        yzhxcql:虽然老了点,但流程还是差不多的
      • 32d2543848c0:楼主你好。我想问下这个SDK不需要token验证啥的对吧?不想用Braintree,那个界面不支持9.0之前的,但是觉得这个SDK没有token验证的话,会不会不安全?
        32d2543848c0:@Adoma 好的,谢谢
        yzhxcql:@Sunshine_4bd8 它和你的后台没交互的,你所做的就是拿到支付成功后的id自己和后台做校验
      • biny_ios:这文档很久的了吧
      • biny_ios:作者,没看到swift的流程啊。。。
      • 钟高荣:你好,可以请教你问题吗? 我现在集成了paypal, 商家帐号是香港的, 测试的用户帐号是国内的, 现在用Sandbox测试是没有问题的, 把环境切换到 live, 就会出现付款的时候,登录用户 (帐号密码正确), 就会弹出来: 很抱歉, 设置此付款时出现问题。 请访问Paypal网站并检查您的账户。 错误代码为 :

        Filtering mail sheet accounts for bundle ID: zz.mycompany.PayPal-iOS-SDK-Sample-App, source account management: 1
        2017-05-03 13:40:10.323765 PayPal-iOS-SDK-Sample-App[4761:1541481] [MC] Result: YES
        2017-05-03 13:40:16.586374 PayPal-iOS-SDK-Sample-App[4761:1541481] PayPal SDK: Request has failed with error: PAYMENT_CREATION_ERROR - 设置此付款时出现问题。请访问PayPal网站并检查您的账户。 (422) | PayPal Debug-ID: ac71137ec658f, ac71137ec658f [live, PayPal iOS SDK 2.16.2]
        yzhxcql:@钟高荣 支付的不是中国的就行
        钟高荣:@Adoma ,现在我是paypal商户帐号用的香港的, 然后支付账户是用的国内的。 那你的意思是 , 商户帐号是中国的, 然后支付账户是国外的,这样才行吗?
        yzhxcql:@钟高荣 国内账户是不能付款的
      • 30e023a6a9e3:请问,paypal的支付流程是不是和微信的不一样啊?
        paypal好像在支付之前是没有到自己的服务器上请求的?是支付之后才到服务器请求确认的吗?
        30e023a6a9e3:@Adoma 也就是说后台服务器只和paypal交互一次吗?就是,在用户app提交验证码到后台服务器,后台服务器就和paypal服务器验证请求,然后paypal就转账.是这个意思吗?能加个QQ,或者微信好友吗?想请教几个问题,谢谢.我的QQ:496794276 微信:WYC496794276
        yzhxcql:@30e023a6a9e3 paypal不和服务器沟通的,除非webhook。支付都在前端,成功之后你需要主动向服务器校验订单。
      • 785c52f271d5:PayPal ios端安全性怎么实现的?
      • e939502bbb11:不懂如何切換真實交易
        並且測試....有無大神可以解答?
      • OlsonXia:楼主,我的app集成了paypal sdk,沙盒环境没有问题,但是打出来的上线appstore的包,装登录paypal的时候显示还是沙盒环境,怎么才能切换到线上真是环境呢?
      • 785c52f271d5:怎么我注册登录后创建app 没有模拟账号可选?
      • 26a0ee7c0683:博主,模拟操作的时候会有这个提示是什么地方没设好?!
        -canOpenURL: failed for URL: "org-appextension-feature-password-management://" - error: "(null)"
      • 老友_:可以,挺6的:no_mouth:
      • 晴天等不到你:更改了货币单位为SGD(新加坡货币单位),但是跳进paypal的vc时候还是显示美元符号$,博主有研究吗?
        yzhxcql:@晴天等不到你 恩
        晴天等不到你:@Adoma 博主的意思是直接显示$是没有错的是吗?
        yzhxcql:通用美元
      • 8be7e754ee7a:沙盒模式是可以支付成功的,但是生产模式就一直报这个错误,请问谁遇到过
        PayPal SDK: Request has failed with error: invalid_user - Incorrect username/password. Please try again. (401) | PayPal Debug-ID: de444ef4bd893, de444ef4bd893 [live, PayPal iOS SDK 2.14.5] | Details: (
        {
        "error_description" = "Invalid user credentials";
        }
        ).
        8be7e754ee7a:@功夫肥猫靈靈九 后来我给Paypal发邮件问了这个问题,他们说是中国的用户不能给中国商户付款
        f81c8c954040:@拿着双猫被春天 请问你是怎么解决这个问题的
        8be7e754ee7a:账号密码是正确的.我在网页端登录过.账号密码也输入好多遍
      • Scott_Dove:没有创建app的按钮 是什么原因
      • Carl_Cfy:作者在吗,求助paypal支付问题,QQ 312584069 谢谢!
      • 莫愁鬼ios:博主,怎么让app自己去验证这次支付的有效性?
      • FarFrom:博主,支付失败的时候是不是没有代理方法走啊,- (void)payPalPaymentViewController:(PayPalPaymentViewController *)paymentViewController didCompletePayment:(PayPalPayment *)completedPayment {
        NSLog(@"PayPal Payment Success!");
        }这个是支付成功才走的吗?要是中间支付失败了,怎么获取失败原因啊?谢谢博主
        yzhxcql:@FarFrom 还有一个取消的代理方法,支付失败的话是不跳出paypal的控制器的。所以,要么完成要么取消。
      • NSMutableHeart:共同讨论共同成长!为你的分享精神点赞!
      • 疾风小超:博主,Paypal的自动扣款功能你研究过没有?
      • RichardZhao:你好 paypal直连你研修过吗
      • Machine_C:博主你好,请问为什么我集成paypal SDK后,paypal控制器里的弹出窗都是黑色的,里面的提示语透明度降的很低很低,几乎看不到了。。。
      • Derrick_P:为什么我把扫描信用卡的功能关了后,点击log in都没反应了啊
      • 0d4cd077cefc:你好 为什么我选择pay with card 支付时就会崩掉 我把acceptCreditCards设置为YES,也就是允许信用卡支付
        f81c8c954040:需要引入 CardIO
        reyzhang:@Adoma 出现同楼上一样的问题。 不知楼主能否给解答一下
        yzhxcql:@0d4cd077cefc 崩掉不可能吧,注册时填的国家是中国的话不能用信用卡的。不支持。会提示账号错误。
      • 懒惰的习惯: 你好,怎么设置创建app应用时的sandbox developer account啊?我在创建的时候,这个没有值。
        灬暮Se丶毛虫:这个没有值,需要等一段时间。我刚开始也遇到了这个问题。是账号还是处于正在处理状态。

      本文标题:PayPal iOS 集成攻略

      本文链接:https://www.haomeiwen.com/subject/kghprttx.html