首页 » ios付费应用 » 苹果如何保证ApplePay支付接入和开发中遇到的问题

苹果如何保证ApplePay支付接入和开发中遇到的问题

 

国外苹果ID/美日韩台、新加坡、香港等——点击购买
韩国区已过年龄认证17+ 19+ 的苹果id游戏应用下载
日本区苹果商店_国外苹果ID/美日韩台新加坡等
独享美区ID小火箭账号----点击购买
正版苹果商店礼品卡、软件兑换码——点击购买

Apple Pay是苹果2014年发布的iOS8支持的新功能,2016年iOS9开始支持中国银联卡。Apple Pay凭借其安全的支付方式、简单快捷的用户体验、便捷的开发接入,在国内市场占据一席之地。

携程是第一批接入Apple Pay的中国应用商户,目前携程国际版也支持Apple Pay支付。国际版 Apple Pay 仍在扩充中,支持接入新的国家货币和支付渠道。

本文主要从iOS前端客户端的角度出发,对Apple Pay应用内接入和开发中遇到的一些问题进行总结和回顾,希望能给开发者带来启发和收获。

文章将主要由三个部分组成:

首先是梳理Apple Pay的支付流程,其中扮演了客户端、服务器、Apple、支付提供商的角色;

二是客户端如何支持Apple Pay:如何配置开发证书,开发注意事项;

三是国内和国际Apple Pay接入的一些差异。

一、Apple Pay的整体流程

下图为目前国内Apple Pay支付接入的一个大概流程(银联API方式),仅供参考:

申请苹果id账号怎么样跳过绑定银行卡_美国id能绑定支付宝吗_香港苹果id绑定支付方式

整个过程如下:

1、客户端通过Apple API在APP中显示Apple Pay支付控件。

2、用户对Apple Pay的支付控件进行生物特征验证(指纹或人脸识别)或手机密码验证。

3、用户验证通过后,苹果会生成一份与用户选择的银行卡相关的加密数据。Apple Pay只有在有网络的情况下才能进行。苹果需要使用开发者网站证书的公钥进行加密。完成后通过API回调返回客户端前端。

4、客户端获取后,向服务器发送扣款请求,等待支付结果。

5、服务器端接收客户端发送的信息,解密提取部分关键字段信息,附加其他订单信息,然后与支付提供商(如中国银联)通信发起扣款。

6、服务器收到扣款结果后,将支付结果返回给手机客户端,最后通知用户支付结果。

二、苹果如何保障安全 1、Apple Pay卡绑定

在iOS手机应用中,用户可以绑定真实的银行卡。绑定过程中需要进入银行卡的安全栏,验证手机号。

绑定成功后香港苹果id绑定支付方式,我们可以在手机中查看卡片,在卡片详情中会看到一个设备卡号。设备卡号为银行卡的虚拟卡号。这个虚拟卡号就是解密后可以得到的苹果公司发行的卡号。该卡号最终会被发送给支付提供商(如中国银联)进行扣款。

虚拟卡号不会固定,每次重新绑定银行卡时都会重新生成和更改。这将确保在随后的所有Apple Pay支付过程中,真实的银行卡号不会在网络中传输,增强了安全性。

苹果会在卡绑定过程中与不同的发卡机构进行沟通和互动。Apple Pay刚进入国内的时候,我们会看到有的银行卡可以绑定成功,有的不能绑定成功,因为有些渠道还不稳定。.

另外,我们可以在Apple Pay的开发者网站上找到专门的API。通过这些API,一些发卡机构APP可以直接在APP内绑定卡,比如一些银行APP。这些功能需要向苹果提交申请,获得专门的授权文件,在开发项目中配置,才能对那些API进行调整。相关的API可以在网上找到,这里只是为了了解,一般的APP开发我们是不会用到的。

对于整个Apple Pay平台,Apple在发卡机构、支付提供商、客户前端的所有流程中都有一套完整的安全机制。我们可以看到苹果对Apple Pay的投入和重视。适用于 iOS 客户端的 Apple Pay API 也简单易用。具体用法可以在苹果开发者网站上找到。

2.Apple Pay数据加密

Apple Pay在传输过程中有非常完善的加密安全机制。

国外统一使用ECC加密方式,国内只使用RSA加密方式。详情请看官方说明。

数据为JSON数据格式,包含Apple加密的支付信息数据。

例子

ECC即椭圆加密算法,是一种非对称加密方法。

ECC加密方式,示例格式:

{
 "data":"H22hDxsaFP8JZCuLf6AYu99IB2rLvRbQaZ/NtuQB/vS++ctYSCqPYWUH69eCV59eUdpEcHSOnJPX+95FpFuyRxryb+xzG0EIO0T7fPwDHPyZcA1gixgG/DD10oQgbTf6uWPWkB3z5E3ENsl4QKOTOpladzj4cLKPerlb28s9gjuJtXSylxbnSe5aRFBFwdqsus39hfXNdlIqRCJzYLiGrIFThxoKSv7kVK32u5UYjjAizMkH5tE0fvFbPjGvi3JLrGCozmJDytFWQUVjzba6ORLtd+ui0oe2PXzkVun8w0BNK2tsKh/Jfh4HdK/JD/TBbFLz06SkVa0T7OSjuyItln7NNh3PC+sAltllUyAtjYnY3X76t/DnJ23GVbwZ4t1bUjieZ2loBg+j1w0adcB0dR9UA1Eh1fexrdZW737sd6wp6Edd+PoEW4G5hY0RM/F280q6SD/wWwr80rOkQmE=",
  "header": {    
"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBZITXjr/xw6fsaVQ2bHCJVwglJt9f9ikgFGtsCKun1Spbei/xi756rt/aTA13ugqNiI2ITk0QvivqV6PhwmrHQ==",
   "publicKeyHash":"KjwaMOiXIeoSDyLEz5TDPl3uXAVcwZ2f5/P/jGH+gMo=",
"transactionId": "2e9d75661d1641d188d4e646901fe708836b5a5ac7c705c15915b27e23786488"
  },
 "signature":"MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCAMIID4jCCA4igAwIBAgIIJEPyqAad9XcwCgYIKoZIzj0EAwIwejEuMCwGA1UEAwwlQXBwbGUgQXBwbGljYXRpb24gSW50ZWdyYXRpb24gQ0EgLSBHMzEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTE0MDkyNTIyMDYxMVoXDTE5MDkyNDIyMDYxMVowXzElMCMGA1UEAwwcZWNjLXNtcC1icm9rZXItc2lnbl9VQzQtUFJPRDEUSBBcHBsaWNhdGlvbiBJbnRlZ3JhdGlvbiBDQSAtIEczMSYwJAYDV电报LDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMCCCRD8qgGnfV3MA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTUwNDA1MDQwOTE2WjAvBgkqhkiG9w0BC电报xIgQgmDfQVEEPlInbB9tQ/AQjni+COkvegoWmfwtpbwe7cuUwCgYIKoZIzj0EAwIERzBFAiB/4NnlUFbNkEqdJ6OGRtA78mZ30539P226OwsNRptycgIhAIzFEYsHH2xuMLVfxEiUmtQxcMdqgW1BgtL/AygaVaAhAAAAAAAA",
  "version":"EC_v1"
}

对ECC加密数据进行解密后,我们可以看到:

{
   "applicationExpirationDate": "190131",
   "applicationPrimaryAccountNumber":"370295XXXXX5435",
    "currencyCode":"840",
   "deviceManufacturerIdentifier": "XXXXXXXXXX",
    "paymentData":{        "emvData":"nycBgJ82AgDCnyYIG2vuQydGkMafEAcGhgEDoLABXzQBAJUFgAABAACCAhzAnwMGAAAAAAAAnxoCCECaAx电报BJwBAJ83BLnvab4="
    },
   "paymentDataType": "EMV",
   "transactionAmount": 100
}

国内的RSA加密方式,得到的格式:

