【问题标题】:Get data returned by Google Pay API on backend获取 Google Pay API 在后端返回的数据
【发布时间】:2019-01-02 10:00:11
【问题描述】:

在我的 Android 应用上使用 Google Pay 进行付款时,一旦付款得到验证,我会得到一个 PaymentData 变量,我可以从中获取一些信息,例如电子邮件、送货地址、帐单邮寄地址......

有没有办法在我的后端获取这些信息,而不发送它们以避免更改?

例如,当我使用 OAuth 执行 Google Connect 时,我得到一个令牌,它允许我向 Google 的服务器执行请求并自己检索诸如“邮件”之类的数据……这样我可以检查是否邮件被更改了。

谢谢,

编辑:这是来自 Android 应用程序的代码

private void payWithGooglePay() {
    PaymentDataRequest.Builder request =
            PaymentDataRequest.newBuilder()
                    .setEmailRequired(true)
                    .setShippingAddressRequired(needShippingAddress)
                    .setTransactionInfo(
                            TransactionInfo.newBuilder()
                                    .setTotalPriceStatus(WalletConstants.TOTAL_PRICE_STATUS_FINAL)
                                    .setTotalPrice(String.valueOf(amountToPay / 100))
                                    .setCurrencyCode(currency.getCurrencyCode())
                                    .build())
                    .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_CARD)
                    .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD)
                    .setCardRequirements(
                            CardRequirements.newBuilder()
                                    .setBillingAddressRequired(needBillingAddress)
                                    .addAllowedCardNetworks(Arrays.asList(
                                            WalletConstants.CARD_NETWORK_VISA,
                                            WalletConstants.CARD_NETWORK_MASTERCARD))
                                    .build());

    PaymentMethodTokenizationParameters tokenizationParameters =
            PaymentMethodTokenizationParameters.newBuilder()
                    .setPaymentMethodTokenizationType(WalletConstants.PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY)
                    .addParameter("gateway", "stripe")
                    .addParameter("stripe:publishableKey", liveMode ? getString(R.string.stripe_live_pk_key) : getString(R.string.stripe_test_pk_key))
                    .addParameter("stripe:version", "5.1.0")
                    .build();

    PaymentDataRequest paymentDataRequest = request
            .setPaymentMethodTokenizationParameters(tokenizationParameters)
            .build();

    if (paymentDataRequest == null) {
        return;
    }

    AutoResolveHelper.resolveTask(paymentsClient.loadPaymentData(paymentDataRequest),
            getActivity(), ProgressViewActivity.PAYMENT_WITH_GOOGLE_PAY_REQUEST_CODE);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case ProgressViewActivity.PAYMENT_WITH_GOOGLE_PAY_REQUEST_CODE:
            if (resultCode == Activity.RESULT_OK) {
                PaymentData paymentData = PaymentData.getFromIntent(data);
                Log.d("MyGooglePay", "Google transaction ID: " + paymentData.getGoogleTransactionId());
                Log.d("MyGooglePay", "mail: " + paymentData.getEmail());
                Log.d("MyGooglePay", "token:" + paymentData.getPaymentMethodToken().getToken());
                Log.d("MyGooglePay", "extra: " + (paymentData.getExtraData() != null ? paymentData.getExtraData().toString() : ""));

                CardInfo cardInfo = paymentData.getCardInfo();
                String description = cardInfo.getCardDescription();
                Log.d("MyGooglePay", description);

                UserAddress shippingAddress = paymentData.getShippingAddress();
                UserAddress billingAddress = cardInfo.getBillingAddress();
                Log.d("MyGooglePay", "shipping: " + shippingAddress);
                Log.d("MyGooglePay", "billing: " + billingAddress);

                String rawToken = paymentData.getPaymentMethodToken().getToken();

                // Now that you have a Stripe token object, charge that by using the id
                Token stripeToken = Token.fromString(rawToken);
                if (stripeToken != null) {
                    // This chargeToken function is a call to your own server, which should then connect
                    // to Stripe's API to finish the charge.
                    Log.d("MyGooglePay", stripeToken.getCard().toJson().toString());
                    //sendFinalRequestAndGoToNext(stripeToken.getId());
                }
                break;
            }
    }
}

为了清楚起见,我想要的是直接从我的后端获取 PaymentData,而不是从应用程序发送到我的后端,以避免更改。

【问题讨论】:

  • 给我们看一些代码。
  • @olylo 刚刚编辑了问题
  • 我还没试过google pay。我正在为我的应用使用 google play 计费库。

标签: android android-pay google-pay


【解决方案1】:

这种与处理器和网关分离的行为是有意为之,它旨在最大限度地提高所有相关代理的兼容性。

从 Google Pay 检索到的敏感信息已加密,因此只有付款处理方才能显示负载的内容。篡改中间的内容只会导致payload无效。

为了能够访问该内容,您还可以选择使用DIRECT integration 实施 Google Pay。话虽如此,请注意支付处理涉及复杂性和对 PCI DSS 等监管条款的合规性,因此,除非另有必要,否则不建议这样做。

【讨论】:

  • 谢谢,但这不是我的问题。使用 Stripe,您可以将一些数据链接到源(如邮件地址)。但是,虽然使用 Google Pay 会自动设置帐单地址(因此我可以确定当我收到后端请求时它没有被篡改),但电子邮件不是。
猜你喜欢
  • 2023-02-15
  • 2018-12-08
  • 1970-01-01
  • 2018-07-03
  • 2017-05-04
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多