Apple pay初探



先说的是我看到的很早以前的Apple Pay的接入教程,这个说完我们来说最新的。

做iOS开发的亲们,最近是不是发现Apple Pay很火啊?迫不及待的想写个demo试一试了。

首先什么是Apple Pay?

Apple Pay类似于一个卡包,它不是应用内支付,Apple Pay用于销售物理商品,比如食品杂货、衣服和电器,也能用于支付俱乐部的会员资格、酒店预订以及演出门票。另一方面,应用内支付只用于销售虚拟物品,如你的App里的高级内容,以及订阅数字内容。

看看写个demo需要哪些步骤吧

第一步:修改targetiOS8.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标示

  1. In Member Center, select Certificates, Identifiers & Profiles.      在开发者中心,选择“Certificate,Identifiers&Profiles”。

  2. Under Identifiers, select Merchant IDs.                                       在Identifiers下选择Merchant IDs

  3. Click the Add button (+) in the upper-right corner.    在右上角点击“+”按钮

  4. Enter a description and identifier, and click Continue.                在Description栏、ID栏输入相应信息,点击“Continue”

  5. Review the settings, and click Register.     浏览下配置参数,点击“Register”

  6. Click Done.     点击“Done”

To configure a certificate for your merchant ID  为你的ID标示配置一个证书

  1. In Member Center, select Certificates, Identifiers & Profiles.     

    在开发者会员中心,选择"Certificates,Identifiers&Profiles"

  2. Under Identifiers, select Merchant IDs.                                     

     在Identifiers下,选择Merchant IDs

  3. Select the merchant ID from the list, and click Edit.                    

    选择列表中的ID标示,点击Edit

  4. Click Create Certificate, follow the instructions to obtain or generate your certificate signing request (CSR), and click Continue.      

    点击"Create Certificate",按照指示获取或生成签名证书请求(CSR),点击"Continue"

  5. Click Choose File, select your CSR, and click Generate.              

     点击"Choose File",选择你的CSR,点击"Generate"

  6. 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标示

image: ../Art/enable_apple_pay.png

NOTE

When troubleshooting, it is sometimes helpful to enable Apple Pay manually. Follow these steps to manually enable Apple Pay:

  1. In Member Center, select Certificates, Identifiers & Profiles.

  2. Under Identifiers, select App IDs.

  3. Select the app ID from the list, and click Edit.

  4. Select Apple Pay, then click Edit.

  5. Select the merchant IDs you want to use, and click Continue.

  6. Review the settings, and click Assign.

  7. Click Done.




接下来看代码吧

#import <UIKit/UIKit.h>

//Apple Pay使用了PassKit框架,所以你需要在适当的文件里导入头文件

#import <PassKit/PassKit.h>

//设置代理,接收回调信息

@interface ViewController : UIViewController

<PKPaymentAuthorizationViewControllerDelegate>


- (IBAction)checkOut:(id)sender;


@end



@implementation ViewController

//当点击button的时候我们需要做些什么呢?

- (IBAction)checkOut:(id)sender

