先说的是我看到的很早以前的Apple Pay的接入教程,这个说完我们来说最新的。
做iOS开发的亲们,最近是不是发现Apple Pay很火啊?迫不及待的想写个demo试一试了。
首先什么是Apple Pay?
Apple Pay类似于一个卡包,它不是应用内支付,Apple Pay用于销售物理商品,比如食品杂货、衣服和电器,也能用于支付俱乐部的会员资格、酒店预订以及演出门票。另一方面,应用内支付只用于销售虚拟物品,如你的App里的高级内容,以及订阅数字内容。
看看写个demo需要哪些步骤吧
第一步:修改target为iOS8.1,然后在项目Capabilities里将Apple Pay设置为on,这将自动导入需要的库文件,然后添加一个权限文件并设置,最后修改或者创建你的App ID。
第二步:你可能会注意到上面没有有效的Merchant ID,我们需要创建一个,访问苹果iOS开发者中心的位于Identifiers > Merchant ID的页面,去创建一个Merchant ID并注册它.
第三步:我们需要给Merchant ID添加一个证书签名请求(Certificate Signing Request),以便加密支付令牌来保证其安全性。为达到这个目的,导航至你的Merchant ID,并点击Edit按钮来修改它。
第四步:你需要创建一个证书,点击下面的Create Certificate按钮,并随着苹果的流程指引完成创建。
第五步:现在Merchant ID设置好了,你可以回到Xcode并刷新Merchant ID区域,如果一切正常,你应当看到刚创建的ID出现在列表上。将它选中,然后可以进入下一部分。
当然了当然了,上面这些都是我从别人博客上搬家的
个人感觉在配置Merchant ID的时候比较麻烦。官方是这么解释的。
To register a merchant ID 注册商用ID标示
-
In Member Center, select Certificates, Identifiers & Profiles. 在开发者中心,选择“Certificate,Identifiers&Profiles”。
-
Under Identifiers, select Merchant IDs. 在Identifiers下选择Merchant IDs
-
Click the Add button (+) in the upper-right corner. 在右上角点击“+”按钮
-
Enter a description and identifier, and click Continue. 在Description栏、ID栏输入相应信息,点击“Continue”
-
Review the settings, and click Register. 浏览下配置参数,点击“Register”
-
Click Done. 点击“Done”
To configure a certificate for your merchant ID 为你的ID标示配置一个证书
-
In Member Center, select Certificates, Identifiers & Profiles.
在开发者会员中心,选择"Certificates,Identifiers&Profiles"
-
Under Identifiers, select Merchant IDs.
在Identifiers下,选择Merchant IDs
-
Select the merchant ID from the list, and click Edit.
选择列表中的ID标示,点击Edit
-
Click Create Certificate, follow the instructions to obtain or generate your certificate signing request (CSR), and click Continue.
点击"Create Certificate",按照指示获取或生成签名证书请求(CSR),点击"Continue"
-
Click Choose File, select your CSR, and click Generate.
点击"Choose File",选择你的CSR,点击"Generate"
-
Download the certificate by clicking Download, and click Done.
点击"Download"下载证书,点击"Done"
If you see a warning in Keychain Access that the certificate was signed by an unknown authority or that it has an invalid issuer, make sure you have the WWDR intermediate certificate - G2 and the Apple Root CA - G2 installed in your keychain. You can download them from apple.com/certificateauthority.如果KeyChain Access中显示了警示信息,表示未知授权签发证书或者无效证书发行人,那么要确保你已经在钥匙链中安装了WWDR中级证书-G2和Apple Root CA-G2。你可以在这个地方下载这些东西:apple.com/certificateauthority.
To enable Apple Pay for your app in Xcode, open the Capabilities pane. Select the switch in the Apple Pay row, and then select the merchant IDs you want the app to use.为了在Xcode中启用Apple Pay,打开APP工程文件的Capabilities面板。在Apple Pay这行将开关按钮设置为"ON",接着选择APP需要使用的ID标示
NOTE
When troubleshooting, it is sometimes helpful to enable Apple Pay manually. Follow these steps to manually enable Apple Pay:
-
In Member Center, select Certificates, Identifiers & Profiles.
-
Under Identifiers, select App IDs.
-
Select the app ID from the list, and click Edit.
-
Select Apple Pay, then click Edit.
-
Select the merchant IDs you want to use, and click Continue.
-
Review the settings, and click Assign.
-
Click Done.
接下来看代码吧
#import <UIKit/UIKit.h>
//Apple Pay使用了PassKit框架,所以你需要在适当的文件里导入头文件
#import <PassKit/PassKit.h>
//设置代理,接收回调信息
@interface ViewController : UIViewController
<PKPaymentAuthorizationViewControllerDelegate>
- (IBAction)checkOut:(id)sender;
@end
@implementation ViewController
- (IBAction)checkOut:(id)sender
{
// [Crittercism beginTransaction:@"checkout"];
//判断设备是否支持Apple Pay支付
if([PKPaymentAuthorizationViewController canMakePayments]) {
NSLog(@"Woo! Can make payments!");
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
//添加物品到支付页
PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem summaryItemWithLabel:@"商品名称1"
amount:[NSDecimalNumber decimalNumberWithString:@"0.99"]];
PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@"商品名称2"
amount:[NSDecimalNumber decimalNumberWithString:@"1.00"]];
PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"美游"
amount:[NSDecimalNumber decimalNumberWithString:@"1.99"]];
request.paymentSummaryItems = @[widget1, widget2, total];
//countryCode查询网站 http://www.unc.edu/~rowlett/units/codes/country.htm
request.countryCode = @"CN";
request.currencyCode = @"CHW";
request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];
//设置Merchant ID(与你创建的相匹配)
request.merchantIdentifier = @"merchant.com.demo.crittercismdemo";
request.merchantCapabilities = PKMerchantCapabilityEMV;
/*
PKMerchantCapabilityCredit NS_ENUM_AVAILABLE_IOS(9_0) = 1UL << 2, // 支持信用卡
PKMerchantCapabilityDebit NS_ENUM_AVAILABLE_IOS(9_0) = 1UL << 3 // 支持借记卡
*/
request.merchantCapabilities = PKMerchantCapabilityCredit;
//增加邮箱及地址信息
request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
Your Delegate Updates Shipping Methods and Costs
-
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
-
didSelectShippingContact:(CNContact*)contact
-
completion:(void(^)(PKPaymentAuthorizationStatus,NSArray*,NSArray*))completion
-
{
-
self.selectedContact=contact;
-
[selfupdateShippingCost];
-
NSArray*shippingMethods=[selfshippingMethodsForContact:contact];
-
completion(PKPaymentAuthorizationStatusSuccess,shippingMethods,self.summaryItems);
-
}
-
-
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
-
didSelectShippingMethod:(PKShippingMethod*)shippingMethod
-
completion:(void(^)(PKPaymentAuthorizationStatus,NSArray*))completion
-
{
-
self.selectedShippingMethod=shippingMethod;
-
[selfupdateShippingCost];
-
completion(PKPaymentAuthorizationStatusSuccess,self.summaryItems);
-
}
NOTE
To maintain privacy, the shipping information provided in paymentAuthorizationViewController:didSelectShippingContact:completion:
is anonymized. The returned contact contains enough information to calculate shipping costs, without revealing sensitive information about the user. You do not get the user’s full shipping information until after the user approves the payment. Additionally, the data available in the contact changes from country to country, and can change from release to release. Be sure to test your app appropriately.
接下来继续代码
//显示由PassKit框架提供的view controller,接下来它将自动处理认证。
PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
paymentPane.delegate = self;
[self presentViewController:paymentPane animated:TRUE completion:nil];
} else {
NSLog(@"该设备不支持支付");
}
}
#pragma mark - ApplePayDelegate
//认证成功
/*
在Apple Pay验证了支付之后,仍然需要开发者来完成交易,这可以用didAuthorizePayment委托方法来完成,它需要你连接服务器并上传支付令牌和和其他信息,以其他信息,以完成整个支付流程。在服务器呼叫结束后,你需要调用completion方法,摒弃提供success或者failure标记的参数。
*/
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatusstatus))completion
{
NSLog(@"Payment was authorized: %@", payment);
BOOL asyncSuccessful = FALSE;
if(asyncSuccessful) {
completion(PKPaymentAuthorizationStatusSuccess);
// 支付成功
NSLog(@"支付成功");
// [Crittercism endTransaction:@"checkout"];
} else {
completion(PKPaymentAuthorizationStatusFailure);
NSLog(@"支付失败");
// [Crittercism failTransaction:@"checkout"];
}
}
//认证完成
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
NSLog(@"Finishing payment view controller");
// hide the payment window
[controller dismissViewControllerAnimated:TRUE completion:nil];
}
@end
做iOS开发的亲们,最近是不是发现Apple Pay很火啊?迫不及待的想写个demo试一试了。
首先什么是Apple Pay?
Apple Pay类似于一个卡包,它不是应用内支付,Apple Pay用于销售物理商品,比如食品杂货、衣服和电器,也能用于支付俱乐部的会员资格、酒店预订以及演出门票。另一方面,应用内支付只用于销售虚拟物品,如你的App里的高级内容,以及订阅数字内容。
看看写个demo需要哪些步骤吧
第一步:修改target为iOS9.0,然后在项目Capabilities里将Apple Pay设置为on,这将自动导入需要的库文件,然后添加一个权限文件并设置,最后修改或者创建你的App ID。
第二步:你可能会注意到上面没有有效的Merchant ID,我们需要创建一个,访问苹果iOS开发者中心的位于Identifiers > Merchant ID的页面,去创建一个Merchant ID并注册它.
第三步:我们需要给Merchant ID添加一个证书签名请求(Certificate Signing Request),以便加密支付令牌来保证其安全性。为达到这个目的,导航至你的Merchant ID,并点击Edit按钮来修改它。
第四步:你需要创建一个证书,点击下面的Create Certificate按钮,并随着苹果的流程指引完成创建。
第五步:现在Merchant ID设置好了,你可以回到Xcode并刷新Merchant ID区域,如果一切正常,你应当看到刚创建的ID出现在列表上。将它选中,然后可以进入下一部分。
当然了当然了,上面这些都是我从别人博客上搬家的
个人感觉在配置Merchant ID的时候比较麻烦。官方是这么解释的。
To register a merchant ID 注册商用ID标示
-
In Member Center, select Certificates, Identifiers & Profiles. 在开发者中心,选择“Certificate,Identifiers&Profiles”。
-
Under Identifiers, select Merchant IDs. 在Identifiers下选择Merchant IDs
-
Click the Add button (+) in the upper-right corner. 在右上角点击“+”按钮
-
Enter a description and identifier, and click Continue. 在Description栏、ID栏输入相应信息,点击“Continue”
-
Review the settings, and click Register. 浏览下配置参数,点击“Register”
-
Click Done. 点击“Done”
To configure a certificate for your merchant ID 为你的ID标示配置一个证书
-
In Member Center, select Certificates, Identifiers & Profiles. 在开发者会员中心,选择"Certificates,Identifiers&Profiles"
-
Under Identifiers, select Merchant IDs. 在Identifiers下,选择Merchant IDs
-
Select the merchant ID from the list, and click Edit. 选择列表中的ID标示,点击Edit
-
Click Create Certificate, follow the instructions to obtain or generate your certificate signing request (CSR), and click Continue. 点击"Create Certificate",按照指示获取或生成签名证书请求(CSR),点击"Continue"
-
Click Choose File, select your CSR, and click Generate. 点击"Choose File",选择你的CSR,点击"Generate"
-
Download the certificate by clicking Download, and click Done. 点击"Download"下载证书,点击"Done"
If you see a warning in Keychain Access that the certificate was signed by an unknown authority or that it has an invalid issuer, make sure you have the WWDR intermediate certificate - G2 and the Apple Root CA - G2 installed in your keychain. You can download them from apple.com/certificateauthority.如果KeyChain Access中显示了警示信息,表示未知授权签发证书或者无效证书发行人,那么要确保你已经在钥匙链中安装了WWDR中级证书-G2和Apple Root CA-G2。你可以在这个地方下载这些东西:apple.com/certificateauthority.
To enable Apple Pay for your app in Xcode, open the Capabilities pane. Select the switch in the Apple Pay row, and then select the merchant IDs you want the app to use.为了在Xcode中启用Apple Pay,打开APP工程文件的Capabilities面板。在Apple Pay这行将开关按钮设置为"ON",接着选择APP需要使用的ID标示
NOTE
When troubleshooting, it is sometimes helpful to enable Apple Pay manually. Follow these steps to manually enable Apple Pay:
-
In Member Center, select Certificates, Identifiers & Profiles.
-
Under Identifiers, select App IDs.
-
Select the app ID from the list, and click Edit.
-
Select Apple Pay, then click Edit.
-
Select the merchant IDs you want to use, and click Continue.
-
Review the settings, and click Assign.
-
Click Done.
接下来看代码吧
#import <UIKit/UIKit.h>
//Apple Pay使用了PassKit框架,所以你需要在适当的文件里导入头文件
#import <PassKit/PassKit.h>
//设置代理,接收回调信息
@interface ViewController : UIViewController
<PKPaymentAuthorizationViewControllerDelegate>
- (IBAction)checkOut:(id)sender;
@end
@implementation ViewController
- (IBAction)checkOut:(id)sender
{
// [Crittercism beginTransaction:@"checkout"];
//判断设备是否支持Apple Pay支付
if([PKPaymentAuthorizationViewController canMakePayments]) {
NSLog(@"Woo! Can make payments!");
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
//添加物品到支付页
PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem summaryItemWithLabel:@"商品名称1"
amount:[NSDecimalNumber decimalNumberWithString:@"0.99"]];
PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@"商品名称2"
amount:[NSDecimalNumber decimalNumberWithString:@"1.00"]];
PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"美游"
amount:[NSDecimalNumber decimalNumberWithString:@"1.99"]];
request.paymentSummaryItems = @[widget1, widget2, total];
//countryCode查询网站 http://www.unc.edu/~rowlett/units/codes/country.htm
request.countryCode = @"CN";
request.currencyCode = @"CHW";
request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];
//设置Merchant ID(与你创建的相匹配)
request.merchantIdentifier = @"merchant.com.demo.crittercismdemo";
request.merchantCapabilities = PKMerchantCapabilityEMV;
/*
PKMerchantCapabilityCredit NS_ENUM_AVAILABLE_IOS(9_0) = 1UL << 2, // 支持信用卡
PKMerchantCapabilityDebit NS_ENUM_AVAILABLE_IOS(9_0) = 1UL << 3 // 支持借记卡
*/
request.merchantCapabilities = PKMerchantCapabilityCredit;
//增加邮箱及地址信息
request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
Your Delegate Updates Shipping Methods and Costs
-
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
-
didSelectShippingContact:(CNContact*)contact
-
completion:(void(^)(PKPaymentAuthorizationStatus,NSArray*,NSArray*))completion
-
{
-
self.selectedContact=contact;
-
[selfupdateShippingCost];
-
NSArray*shippingMethods=[selfshippingMethodsForContact:contact];
-
completion(PKPaymentAuthorizationStatusSuccess,shippingMethods,self.summaryItems);
-
}
-
-
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
-
didSelectShippingMethod:(PKShippingMethod*)shippingMethod
-
completion:(void(^)(PKPaymentAuthorizationStatus,NSArray*))completion
-
{
-
self.selectedShippingMethod=shippingMethod;
-
[selfupdateShippingCost];
-
completion(PKPaymentAuthorizationStatusSuccess,self.summaryItems);
-
}
NOTE
To maintain privacy, the shipping information provided in paymentAuthorizationViewController:didSelectShippingContact:completion:
is anonymized. The returned contact contains enough information to calculate shipping costs, without revealing sensitive information about the user. You do not get the user’s full shipping information until after the user approves the payment. Additionally, the data available in the contact changes from country to country, and can change from release to release. Be sure to test your app appropriately.
接下来继续代码
//显示由PassKit框架提供的view controller,接下来它将自动处理认证。
PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
paymentPane.delegate = self;
[self presentViewController:paymentPane animated:TRUE completion:nil];
} else {
NSLog(@"该设备不支持支付");
}
}
#pragma mark - ApplePayDelegate
//认证成功
/*
在Apple Pay验证了支付之后,仍然需要开发者来完成交易,这可以用didAuthorizePayment委托方法来完成,它需要你连接服务器并上传支付令牌和和其他信息,以其他信息,以完成整个支付流程。在服务器呼叫结束后,你需要调用completion方法,摒弃提供success或者failure标记的参数。
*/
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatusstatus))completion
{
NSLog(@"Payment was authorized: %@", payment);
BOOL asyncSuccessful = FALSE;
if(asyncSuccessful) {
completion(PKPaymentAuthorizationStatusSuccess);
// 支付成功
NSLog(@"支付成功");
// [Crittercism endTransaction:@"checkout"];
} else {
completion(PKPaymentAuthorizationStatusFailure);
NSLog(@"支付失败");
// [Crittercism failTransaction:@"checkout"];
}
}
//认证完成
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
NSLog(@"Finishing payment view controller");
// hide the payment window
[controller dismissViewControllerAnimated:TRUE completion:nil];
}
@end
来源:Yasin的简书
链接:http://www.jianshu.com/p/738aee78ba52#
准备工作
在接入Apple Pay之前,首先要申请MerchantID及对应证书。
请移步我写的申请MerchantID及对应证书详细图文教程
工程设置
bundleID设置
Capability中启用Apple Pay权限,并选择merchantID。
之后项目会多一个Applepay的配置文件ApplePayYasin.entitlements
需要引用的库
Xcode7.0以上不需要再手动添加需要引用的库了,只需要导入头文件就可以了
#import <PassKit/PassKit.h> //用户绑定的银行卡信息#import <PassKit/PKPaymentAuthorizationViewController.h> //Apple pay的展示控件
#import <AddressBook/AddressBook.h> //用户联系信息相关
设备Applepay权限检测
if (![PKPaymentAuthorizationViewController class]) {
//PKPaymentAuthorizationViewController需iOS8.0以上支持
NSLog(@"操作系统不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");
return;
}
//检查当前设备是否可以支付
if (![PKPaymentAuthorizationViewController canMakePayments]) {
//支付需iOS9.0以上支持
NSLog(@"设备不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");
return;
}
//检查用户是否可进行某种卡的支付,是否支持Amex、MasterCard、Visa与银联四种卡,根据自己项目的需要进行检测
NSArray *supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];
if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetworks]) {
NSLog(@"没有绑定支付卡");
return;
}
创建支付请求PKPaymentRequest
-
初始化PKPaymentRequest
这里需要注意RMB的币种代码是CNY
//设置币种、国家码及merchant标识符等基本信息
PKPaymentRequest *payRequest = [[PKPaymentRequest alloc]init];
payRequest.countryCode = @"CN"; //国家代码
payRequest.currencyCode = @"CNY"; //RMB的币种代码
payRequest.merchantIdentifier = @"merchant.ApplePayDemoYasin"; //申请的merchantID
payRequest.supportedNetworks = supportedNetworks; //用户可进行支付的银行卡
payRequest.merchantCapabilities = PKMerchantCapability3DS|PKMerchantCapabilityEMV; //设置支持的交易处理协议,3DS必须支持,EMV为可选,目前国内的话还是使用两者吧
-
设置发票配送信息和货物配送地址信息,用户设置后可以通过代理回调代理获取信息的更新
// payRequest.requiredBillingAddressFields = PKAddressFieldEmail;
//如果需要邮寄账单可以选择进行设置,默认PKAddressFieldNone(不邮寄账单)
//楼主感觉账单邮寄地址可以事先让用户选择是否需要,否则会增加客户的输入麻烦度,体验不好,
payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName;
//送货地址信息,这里设置需要地址和联系方式和姓名,如果需要进行设置,默认PKAddressFieldNone(没有送货地址)
送货信息页面展示
-
设置货物的配送方式,不需要不配置
//设置两种配送方式
PKShippingMethod *freeShipping = [PKShippingMethod summaryItemWithLabel:@"包邮" amount:[NSDecimalNumber zero]];
freeShipping.identifier = @"freeshipping";
freeShipping.detail = @"6-8 天 送达";
PKShippingMethod *expressShipping = [PKShippingMethod summaryItemWithLabel:@"极速送达" amount:[NSDecimalNumber decimalNumberWithString:@"10.00"]];
expressShipping.identifier = @"expressshipping";
expressShipping.detail = @"2-3 小时 送达";
payRequest.shippingMethods = @[freeShipping, expressShipping];
-
账单信息的设置
-
每条账单的设置
账单列表使用PKPaymentSummaryItem添加描述和价格,价格使用NSDecimalNumber。
PKPaymentSummaryItem初始化:
label为商品名字或者是描述,amount为商品价格,折扣为负数,type为该条账单为最终价格还是估算价格(比如出租车价格预估)
+ (instancetype)summaryItemWithLabel:(NSString *)label amount:(NSDecimalNumber *)amount;+ (instancetype)summaryItemWithLabel:(NSString *)label amount:(NSDecimalNumber *)amount type:(PKPaymentSummaryItemType)type NS_AVAILABLE(NA, 9_0);
-
NSDecimalNumber初始化:
NSDecimalNumber可以使用数字初始化,也可以使用字符串。
使用方法请移步我写的NSDecimalNumber--十进制数
-
添加账单列表:
NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:1275 exponent:-2 isNegative:NO]; //12.75
PKPaymentSummaryItem *subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@"商品价格" amount:subtotalAmount];
NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithString:@"-12.74"]; //-12.74
PKPaymentSummaryItem *discount = [PKPaymentSummaryItem summaryItemWithLabel:@"优惠折扣" amount:discountAmount];
NSDecimalNumber *methodsAmount = [NSDecimalNumber zero];
PKPaymentSummaryItem *methods = [PKPaymentSummaryItem summaryItemWithLabel:@"包邮" amount:methodsAmount];
NSDecimalNumber *totalAmount = [NSDecimalNumber zero];
totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount];
totalAmount = [totalAmount decimalNumberByAdding:discountAmount];
totalAmount = [totalAmount decimalNumberByAdding:methodsAmount];
PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"Yasin" amount:totalAmount]; //最后这个是支付给谁。哈哈,快支付给我
summaryItems = [NSMutableArray arrayWithArray:@[subtotal, discount, methods, total]];
//summaryItems为账单列表,类型是 NSMutableArray,这里设置成成员变量,在后续的代理回调中可以进行支付金额的调整。
payRequest.paymentSummaryItems = summaryItems;
显示购物信息并进行支付
//ApplePay控件
PKPaymentAuthorizationViewController *view = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:payRequest];
view.delegate = self;
[self presentViewController:view animated:YES completion:nil];
PKPaymentAuthorizationViewControllerDelegate代理
-
这里还有两个类要介绍 -
PKPayment 支付成功信息
PKPaymentToken *payToken = payment.token;
//支付凭据,发给服务端进行验证支付是否真实有效
PKContact *billingContact = payment.billingContact; //账单信息
PKContact *shippingContact = payment.shippingContact; //送货信息
PKContact *shippingMethod = payment.shippingMethod; //送货方式
-
PKContact 联系人信息
NSPersonNameComponents *name = contact.name; //联系人姓名CNPostalAddress *postalAddress = contact.postalAddress; //联系人地址
NSString *emailAddress = contact.emailAddress; //联系人邮箱
CNPhoneNumber *phoneNumber = contact.phoneNumber; //联系人手机
NSString *supplementarySubLocality = contact.supplementarySubLocality; //补充信息,地址详细描述,其他备注等等,iOS9.2及以上才有
-
代理说明
送货地址回调
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingContact:(PKContact *)contact
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKShippingMethod *> * _Nonnull, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{
//contact送货地址信息,PKContact类型
//送货信息选择回调,如果需要根据送货地址调整送货方式,比如普通地区包邮+极速配送,偏远地区只有付费普通配送,进行支付金额重新计算,可以实现该代理,返回给系统:shippingMethods配送方式,summaryItems账单列表,如果不支持该送货信息返回想要的PKPaymentAuthorizationStatus
completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, summaryItems);
}
送货方式回调
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingMethod:(PKShippingMethod *)shippingMethod
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{
//配送方式回调,如果需要根据不同的送货方式进行支付金额的调整,比如包邮和付费加速配送,可以实现该代理
PKShippingMethod *oldShippingMethod = [summaryItems objectAtIndex:2];
PKPaymentSummaryItem *total = [summaryItems lastObject];
total.amount = [total.amount decimalNumberBySubtracting:oldShippingMethod.amount];
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingMethod:(PKShippingMethod *)shippingMethod
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{
//配送方式回调,如果需要根据不同的送货方式进行支付金额的调整,比如包邮和付费加速配送,可以实现该代理
PKShippingMethod *oldShippingMethod = [summaryItems objectAtIndex:2];
PKPaymentSummaryItem *total = [summaryItems lastObject];
total.amount = [total.amount decimalNumberBySubtracting:oldShippingMethod.amount];
total.amount = [total.amount decimalNumberByAdding:shippingMethod.amount];
[summaryItems replaceObjectAtIndex:2 withObject:shippingMethod];
[summaryItems replaceObjectAtIndex:3 withObject:total];
completion(PKPaymentAuthorizationStatusSuccess, summaryItems);
} total.amount = [total.amount decimalNumberByAdding:shippingMethod.amount];
[summaryItems replaceObjectAtIndex:2 withObject:shippingMethod];
[summaryItems replaceObjectAtIndex:3 withObject:total];
completion(PKPaymentAuthorizationStatusSuccess, summaryItems);
}
支付卡选择回调
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectPaymentMethod:(PKPaymentMethod *)paymentMethod completion:(void (^)(NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{
//支付银行卡回调,如果需要根据不同的银行调整付费金额,可以实现该代理
completion(summaryItems);
}
送货地址回调,已弃用
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectShippingAddress:(ABRecordRef)address completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKShippingMethod *> * _Nonnull, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{
//送货地址回调,已弃用
}
付款成功苹果服务器返回信息回调,做服务器验证
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion {
PKPaymentToken *payToken = payment.token;
//支付凭据,发给服务端进行验证支付是否真实有效
PKContact *billingContact = payment.billingContact; //账单信息
PKContact *shippingContact = payment.shippingContact; //送货信息
PKContact *shippingMethod = payment.shippingMethod; //送货方式
//等待服务器返回结果后再进行系统block调用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//模拟服务器通信
completion(PKPaymentAuthorizationStatusSuccess);
});
}
支付完成回调
-(void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{
[controller dismissViewControllerAnimated:YES completion:nil];
}
demo的话因为证书问题可能会报错,不过大家可以看看代码。