Добавьте карту постоянного клиента в Google Pay через Google Play Services API

У меня проблема с добавлением карты лояльности в приложение Google Pay с помощью API сервисов Google Play. У меня есть верификация аккаунта после запроса Google Pay, но я получаю 400 в логах.

Не могу найти в чем дело ...

Код ниже был написан в соответствии с этими руководствами:

https://developers.google.com/pay/passes/guides/get-started/implementing-the-api/save-to-google-pay#from-native-android-app

https://developers.google.com/pay/passes/guides/overview/basics/typical-api-flow

Прикрепленный код (Обратите внимание на комментарии, это важно)

// is 9999999
val userId : String = usr.idUser.toString()
// value is "John Snow"
val fullname : String = usr.fullname
// ISSUER_ID - is numeric value from console

val wob = LoyaltyWalletObject.newBuilder()
//    the class id has similar name. All characters has been replaced with 'x' character
    .setClassId("$ISSUER_ID.xxxx.xxx.xxxxxxxxxxxx.xxxxxxxxxx")
//    similar to comment from method setClassId
    .setId("$ISSUER_ID.xxxx.xxx.xxxxxxxxxxxx.xxxxxxxxxx.$userId")
    .setState(WalletObjectsConstants.State.ACTIVE)
//   id of user in app
    .setAccountId(userId)
//   name of user in app
    .setAccountName(fullname)
//    from console - "Issuer" = Loyalty
    .setIssuerName("Loyalty")
//    from console - "Program Name" = Loyalty card
    .setProgramName("Loyalty card")
//    barcode type from docs  
    .setBarcodeType("code128")
//   card 16 digits card number
    .setBarcodeValue("1234567890123456")
//   formatter card number
    .setBarcodeAlternateText("1234 5678 9012 3456")
//   url on web resources
    .addLinksModuleDataUris(uris)
    .build()

val request = CreateWalletObjectsRequest.newBuilder()
    .setLoyaltyWalletObject(wob)
    .build()

val opts = Wallet.WalletOptions.Builder()
    .setTheme(WalletConstants.THEME_LIGHT)
    .setEnvironment(WalletConstants.ENVIRONMENT_PRODUCTION)
    .build()

val client = Wallet.getWalletObjectsClient(activity, opts)
val task = client.createWalletObjects(request)
AutoResolveHelper.resolveTask(task,activity,UIRequestCode.RC_GPAY)

Журнал:

E: [13290] BasicNetwork.performRequest: Unexpected response code 400 for https://wallet.google.com/payments/apis/instantbuy/android/v1/createWalletObjects
E: Exception sending Volley request
java.util.concurrent.ExecutionException: com.android.volley.ClientError
    at com.android.volley.toolbox.RequestFuture.a(:com.google.android.gms@[email protected] (040408-219897028):4)
    at com.android.volley.toolbox.RequestFuture.get(:com.google.android.gms@[email protected] (040408-219897028):1)
    at atew.a(:com.google.android.gms@[email protected] (040408-219897028):29)
    at atew.a(:com.google.android.gms@[email protected] (040408-219897028):25)
    at atyd.a(:com.google.android.gms@[email protected] (040408-219897028):8)
    at atxx.a(:com.google.android.gms@[email protected] (040408-219897028):16)
    at atof.a(:com.google.android.gms@[email protected] (040408-219897028):4)
    at atxw.a(:com.google.android.gms@[email protected] (040408-219897028):4)
    at atyg.a(:com.google.android.gms@[email protected] (040408-219897028):2)
    at atxq.a(Unknown Source:2)
    at atxu.a(Unknown Source:19)
    at xrb.a(:com.google.android.gms@[email protected] (040408-219897028):3)
    at cpb.onTransact(:com.google.android.gms@[email protected] (040408-219897028):4)
    at atxq.onTransact(:com.google.android.gms@[email protected] (040408-219897028):1)
    at android.os.Binder.transact(Binder.java:627)
    at dry.onTransact(:com.google.android.gms@[email protected] (040408-219897028):3)
    at android.os.Binder.execTransact(Binder.java:697)
 Caused by: com.android.volley.ClientError
    at com.android.volley.toolbox.BasicNetwork.performRequest(:com.google.android.gms@[email protected] (040408-219897028):49)
    at qni.performRequest(:com.google.android.gms@[email protected] (040408-219897028):13)
    at com.android.volley.NetworkDispatcher.a(:com.google.android.gms@[email protected] (040408-219897028):6)
    at com.android.volley.NetworkDispatcher.run(:com.google.android.gms@[email protected] (040408-219897028):2)
E: Unknown ServerResponse type=1