{

    // [Crittercism beginTransaction:@"checkout"];

    //判断设备是否支持Apple Pay支付

    if([PKPaymentAuthorizationViewController canMakePayments]) {


        NSLog(@"Woo! Can make payments!");

        

        PKPaymentRequest *request = [[PKPaymentRequest allocinit];

        //添加物品到支付页

        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 = @[PKPaymentNetworkAmexPKPaymentNetworkMasterCardPKPaymentNetworkVisa];

        //设置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;


这里值得一提的是配送方式,可以创建一个PKShippingMethod的实例,可以设置选择标准配送或者第二天配送,配送方式还有一个detail属性,像“7月29日到达”或者“24小时之内配送”等。如果用户选择地址或者配送方式不适用,你可以在代理方法中更新这些信息,官方文档是这样说的:

Your Delegate Updates Shipping Methods and Costs

  1. -(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
  2. didSelectShippingContact:(CNContact*)contact
  3. completion:(void(^)(PKPaymentAuthorizationStatus,NSArray*,NSArray*))completion
  4. {
  5. self.selectedContact=contact;
  6. [selfupdateShippingCost];
  7. NSArray*shippingMethods=[selfshippingMethodsForContact:contact];
  8. completion(PKPaymentAuthorizationStatusSuccess,shippingMethods,self.summaryItems);
  9. }
  10. -(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
  11. didSelectShippingMethod:(PKShippingMethod*)shippingMethod
  12. completion:(void(^)(PKPaymentAuthorizationStatus,NSArray*))completion
  13. {
  14. self.selectedShippingMethod=shippingMethod;
  15. [selfupdateShippingCost];
  16. completion(PKPaymentAuthorizationStatusSuccess,self.summaryItems);
  17. }

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 allocinitWithPaymentRequest: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


详细的说明我都在里面写了备注了哦。

然后呢,我有看了苹果的官方文档。以下在做些更加细节的说明吧。

1、需要注意的是,你要用到Apple Pay就必须导入PassKit框架(在这里提一下应用内支付需导入StoreKit框架);
2、上面提到需要前往开发者中心去配置Merchant ID,按照上面说的步骤来就行了
3、通俗的流程:点击支付按钮,PassKit提供相关API检测运行环境是否安全,以及设备是否已经被分配了你所支持的信用卡。   然后呢,就会弹出一个支付页面,这个页面你可以修改内容和要展示的信息。   接下来,就是用户输入密码或者Touch ID认证后,你的App将会从PassKit接收到一个支付令牌,这个支付令牌包含完成交易所需要的信息。
4、Apple Pay不收取用户、商家以及开发者的费用。


附录:Apple Pay编程指南写的非常好:http://www.cocoachina.com/ios/20150126/11019.html



做iOS开发的亲们,最近是不是发现Apple Pay很火啊?迫不及待的想写个demo试一试了。

首先什么是Apple Pay?

Apple Pay类似于一个卡包,它不是应用内支付,Apple Pay用于销售物理商品,比如食品杂货、衣服和电器,也能用于支付俱乐部的会员资格、酒店预订以及演出门票。另一方面,应用内支付只用于销售虚拟物品,如你的App里的高级内容,以及订阅数字内容。

看看写个demo需要哪些步骤吧

第一步:修改targetiOS9.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标示

  1. In Member Center, select Certificates, Identifiers & Profiles.      在开发者中心,选择“Certificate,Identifiers&Profiles”。

  2. Under Identifiers, select Merchant IDs.                                       在Identifiers下选择Merchant IDs

  3. Click the Add button (+) in the upper-right corner.    在右上角点击“+”按钮

  4. Enter a description and identifier, and click Continue.                在Description栏、ID栏输入相应信息,点击“Continue”

  5. Review the settings, and click Register.     浏览下配置参数,点击“Register”

  6. Click Done.     点击“Done”

To configure a certificate for your merchant ID  为你的ID标示配置一个证书

  1. In Member Center, select Certificates, Identifiers & Profiles.     在开发者会员中心,选择"Certificates,Identifiers&Profiles"

  2. Under Identifiers, select Merchant IDs.                                      在Identifiers下,选择Merchant IDs

  3. Select the merchant ID from the list, and click Edit.                    选择列表中的ID标示,点击Edit

  4. Click Create Certificate, follow the instructions to obtain or generate your certificate signing request (CSR), and click Continue.      点击"Create Certificate",按照指示获取或生成签名证书请求(CSR),点击"Continue"

  5. Click Choose File, select your CSR, and click Generate.               点击"Choose File",选择你的CSR,点击"Generate"

  6. 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标示

image: ../Art/enable_apple_pay.png

NOTE

When troubleshooting, it is sometimes helpful to enable Apple Pay manually. Follow these steps to manually enable Apple Pay:

  1. In Member Center, select Certificates, Identifiers & Profiles.

  2. Under Identifiers, select App IDs.

  3. Select the app ID from the list, and click Edit.

  4. Select Apple Pay, then click Edit.

  5. Select the merchant IDs you want to use, and click Continue.

  6. Review the settings, and click Assign.

  7. Click Done.




接下来看代码吧

#import <UIKit/UIKit.h>

//Apple Pay使用了PassKit框架,所以你需要在适当的文件里导入头文件

#import <PassKit/PassKit.h>

//设置代理,接收回调信息

@interface ViewController : UIViewController

<PKPaymentAuthorizationViewControllerDelegate>


- (IBAction)checkOut:(id)sender;


@end



@implementation ViewController

//当点击button的时候我们需要做些什么呢?

- (IBAction)checkOut:(id)sender

{

    // [Crittercism beginTransaction:@"checkout"];

    //判断设备是否支持Apple Pay支付

    if([PKPaymentAuthorizationViewController canMakePayments]) {


        NSLog(@"Woo! Can make payments!");

        

        PKPaymentRequest *request = [[PKPaymentRequest allocinit];

        //添加物品到支付页

        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 = @[PKPaymentNetworkAmexPKPaymentNetworkMasterCardPKPaymentNetworkVisa];

        //设置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;


这里值得一提的是配送方式,可以创建一个PKShippingMethod的实例,可以设置选择标准配送或者第二天配送,配送方式还有一个detail属性,像“7月29日到达”或者“24小时之内配送”等。如果用户选择地址或者配送方式不适用,你可以在代理方法中更新这些信息,官方文档是这样说的:

Your Delegate Updates Shipping Methods and Costs

  1. -(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
  2. didSelectShippingContact:(CNContact*)contact
  3. completion:(void(^)(PKPaymentAuthorizationStatus,NSArray*,NSArray*))completion
  4. {
  5. self.selectedContact=contact;
  6. [selfupdateShippingCost];
  7. NSArray*shippingMethods=[selfshippingMethodsForContact:contact];
  8. completion(PKPaymentAuthorizationStatusSuccess,shippingMethods,self.summaryItems);
  9. }
  10. -(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
  11. didSelectShippingMethod:(PKShippingMethod*)shippingMethod
  12. completion:(void(^)(PKPaymentAuthorizationStatus,NSArray*))completion
  13. {
  14. self.selectedShippingMethod=shippingMethod;
  15. [selfupdateShippingCost];
  16. completion(PKPaymentAuthorizationStatusSuccess,self.summaryItems);
  17. }

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 allocinitWithPaymentRequest: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


详细的说明我都在里面写了备注了哦。

然后呢,我有看了苹果的官方文档。以下在做些更加细节的说明吧。

1、需要注意的是,你要用到Apple Pay就必须导入PassKit框架(在这里提一下应用内支付需导入StoreKit框架);
2、上面提到需要前往开发者中心去配置Merchant ID,按照上面说的步骤来就行了
3、通俗的流程:点击支付按钮,PassKit提供相关API检测运行环境是否安全,以及设备是否已经被分配了你所支持的信用卡。   然后呢,就会弹出一个支付页面,这个页面你可以修改内容和要展示的信息。   接下来,就是用户输入密码或者Touch ID认证后,你的App将会从PassKit接收到一个支付令牌,这个支付令牌包含完成交易所需要的信息。
4、Apple Pay不收取用户、商家以及开发者的费用。


附录:Apple Pay编程指南写的非常好:http://www.cocoachina.com/ios/20150126/11019.html



然后呢?我看了一篇最新的Apple Pay的接入教程,其中大部分内容是一样的。内容太长,我就不一一介绍了,直接把内容粘贴过来,人家介绍的还是很详细的。

来源:Yasin的简书 

链接:http://www.jianshu.com/p/738aee78ba52#


首先Apple Pay运行环境:iPhone6以上设备,操作系统最低iOS9.0以上,部分信息设置需要iOS9.2以上。目前还不支持企业证书添加。

环境搭建好之后可以模拟器上面运行,xcode7.2.1+iPhone6SP9.2系统下,系统会绑定几种虚拟的银行卡,和几个联系人,方便调试,支持也不会发生真实的付款,真的很方便。

准备工作

在接入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的话因为证书问题可能会报错,不过大家可以看看代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值