Apple Pay

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以上不需要再手动添加需要引用的库了,只需要导入头文件就可以了


1

2

3

#import <passkit passkit.h="">                                 //用户绑定的银行卡信息

#import <passkit pkpaymentauthorizationviewcontroller.h="">    //Apple pay的展示控件

#import <addressbook addressbook.h="">                         //用户联系信息相关</addressbook></passkit></passkit>

  • 设备Applepay权限检测

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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


1

2

3

4

5

6

7

//设置币种、国家码及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为可选,目前国内的话还是使用两者吧

  • 设置发票配送信息和货物配送地址信息,用户设置后可以通过代理回调代理获取信息的更新

1

2

3

4

5

// payRequest.requiredBillingAddressFields = PKAddressFieldEmail;   

//如果需要邮寄账单可以选择进行设置,默认PKAddressFieldNone(不邮寄账单)

//楼主感觉账单邮寄地址可以事先让用户选择是否需要,否则会增加客户的输入麻烦度,体验不好,

  payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName;

  //送货地址信息,这里设置需要地址和联系方式和姓名,如果需要进行设置,默认PKAddressFieldNone(没有送货地址)

送货信息页面展示

设置货物的配送方式,不需要不配置


1

2

3

4

5

6

7

8

9

10

//设置两种配送方式

  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为该条账单为最终价格还是估算价格(比如出租车价格预估)


1

2

+ (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--十进制数

添加账单列表:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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;

显示购物信息并进行支付


1

2

3

4

//ApplePay控件

    PKPaymentAuthorizationViewController *view = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:payRequest];

    view.delegate = self;

    [self presentViewController:view animated:YES completion:nil];

PKPaymentAuthorizationViewControllerDelegate代理

  • 这里还有两个类要介绍

PKPayment 支付成功信息


1

2

3

4

5

PKPaymentToken *payToken = payment.token;

//支付凭据,发给服务端进行验证支付是否真实有效

PKContact *billingContact = payment.billingContact;     //账单信息

PKContact *shippingContact = payment.shippingContact;   //送货信息

PKContact *shippingMethod = payment.shippingMethod;     //送货方式

PKContact 联系人信息


1

2

3

4

5

NSPersonNameComponents *name = contact.name;                //联系人姓名

CNPostalAddress *postalAddress = contact.postalAddress;     //联系人地址

NSString *emailAddress = contact.emailAddress;              //联系人邮箱

CNPhoneNumber *phoneNumber = contact.phoneNumber;           //联系人手机

NSString *supplementarySubLocality = contact.supplementarySubLocality;  //补充信息,地址详细描述,其他备注等等,iOS9.2及以上才有

  • 代理说明

送货地址回调


1

2

3

4

5

6

7

-(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);

}</pkpaymentsummaryitem *></pkshippingmethod *>

送货方式回调


1

2

3

4

5

6

7

8

9

10

11

12

13

-(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);

}</pkpaymentsummaryitem *>

支付卡选择回调


1

2

3

4

-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectPaymentMethod:(PKPaymentMethod *)paymentMethod completion:(void (^)(NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{

  //支付银行卡回调,如果需要根据不同的银行调整付费金额,可以实现该代理

  completion(summaryItems);

}</pkpaymentsummaryitem *>

送货地址回调,已弃用


1

2

3

-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectShippingAddress:(ABRecordRef)address completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<pkshippingmethod *> * _Nonnull, NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{

  //送货地址回调,已弃用

}</pkpaymentsummaryitem *></pkshippingmethod *>

付款成功苹果服务器返回信息回调,做服务器验证


1

2

3

4

5

6

7

8

9

10

11

12

13

14

-(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);

  });

}

支付完成回调


1

2

3

