iOS 账号证书那些事程序员

Apple Pay--iOS开发

2018-11-21  本文已影响72人  晓风f残月

一、什么是Apple Pay?

  1. 概念

Apple Pay,简单来说, 就是一种移动支付方式。通过Touch ID/ Passcode,用户可使用存储在iPhone 6, 6p等设备上的信用卡和借记卡支付证书来授权支付; 它是苹果公司在2014苹果秋季新品发布会上发布的一种基于NFC的手机支付功能,于2014年10月20日在美国正式上线,2016年2月18日凌晨5:00, Apple Pay 业务在中国上线。

  2. 使用前提

(1). 支持设备

47F0748F-98D8-4ABD-AD04-0B59A40C5701.png

(2). 系统支持(iOS8.0+版本, 注意:iOS9.2才真正的支持“银联支付”, 意味着iOS9.2以后才可以在中国市场使用)

(3). 银行支持

需要将被支持银行的银行卡, 添加到手机wallet应用当中

image

二、 应用场景?

  1. 线下支付

> 除下使用前提之外, 还要求

> 商家支持(要求必须有支持NFC的刷卡机)

如果发现以下标识,就代表该商家支持Apple Pay

image

苹果公开的Apple Pay商家有:

image

  2. 线上支付

> 除下使用前提之外, 还要求

> App 支持

目前支持Apple Pay支付方式的App并不多。很多公司也在集成当中,这也是写这篇博客的目的。

| 唯品会   | 大众点评   |

| image | image

|

目前, 苹果公开的支持Apple Pay的APP列表

image

 三、 与微信支付以及支付宝等第三方支付平台的区别?

  1. 硬件方面

Apple Pay:必须是iOS设备, 而且是按照线上支付和线下支付区分不同的真机设备(具体参考表1)

微信、支付宝: 基本跟硬件设备无关, 支持大多数的只能手机

  2. 网络环境要求

Apple Pay:线上支付需要联网, 线下支付无需联网就可以支付

微信、支付宝: 无论是线上还是线下支付, 都需要联网使用

  3. 使用技术

Apple Pay:线下支付使用的是 基于NFC的近场通讯技术

微信、支付宝: 线下支付使用的是 扫码支付(条形码、二维码)

  4. 主要功能

Apple Pay:线上支付、线下支付、部分升级后的ATM机可以取款

微信、支付宝: 线上支付、线下支付、转账、理财等

  5. 安全性能

Apple Pay:不保留银行卡信息,并且不会暴漏给外界、不分流银行存款(不需要从银行卡转钱到另外一个平台)、不能充值 安全性较高

微信、支付宝: 密码保护,身份验证等手段保护账户 安全性相对稍差

  6. 支付时长

Apple Pay:无论是线上支付,还是线下支付, 只需要验证指纹即可支付。非常迅速

微信、支付宝: 需要扫码支付, 流程相对繁琐,所以时长较长

  7. 各自弊端

Apple Pay:只适用于苹果设备, 支付场景单一,无转账理财等业务

微信、支付宝: 安全性较差, 必须联网操作,需要充值到对应平台

 四、线上支付集成步骤

 1. 配置支付环境

2. 配置Xcode 项目

 3. 代码实现

4. 服务器处理

五、 具体步骤实现

1. 配置支付环境

image

(1)添加一个App ID, 并勾选Apple Pay功能

image image

(2)配置Merchant ID

image image

(3)为Merchant ID 配置证书, 并下载证书安装到钥匙串

image image image

(4)检查安装到钥匙串中的证书是否有效

问题描述: 有可能会出现 image

提示

问题原因: 系统根证书/中级证书颁发机构过期

解决方案: 重新下载证书, 并安装,具体下载列表看下图

image

(5)绑定Merchant ID 到 APP ID

image image image image image

2. 配置Xcode 项目

image image

注意: 以上步骤截图, 只是关键处截图。

3. 代码实现

(1)判断当前设备是否可以支付

if``(![PKPaymentAuthorizationViewController canMakePayments])

{

NSLog``(@``"不能支付"``);

return``;

}

(2)判断"Wallet有没有添加该支付网络的储蓄卡/信用卡"

if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay]]) {

NSLog``(@``"Wallet没有添加该支付网络的储蓄卡/信用卡"``);

// 创建一个设置按钮

// PKPaymentButton *button = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];

// [button addTarget:self action:@selector(jump) forControlEvents:UIControlEventTouchUpInside];

// button.center = self.view.center;

// [self.view addSubview:button];

return``;

}

