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())}</boolean>

В зависимости от результата, нам необходимо показать либо же оставить спрятанной кнопку:

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 -&gt;{
           when (resultCode){
               Activity.RESULT_OK-&gt;{
                   data?.let{
                       onPaymentSuccess(PaymentData.getFromIntent(data))}}
               Activity.RESULT_CANCELED-&gt;{}
               AutoResolveHelper.RESULT_ERROR-&gt;{
                   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, и мы быстро и качественно разработаем и внедрим любой функционал для вашего мобильного приложения.