从Android支付迁移到Google支付API

从Android支付迁移到Google支付API,android,android-pay,Android,Android Pay,TL;DR:我是否可以使用使用WalletConstants.TOTAL_PRICE_STATUS_ESTIMATED作为交易信息的“TotalPrice STATUS”构建的PaymentDataRequest来处理交易 完整问题说明 我有一个应用程序,目前集成了AndroidPay作为支付方式,我想将其迁移到新的应用程序中 用户可以购买发送给他们的物品,由于运输成本可能会根据位置而变化,因此在我从MaskedWallet(AndroidPay)或PaymentData(Google Paym

TL;DR:我是否可以使用使用WalletConstants.TOTAL_PRICE_STATUS_ESTIMATED作为
交易信息的“TotalPrice STATUS”构建的
PaymentDataRequest
来处理交易

完整问题说明 我有一个应用程序,目前集成了AndroidPay作为支付方式,我想将其迁移到新的应用程序中

用户可以购买发送给他们的物品,由于运输成本可能会根据位置而变化,因此在我从
MaskedWallet
(AndroidPay)或
PaymentData
(Google Payment)获取用户的运输地址之前,我无法计算订单的最终成本。当使用AndroidPay时,当我请求
MaskedWallet
时,用户会看到一个底部的页面对话框,然后我可以计算订单总额,然后请求
FullWallet
,并向用户收取准确的金额

如果我遵循与谷歌支付相同的基本模式,我会请求一个
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\u PRICE\u STATUS\u 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
来向用户收费,即使用户收取的确切美元金额可能与我创建请求时使用的金额不同,正如您正确指出的,与旧的Android Pay API不同,旧的Android Pay API具有
loadMaskedWallet
loadFullWallet
,应该在流的不同部分调用,Google Pay API只有一个
loadPaymentData
调用,从这个意义上说,可以将其视为两者的组合(即在
loadMaskedWallet
之后立即调用
loadFullWallet

这意味着无需进行第二次
PaymentDataRequest
——因为当您向谷歌申请支付凭证时,您的最终价格未知,
TOTAL_price_STATUS_ESTIMATED
是正确的方法。一旦成功接收到支付凭据,就无需再调用API

请记住,谷歌不会处理交易,因此您仍然需要向您的支付处理器/网关提供正确的最终金额