sdk下载地址:
https://github.com/paypal/PayPal-iOS-SDK
最近项目要求做paypal,踩了很多坑
流程分析:
1.首先创建 PayPalConfiguration对象
PayPalConfiguration对象属性:
acceptCreditCards 是否支持信用卡
merchantPrivacyPolicyURL 商家政策地址,可用官方:https://www.paypal.com/webapps/mpp/ua/privacy-full
merchantUserAgreementURL 用户同意协议地址,可用官方:https://www.paypal.com/webapps/mpp/ua/useragreement-full
languageOrLocale 语言环境,[NSLocale preferredLanguages][0]
payPalShippingAddressOption 是否有地址选择
merchantName 商户名称
typedef NS_ENUM(NSInteger, PayPalShippingAddressOption) {
PayPalShippingAddressOptionNone =0,(默认)
PayPalShippingAddressOptionProvided =1,
PayPalShippingAddressOptionPayPal =2,
PayPalShippingAddressOptionBoth =3,
};
2.初始化paypal支付
[PayPalMobile initializeWithClientIdsForEnvironments:@{PayPalEnvironmentProduction : @"正式环境的clientid",PayPalEnvironmentSandbox :@"沙盒环境clientid"}]
[PayPalMobile preconnectWithEnvironment:支付环境]; //PayPalEnvironmentNoNetwork 无网络环境、PayPalEnvironmentProduction 生产环境、PayPalEnvironmentSandbox 沙盒环境
3.支付商品参数设置
PayPalPayment对象
单一商品和多个商品公共属性
currencyCode 货币代码 例如:@"USD" ("RMB"没用)
shortDescription 商品描述
custom 订单号
单一商品:
amount 单个商品价格(NSDecimalNumber类型)
items 商品 (设为nil)
paymentDetails 商品详情(设为nil)
多个商品:
amount 多个商品价格包含税费和运费(NSDecimalNumber类型)
items 商品数组
paymentDetails 商品集合(PayPalPaymentDetails类型)
PayPalPaymentDetails属性:
subtotal 商品的集合(NSDecimalNumber类型)
shipping 商品运费(NSDecimalNumber类型)
tax 商品税费(NSDecimalNumber类型)
PayPalItem 对象 : name 商品名称 quantity商品数量(int类型) price商品价格 (NSDecimalNumber类型) currency 商品价格单位 sku 商品基数(设为1)
4.打开paypal页面
创建PayPalPaymentViewController 对象,present 该vc
具体代码:
1.paypalconfig:
-(instancetype)init{
self = [super init];
if (self) {
_payPalConfig = [[PayPalConfiguration alloc] init];
_payPalConfig.acceptCreditCards = YES;
_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"];
_payPalConfig.languageOrLocale = [NSLocale preferredLanguages][0];
_payPalConfig.merchantName = @"商户名";
}
return self;
}
2.paypal初始化
[PayPalMobile initializeWithClientIdsForEnvironments:@{PayPalEnvironmentProduction : @"xxx",PayPalEnvironmentSandbox :@"xxx"}];
[PayPalMobile preconnectWithEnvironment:(payType == 0 ? PayPalEnvironmentNoNetwork : payType == 1 ? PayPalEnvironmentProduction : PayPalEnvironmentSandbox)];
3.配置所需参数
PayPalPayment *payment = [[PayPalPayment alloc] init];
payment.currencyCode = para1[@"data"][@"currency"];
payment.shortDescription = para1[@"data"][@"orderName"];
payment.custom = para1[@"data"][@"onumber"];
if([para1[@"type"] integerValue] != 1){
//单个商品
payment.amount = [[NSDecimalNumber alloc] initWithString:para1[@"data"][@"price"]];
payment.items = nil;
payment.paymentDetails = nil;
}else{
//多个商品
NSMutableArray *items = [NSMutableArray array];
for (NSDictionary *good in para1[@"data"][@"goodsList"]) {
PayPalItem *item = [PayPalItem itemWithName:good[@"name"]
withQuantity:[good[@"quantity"] intValue]
withPrice:[NSDecimalNumber decimalNumberWithString:good[@"price"]]
withCurrency:good[@"currency"]
withSku:good[@"sku"]];
[items addObject:item];
}
NSDecimalNumber *subtotal = [PayPalItem totalPriceForItems:[items copy]];
if([subtotal intValue] == 0){
//容错
[vc.view makeToast:@"产品数量有误" duration:2.0f position:CSToastPositionCenter];
return;
}
NSDecimalNumber *shipping = [[NSDecimalNumber alloc] initWithString:para1[@"data"][@"shipping"]];
NSDecimalNumber *tax = [[NSDecimalNumber alloc] initWithString:para1[@"data"][@"tax"]];
PayPalPaymentDetails *paymentDetails = [PayPalPaymentDetails paymentDetailsWithSubtotal:subtotal
withShipping:shipping
withTax:tax];
NSDecimalNumber *total = [[subtotal decimalNumberByAdding:shipping] decimalNumberByAdding:tax];
payment.items = items;
payment.paymentDetails = paymentDetails;
payment.amount = total;
}
dispatch_async(dispatch_get_main_queue(), ^{
PayPalPaymentViewController *paymentViewController = [[PayPalPaymentViewController alloc] initWithPayment:payment configuration:self.payPalConfig delegate:self];
[vc presentViewController:paymentViewController animated:YES completion:nil];
});
4.实现代理
#pragma mark ====================== PayPalPaymentDelegate ==============
//取消支付
-(void)payPalPaymentDidCancel:(PayPalPaymentViewController *)paymentViewController{
[paymentViewController dismissViewControllerAnimated:YES completion:nil];
}
//支付完成
-(void)payPalPaymentViewController:(PayPalPaymentViewController *)paymentViewController didCompletePayment:(PayPalPayment *)completedPayment{
[self sendCompletedPaymentToServer:completedPayment];
[paymentViewController dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark Proof of payment validation
- (void)sendCompletedPaymentToServer:(PayPalPayment *)completedPayment {
//支付完成后的回调处理
NSLog(@"Here is your proof of payment:\n\n%@\n\nSend this to your server for confirmation and fulfillment.", completedPayment.confirmation);
}
附:如果不需要信用卡支付,可以不导入cardIO库,这个是信用卡支付需要用到的库
网友评论