Как и зачем интегрировать платежный сервис Google Pay в Android-приложение для коммерции

Google Pay для Android-приложения

Важное условие успеха в электронной коммерции — правильный выбор способа оплаты, предлагаемый клиенту. Если говорить о мобильных приложениях, то, по статистике, на этапе оплаты покупки вы можете терять до 80% клиентов лишь потому, что способ оплаты неудобен и не вызывает доверия. Чего стоят одни попытки правильно ввести свои данные при помощи тачскрин — не говоря уже о необходимости совершить множество переходов и страхе утечки данных. Удобным для всех решением в этой ситуации является интеграция в приложение сервиса Google Pay.

Бизнес-преимущества Google Pay

Google Pay (известный ранее как Android Pay) позволяет оплачивать покупки в мобильном приложении всего в два действия. Пользователь, зарегистрированный в Google, на этапе оплаты нажимает на кнопку "оплатить через Google", выбирает одну из своих платежных карт и нажимает кнопку подтверждения. А привязав к аккаунту способ доставки, он еще и избавляется от необходимости каждый раз вводить одни и те же контактные данные.

Не удивительно, что такой простой способ оплаты очень популярен среди пользователей: на сентябрь 2018 г. приложение Google Pay было скачано 100 млн. раз. Насколько это выгодно для бизнеса? AirBnB после интеграции сервиса отметила, что рост объема онлайн-платежей увеличился в 11 раз. Google не взимает за пользование сервисом оплату, так что все, что вы получаете от интеграции — это рост конверсий и прибыли.

Google Pay доступен для всех поставщиков товаров и услуг в странах, где поддерживается сервис. Это прекрасный способ связать при помощи единого интерфейса пользователя приложения с несколькими десятками платежных систем по всему миру. Его легко интегрировать в Android приложения. Как именно — читайте дальше.

Подключение Google Pay

Первое, что нам необходимо сделать, это подключить библиотеку. В gradle файле проекта необходимо добавить зависимость: implementation 'com.google.android.gms:play-services-wallet:$play_service_wallet_version' где $play_service_wallet_version — это версия библиотеки, которую мы будем использовать. Сейчас актуальная версия — 16.0.0. Более детальную инструкцию, как подключить библиотеку, и информацию, какие библиотеки Google Play Services вообще есть, можно посмотреть тут.

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

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)
}

В качестве PAYMENTS_ENVIRONMENT мы укажем тип окружения 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", “https://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:

Кнопка Google Pay

После нажатия будет вызвана форма оформления заказа:

Google Pay оформление заказа

Подведем итог

Google Pay - удобный и безопасный сервис оплаты через приложение с возможностью интеграции большого количества платежных систем. Он облегчает процесс покупки для клиентов, а продавцам это позволяет увеличить объемы онлайн-платежей. Воспользовавшись приведенным выше алгоритмом действий, вы легко сможете интегрировать сервис Google Pay в ваше Android-приложение.

Если же программирование не является вашей профессиональной сферой - обращайтесь к специалистам Stfalcon.com, и мы быстро и качественно разработаем и внедрим любой функционал для вашего мобильного приложения.