2

我的后端成功验证了商家并返回了一个会话,但是当我在浏览器上完成验证时,它立即取消了交易。Apple Dev 论坛上有一些类似的投诉,但似乎都没有得到答复;我希望你们能提供帮助!

在对象上的所有事件处理程序ApplePaymentSession中,只有 onvalidatemerchant 被调用,然后只要completeMerchantValidation有一个有效的会话对象(见下面的有效负载),oncancel就会被触发。

会话配置(在浏览器上)

const session = new ApplePaySession(3, {
  currencyCode: 'GBP',
  countryCode: 'GB',
  merchantCapabilities: [ 'supports3DS' ],
  supportedNetworks: ['visa', 'masterCard', 'amex', 'discover' ],
  total: {
    type: 'final',
    label: 'My Product',
    amount: 9.99,
  },       
});

请求(在后端)

{
  merchantIdentifier: 'merchant.MY.FQDN',
  displayName: 'My Company Name',
  initiative: 'web',
  initiativeContext: 'MY.VERIFIED.FQDN',
}

响应(从 Apple 到后端,然后发送到completeMerchantValidation

{
  "epochTimestamp": 1552090296444,
  "expiresAt": 1552093896444,
  "merchantSessionIdentifier": "LONG_STRING",
  "nonce": "XXXX",
  "merchantIdentifier": "SAME_AS_IN_MY_MERCHANT_ID_CERT",
  "domainName": "MY.VERIFIED.FQDN",
  "signature": "XXXXXX-VERY-LONG-STRING-XXXXX"
}

我肯定会将此响应completeMerchantValidation作为 JSON 对象而不是字符串发送,如下所示:

console.log('session is a', typeof(result), result); // says: object
session.completeMerchantValidation(result);

这一切发生的域名(并托管在 Firebase 上)已针对此商家 ID 进行验证,我在后端或浏览器控制台中都没有收到任何错误,也没有抛出异常,它只显示 Apple Pay托盘,然后说“付款未完成”并很快隐藏托盘。帮助!

更新:查看文档,似乎startSession(正在onvalidatemerchant被逐步淘汰,所以我尝试用paymentSession(eg https://apple-pay-gateway-nc-pod5.apple.com/paymentservices/paymentSession) 替换它;但我仍然得到相同的响应和行为。

4

1 回答 1

1

此解决方案可能适合您,也可能不适合您,但我遇到了同样的问题,即会话一被session.completeMerchantValidation()调用就被取消。

它归结为使用未经验证的值merchantSession创建(参见:https ://developer.apple.com/documentation/apple_pay_on_the_web/configuring_your_environment )domainName

我使用通过Ngrok广播的本地网络服务器来验证临时 URL,方法是将apple-developer-merchantid-domain-association.txt文件放在需要基于 Apple Pay 文档的位置。

之后,只要我使用沙盒 iCloud 帐户和测试 Apple Pay 卡,将ngrokURL 作为请求的domainName值传递merchantSession,Apple Pay 终于开始在本地工作。请注意,我必须通过ngrokurl 与本地运行的 Web 应用程序进行交互,Apple Pay 才能正常工作。

于 2019-10-31T21:44:27.463 回答