{"data" :"juTLgE+0gQPg3RSe5DdJj1/w4amEvJOWSIka+nHNGFmFVd028omhkwMNNqG0exHgT39DAXnKqVNBh4ExGvIEgO7yi97JhDOmwq0nTyvPF/U393wgizrmoe8zX1FpUzI7e2co8PIYCJLkC6uTIuuumsE//503nDhvnz9frzmiMYVhdquf56couB028QBhJiQAupLM+NawVJ41i7e7WJIfyVhYEEn1Qw0TKZKy+Y65PkhAgdwlUGkKUI6r2IpHCc/l4EWvpn1tcVQvVeoG6qJxUdszgL6qrJBLtaT+/8teg9/jfn0iQwipEgYfTjalgHwXx3nop0dK2ZxzcOzdclfTY3uguM6HBNK6rK3hL2B/LnidAuWE0EWMp5/kqNunDJsSXsUM4+g6zg7ceVjlndZ0YLrQozxRkhPkgHHGtjFxn01PpeGSMMdoAVc8iOgpGKrjx/AAIp2jNY1fZZ1G4cYzW+gsJo5PrmPV7gGxA+M+HG5xdwMVfa9/cxS0qVU2eMw92OB7hdgaIW6cwONETgrd0Y2vF/oHiw7AbRiX/3GxkOJfJ9/5S0P6cxJF4JsvVHkrgit6gZPMCMXFQxDQsK8DlmQ9YxzDRIJCb9jxKE0=",
    "header" : {
"publicKeyHash": "YcmdtTV209LCGVZV99T0lNab3yo0KnudAyBKQPo+5e8=",
       "transactionId":"41a6eb8dd8602def5f41463ad314e484289258df71ab17b50204ea4795a3db52",
"wrappedKey" :"l6w4oBmvLF/f/6Gj7idhO5aIFlwZ5qZrqSLxR+mLqsjJqHLf2OUTObn+UOO/Iaupc+nc6Kuz1ZTQbBMG2w6/KC8F07lZTPnCOcHVxxBP03UQn6gNkNV8DLNNqJ9GoBDzbGy/dWgKBBPNEdgA59jKY+8H/XQzvNuZqiFDM4LTr+O3/FdqGy6PxfFHRwRNV15WoKtsfQ91xPf++MI4GoTZSdxpc63ewm/8l5Q81AqnZMH03PMRyu8POT92tl10tg8GRmQFCXMgBm7GM+6nz0tebOoLndspqHbe9xtAGmxzseuFCi4A2q8WaqzPgnQ917bvuUnxNHAkXoPTVIUCsXzxXA=="
    },
"signature":"MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCAMIIEtTCCBFugAwIBAgIIEVmL4CjCUF8wCgYIKoZIzj0EAwIwejEuMCwGA1UEAwwlQXBwbGUgQXBwbGljYXRpb24gSW50ZWdyYXRpb24gQ0EgLSBHMzEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTE0MTIwMzAxMDAyNloXDTE5MTIwMjAxMDAyNlowZzEtMCsGA1UEAwwkZWNjLXNtcC1icm9rZXItc2lnbl9VQzQtUFJPRF9LcnlwQ8XDTE2MTEwMjEyMzg0OFowLwYJKoZIhvcNAQkEMSIEIP+1yZ0K5+XsvQRPOcudpBElpvl64hJ2pE0PryWNhFSlMA0GCSqGSIb3DQEBAQUABIIBAHuOnvaNlq/1oBGLGyi/+6BmUJLAZjtArsHnpMArgEcmW8qy1oObVeSF7puBjhsnnoWsGnSr+c0/jxYgxKk10RuzLdxdITbx2DJab+3AzQ4gCatfKuzlzPAdqYaumZLnr/6pJ+CPLaTlWZJZhrPY7GNiqdN2v22tXZQae6fHLwXXqNzjdVOsHNYRRReZA9jbQ46haaI/3HpYuQpRhLu5EAkReaYZZKuOhpyxxUeatFtRFwo/vH3yOU5eG07VASCGB33SZqgjJNMZWACIF3FRKK9W8yL50ywEZzDCpCV3/6Jk9yZB1h/jU7qu3iTBXo8jU6lGRcoKjl0DzkiIEQVHB+kAAAAAAAA=", 
"version" :"RSA_v1"

国内的Apple Pay加密方式其实是RSA+AES,RSA是非对称加密,AES是对称加密。以上数据实际上是经过AES加密的。AES 密钥隐藏在内部,受 RSA 加密保护。

国内加密数据解密后如下:

{
      "applicationPrimaryAccountNumber":"62583300888880215",
      "applicationExpirationDate": "270101",
      "currencyCode": "156",
      "transactionAmount": 0,
      "deviceManufacturerIdentifier": "062010011111",
      "paymentDataType": "EMV",
      "paymentData": {
             "emvData":"nyYItis3L6CiQbufNgIACYECAE2DgZCgujJqvZh6gtCOicVyx2tOh1ncXHOQ9bhYMObxz+IHR5a4PD93thtwu7RKyIFb2zab3wkj0oMcra5Cf+J+JbXdk0FxxxxxxxxxxT56HVqNMBp4M/7Uh36lblsiLkvW0H3rwLVWE/CV4/h0="
       }
}

解密后,我们只能看到手机中银行卡绑定的虚拟卡号,用于向支付方发起扣费。

3.支付提供商

支付商主要是提供支付和扣款渠道的商户,如中国的银联,国外的Adyen。您可以参考 Apple 支持的支付提供商。支付提供商主要负责与发卡机构互动并发起拒付。

4.客户端开发Apple Pay

客户端开发工作主要包括:

1. 证书制作;

2、APP项目配置及证书使用;

3.API调用;

证书准备

开发者需要在 Apple 开发者网站上提交 Apple Pay 证书。

生成Apple Pay证书首先需要准备一个CSR文件,可以通过mac电脑的应用快速生成。此 CSR 文件是一个文本文件任务。

这个CSR文件需要上传到苹果开发者网站:

美国id能绑定支付宝吗_申请苹果id账号怎么样跳过绑定银行卡_香港苹果id绑定支付方式

对iOS开发比较了解,苹果的各种开发证书都是这种形式生成的。

生成Apple Pay证书的CSR文件时注意:在国内生成CSR时需要使用RSA加密方式。在非中国地区生成CSR时,需要使用ECC加密方式。

CSR中包含公钥信息,在生成的同时,mac电脑的 中也会生成对应的私钥。将CSR上传到苹果开发者网站生成证书后,在mac上下载安装,即可在应用中看到私钥,导出私钥即可解密。

证书生成过程官方和网上都有介绍,这里不再赘述。

项目配置及证书使用

正如您在苹果开发者账户网站上看到的那样,每个 Apple Pay 证书都对应并关联一个。在实际使用中,每张Apple Pay证书对应一组密钥和一组支付扣费通道。当Apple发出的加密是根据APP调用API时传入的对应公钥进行加密过程。

客户端调用API时,如果需要指定证书,建议不要在本地硬编码客户端。最好由服务器发送,灵活可配置,这样支付通道就可以切换了。

生成证书后,需要在Xcode工程文件中打开Apple Pay的开关,勾选对应的证书,否则APP安装包ipa将无法调用Apple Pay的支付页面。

打开选项的位置,如图:

申请苹果id账号怎么样跳过绑定银行卡_香港苹果id绑定支付方式_美国id能绑定支付宝吗

Apple Pay证书具有时效性,一般两年后就会过期,需要更换密钥。证书过期的具体操作可以在苹果开发者网站上进行。

如下图页面更改证书时,先绑定新的CSR生成新证书,然后在线切换到新证书模式。

香港苹果id绑定支付方式_美国id能绑定支付宝吗_申请苹果id账号怎么样跳过绑定银行卡

在线验证证书没有问题,然后可以使用旧证书。

证书更新过程中,在线APP客户端无需调整,证书的密钥配置在服务器端。为了不影响用户的支付流程,需要对APP服务器进行控制。证书更换期间,先暂时关闭Apple Pay支付模式,待新证书密钥生效后再启用。

5. 国内和国际接入的一些区别和注意事项

携程支付最初接入中国银联的Apple Pay通道时,采用的是银联SDK模式。

这种SDK模式是中国银联提供SDK给APP使用Apple Pay进行支付。具体的SDK和说明可以在中国银联开发网下载。

使用SDK的好处是客户端接入简单,调用SDK接口和处理支付结果的回调即可,客户端不需要处理各种异常。银联SDK在调用银联SDK时需要传递一个tn号码。此 tn 号码由银联生成。这个 tn 号对应一个事务。APP调用银联SDK时,必须通过。

使用SDK模式的缺点是:

1、对APP打包的ipa安装文件影响比较大。对于体积要求比较高的携程APP,当时银联SDK的体积在支付端占了很大比重。原因应该是银联的SDK,里面有自己的通信等框架。

2、当整个APP需要Https,或者ipv6等类似的特殊支持时,APP对银联SDK的依赖较大,需要与银联进行沟通确认,确保银联SDK支持。

3、SDK模式下,证书和密钥由银联生成。APP开发,使用银联提供的CSR文件生成并绑定Apple Pay证书。更新证书和密钥很麻烦。

4、Apple Pay的页面显示完全由银联SDK控制。当需要增加展示项时,需要寻求银联SDK的外部支持。

后来携程支付改革了接入方式,采用API模式,不再使用SDK方式接入银联Apple Pay。这样对于接入商户来说,证书和密钥由接入商户自行管理,不再依赖于支付提供商,客户端和服务端的开发更加灵活。

这样,iOS开发者就需要自行控制和处理Apple Pay的UI显示和交互,并处理如下异常:

1、部分场景下,用户验证通过后,发送扣款请求时,用户点击取消按钮取消Apple Pay操作。在这种场景下,支付需要采取一定的计划和策略,避免从用户身上扣更多的钱。.

2、与其他支付方式一样,需要考虑如何处理异常情况下重复提交订单的问题。

更多安全检查:在实际项目中,对Apple Pay的数据进行解密后,是看不到金额的。我们尝试直接给用户随机打折,提交给银联服务器的支付金额与APP中显示给用户的金额一致。当金额不一致时,发现不能扣款成功。由此可以得出结论,Apple 与支付提供商之间必须存在金额验证机制。APP端不能扣除用户以外的任何金额香港苹果id绑定支付方式,必须在Apple Pay页面显示清楚的金额。

在后续的Apple Pay国际接入中,携程分别接入了Adyen和Apple Pay。这两个通道所需要的Apple Pay证书都是ECC加密的,这一点和国内的银联是不一样的。

另外,Adyen接入时,证书由Adyen生成,加解密全部由Adyen处理。但是证书的生成、加密和解密都需要携程支付自己完成,所以携程支付在获取之后需要针对不同的支付渠道做不同的处理。

实际调用国际版Apple Pay时,APP服务器会根据不同的币种使用不同的支付渠道。Apple Pay API 支持指定证书。进入支付时,APP客户端根据服务器下发的消息调用Apple Pay。. 这样就可以实现使用不同的币种,不同的凭证通道进行支付。

除了服务分发可配置证书通道外,国际版Apple Pay产品的业务比中国版复杂,不同的业务场景需要支持的银行通道也不同. 同理,APP根据服务器发卡通道控制Apple Pay的支持和显示,如Visa等支付方式。

6.总结

在iOS开发中,接入Apple Pay不仅仅是简单的API调用和展示,还需要考虑一些用户行为和交互。与任何支付流程一样,您必须对用户的体验和财产负责。要充分考虑各种可能出现的异常,如何避免和解决这些异常,需要在整体上进行更全面的设计。

Apple Pay的正常运行需要客户端、服务器、发卡机构、支付提供商和Apple之间的密切合作。通过参与Apple Pay的开发和对Apple Pay安全性的不断深入了解,你会发现Apple真的很注重细节,有很多值得借鉴的想法和设计。在支付环节,如何在保证安全的同时,为用户提供极致简单的体验,苹果确实做到了。

【作者简介】 杨伟,携程金融支付中心支付iOS团队,目前主要负责携程APP中文版和国际版APP的支付项目功能开发和团队管理。热爱生活,热爱探索。

更多携程技术人员,欢迎搜索关注“携程技术中心”微信公众号~

国外苹果ID/美日韩台、新加坡、香港等——点击购买
韩国区已过年龄认证17+ 19+ 的苹果id游戏应用下载
日本区苹果商店_国外苹果ID/美日韩台新加坡等
独享美区ID小火箭账号----点击购买
正版苹果商店礼品卡、软件兑换码——点击购买

原文链接:苹果如何保证ApplePay支付接入和开发中遇到的问题,转载请注明来源!

0