(3)创建一个支付请求, 并配置各项信息

// 1\. 创建一个支付请求

PKPaymentRequest *request = [[PKPaymentRequest alloc] init];

// 2\. 参数配置

// 2.1 商店标识

request.merchantIdentifier = @``"merchant.520it.com"``;

// 2.2 货币代码

request.currencyCode = @``"CNY"``;

// 2.3 国家编码

request.countryCode = @``"CN"``;

// 2.4 支持的支付网络(PKPaymentNetworkChinaUnionPay iOS9.2开始支持)

request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay];

// 2.5 支付请求包含一个支付摘要项目的列表

NSDecimalNumber *price1 = [``NSDecimalNumber decimalNumberWithString:@``"2"``];

PKPaymentSummaryItem *item1 = [PKPaymentSummaryItem summaryItemWithLabel:@``"手榴弹" amount:price1];

NSDecimalNumber *price2 = [``NSDecimalNumber decimalNumberWithString:@``"6"``];

PKPaymentSummaryItem *item2 = [PKPaymentSummaryItem summaryItemWithLabel:@``"炸弹" amount:price2 type:PKPaymentSummaryItemTypePending];

NSDecimalNumber *totalAmount = [``NSDecimalNumber zero];

totalAmount = [totalAmount decimalNumberByAdding:price1];

totalAmount = [totalAmount decimalNumberByAdding:price2];

PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@``"小码哥财务中心" amount:totalAmount type:PKPaymentSummaryItemTypePending];

// 注意: 数组最后一个是总价格

request.paymentSummaryItems = @[item1, item2, total];

// 2.6 运输方式

NSDecimalNumber *shippingPrice = [``NSDecimalNumber decimalNumberWithString:@``"18.0"``];

PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@``"顺丰快递" amount:shippingPrice];

method.detail = @``"24小时送到!"``;

method.identifier = @``"shunfeng"``;

request.shippingMethods = @[method];

request.shippingType = PKShippingTypeServicePickup;

// 2.7 通过指定merchantCapabilities属性来指定你支持的支付处理标准,3DS支付方式是必须支持的,EMV方式是可选的,

request.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV | PKMerchantCapabilityCredit | PKMerchantCapabilityDebit;

// 2.8 需要的配送信息和账单信息

request.requiredBillingAddressFields = PKAddressFieldAll;

request.requiredShippingAddressFields = PKAddressFieldAll;

// 2.9 存储额外信息

// 使用applicationData属性来存储一些在你的应用中关于这次支付请求的唯一标识信息,比如一个购物车的标识符。在用户授权支付之后,这个属性的哈希值会出现在这次支付的token中。

request.applicationData = [@``"购物车ID: 123456" dataUsingEncoding:``NSUTF8StringEncoding``];

(4)弹出授权控制器,让用户给支付授权

// 3\. 开始支付

PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];

if (paymentPane == ``nil``) {

NSLog``(@``"授权控制器创建失败"``);

return``;

}

paymentPane.delegate = ``self``;

[``self presentViewController:paymentPane animated:``YES completion:``nil``];

(5)处理支付凭证(token)

/**

* 当授权成功之后会调用这个代理方法

*/

- (``void``)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller

didAuthorizePayment:(PKPayment *)payment

completion:(``void (^)(PKPaymentAuthorizationStatus status))completion;

{

// PKPayment *temp = payment;

NSLog``(@``"验证授权---%@"``, payment.token);

NSLog``(@``"验证通过后, 需要开发者继续完成交易"``);

// 它需要你连接服务器并上传支付令牌和 其他信息,以完成整个支付流程。

BOOL isSuccess = ``YES``;

if (isSuccess) {

completion(PKPaymentAuthorizationStatusSuccess);

}``else

{

completion(PKPaymentAuthorizationStatusFailure);

}

}

(6)关闭授权控制器

/**

* 当授权成功之后或者取消授权之后会调用这个代理方法

*/

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

{

NSLog``(@``"取消或者交易完成"``);

[``self dismissViewControllerAnimated:``YES completion:``nil``];

}

* 支付授权的流程:

image

  4. 服务器接收到token后的一般处理流程

处理支付请求时,你有两个选择;你既可以利用支付平台处理支付请求,也可以自己实现支付请求处理流程。一个常用的支付平台可以完成上述大部分操作。

关于支持Apple Pay支付平台的更多信息,请参考developer.apple.com/apple-pay/

上一篇下一篇

猜你喜欢

热点阅读