-(void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{

  [controller dismissViewControllerAnimated:YES completion:nil];

}

时间: 2024-10-25 14:42:50

Apple Pay的相关文章

ios apple pay 证书配置

一 环境配置 需要开发者账号 开发者中心https://developer.apple.com/membercenter/index.action 添加一个APP IDs 二.配置Merchant IDs商业ID   下面进行appids和商业id的绑定 之后在回到appids中查看id中的apple pay,发现已经变为可使用状态了 接下来是为商业id生成证书. 点击Merchant IDs 点击id.点击编辑. 这里会有一个提示信息.提示是否允许在美国以外的地区使用apple pay?当然要

Apple Pay(转)

Apple Pay 是在 iOS 8 中第一次被介绍,它可以为你的应用中的实体商品和服务,提供简单.安全.私密的支付方式.它使得用户支付起来非常简便,只需按一下指纹就可以授权进行交易. Apple Pay 只能在特定的设备上使用,目前为止,这些设备包括 iPhone 6, iPhone 6+, iPad Air 2, iPad mini 3. 这是因为 Apple Pay 需要特定的硬件芯片来支持,这个硬件叫做 Secure Element (简称SE,安全元件),他可以用来存储和加解密信息.

移动支付大战在即,Apple Pay在中国却步履维艰

移动互联网的全面兴起也带动了国内互联网金融的爆发式增长,其中以第三方移动支付与P2P金融的发展最为迅猛.根据Analysys易观智库近期发布的<中国第三方支付市场季度监测报告2015年第3季度>数据显示,2015年第3季度中国第三方支付市场互联网收单交易规模为36475亿元人民币,环比增长10.91%. 国内移动支付市场发展速度如此迅猛,主要受以下几大原因的影响 1.智能手机的全面普及.来自Nielsen的调查报告显示,2014年第四季度,在中国一线城市16到59岁的人群中智能手机普及率达到9

apple pay,--&gt;牛逼,

转:http://www.mpaypass.com.cn/news/201410/29134818.html 关于Apple Pay的详细流程和利害解析 来源:爱范儿    作者:康上明学 2014-10-29 13:31:10 编者按:本文作者康上明学为“小米生活”产品经理,在苹果Apple Pay发布后,他对该产品做了深入研究,带来这篇文章.本文首发康上明学博客“明学的白板”,独家授权爱范儿发布. 对于 Apple Pay ,我有几个疑问: 线下支付是一个庞大复杂的流程,当中涉及到银行,银联

Apple Pay支付

1.Apple Pay支付到底是怎么的流程 首先Apple Pay分为线上线下两种支付方式,网上所谓的不需要网络直接可以支付指的是线下支付,此支付方式利用的是NFC,通过NFC技术与商家进行连接,然后通过 NFC传递你所绑定卡的银行信息到商户的NFC设备上,然后商户进行处理,就类似于刷卡,你拿着卡商户在pos机上刷是一样的,只不过,这里的卡变成了手 机而已. 其次是应用内支付,应用内支付呢,这个就需要网络了,因为你得自己处理你得支付.现在银联已经推出了支持Apple Pay的SDK,地址如下:

iOS开发笔记(5)---- 应用内接入Apple Pay

自2014年苹果秋季发布会至今,Apple Pay推出已将近一年时间,我们对其便利性与安全性也早有耳闻,然而时至今日其使用范围仍然只限美国.英国两地区,对于在中国区的引入,我们只能报以期望. 总体来说,在应用内集成Apple Pay需要两个部分:交易授权与交易处理.交易授权在应用内进行,通过PassKit.framework所提供的接口向用户获取支付授权:而交易处理则需要授权后调用可受理交易的服务器接口,你可以选择某个支付平台来处理交易,或者也可以自己实现交易处理过程,苹果官方比较推荐前者. 准

Swift # Apple Pay集成

苹果正式开放了Apple Pay支付系统.Apple Pay是一个基于NFC的支付系统,不久将被数以万计的线下零售商店予以支持.即便这项科技并不是彻底的突破性进展,但它足以推动许多公司和零售商来支持这种支付方式,并成为苹果的又一项成功的投资. Apple Pay还给开发者带来了处理支付的新渠道,用户将期望在应用中使用它,因为它将验证和交易极端简化,仅需手指轻轻一触即可完成,如果应用里面有涉及到交易,开发者很有必要集成Apple Pay.那么如何将Apple Pay功能集成到你的应用里呢? 在Ap

App Store审核指南中文版(2014.9.10更新):新增Apple Pay相关内容

苹果在9月3日对App Store审核指南进行了重大更新,新添加了扩展.HealthKit.HomeKit以及TestFlight相关内容.另外,在9月10日新品发布会之后,苹果再次更新了App Store审核指南,添加Apple Pay相关内容.文中红色部分是相对于此前版本的新增内容,蓝色部分表示苹果相关官方文档的链接. App Store Review Guidelines(英文版). 前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说

开发apple pay碰到的问题总结

本来想简单总结一下Apple Pay 开发过程中的几个问题, 结果被下面这篇文章全碰上了, 干脆全文转载, 作者对相关资源整理得比较详细, 比较有参考价值 总的来说, 我们做过 APNs 推送的话, 申请 商户ID 并关联到 apple id, 申请证书, 生成provisioning profile等步骤都差不多 然后我真机调试有两个地方没通过, 下文也总结了, 我拎出来单独说一下: 1, Payment request is invalid: check your entitlements.