iosApplePay

1、Apple Pay 接入工程 - 简书

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

2、iOS集成ApplePay - 码农教程 

3、iOS开发ApplePay的介绍与实现_diaochuanzhi7826的博客-CSDN博客 

3.1>设备

  • 设备支持
    • iPhone
    • iPad
      • 配备触控 ID 或面容 ID 的 iPad Pro、iPad Air、iPad 和 iPad mini 机型
    • Apple Watch
      • Apple Watch Series 1 和 2 及更新机型
      • Apple Watch(第 1 代)7
    • Mac
      • 配备触控 ID 功能的 Mac 机型
      • 2012 年或之后推出的 Mac 机型,与支持 Apple Pay 的 iPhone 或 Apple Watch 搭配使用
  • 系统支持
    • iOS8.0以上版本, 注意:iOS9.2才真正的支持“银联支付”, 意味着iOS9.2以后才可以在中国市场使用。
  • 银行支持

3.2>、发卡行及机构:亚太地区参加 Apple Pay 计划的银行和发卡机构:

亚太地区参加 Apple Pay 计划的银行和发卡机构 - 官方 Apple 支持 (中国)

3.3>、 应用场景:

  • 线下支付
    • 除去使用前提之外,还要商家支持(要求必须有支持NFC的刷卡机)
    • 如果发现以下标识,就代表该商家支持Apple Pay
  • 线上支付
    • 除去使用前提之外, 还要求App内部集成支持
    • 目前支持Apple Pay支付方式的App并不多。很多公司也在集成当中,这也是写这篇博客的目的。
    • 目前,苹果公开的支持Apple Pay的APP列表

3.4>、iOS开发_ApplePay的介绍与实现 

3.5>、代码实现:

   3.5.1>框架导入:
   #import <PassKit/PassKit.h>   // 用户绑定的银行卡信息
   #import <PassKit/PKPaymentAuthorizationViewController.h> // Apple pay的展示控件
   #import <AddressBook/AddressBook.h>// 用户联系信息相关

   3.5.2>判断设备是否支持:

    if(![PKPaymentAuthorizationViewController canMakePayments]) {
       NSLog(@"不能支付");
       return;
     }

   3.5.3>判断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.5.4>创建一个支付请求,并配置各种信息:

      // 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];

   3.5.5>弹出授权控制器,让用户给支付授权:
PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
if (paymentPane == nil) {
    NSLog(@"授权控制器创建失败");
    return;
}
paymentPane.delegate = self;
[self presentViewController:paymentPane animated:YES completion:nil];

   3.5.6>处理支付凭证:

      /**
*  当授权成功之后会调用这个代理方法
*/
- (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);
    }
}

   3.5.7>关闭授权控制器:

     /**
      *  当授权成功之后或者取消授权之后会调用这个代理方法
      */
   - (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController*)controller {
      NSLog(@"取消或者交易完成");
      [self dismissViewControllerAnimated:YES completion:nil];
  }

   3.5.8>支付授权的流程:

 3.6>服务器处理:

    3.6.1>验证支付数据的哈希表和签名

    3.6.2>为加密过的支付数据解密

    3.6.3>向支付处理系统提交支付数据

    3.6.4>向订单追踪系统提交订单

4、iOS PassKit Wallet 开发(Passbook 开发)【附有很多官网说明链接】https://blog.csdn.net/andanlan/article/details/78113486?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-78113486-blog-52311153.235%5Ev27%5Epc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-78113486-blog-52311153.235%5Ev27%5Epc_relevant_recovery_v2&utm_relevant_index=3

4.1>分类:可被添加到wallet的票据凭证分以下5类

   4.1.1> Boarding pass(登机牌,如飞机票、火车票)

   4.1.2>Coupon(优惠券,如打折券、减免券 一般为一次性使用的券)

   4.1.3>Event ticket(票,如电影票、演出票)

   4.1.4>Generic(通用类型)

   4.1.5>Store card(购物卡,可以显示余额等信息)

4.2>创建凭证

    4.2.1>Creating and Populating the Pass Package(创建一个包含Pass所有信息和资源文件的文件夹):Passes 的创建需要一个 pass.json 文件,这个 pass.json 文件包含 pass 的所有信息,如票据类型,logo、icon资源图片,过期时间、票据描述等信息。将 pass.json 和需要的图片资源文件一起放入一个文件夹,然后从这个文件夹生成 Pass。

  创建步骤:

  1. 创建一个 filmTicket.pass 文件夹,使用 .pass 作为文件夹的后缀名,放在 Documents 目录下。
  2. 这里下载示例文件。
  3. 解压缩,将 Event.pass 文件夹中的所有内容拷贝到 filmTicket.pass 文件夹中。

  4.2.2>Setting the Pass Type Identifier and Team ID(设置PassTypeId和Team ID)

      每一个 pass 都需要通过一个 PassTypeID 关联到一个开发者账号下。所有的 PassTypeID 都通过开发者账号中心管理。想要创建 pass ,必须到开发者账号下配置你的 PassTypeID 。