Проблема с Github: https://github.com/google-pay/s2gp-quickstart-android/issues/4 (пример кода, руководство разработчика для API-интерфейсов передач, еще не обновленных командой API-интерфейсов Google)


person Alex Nuts    schedule 15.11.2018    source источник
comment
есть какое-нибудь решение? это ошибка или проблема с белым списком? пожалуйста обновите   -  person LOG_TAG    schedule 17.12.2018
comment
.setCreateMode (SHOW_SAVE_PROMPT) нужен?   -  person LOG_TAG    schedule 17.12.2018
comment
Нет, наша команда не нашла для этого решения. Наше обсуждение продолжается с Google.   -  person Alex Nuts    schedule 18.12.2018
comment
@LOG_TAG - к сожалению .setCreateMode (SHOW_SAVE_PROMPT) не подходит для тестирования у нас   -  person Alex Nuts    schedule 18.12.2018
comment
то же самое! дайте мне знать, если вы получите решение от команды Google, я также буду сообщать вам о прогрессе! прокомментируйте здесь также github.com/google-pay/s2gp-quickstart- android / issues / 4   -  person LOG_TAG    schedule 18.12.2018


Ответы (2)


Команда Google Pay должна внести ваше приложение в белый список. Да, очень важно, но ...

Я отправил команде Google Pay свой релиз SHA1 Fingerprint (https://developers.google.com/pay/passes/guides/get-started/basic-setup/native-android-sdk). После этого при установке приложения прямо из файла apk все начинает работать отлично (при нажатии на «Добавить в GPay» -> добавить карту лояльности в Google Pay)!

Но продолжал не работать при загрузке в Play Market (

После тщательного исследования ...)

Решение: отпечаток SHA1 необходимо получить из "Консоль Google Play> Управление выпуском> Подписание приложения> Сертификат подписи приложения".

person Павел Карпычев    schedule 11.01.2019

У меня тоже была эта проблема. Сообщение об ошибке не очень информативно. Команда Google Pay должна внести ваше приложение в белый список. Вам необходимо связаться с ними по адресу https://support.google.com/pay/merchants/contact/interest и укажите следующее:

  • Идентификатор эмитента (находится на странице вашего торгового счета)
  • Имя пакета приложения (находится в вашем AndroidManifest.xml в родительском элементе манифеста com.companyname.appname)
  • Отпечаток SHA1 (его можно найти, следуя инструкциям, изложенным здесь: https://developers.google.com/pay/passes/guides/get-started/basic-setup/native-android-sdk)

Итак, я, наконец, заставил это работать, в торговом центре под общей областью я изменил поле статуса с ЧЕРНОВИК на UNDER_REVIEW. Он сразу изменился на одобренный, и я смог сохранить карту лояльности.

Снимок экрана статуса

person Stevenr12    schedule 14.12.2018
comment
рад, что кто-то уже разместил здесь! какие-нибудь обновления по этому поводу? вся документация обновлена, образцы кода устарели! - person LOG_TAG; 17.12.2018
comment
Привет, @ Stevenr12. Спасибо за ваш ответ. Текущее приложение отсутствует в белом списке (ведется обсуждение с Google). Остальные были сделаны. - person Alex Nuts; 18.12.2018
comment
@LOG_TAG и Alex Nuts: Посмотрите правки, у меня все заработало, обновив статус в торговом центре. - person Stevenr12; 21.12.2018
comment
@ Stevenr12 .setId (ISSUER_ID +. + OFFER_OBJECT_ID) .setClassId (ISSUER_ID +. + OFFER_CLASS_ID) не могли бы вы уточнить, что OFFER_OBJECT_ID и OFFER_CLASS_ID одинаковы? github.com/google-pay/s2gp-quickstart-android/blob/master/app/! как вы создаете объект Layality? - person LOG_TAG; 23.12.2018
comment
'.setClassId (2951238800106304306.OfferClassMonster3) .setId (2951238800106304306.OfferTestObject1)', где мы получаем OfferTestObject1 - это случайное число? просто как примерный ключ в БД? - person LOG_TAG; 23.12.2018
comment
@LOG_TAG Из документации: Уникальный идентификатор объекта. Этот идентификатор должен быть уникальным для всех объектов эмитента. Это значение должно соответствовать формату идентификатора эмитента ID.identifier, где первый выдается Google, а второй выбирается вами. Уникальный идентификатор должен включать только буквенно-цифровые символы, «.», «_» Или «-». developers.google.com/pay/passes/reference/v1/loyaltyobject В вашем примере кода OfferTestObject1 не будет уникальным значением. Также будьте осторожны при публикации своего идентификатора эмитента. - person Stevenr12; 27.12.2018