知识体系
1. 什么是 Apple Pay?
Apple Pay,是苹果公司在2014苹果秋季新品发布会上发布的一种基于NFC的手机支付功能,于2014年10月20日在美国正式上线。2016年2月18日凌晨5:00, Apple Pay 业务在中国上线.
2. 应用场景
线下:要求商家拥有支持NFC功能的刷卡机
线上:要求App的支持。目前美团、大众、京东等网站均支持。这也是为什么我们现在需要学习Apple Pay集成的原因
3. 与传统第三方支付的区别
硬件要求:Apple Pay要求手机在iPhone6以上设备,iOS8以上的系统。
网络要求:线下支付可以没有网络支持
安全: 更加安全,无需第三方账号
效率: 支付时间短,不需要扫描二维码等操作
使用功能:功能较单一、升级的ATM机可以取款。但不能进行转账理财
4. 线上集成的步骤
1.环境配置
首先创建一个Xcode工厂
登陆开发者账号,证书中心
添加一个AppID,并勾选Apple Pay功能
配置MerchantID,并创建相应的证书,下载并安装到钥匙串中
绑定AppID 与 MerchantID
在Xcode中调到iOS8以上(在中国iOS9.2以后才支持银联)
在Xcode中打开Apple Pay功能,出现三个对勾说明配置完成
2.代码实现:
Apple Pay支付原理图:
支付请求原理图
具体处理步骤如下:
框架发送支付请求给安全模块,只有安全模块可以访问存储在设备上的标记化的卡信息。
安全模块把特定的卡和商家等支付数据加密,以保证只有苹果可以读取,然后发送给框架。框架会将这些数据发送给苹果。
苹果服务器再次加密这些支付数据,以保证只有商家可以读取。然后服务器对它进行签名,生成支付token,然后发送给设备
框架调用相应的代理方法并传入这个token,然后你的代理方法传送token给你的服务器
步骤:
//判断设备是否支持
[PKPaymentAuthorizationViewControllercanMakePayments];
判断wallet卡包是否绑定银行卡
[PKPaymentAuthorizationViewControllercanMakePaymentsUsingNetworks:@[PKPaymentNetworkMasterCard,PKPaymentNetworkChinaUnionPay,PKPaymentNetworkVisa]];
//创建支付请求
PKPaymentRequest *requst = [[PKPaymentRequestalloc]init];
// 配置商家ID
requst.merchantIdentifier =@"merchant.appyPayDemo1";
//配置货币代码及国家代码
requst.countryCode =@"CN";
requst.currencyCode =@"CNY";
//配置请求支持的支付网络
requst.supportedNetworks =@[PKPaymentNetworkVisa,PKPaymentNetworkMasterCard,PKPaymentNetworkChinaUnionPay];
//配置商户的处理方式
requst.merchantCapabilities =PKMerchantCapability3DS;
//配置购买的商品列表,如果有多项 商品 列表信息 最后一项为汇总信息
NSDecimalNumber *price = [NSDecimalNumberdecimalNumberWithString:@"0.01"];
PKPaymentSummaryItem *item = [PKPaymentSummaryItemsummaryItemWithLabel:@"苹果6s"amount:price];
requst.paymentSummaryItems =@[item];
//配置请求的附加项
//2.1 是否显示发票收获地址
requst.requiredBillingAddressFields =PKAddressFieldAll;
//2.2 是否显示快递收货地址
requst.requiredShippingAddressFields =PKAddressFieldAll;
//2.3 配置快递方式
NSDecimalNumber *price1 = [NSDecimalNumberdecimalNumberWithString:@"0.01"];
PKShippingMethod *method1 = [PKShippingMethodsummaryItemWithLabel:@"顺丰快递"amount:price1];
method1.identifier =@"顺丰";
requst.shippingMethods =@[method1];
requst.shippingType =PKShippingTypeShipping;
//添加附件数据
requst.applicationData = [@"buyID = 1234567"dataUsingEncoding:NSUTF8StringEncoding];
给支付授权
//验证用户的支付授权
PKPaymentAuthorizationViewController *avc = [[PKPaymentAuthorizationViewControlleralloc]initWithPaymentRequest:requst];
avc.delegate =self;
[selfpresentViewController:avcanimated:YEScompletion:nil];
处理支付凭证
PKPaymentAuthorizationViewControllerDelegate 的方法中处理
// 如果用户授权成功就会调用方法
//参数一、授权控制器
//参数二、支付对象
//参数三、系统给定一个回调代码块,我们需要执行这个代码块,来告诉系统当前的支付状态十分成功
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
//这里拿到支付信息,发送给服务器处理,处理完毕服务器会返回一个状态,告诉客户端,是否支付成功,然后由客户端处理
BOOL success =YES;
if (success) {
completion(PKPaymentAuthorizationStatusSuccess);
}else
{
completion(PKPaymentAuthorizationStatusFailure);
}
}
//执行这里的方法代表支付授权结束或者取消。也是返回上一个界面的时机
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
NSLog(@"授权结束");
[selfdismissViewControllerAnimated:YEScompletion:nil];
}
—————–陈洪鑫——————-