**创建 PassTypeID **

  1. 到你的开发者账号中心,找到Certificates, Identifiers & Profiles,选择 Identifiers
  2. 在 Identifiers 下, 选择 Pass Type IDs
  3. 点击右上角 + 按钮。
  4. 填写描述和 Pass Type ID 并提交。

查看 Team ID:

开发者账号下,选择 MemberShip 。

**添加 PassTypeID 和 Team ID 到 pass.json **

打开 filmTicket.pass 文件夹下的 pass.json , 将 PassTypeID 和 Team ID 替换为自己开发者账号下的。

{
...
"passTypeIdentifier" : "your pass type identifier",
"teamIdentifier" : "your Team ID",
...
}
4.2.3>. Signing and Compressing the Pass(签名并压缩 pass )
As part of building your production environment, you will need to set up a system for automatically signing and compressing passes as described in Passes Are Cryptographically Signed and Compressed. For this tutorial, a very simple tool for signing passes is included.

4.2.3.1>.下载签名证书

  1. 在 Certificates, Identifiers & Profiles, 选择 Identifiers
  2. 在 Identifiers 下,选择 Pass Type IDs.
  3. 选择你已经创建好的 pass type identifier, 点击编辑。
  4. 如果已经存在证书文件,直接点击下载即可。如果没有,点击创建,按照提示创建一个(与创建 APNs 推送证书基本一样)。

4.2.3.2>.生成 .pkpass 后缀的压缩文件   

  1. 找到上面已经下载的文件包,找到 signpass 工程,使用 Xcode 打开并运行。
  2. 选中 Xcode 中 Products 文件夹下的 signpass 文件,右击鼠标,Show in Finder
  3. 拷贝 signpass 文件到 filmTicket.pass 文件夹的同级目录(Documents)下。
  4. 执行以下语句:cd ~/Documents
    ./signpass -p filmTicket.pass

     上面语句会生成 filmTicket.pkpass 文件,也就是我们需要的压缩后的 pass

4.2.4>.查看 pass

   在 Mac 中直接双击就能打开查看。或者打开你的模拟器,将 filmTicket.pkpass文件拖拽到你的模拟器,就能添加这个 pass 到你模拟器的 Wallet 应用。

4.2.5>.修改信息,并重新生成 pass

原有 pass.json 文件内容

{
  "formatVersion" : 1,
  "passTypeIdentifier" : "pass.com.apple.devpubs.example",
  "serialNumber" : "nmyuxofgna",
  "teamIdentifier" : "A93A5CM278",
  "webServiceURL" : "https://example.com/passes/",
  "authenticationToken" : "vxwxd7J8AlNNFPS8k0a0FfUFtq0ewzFdc",
  "relevantDate" : "2011-12-08T13:00-08:00",
  "locations" : [
    {
      "longitude" : -122.3748889,
      "latitude" : 37.6189722
    },
    {
      "longitude" : -122.03118,
      "latitude" : 37.33182
    }
  ],
  "barcode" : {
    "message" : "123456789",
    "format" : "PKBarcodeFormatPDF417",
    "messageEncoding" : "iso-8859-1"
  },
  "organizationName" : "Apple Inc.",
  "description" : "Apple Event Ticket",
  "foregroundColor" : "rgb(255, 255, 255)",
  "backgroundColor" : "rgb(60, 65, 76)",
  "eventTicket" : {
    "primaryFields" : [
      {
        "key" : "event",
        "label" : "EVENT",
        "value" : "The Beat Goes On"
      }
    ],
    "secondaryFields" : [
      {
        "key" : "loc",
        "label" : "LOCATION",
        "value" : "Moscone West"
      }
    ]
  }
}
需要修改 eventTicket 的子级内容

4.2.5.1>.描述信息

4.2.5.2>.条形码改为二维码,添加描述

 // 修改前
"barcode" : {
    "message" : "123456789",
    "format" : "PKBarcodeFormatPDF417",
    "messageEncoding" : "iso-8859-1"
}
// 修改后
"barcode" : {
    "altText" : "订单号:123456",
    "message" : "123456789",
    "format" : "PKBarcodeFormatQR",
    "messageEncoding" : "iso-8859-1"
}

4.2.5.3>.删除原来生成的 filmTicket.pkpass 文件,重复上面的生成步骤。

4.2.6>pass.json 设计说明

   4.2.6.1>样式和内容规范

   4.2.6.2>相关 key-value 说明

4.3>.在APP中提供Wallet凭证支持(添加凭证到Wallet)

直接上代码(代码见4链接):记得 import PassKit

   4.3.1>将上个步骤生成的 .pkpass 文件拖拽到工程,然后加载本地凭证数据。

   4.3.2>显示凭证信息

   4.3.3>用户添加、取消后的回调操作

   4.3.3>查看 Wallet 中已添加的凭证

4.4>.更新凭证

