授权支付(Apple Pay)

Authorizing Payments

支付授权处理是支付授权视图控制器和它的代理之间的协力合作的结果。支付授权视图控制器做两件事:让用户选择支付请求中所需要的账单和运送信息,让用户去授权支付。当用户和视图控制器交互时调用代理的方法以便app可以更新展示的信息-例如:当一个运送地址被选择时更新运送价格。在用户授权支付请求之后调用该代理。

注意:
当实现代理方法时,记得它们会被调用很多次并且它们被调用的规则取决于用户的动作顺序。

所有在授权处理期间调用的代理方法均传送一个完成的block作为它们的参数之一。在它调用其他代理方法之前,支付授权视图控制器等待代理完成响应一个方法(通过调用完成block)。paymentAuthorizationViewControllerDidFinish:方法是唯一的例外。它没有取到完成block,但是它在任何时候均可被调用。

完成 block取到一个论证,该论证可以指定基于可用信息的交易的当前授权状态。如果该交易没有任何问题,传送该值PKPaymentAuthorizationStatusSuccess;否则,传送一个值来标识错误。

为了创建一个PKPaymentAuthorizationViewController类的实例,传送支付请求给视图控制器的初始化。设置该视图控制器的代理,然后显示它。

    PKPaymentAuthorizationViewController *viewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
    if (!viewController) { /* ... Handle error ... */ }
    viewController.delegate = self;
    [self presentViewController:viewController animated:YES completion:nil];

当用户与视图控制器交互时,视图控制器调用它的代理方法。

注意:
在Xcode 7.0或者以后,可以在模拟器上测试支付授权视图控制器。它提供了所有支持的支付系统的模拟卡片并以简单的文本形式返回虚拟的支付数据。在设备上,该数据使用商户标识加密并必须在自己的服务器上或者在支付处理时解密。
虽然模拟器提供一个快捷而且方便的方式测试自己的代码,仍然需要在真实的物理设备上完全地测试Apple Pay。
如果使用 Xcode的早期版本,仅仅可以在设备上测试Apple Pay。

Your Delegate Updates Shipping Methods 代理更新运送方式和费用

当用户提供运送信息时,授权视图控制器调用代理的paymentAuthorizationViewController:didSelectShippingContact:completion:方法和paymentAuthorizationViewController:didSelectShippingMethod:completion:方法。使用这些方法来更新基于这些新信息的支付请求。

    - (void) paymentAuthorizationViewController:    (PKPaymentAuthorizationViewController *)controller
                       didSelectShippingContact:(CNContact *)contact
                                     completion:(void (^)   (PKPaymentAuthorizationStatus, NSArray *, NSArray *))completion
    {
        self.selectedContact = contact;
        [self updateShippingCost];
        NSArray *shippingMethods = [self shippingMethodsForContact:contact];
        completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, self.summaryItems);
    }
    - (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                        didSelectShippingMethod:(PKShippingMethod *)shippingMethod
                                     completion:(void (^)(PKPaymentAuthorizationStatus, NSArray *))completion
    {
        self.selectedShippingMethod = shippingMethod;
        [self updateShippingCost];
        completion(PKPaymentAuthorizationStatusSuccess, self.summaryItems);
    }

注意:
为了维护隐私,paymentAuthorizationViewController:didSelectShippingContact:completion:方法中提及的运送信息是匿名的。返回的联系方式包含足够的信息用以计算运费,不展现用户的敏感信息。直到用户批准了该支付之后,才能获取到用户的全部运送信息,否则不能获取到。另外,联系方式中的数据可以根据不同的国家而改变,并可以一次又一次地改变。保证以合适的方式测试app。

A Payment Token Is Created When a Payment Is Authorized 当支付被授权时生成一个支付密钥

当用户授权支付请求时,框架通过Apple 服务器和安全元件联合生成一个支付密钥。可以通过paymentAuthorizationViewController:didAuthorizePayment:completion:代理方法传送该支付密钥给自己的服务器,与其它需要的信息一起处理购买。例如:运送地址和购物车标识。过程如下:

  • 1.框架发送支付请求给安全元件。只有安全元件可以使用tokenized标记化的特定设备的支付卡号。
  • 2.安全元件将含有特定卡和商户的支付数据 放在一起,加密它使得只有Apple 可以读取它,并发送它给框架。框架然后发送支付数据给Apple 服务器。
  • 3.Apple 服务器使用Merchant Identifier certificate商户标识证书解密支付数据。该密钥仅仅自己和那些已分享商户标识证书给他们的人可读。然后服务器写下该支付密钥,并返回它给设备。
  • 4.框架通过调用

paymentAuthorizationViewController:didAuthorizePayment:completion:方法传送该密钥给代理。代理传送该密钥给自己的服务器。

在自己服务器上的行为改变取决于是否处理自己的支付或者对一个支付平台有效。在两种情况下,服务器处理订单并传送一个状态返回给设备,代理可传送给它的完成处理者,具体描述在Processing a Payment

    - (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                            didAuthorizePayment:(PKPayment *)payment
                                     completion:(void (^)(PKPaymentAuthorizationStatus))completion
    {
        NSError *error;
        ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress, kABPersonAddressProperty);
        NSDictionary *addressDictionary = (__bridge_transfer NSDictionary *) ABMultiValueCopyValueAtIndex(addressMultiValue, 0);
        NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];
        
        // ... Send payment token, shipping and billing address, and order information to your server ...
        
        PKPaymentAuthorizationStatus status;  // From your server
        completion(status);
    }

Your Delegate Dismisses the Payment Authorization View Controller代理dismiss支付授权视图控制器

当框架显示交易的状态之后,授权视图控制器调用代理的paymentAuthorizationViewControllerDidFinish:方法。在实施阶段,dismiss授权视图控制器并且显示自己app特定的订单确认页面。

    - (void) paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
    {
        [controller dismissViewControllerAnimated:YES completion:nil];
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 1.About Apple Pay Apple Pay是一种移动支付技术,让使用者把它们对真实的物品和服务的支付信...
    NEWWORLD阅读 5,174评论 14 51
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,446评论 25 707
  • Creating Payment Requests Payment Requests支付请求是PKPaymentR...
    NEWWORLD阅读 1,335评论 0 3
  • 刚刚看了一集2014年的《快乐大本营》,那些熟悉的面孔、那些搞笑和感动,好像就在昨天,这些人一直都没有变。想来从1...
    猫的树咩阅读 389评论 0 1