ps:转自我自己的简书
这两天在研究如何在项目中集成PayPal的iOS SDK 但是百度到的资料很少,研究了两天拿出来和大家分享下,共同讨论共同成长。
这里以PayPal的官方demo为例,sdk和demo地址在这里:paypal
- 安装流程建议使用CocoaPods,喜欢配置依赖库的小伙伴自行百度
准备事项
- 预先善其事,必先利其器
首先你得注册个paypal账号,连账号都没有谁给你钱啊
- 登录paypal开发者网站。 点这里
- 右上角看到了没有,不上图了。有账号的登录,没账号的注册。
- 在上面的 DASHBOARD 页面下,找到 Creat APP ,点它!创建一个阿啪啪出来。
- 我们来到创建阿啪啪的页面,这里需要输入一个阿啪啪名字以及选择一个账户,名字没问题,可是这个账户怎么来的?这个稍后说,选上就行了。名字填好后,点击Creat App。
- 来到我们的阿啪啪页面,这里是查看你的应用信息的地方。右上角分别对应着你的应用的测试模式和真实交易模式,点击切换会看到不同的API CREDENTIALS 内容,分别是在测试模式和真实交易模式下不同的Account、Client ID和Secret。这里掏出小本本,记下测试模式下的Client ID,之后会用到。
- 接下来,选择右边的Sandbox下Accounts选项。Sandbox就是测试环境,其中包含了你的账户信息、通知消息、交易记录等等。。(其实我不知道后面那三个干嘛的,因为没用到)。 而在现在所看到的Accounts中,你会看到两个账号,第一个就是测试模式下,你的商家账号。在你的阿啪啪中产生的所有虚拟交易,其金额都会流入到这个账号下。而第二个,不用说你也猜到,就是在虚拟交易中扮演顾客的账号。右上角可以添加账号,具体玩法自行摸索,这里不多说了。
- 轻轻的点下你的商家账号。弹出的框选择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的支付流程:
- 配置paypal SDK连接环境如:测试环境、真实环境
- 配置paypal一些参数如:商家名字、地址选项、商家隐私政策和用户协议网址等
- 配置支付相关如:订单总额、货币类型和订单描述等
- 提交订单,通过代理回调支付状态
老司机要开车了,请坐稳
简单说下原理,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选择。这里就是所有的交易通知,包括商家账户和顾客账户。