当你购买了电影票,需要在指定的时间前去观看,超过了这个时间就过期了,那就需要更新凭证。
任何一个凭证凭证都可以通过它的 authentication token 和 serial number 更新。

 4.4.1>.更新流程简介

   Updating a pass is a cooperative effort between the user’s device, Apple’s servers, and your servers. At a high level, it consists of the following steps, shown in Figure 6-1:

  1. pass 被设置为支持更新和安装,并且用户设备注册到你的服务器获取更新。
  2. 如果有变更,则触发更新,你的服务器发送推送通知。
  3. 用户收到推送后,从你的服务器查询更新的列表。
  4. 用户从你的服务器获取每个 pass 的最新版本到自己的设备。

   4.4.2>.web server 注意事项

      4.4.2.1>备份私钥和证书,并将其保存在安全的位置。
      4.4.2.2>避免将私钥存储在Web服务器上,因为Web服务器通常具有较大的攻击面。一个更安全的方法是具有不同的服务器句柄创建和签名传递,并将完成的传递推送到您的Web服务器。
      4.4.2.3>当与您的Web服务通话时,序列号,传递类型标识符和last-update标签全部包含在URL中。使其过长可能会对对URL长度造成限制的系统造成问题。
      4.4.2.4>不要更改更新中的身份验证令牌。因为 passes 不能保证被更新,所以仍然可能有具有旧通行证和旧认证令牌的设备。您的服务器必须根据已经有效的每个令牌的列表来检查身份验证令牌。

4.5>.Demo

WalletDemo

4.6>.参考

Pass.json官方说明
Pass创建步骤官方文档

5、ApplePay的证书配置:iOS开发------Apple Pay(证书配置篇)_RITL的博客-CSDN博客

6、ApplePay线上使用演示:iOS开发------Apple Pay(PassKit.framework篇)_00烽火连城00的博客-CSDN博客

7、Apple Pay 接入工程 Apple Pay 接入工程 - 简书

当用户授权一个支付请求时,支付框架的 Apple 服务器与安全模块会协作创建一个支付令牌。你可以在委托方法 paymentAuthorizationViewController:didAuthorizePayment:completion: 中将支付信息以及其它你需要处理的信息,例如配送地址和购物车标识符,一起发送至你的服务器。这个过程如下所示:

  • 支付框架将支付请求发送至安全模块。只有安全模块会访问令牌化后的设备相关的支付卡号。
  • 安全模块将特定卡的支付数据和商家信息一起加密(加密后的数据只有 Apple 可以访问),然后将加密后的数据发送至支付框架。支付框架再将这些数据发送至 Apple 的服务器。
  • Apple 服务器使用商家标识证书将这些支付数据重新加密。这些令牌只能由你以及那些与你共享商户标识证书的人读取。随后服务器生成支付令牌再将其发送至设备。
  • 支付框架调用 paymentAuthorizationViewController:didAuthorizePayment:completion: 方法将令牌发送至你的委托。你在委托方法中再将其发送至你的服务器。

在服务器上的处理操作取决于你是自己处理支付还是使用其它支付平台。不过,在两种情况下服务器都得处理订单再将处理结果返回给设备。在设备上,委托再将处理结果传入完成处理方法中,详细过程请参阅 处理支付

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

8、ApplePay官方文档链接:Offering Apple Pay in Your App | Apple Developer Documentation

9、官方 Apple 支持

10、【iOS】Apple Pay配置 - 简书

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS系统是目前市场上最为流行的智能手机操作系统之一,而H5技术则是网页设计与开发领域的一大热门技术。在很多情况下,我们需要H5页面能够实现唤醒app的功能,这样不仅可以增加用户体验,还能提高应用的活跃度和转化率。下面我们来看一下如何在iOS平台上实现H5唤醒App的功能: 1.使用 universal link:Universal Links 是苹果提供的一种标准的网络链接技术。在使用这种技术时,需要在项目中配置一个 JSON 文件,并在 app 中运用 Associated Domains 的配置与这个 JSON 文件联系,最后在 H5 页面中添加相应的链接。当用户点击链接时,iOS 系统就会判断该链接是否关联到了 APP 上,如果是,就会自动将用户跳转到 APP 中。 2.使用 scheme:Scheme 系统是 iOS 中常用的一种协议,用于在应用程序之间传递数据,或调用应用程序内部的某些功能。可以在APP项目中设置scheme,当手机浏览器在用户访问页面时,会根据链接协议中的scheme来唤醒APP,并且把数据传递到APP中。使用Scheme的方式相对来说比较简单,但是要注意的是,由于iOS9中的安全机制调整,仅能在应用内发起 scheme 调用。如果APP没有被安装,那么scheme调用是无效的。 3.使用IOS智能浏览器:安装一些智能浏览器,它们可以自动扫描网页上提供的一个二维码,并从中解析出应用商店的链接,并引导用户去下载应用,类似于国内的微信、手Q、支付宝等。 需要注意的是,无论使用哪种方式实现唤醒App的功能,都需要在APP中进行相应的设置和配置,以确保APP能够正常响应用户的调用。因此在进行开发时,需要综合考虑多个方面的因素,才能实现最优质的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值