Skip to content
This repository was archived by the owner on Jul 10, 2025. It is now read-only.
This repository was archived by the owner on Jul 10, 2025. It is now read-only.

 #322

@Skl5gtrdd4

Description

@Skl5gtrdd4

/*

  • Copyright 2017 Google Inc.
  • Licensed under the Apache License, Version 2.0 (the "License");
  • you may not use this file except in compliance with the License.
  • You may obtain a copy of the License at
  • http://www.apache.org/licenses/LICENSE-2.0
    
  • Unless required by applicable law or agreed to in writing, software
  • distributed under the License is distributed on an "AS IS" BASIS,
  • WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  • See the License for the specific language governing permissions and
  • limitations under the License.
    */

package com.google.android.gms.samples.wallet

import android.app.Activity
import com.google.android.gms.wallet.PaymentsClient
import com.google.android.gms.wallet.Wallet
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
import java.math.BigDecimal
import java.math.RoundingMode

/**

  • Contains helper static methods for dealing with the Payments API.

  • Many of the parameters used in the code are optional and are set here merely to call out their

  • existence. Please consult the documentation to learn more and feel free to remove ones not

  • relevant to your implementation.
    */
    object PaymentsUtil {
    val MICROS = BigDecimal(1000000.0)

    /**

    • Create a Google Pay API base request object with properties used in all requests.
    • @return Google Pay API base request object.
    • @throws JSONException
      */
      private val baseRequest = JSONObject().apply {
      put("apiVersion", 2)
      put("apiVersionMinor", 0)
      }

    /**

    • Gateway Integration: Identify your gateway and your app's gateway merchant identifier.
    • The Google Pay API response will return an encrypted payment method capable of being charged
    • by a supported gateway after payer authorization.
    • TODO: Check with your gateway on the parameters to pass and modify them in Constants.java.
    • @return Payment data tokenization for the CARD payment method.
    • @throws JSONException
    • @see PaymentMethodTokenizationSpecification
      */
      private fun gatewayTokenizationSpecification(): JSONObject {
      return JSONObject().apply {
      put("type", "PAYMENT_GATEWAY")
      put("parameters", JSONObject(Constants.PAYMENT_GATEWAY_TOKENIZATION_PARAMETERS))
      }
      }

    /**

    • DIRECT Integration: Decrypt a response directly on your servers. This configuration has

    • additional data security requirements from Google and additional PCI DSS compliance complexity.

    • Please refer to the documentation for more information about DIRECT integration. The

    • type of integration you use depends on your payment processor.

    • @return Payment data tokenization for the CARD payment method.

    • @throws JSONException

    • @see PaymentMethodTokenizationSpecification
      */
      private fun directTokenizationSpecification(): JSONObject {
      if (Constants.DIRECT_TOKENIZATION_PUBLIC_KEY == "REPLACE_ME" ||
      (Constants.DIRECT_TOKENIZATION_PARAMETERS.isEmpty() ||
      Constants.DIRECT_TOKENIZATION_PUBLIC_KEY.isEmpty())) {

       throw RuntimeException(
               "Please edit the Constants.java file to add protocol version & public key.")
      

      }

      return JSONObject().apply {
      put("type", "DIRECT")
      put("parameters", JSONObject(Constants.DIRECT_TOKENIZATION_PARAMETERS))
      }
      }

    /**

    • Card networks supported by your app and your gateway.
    • TODO: Confirm card networks supported by your app and gateway & update in Constants.java.
    • @return Allowed card networks
    • @see CardParameters
      */
      private val allowedCardNetworks = JSONArray(Constants.SUPPORTED_NETWORKS)

    /**

    • Card authentication methods supported by your app and your gateway.
    • TODO: Confirm your processor supports Android device tokens on your supported card networks
    • and make updates in Constants.java.
    • @return Allowed card authentication methods.
    • @see CardParameters
      */
      private val allowedCardAuthMethods = JSONArray(Constants.SUPPORTED_METHODS)

    /**

    • Describe your app's support for the CARD payment method.

    • The provided properties are applicable to both an IsReadyToPayRequest and a

    • PaymentDataRequest.

    • @return A CARD PaymentMethod object describing accepted cards.

    • @throws JSONException

    • @see PaymentMethod
      */
      // Optionally, you can add billing address/phone number associated with a CARD payment method.
      private fun baseCardPaymentMethod(): JSONObject {
      return JSONObject().apply {

       val parameters = JSONObject().apply {
           put("allowedAuthMethods", allowedCardAuthMethods)
           put("allowedCardNetworks", allowedCardNetworks)
           put("billingAddressRequired", true)
           put("billingAddressParameters", JSONObject().apply {
               put("format", "FULL")
           })
       }
      
       put("type", "CARD")
       put("parameters", parameters)
      

      }
      }

    /**

    • Describe the expected returned payment data for the CARD payment method

    • @return A CARD PaymentMethod describing accepted cards and optional fields.

    • @throws JSONException

    • @see PaymentMethod
      */
      private fun cardPaymentMethod(): JSONObject {
      val cardPaymentMethod = baseCardPaymentMethod()
      cardPaymentMethod.put("tokenizationSpecification", gatewayTokenizationSpecification())

      return cardPaymentMethod
      }

    /**

    • An object describing accepted forms of payment by your app, used to determine a viewer's

    • readiness to pay.

    • @return API version and payment methods supported by the app.

    • @see IsReadyToPayRequest
      */
      fun isReadyToPayRequest(): JSONObject? {
      return try {
      val isReadyToPayRequest = JSONObject(baseRequest.toString())
      isReadyToPayRequest.put(
      "allowedPaymentMethods", JSONArray().put(baseCardPaymentMethod()))

       isReadyToPayRequest
      

      } catch (e: JSONException) {
      null
      }
      }

    /**

    • Information about the merchant requesting payment information
    • @return Information about the merchant.
    • @throws JSONException
    • @see MerchantInfo
      */
      private val merchantInfo: JSONObject
      @throws(JSONException::class)
      get() = JSONObject().put("merchantName", "Example Merchant")

    /**

    • Creates an instance of [PaymentsClient] for use in an [Activity] using the

    • environment and theme set in [Constants].

    • @param activity is the caller's activity.
      */
      fun createPaymentsClient(activity: Activity): PaymentsClient {
      val walletOptions = Wallet.WalletOptions.Builder()
      .setEnvironment(Constants.PAYMENTS_ENVIRONMENT)
      .build()

      return Wallet.getPaymentsClient(activity, walletOptions)
      }

    /**

    • Provide Google Pay API with a payment amount, currency, and amount status.
    • @return information about the requested payment.
    • @throws JSONException
    • @see TransactionInfo
      */
      @throws(JSONException::class)
      private fun getTransactionInfo(price: String): JSONObject {
      return JSONObject().apply {
      put("totalPrice", price)
      put("totalPriceStatus", "FINAL")
      put("countryCode", Constants.COUNTRY_CODE)
      put("currencyCode", Constants.CURRENCY_CODE)
      }
      }

    /**

    • An object describing information requested in a Google Pay payment sheet

    • @return Payment data expected by your app.

    • @see PaymentDataRequest
      */
      fun getPaymentDataRequest(price: String): JSONObject? {
      try {
      return JSONObject(baseRequest.toString()).apply {
      put("allowedPaymentMethods", JSONArray().put(cardPaymentMethod()))
      put("transactionInfo", getTransactionInfo(price))
      put("merchantInfo", merchantInfo)

           // An optional shipping address requirement is a top-level property of the
           // PaymentDataRequest JSON object.
           val shippingAddressParameters = JSONObject().apply {
               put("phoneNumberRequired", false)
               put("allowedCountryCodes", JSONArray(Constants.SHIPPING_SUPPORTED_COUNTRIES))
           }
           put("shippingAddressRequired", true)
           put("shippingAddressParameters", shippingAddressParameters)
       }
      

      } catch (e: JSONException) {
      return null
      }

    }
    }

/**

  • Converts micros to a string format accepted by [PaymentsUtil.getPaymentDataRequest].
  • @param micros value of the price.
    */
    fun Long.microsToString() = BigDecimal(this)
    .divide(PaymentsUtil.MICROS)
    .setScale(2, RoundingMode.HALF_EVEN)
    .toString()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions