Як інтегрувати сервіс Google Pay у свій додаток для Android і навіщо це потрібно

Google Pay for Android app

Донедавна впровадження методу оплати у програмне забезпечення вашого бізнесу було справою ваших клієнтів’ зручність і важливий фактор успіху в електронній комерції. Сьогодні, в умовах пандемії COVID-19, безконтактні платежі також стали важливим аспектом безпеки як для покупців, так і для продавців.

Якщо говорити про мобільні додатки для бізнесу, то, за статистикою, ви можете втратити до 80% клієнтів лише через те, що платіжний сервіс незручний або ненадійний. Подумайте про всі ці спроби ввести всі дані за допомогою сенсорного екрану - не кажучи вже про численні зміни і страх витоку даних. У цій ситуації інтеграція платіжного шлюзу Google Pay є безпрограшним рішенням для всіх сторін. Окрім безконтактних платежів за допомогою телефонів Android та носимих пристроїв, GPAY гарантує безпечні онлайн-платежі з швидким та безпечним оформленням замовлення в додатках та на веб-сайтах. Хоча інтегрувати Google Pay в додаток для Android дуже просто, це рішення є потужним і відкриває доступ до сотень карток, збережених в обліковому записі Google, і відкриває вашому бізнесу більше можливостей. Що важливо, воно безкоштовне як для підприємців, так і для клієнтів.

Переваги Google Pay для бізнесу

Google Pay (раніше відомий як Android Pay) дозволяє здійснювати мобільні платежі у два кроки. Користувачі, зареєстровані в Google, коли справа доходить до оплати, натискають кнопку "Купити з GPAY", обирають одну зі своїх платіжних карток і відправляють замовлення. Прив'язавши спосіб доставки один раз, вони позбавляються від необхідності вводити ті самі контактні дані знову і знову. Не дивно, що такий простий спосіб оплати користується великою популярністю серед користувачів: станом на вересень 2018 року додаток Google Pay завантажили вже понад 100 мільйонів разів. Які ж переваги для бізнесу? AirBnB, наприклад, задекларував збільшення кількості онлайн-платежів в 11 разів після інтеграції сервісу. Google не стягує плату за використання GPAY, тому все, що ви отримуєте від інтеграції - це зростання конверсії та доходу. Підіб'ємо підсумки:

  • G-Pay безкоштовний,
  • його легко інтегрувати,
  • відкриває доступ до сотень карток,
  • Це стрімко збільшує ваші конверсії,
  • і збільшує ваш дохід.

Будь-яке програмне рішення для електронної комерції, що займається роздрібною торгівлею або наданням послуг, може отримати значну вигоду від впровадження Google Pay в додатки для Android, що пропонуються користувачам.

Google Pay доступний для всіх постачальників товарів і послуг у країнах, де підтримується сервіс. Впровадження Google Pay в Android - це ідеальний спосіб з'єднати користувача з кількома десятками платіжних систем по всьому світу через уніфікований інтерфейс. Воно легко інтегрується в додаток для Android.

Як? Читайте далі, щоб дізнатися більше.

Інтеграція Google Pay

Імпорт бібліотеки послуг GPAY

Перше, що вам потрібно зробити для інтеграції Google Pay у програму Android, це імпортувати бібліотеку. У файлі проекту gradle вам потрібно додати залежність: реалізація ’com.google.android.gms:play-services-wallet:$play_service_wallet_version’, де $play_service_wallet_version — це версія бібліотеки, яку ми будемо використовувати.

Поточна версія 18.0.0. Більш детальну інструкцію щодо бібліотечних даних та інформацію про бібліотеки Google Pay Services можна знайти тут.

Ініціалізація платіжного клієнта

Припустимо, що продукт або послуга вже сформовані, і все готово для того, щоб вони перейшли у вашу власність. Нам ще потрібно налагодити сам процес покупки. Для цього ініціалізуємо платіжний клієнт:

private lateinit var mPaymentsClient: PaymentsClient
 
private lateinit var mPaymentsClient: PaymentsClient
 
mPaymentsClient = GooglePayUtil.createPaymentsClient(this)
 
fun createPaymentsClient(activity: Activity): PaymentsClient {
val walletOptions = Wallet.WalletOptions.Builder()
.setEnvironment(PAYMENTS_ENVIRONMENT)
.build()
return Wallet.getPaymentsClient(activity, walletOptions)
}
For PAYMENTS_ENVIRONMENT, we will specify the environment type WalletConstants.ENVIRONMENT_TEST.

Перевірити можливість покупки

Далі пропоную спочатку перевірити можливість здійснення покупок через Google Pay:

GooglePayUtil.isReadyToPay(mPaymentsClient).addOnCompleteListener { task ->
try {
setGooglePayButtonAvailable(task.getResult(ApiException::class.java))
} catch (exception: ApiException) {
mGooglePayStatusText.text = "Payment status: Error init"
Log.d("isReadyToPay failed", exception.statusCode.toString())
}
}
 
 
fun isReadyToPay(client: PaymentsClient): Task<Boolean> {
val request = IsReadyToPayRequest.newBuilder()
for (allowedMethod in SUPPORTED_METHODS) {
request.addAllowedPaymentMethod(allowedMethod)
}
return client.isReadyToPay(request.build())
}

Відобразити або приховати кнопку

Залежно від результату нам потрібно або відобразити, або приховати кнопку:

private fun setGooglePayButtonAvailable(available: Boolean) {
if (available) {
mGooglePayStatusText.text = "Payment status: Supported"
mGooglePayButton.visibility = View.VISIBLE
} else {
mGooglePayStatusText.text = "Payment status: Not supported"
}
}

Вкажіть способи оплати

Способи оплати уточнюються заздалегідь:

private val SUPPORTED_METHODS = Arrays.asList(
WalletConstants.PAYMENT_METHOD_CARD,
WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD
)

Google Pay у програмі Android: подальші кроки інтеграції

Ми пройшли всі підготовчі етапи, пов'язані з використанням наших платіжних систем. Тепер ми підійшли до найскладнішого етапу – здійснення платежу:

mGooglePayButton.setOnClickListener{
   requestPayment()
}

Важливе зауваження: більшість платіжних систем використовують мінімально можливу вартість валюти. Отже, у випадку з копійкою чи копійкою, наприклад, вказуючи суму списання 17852, ми підтверджуємо, що хочемо списати 178,52.

Тип валюти:

private fun requestPayment() {
   mGooglePayButton.isClickable = false
 
   val price = GooglePayUtil.microsToString(17852)
   val transaction = GooglePayUtil.createTransaction(price)
   val request = GooglePayUtil.createPaymentDataRequest(transaction)
   val futurePaymentData = mPaymentsClient.loadPaymentData(request)
 
   AutoResolveHelper.resolveTask(futurePaymentData, this, LOAD_PAYMENT_DATA_REQUEST_CODE)
}

Далі підготуйте транзакцію. Не забудьте вказати тип валюти:

fun createTransaction(price: String): TransactionInfo {
   return TransactionInfo.newBuilder()
       .setTotalPriceStatus(WalletConstants.TOTAL_PRICE_STATUS_FINAL)
       .setTotalPrice(price)
       .setCurrencyCode("USD")
       .build()
}

Сформуйте заявку. Відразу додайте специфікації для продавця та посилання на сайт:

fun createPaymentDataRequest(transactionInfo: TransactionInfo): PaymentDataRequest {
   val paramsBuilder = PaymentMethodTokenizationParameters.newBuilder()
       .setPaymentMethodTokenizationType(
           WalletConstants.PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY
       )
       .addParameter("gateway", “http://www.example.com”)
       .addParameter("gatewayMerchantId", "Example Merchant Name")
   return createPaymentDataRequest(transactionInfo, paramsBuilder.build())
}

Далі сам запит. Тут вкажіть усі необхідні поля та параметри оформлення. Наприклад, ми можемо вказати, чи потрібно нам запитувати номер телефону, електронну пошту та чи потрібна нам взагалі можливість доставки. Тут і зараз ми також вказуємо країни доставки товару, способи оплати та платіжні системи (VISA, MASTERCARD):

private fun createPaymentDataRequest(
   transactionInfo: TransactionInfo,
   params: PaymentMethodTokenizationParameters
): PaymentDataRequest {
 
   return PaymentDataRequest.newBuilder()
       .setPhoneNumberRequired(false)
       .setEmailRequired(true)
       .setShippingAddressRequired(true)
       .setShippingAddressRequirements(
           ShippingAddressRequirements.newBuilder()
               .addAllowedCountryCodes(SHIPPING_SUPPORTED_COUNTRIES)
               .build()
       )
       .setTransactionInfo(transactionInfo)
       .addAllowedPaymentMethods(SUPPORTED_METHODS)
       .setCardRequirements(
           CardRequirements.newBuilder()
               .addAllowedCardNetworks(SUPPORTED_NETWORKS)
               .setAllowPrepaidCards(true)
               .setBillingAddressFormat(WalletConstants.BILLING_ADDRESS_FORMAT_FULL)
               .build()
       )
       .setPaymentMethodTokenizationParameters(params)
       .setUiRequired(true)
       .build()
}
 
private val SHIPPING_SUPPORTED_COUNTRIES = Arrays.asList("UA, US, DE, GB")
 
private val SUPPORTED_NETWORKS = Arrays.asList(
   WalletConstants.CARD_NETWORK_VISA,
   WalletConstants.CARD_NETWORK_MASTERCARD
)

Отже, запит сформований. Далі нам потрібно обробити результат цього запиту:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
   when (requestCode) {
       LOAD_PAYMENT_DATA_REQUEST_CODE -> {
           when (resultCode) {
               Activity.RESULT_OK -> {
                   data?.let {
                       onPaymentSuccess(PaymentData.getFromIntent(data))
                   }
               }
               Activity.RESULT_CANCELED -> {
               }
               AutoResolveHelper.RESULT_ERROR -> {
                   onError(AutoResolveHelper.getStatusFromIntent(data)?.statusCode)
               }
           }
           mGooglePayButton.isClickable = true
       }
   }
}

Потім йде обробка транзакції. Тут можна додати багато різної логіки, включаючи зміщення екрану, вітання лише сервісних даних, але в нашій версії ми просто перевіримо результат і покажемо його. Це всього лише пробна версія, тому не будемо заглиблюватися в бізнес-логіку:

private fun onPaymentSuccess(paymentData: PaymentData?) {
     Toast.makeText(this, “Payment Success”, Toast.LENGTH_LONG).show()
}
 
private fun onError(statusCode: Int?) {
   Log.w("loadPaymentData failed", String.format("Error code: %d", statusCode))
}

Результат інтеграції Google Pay на Android:Що бачить користувач

В результаті користувачі на етапі оформлення замовлення бачитимуть кнопку Google Pay:

Google Pay button

Після натискання вони побачать форму оформлення замовлення:

google pay checkout form

Оновлення Google Pay 2024

Час летить, і щоб цей невеликий посібник з інтеграції Google Pay для Android був актуальним, ми вирішили його оновити. Google вже створив чудовий посібник, а я лише спробую пояснити деякі моменти з практичної точки зору.

Версії бібліотек

По-перше, з часом версії бібліотеки платіжних плагінів були оновлені.

com.google.android.gms:play-services-wallet:$play_service_wallet_version

Поточна версія бібліотеки - 19.3.0. Зміни в основному торкнулися протоколів безпеки та взаємодії з банками.

Платіжні провайдери

Актуальний список банків і платіжних систем, які працюють з Google Pay, можна знайти тут. Платежі можуть бути здійснені тільки через перерахованих платіжних провайдерів. До речі, список досить великий і найпопулярніші платіжні системи також підтримують платежі GPAY. Тут можна знайти глобальні платіжні системи, такі як BrainTree, Stripe, Square. Також є кілька варіантів для українського ринків: LiqPay, Portmone, WayForPay, iPay.

Відображення

Щоб вміти користуватися платіжками, варто також вивчити інструкції з оформлення. Цілком можливо, що під час перевірки ви отримаєте заблокований платіж до того, як всі проблеми будуть усунені. Всі вимоги гайдів тут, вони не складні і більш ніж логічні.

Використання

Перший крок до успішних платежів - це реєстрація вашого бізнесу в консолі.

Далі потрібно налаштувати сам платіжний клієнт. Для цього потрібно сформувати хоча б базовий запит, де буде вказана мінімальна версія API оплати. Ця частина повинна використовуватися під час кожного запиту.

private val baseRequest = JSONObject().apply {
	put("apiVersion", 2)
	put("apiVersionMinor", 0)
	}

Ми одразу формуємо запит на токенізацію вашого провайдера.

private fun gatewayTokenizationSpecification(): JSONObject {
	return JSONObject().apply {
	put("type", "PAYMENT_GATEWAY")
	put("parameters", JSONObject(mapOf(
	"gateway" to "example",
	"gatewayMerchantId" to "exampleGatewayMerchantId")))
	}
}

Далі ми вказуємо, з якими типами карток ми будемо працювати та можливі варіанти автентифікації.

private val allowedCardNetworks = JSONArray(listOf(
	"AMEX",
	"DISCOVER",
	"INTERAC",
	"JCB",
	"MASTERCARD",
	"VISA"))
 
private val allowedCardAuthMethods = JSONArray(listOf(
	"PAN_ONLY",
	"CRYPTOGRAM_3DS"))

Що стосується авторизації, то є можливість вказати просто PAN_ONLY, що дозволить вам використовувати GPAY тільки з тими картками, які вже прив'язані до вашого облікового запису. Далі немає нічого складного. Залишається лише створити клієнт для оплати (PaymentClient), перевірити можливість оплати за допомогою GPAY і вивести кнопку так, як це було описано вище. Всі приклади коду наведені на GitHub, де ви можете знайти майже повний зразок від самого Google.

Наш досвід

Поговоримо трохи про сумне. Виходячи з нашого досвіду, багато компаній, яким потрібно розробити мобільний додаток, вже мають свій потік роботи з грошима. Тобто компанії мають відкриті банківські рахунки та налагоджені системи звітності, тож навіщо їм все це? У таких випадках від бізнесу часто вимагають використовувати локальні платіжні провайдери без відкриття додаткових рахунків та реєстрації компаній у консолях. Це було б добре, але реалізувати це в нативному середовищі практично неможливо. Більшість локальних платіжних систем, з якими ми мали справу, просто не мали робочого SDK, або мали його жахливо застарілим. Вихід може бути дуже простим.

Незважаючи на відсутність власного SDK, ви завжди можете використовувати веб-плагіни для платежів. Можливо, це виглядає не дуже красиво, але це працює! У більшості випадків ми формуємо сторінку з готовим платіжним плагіном від банку, в якому обслуговується клієнт, і виводимо її на вбудовану сторінку браузера. Слід також зазначити, що використання звичайного WebView не підійде. До недавнього часу можна було створити простий WebClient, де можна було написати логіку редиректів, і таким чином можна було обробляти зворотні дзвінки від платіжної системи, тим самим реалізуючи подальшу логіку додатку.

Однак, останнім часом від цього відмовилися через низький рівень безпеки. Хоча більшість банківських віджетів не зазнають жодних змін у роботі, Google Pay не запуститься. Кнопка на віджеті з'явиться і навіть буде доступна для натискання, але після натискання нічого не відбудеться.

Поточна реалізація - це використання CustomTabs. Так само потрібно генерувати URL для веб-плагіна, але обробка веб-клієнта не повинна бути ручною, а віддана на відкуп процесору хром-рушія.

Мінуси очевидні: ми не можемо впливати на те, що відбувається всередині. Ми більше не можемо обробляти редиректи і продовжувати основний потік додатку після оплати. При такій реалізації потрібно довіряти користувачеві і запитувати статус оплати замовлення у сервера.

Підіб'ємо підсумки

Google Pay - це зручний та безпечний платіжний сервіс для мобільного додатку з можливістю інтеграції численних платіжних систем. Це полегшує покупки для клієнтів і збільшує онлайн-продажі для продавців. За допомогою описаного вище алгоритму ви легко додасте Google Pay в Android-додаток, який розробляєте для свого бізнесу, і, крім того, тепер маєте уявлення про те, як впоратися з труднощами при його інтеграції.

Однак, якщо програмування - не ваша професійна сфера, зверніться до Stfalcon.com - і наші фахівці швидко та якісно розроблять і впровадять будь-який функціонал для вашого мобільного додатку.