isReadyToPayRequest возвращает false, когда я устанавливаю existingPaymentMethodRequired как true

Я следовал приведенным здесь инструкциям, чтобы определить готовность к использованию кошелька Google Pay. https://developers.google.com/pay/api/android/guides/tutorial#isreadytopay

Это работает нормально, пока я не установлю true на existingPaymentMethodRequired. Я намерен узнать, есть ли в кошельке хотя бы одна карта, но я всегда получаю false из запроса. Моя среда - это тестовая среда, и в телефоне Android зарегистрирована кредитная карта. Кто-нибудь знает почему? Документация находится здесь https://developers.google.com/pay/api/android/reference/request-objects#IsReadyToPayRequest

public static Optional<JSONObject> getIsReadyToPayRequest() {
    try {
      JSONObject isReadyToPayRequest = getBaseRequest();
      isReadyToPayRequest.put(
          "allowedPaymentMethods", new JSONArray().put(getBaseCardPaymentMethod()));
      isReadyToPayRequest.put("existingPaymentMethodRequired", true);

      return Optional.of(isReadyToPayRequest);

    } catch (JSONException e) {
      return Optional.empty();
    }
  }

 private static JSONObject getCardPaymentMethod() throws JSONException {
    JSONObject cardPaymentMethod = getBaseCardPaymentMethod();
    cardPaymentMethod.put("tokenizationSpecification", getGatewayTokenizationSpecification());

    return cardPaymentMethod;
  }

private static JSONObject getBaseCardPaymentMethod() throws JSONException {
    JSONObject cardPaymentMethod = new JSONObject();
    cardPaymentMethod.put("type", "CARD");

    JSONObject parameters = new JSONObject();
    parameters.put("allowedAuthMethods", getAllowedCardAuthMethods());
    parameters.put("allowedCardNetworks", getAllowedCardNetworks());
    // Optionally, you can add billing address/phone number associated with a CARD payment method.
    parameters.put("billingAddressRequired", true);

    JSONObject billingAddressParameters = new JSONObject();
    billingAddressParameters.put("format", "FULL");

    parameters.put("billingAddressParameters", billingAddressParameters);

    cardPaymentMethod.put("parameters", parameters);

    return cardPaymentMethod;
  }

private static JSONArray getAllowedCardAuthMethods() {
  return new JSONArray()
      .put("PAN_ONLY")
      .put("CRYPTOGRAM_3DS");
}
private static JSONArray getAllowedCardNetworks() {
  return new JSONArray()
      .put("AMEX")
      .put("DISCOVER")
      .put("INTERAC")
      .put("JCB")
      .put("MASTERCARD")
      .put("VISA");
}
  private static JSONObject getBaseRequest() throws JSONException {
    return new JSONObject().put("apiVersion", 2).put("apiVersionMinor", 0);
  }


private void possiblyShowGooglePayButton() {

    final Optional<JSONObject> isReadyToPayJson = PaymentsUtil.getIsReadyToPayRequest();
    if (!isReadyToPayJson.isPresent()) {
      return;
    }

    // The call to isReadyToPay is asynchronous and returns a Task. We need to provide an
    // OnCompleteListener to be triggered when the result of the call is known.
    IsReadyToPayRequest request = IsReadyToPayRequest.fromJson(isReadyToPayJson.get().toString());
    Task<Boolean> task = paymentsClient.isReadyToPay(request);
    task.addOnCompleteListener(this,
        new OnCompleteListener<Boolean>() {
          @Override
          public void onComplete(@NonNull Task<Boolean> task) {
            if (task.isSuccessful()) {
              setGooglePayAvailable(task.getResult());
            } else {
              Log.w("isReadyToPay failed", task.getException());
            }
          }
        });
  }


person Haoyu Zha    schedule 20.03.2021    source источник


Ответы (1)


Согласно документации, в TEST среде он всегда должен возвращать true:

Примечание. В среде TEST, если вы установите для existingPaymentMethodRequired значение true в запросе IsReadyToPay (), ответ всегда будет возвращать значение true.

Можете ли вы подтвердить, что он всегда возвращается false для вас? То есть документация неверная?

person Soc    schedule 22.03.2021
comment
Да, это самое странное. Я трижды проверил документ и код. Похоже, что API всегда возвращает false. Не уверен, связано ли это с какими-либо настройками телефона. Я использую 2 новых телефона на базе Android. Может быть, полезная информация - если я не передаю этот атрибут, я получаю true и могу продолжать запускать поток GPay, могу подтвердить транзакцию с помощью Stripe в тестовой среде. - person Haoyu Zha; 24.03.2021
comment
Не уверен, есть ли у SDK кошелька доступная поддержка. Я как бы застрял в этом моменте. - person Haoyu Zha; 24.03.2021
comment
Вы сможете получить поддержку через меню «Связаться со службой поддержки» в бизнес-консоли: pay.google.com/business / console - person Soc; 24.03.2021