为你的iOS应用集成Apple Pay

作者: TonyDuan | 来源:发表于2016-03-24 10:28 被阅读347次

    Apple Pay正式在国内上线的那天,一起工作的小伙伴就走进了Starbucks,7-11等带有银联闪付的店进行了尝鲜。不管是否要再次输入一次密码,但是它的出现确实给我们带来了极大的便捷。下面就尝试在一个Demo中来集成下Apple Pay的功能。

    Apple Pay流程

    Apple Pay运行环境:

    iPhone 6以上设备,当然也包括最新出来的iPhone SE。iOS版本在9.2以上。

    Xcode版本号 7.2.1

    APP接入ApplePay不需要POS机,但是还是要和银行签约,比如和银联签约。

    准备工作

    在接入Apple Pay之前,首先要申请MerchantID及对应的证书。

    申请Merchant ID

    需要以merchant开头的一个字符串

    仅在中国使用

    申请App ID,这里和Merchant ID填写一样的名字为了辨别

    申请好后再权限里面打开ApplePay功能,并配置merchant证书

    选择Edit进行相应配置

    配置成功后你会看到

    配置APP ID和Merchant ID关联成功

    搭建工程文件

    bundleID设置,对应手动生成的bundleID

    Bundle Id设置

    Capability中启用Apple Pay权限,并选择merchantID.

    Apple Pay使能并勾选对应merchantID

    设置需要导入的头文件、引入的库

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

    #import <PassKit/PKPaymentAuthorizationViewController.h>//Apple pay的展示控件

    #import <AddressBook/AddressBook.h>//用户联系信息相关

    在开始Apple Pay支付前需要带代码中进行,系统版本检测,设备是否支持ApplePay检测以及用户是否绑定有对应的银行,三步操作。

    if(![PKPaymentAuthorizationViewControllerclass]) {

    //PKPaymentAuthorizationViewController需iOS8.0以上支持

    NSLog(@"操作系统不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");

    return;

    }

    //检查当前设备是否可以支付

    if(![PKPaymentAuthorizationViewControllercanMakePayments]) {

    //支付需iOS9.0以上支持

    NSLog(@"设备不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");

    return;

    }

    //检查用户是否可进行某种卡的支付,是否支持Amex、MasterCard、Visa与银联四种卡,根据自己项目的需要进行检测

    NSArray*supportedNetworkCards =@[PKPaymentNetworkAmex,PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];

    if(![PKPaymentAuthorizationViewControllercanMakePaymentsUsingNetworks:supportedNetworks]) {

    NSLog(@"没有绑定支付卡");

    return;

    }

    NSLog(@"可以支付,开始建立支付请求");

    //当以上三种检查都通过后我这里以人民币作为测试

    //设置币种、国家码及merchant标识符等基本信息

    PKPaymentRequest*payRequest = [[PKPaymentRequestalloc]init];

    payRequest.countryCode=@"CN";//国家代码

    payRequest.currencyCode=@"CNY";//RMB的币种代码

    payRequest.merchantIdentifier=@"merchant.com.rm.applepay";//申请的merchantID

    payRequest.supportedNetworks= supportedNetworkCards;//用户可进行支付的银行卡

    payRequest.merchantCapabilities=PKMerchantCapability3DS|PKMerchantCapabilityEMV;//设置支持的交易处理协议,3DS必须支持,EMV为可选

    //payRequest.requiredBillingAddressFields = PKAddressFieldEmail;

    //payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName;

    payRequest.requiredShippingAddressFields=PKAddressFieldNone;

    //设置两种配送方式,一般都是商户App,里面一般自带配送方式e.g.京东配送

    payRequest.shippingMethods=@[];

    NSDecimalNumber*totalAmount = [NSDecimalNumberdecimalNumberWithString:@"10000000"];

    PKPaymentSummaryItem*total = [PKPaymentSummaryItemsummaryItemWithLabel:@"眉州彦祖"amount:totalAmount];

    summaryItems= [NSMutableArrayarrayWithArray:@[total]];

    //summaryItems为账单列表,类型是NSMutableArray,这里设置成成员变量,在后续的代理回调中可以进行支付金额的调整。

    payRequest.paymentSummaryItems=summaryItems;

    //ApplePay控件

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

    view.delegate=self;

    [selfpresentViewController:viewanimated:YEScompletion:nil];

    接下来假如一切顺利就会去调用服务端去调用对应的支付网关完成付款.

    - (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller

    didAuthorizePayment:(PKPayment*)payment

    completion:(void(^)(PKPaymentAuthorizationStatusstatus))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);

    });

    }

    点击Apple Pay按钮触发 输入指纹后 支付完成,😄

    后续工作

    上面是模拟支付成功的回调,真实环境你需要@服务端开发人员给你写好驱动支付网关的代码,可以参考Apple Pay的官方文档

    https://developer.apple.com/library/ios/ApplePay_Guide/ProcessPayment.html#//apple_ref/doc/uid/TP40014764-CH5-SW4

    Processing a payment involves several steps:

    Sending the payment information to your server, along with other information needed to process the order

    Verifying the hashes and signature of the payment data

    Decrypting the encrypted payment data

    Submitting payment data to the payment processing network

    Submitting the order to your order-tracking system

    服务端处理请求流程

    其它选择

    接入Apple Pay还可以使用国内使用人数较多的平台

    https://open.unionpay.com/ajweb/help/file/techFile?productId=80

    银联Apple Pay控件开发包 银联SDK实现Apple Pay流程

    1-2、 商户生成订单,通过商户SERVER端将订单信息发送给银联支付网关;3-4、银联支付网关记录订单信息,返回用来标识订单的TN号,经由商户SERVER返回至给

    商户APP;

    5、 商户APP调用银联SDK,将TN号传递给银联SDK

    6、 银联SDK向Apple公司的PASSKIT FRAMEWORK发起支付请求;

    7、 接口返回加密的支付Token信息;

    8-9、银联SDK将支付Token传递给银联支付网关,完成交易认证;10-12、银联将支付结果返回给商户APP,商户SERVER,商户APP负责提示用户交易结果。

    相关文章

      网友评论

      • cyh老崔:你好,请问如何集成闪付?如美团与京东都有闪付,可以添加到wallet中。集成后,用户在任何场景下(如淘宝等)使用apple pay 付款时,就可以选择美团闪付或京东闪付。

      本文标题:为你的iOS应用集成Apple Pay

      本文链接:https://www.haomeiwen.com/subject/goqrlttx.html