【问题标题】:Migrating from Android Pay to Google Payment API从 Android Pay 迁移到 Google Payment API
【发布时间】:2018-06-02 08:39:56
【问题描述】:

TL;DR:我可以使用使用WalletConstants.TOTAL_PRICE_STATUS_ESTIMATED 构建的PaymentDataRequest 作为TransactionInfo 的“TotalPriceStatus”来处理交易吗?

完整的问题描述

我有一个应用,目前集成了 AndroidPay 作为支付方式,我想迁移它以使用新的Google Payment API

用户可以购买运送给他们的东西,并且由于运费可能会根据位置而变化,因此我无法计算订单的最终费用,直到我从MaskedWallet (AndroidPay) 或PaymentData(谷歌支付)。使用AndroidPay时,当我请求MaskedWallet时,用户会看到一个底部对话框,然后我可以计算订单总额,然后请求FullWallet,并以准确的金额向用户收费。

如果我遵循与 Google Payment 相同的基本模式,我会请求PaymentData,如下所示:

PaymentDataRequest.Builder request = PaymentDataRequest.newBuilder()
        .setTransactionInfo(TransactionInfo.newBuilder()
            .setTotalPriceStatus(WalletConstants.TOTAL_PRICE_STATUS_ESTIMATED)
            .setTotalPrice("123")
            .setCurrencyCode("USD")
            .build())
        .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_CARD)
        .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD)
        .setPhoneNumberRequired(true)
        .setEmailRequired(true)
        .setShippingAddressRequired(true)
        .setPaymentMethodTokenizationParameters(getTokenizationParameters())
        .setCardRequirements(getCardRequirements());

其中getTokenizationParameters()getCardRequirements() 是本地定义的辅助方法。在我提出这个请求后,会向用户显示一个对话框,确认他们的地址和信用卡(就像为 AndroidPay 请求 MaskedWallet 一样),然后我会显示一个我自己的确认 UI,显示价格明细。当用户单击确认购买并下订单时,我正在创建另一个PaymentDataRequest,但这次在TransactionInfo 中使用WalletConstants.TOTAL_PRICE_STATUS_FINAL,因为我知道确切地知道客户将被收取多少费用,如下所示:

PaymentDataRequest.Builder request = PaymentDataRequest.newBuilder()
        .setTransactionInfo(TransactionInfo.newBuilder()
            .setTotalPriceStatus(WalletConstants.TOTAL_PRICE_STATUS_FINAL)
            .setTotalPrice("133.5")
            .setCurrencyCode("USD")
            .build())
        .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_CARD)
        .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD)
        .setPhoneNumberRequired(true)
        .setEmailRequired(true)
        .setUiRequired(false)
        .setShippingAddressRequired(true)
        .setPaymentMethodTokenizationParameters(getTokenizationParameters())
        .setCardRequirements(getCardRequirements());

我执行第二个请求的部分原因是这反映了 Android Pay 中使用的流程,FullWallet,但由于第二个对话框,用户体验很糟糕。

我是否必须使用WalletConstants.TOTAL_PRICE_STATUS_FINAL 创建一个PaymentDataRequest 才能获得一个可以用来向用户收费的PaymentData,或者我可以使用WalletConstants.TOTAL_PRICE_STATUS_ESTIMATED 并使用该PaymentData 来向用户收费,甚至尽管向用户收取的确切金额可能与我创建请求时使用的金额不同?

【问题讨论】:

    标签: android android-pay


    【解决方案1】:

    正如您正确指出的那样,与应该在流程的不同部分调用的具有 loadMaskedWalletloadFullWallet 的旧 Android Pay API 不同,Google Pay API 只有一个 loadPaymentData 调用从这个意义上说,可以认为是两者的结合(即在loadMaskedWallet 之后立即调用loadFullWallet)。

    这意味着不需要第二个PaymentDataRequest - 因为当您向 Google 请求付款凭据时您的最终价格是未知的,TOTAL_PRICE_STATUS_ESTIMATED 是正确的方法。成功收到付款凭据后,无需进一步调用 API。

    请注意,Google 不处理交易,因此您仍需要向您的支付处理器/网关提供正确的最终金额。

    【讨论】:

      猜你喜欢
      • 2018-06-23
      • 1970-01-01
      • 2018-07-03
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      相关资源
      最近更新 更多