অ্যান্ড্রয়েডে জেটপ্যাক কম্পোজের জন্য গুগল পে এপিআই

1. ভূমিকা

তুমি কী তৈরি করবে

এই কোডল্যাবটি সম্পন্ন হওয়ার পর, আপনার কাছে অ্যান্ড্রয়েডের জন্য একটি কার্যকর গুগল পে ইন্টিগ্রেশন সহ একটি ন্যূনতম কার্যকর জেটপ্যাক কম্পোজ অ্যাপ থাকবে। এই প্রকল্পটি একটি পেমেন্ট টোকেন পুনরুদ্ধার করে যা প্রক্রিয়াকরণের জন্য একটি পেমেন্ট পরিষেবা প্রদানকারীর কাছে পাঠানো যেতে পারে।

তুমি কি শিখবে

  • গুগল পে জেটপ্যাক কম্পোজ লাইব্রেরি কীভাবে ইনস্টল এবং কনফিগার করবেন
  • গুগল পে বোতামটি কীভাবে প্রদর্শন করবেন এবং ক্লিকগুলি কীভাবে পরিচালনা করবেন
  • গুগল পে থেকে কীভাবে পেমেন্ট টোকেনের অনুরোধ করবেন

তোমার যা লাগবে

  • অ্যান্ড্রয়েড স্টুডিও (সর্বশেষ স্থিতিশীল) ইনস্টল করা হয়েছে।
  • অ্যান্ড্রয়েড স্টুডিওতে সেট আপ করা অ্যান্ড্রয়েড এসডিকে এবং একটি এমুলেটর বা ডিভাইস।
  • উৎপাদনের জন্য, আপনার একটি Google Pay merchantId প্রয়োজন হবে। Google Pay & Wallet Console- এ নিবন্ধন করতে মাত্র এক মিনিট সময় লাগে, তাই এখনই এটির যত্ন নেওয়া উচিত।

২. জেটপ্যাক কম্পোজ প্রকল্প তৈরি করুন

প্রকল্প ফাইল তৈরি করুন

  1. অ্যান্ড্রয়েড স্টুডিওতে gpay-compose নামে একটি নতুন Jetpack Compose প্রকল্প তৈরি করুন:
    • অ্যান্ড্রয়েড স্টুডিও খুলুন এবং New Project নির্বাচন করুন।
    • Empty Activity (Jetpack Compose) টেমপ্লেটটি বেছে নিন।
    • নাম: gpay-compose , প্যাকেজের নাম: com.example.gpay
    • ভাষা: কোটলিন, সর্বনিম্ন SDK: API 21+।
    • প্রকল্পটি তৈরি করতে শেষ করুন।
  2. Google Pay Compose বোতাম নির্ভরতা যোগ করুন। আপনার app/build.gradle(.kts) ফাইলে, যোগ করুন:
    dependencies {
        implementation("com.google.pay.button:compose-pay-button:1.0.0")
    }
    
    গ্রুভি ডিএসএল:
    dependencies {
        implementation 'com.google.pay.button:compose-pay-button:1.0.0'
    }
    
  3. গুগল প্লে সার্ভিসেস ওয়ালেট নির্ভরতা যোগ করুন (গুগল পে শিট খুলতে): আপনার app/build.gradle(.kts) ফাইলে, নিম্নলিখিত নির্ভরতা যোগ করুন:
    dependencies {
        implementation("com.google.android.gms:play-services-wallet:19.3.0")
    }
    
    যদি আপনার প্রকল্পটি গ্রুভি ডিএসএল ব্যবহার করে, তাহলে ব্যবহার করুন:
    dependencies {
        implementation 'com.google.android.gms:play-services-wallet:19.3.0'
    }
    
  4. অ্যান্ড্রয়েড স্টুডিওতে MainActivity.kt খুলুন এবং নিম্নলিখিত ন্যূনতম কম্পোজ অ্যাপ স্ক্যাফোল্ড দিয়ে বিষয়বস্তু প্রতিস্থাপন করুন (আমরা পরবর্তী বোতামটি সংযুক্ত করব):
    package com.example.gpay
    
    import android.os.Bundle
    import androidx.activity.ComponentActivity
    import androidx.activity.compose.setContent
    import androidx.compose.foundation.layout.Box
    import androidx.compose.foundation.layout.fillMaxSize
    import androidx.compose.material3.MaterialTheme
    import androidx.compose.material3.Surface
    import androidx.compose.ui.Alignment
    import androidx.compose.ui.Modifier
    
    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContent {
                Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
                    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                        // Google Pay button added in the next section
                    }
                }
            }
        }
    }
    

৩. গুগল পে কনফিগার করুন

Google Pay পেমেন্ট অনুরোধের জন্য একটি অনুরোধ বস্তুর প্রয়োজন। এখানে baseGooglePayRequest হিসাবে সংজ্ঞায়িত বস্তুটিতে সমস্ত অনুরোধের জন্য ন্যূনতম সাধারণ সেটিংস রয়েছে। অনুরোধের উপর নির্ভর করে অতিরিক্ত সেটিংস যোগ করা হবে যা আমরা এই কোডল্যাবে পর্যালোচনা করব।

MainActivity.kt তে Google Pay কনফিগারেশন ধ্রুবক যোগ করুন (পরবর্তী ধাপে আপনি এগুলি পুনরায় ব্যবহার করবেন):

private const val merchantId = "12345678901234567890"

// This is the base configuration for all Google Pay payment data requests.
private val baseGooglePayRequest = """
    {
      "apiVersion": 2,
      "apiVersionMinor": 0,
      "allowedPaymentMethods": [
        {
          "type": "CARD",
          "parameters": {
            "allowedAuthMethods": [
              "PAN_ONLY", "CRYPTOGRAM_3DS"
            ],
            "allowedCardNetworks": [
              "AMEX", "DISCOVER", "INTERAC", "JCB", "MASTERCARD", "VISA"
            ]
          },
          "tokenizationSpecification": {
            "type": "PAYMENT_GATEWAY",
            "parameters": {
              "gateway": "example",
              "gatewayMerchantId": "exampleGatewayMerchantId"
            }
          }
        }
      ],
      "merchantInfo": {
        "merchantId": "$merchantId"
      }
    }
""".trimIndent()

রিসোর্স

  • API রেফারেন্স : Google Pay API অনুরোধের অবজেক্ট ডকুমেন্টেশন
  • API রেফারেন্স : অনুমোদিত অনুমোদন পদ্ধতি, অনুমোদিত কার্ড নেটওয়ার্ক এবং সঠিক গেটওয়ে মান সহ টোকেনাইজেশন স্পেসিফিকেশন সম্পর্কে আরও তথ্যের জন্য PaymentMethod দেখুন।

৪. গুগল পে বোতামটি যোগ করুন

একটি নেটিভ Google Pay বোতাম রেন্ডার করতে Compose Pay বোতাম ব্যবহার করুন এবং Google Pay শীট খুলতে Wallet API ব্যবহার করুন।

MainActivity.kt এর সম্পূর্ণ বিষয়বস্তু নিম্নলিখিত সম্পূর্ণ উদাহরণ দিয়ে প্রতিস্থাপন করুন (কনফিগারেশন + বোতাম + পেমেন্ট প্রবাহ সহ):

package com.example.gpay

import android.os.Bundle
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import com.google.android.gms.common.api.CommonStatusCodes
import com.google.android.gms.tasks.Task
import com.google.android.gms.wallet.contract.TaskResultContracts.GetPaymentDataResult
import com.google.android.gms.wallet.*
import com.google.pay.button.ButtonTheme
import com.google.pay.button.ButtonType
import com.google.pay.button.PayButton
import org.json.JSONObject

private const val merchantId = "12345678901234567890"

// Base Google Pay request used for both the button and the Wallet request
private val baseGooglePayRequest = """
    {
      "apiVersion": 2,
      "apiVersionMinor": 0,
      "allowedPaymentMethods": [
        {
          "type": "CARD",
          "parameters": {
            "allowedAuthMethods": [
              "PAN_ONLY", "CRYPTOGRAM_3DS"
            ],
            "allowedCardNetworks": [
              "AMEX", "DISCOVER", "INTERAC", "JCB", "MASTERCARD", "VISA"
            ]
          },
          "tokenizationSpecification": {
            "type": "PAYMENT_GATEWAY",
            "parameters": {
              "gateway": "example",
              "gatewayMerchantId": "exampleGatewayMerchantId"
            }
          }
        }
      ],
      "merchantInfo": {
        "merchantId": "$merchantId"
      }
    }
""".trimIndent()

class MainActivity : ComponentActivity() {
  private val paymentDataLauncher = registerForActivityResult(GetPaymentDataResult()) { taskResult ->
    when (taskResult.status.statusCode) {
      CommonStatusCodes.SUCCESS -> {
        handlePaymentData(taskResult.result!!)
      }
      //CommonStatusCodes.CANCELED -> The user canceled
      //CommonStatusCodes.DEVELOPER_ERROR -> The API returned an error (it.status: Status)
      //else -> Handle internal and other unexpected errors
    }
  }
  private lateinit var paymentsClient: PaymentsClient

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Create the PaymentsClient
    paymentsClient = Wallet.getPaymentsClient(
      this,
      Wallet.WalletOptions.Builder()
        .setEnvironment(WalletConstants.ENVIRONMENT_TEST) // Switch to PRODUCTION when ready
        .build()
    )

    // Derive allowedPaymentMethods for the button from baseGooglePayRequest
    val allowedPaymentMethods = JSONObject(baseGooglePayRequest)
      .getJSONArray("allowedPaymentMethods")
      .toString()

    setContent {
      Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        PayButton(
          onClick = { requestPayment(paymentDataLauncher) },
          allowedPaymentMethods = allowedPaymentMethods,
          type = ButtonType.Pay,
          theme = ButtonTheme.Light
        )
      }
    }
  }

  private fun requestPayment(launcher: ActivityResultLauncher<Task<PaymentData>>) {
    // Build a PaymentDataRequest from the base request by adding transaction info
    val requestJson = JSONObject(baseGooglePayRequest).apply {
      put("transactionInfo", JSONObject().apply {
        put("totalPrice", "14.95")
        put("totalPriceStatus", "FINAL")
        put("countryCode", "US")
        put("currencyCode", "USD")
      })
    }
    val request = PaymentDataRequest.fromJson(requestJson.toString())
    val task = paymentsClient.loadPaymentData(request)
    task.addOnCompleteListener(paymentDataLauncher::launch)
  }

  private fun handlePaymentData(paymentData: PaymentData?) {
    val json = paymentData?.toJson() ?: return
    val paymentMethodData = JSONObject(json).getJSONObject("paymentMethodData")
    val tokenizationData = paymentMethodData.getJSONObject("tokenizationData")
    val token = tokenizationData.getString("token")
    // Send 'token' to your payment service provider (PSP)
    println("Payment token: $token")
  }
}

৫. পেমেন্টের অনুরোধ করুন

যখন Google Pay বোতামটি চাপা হয়, তখন requestPayment(...) আপনার baseGooglePayRequesttransactionInfo যোগ করে একটি PaymentDataRequest তৈরি করে, Google Pay শিটটি খোলে এবং একটি পেমেন্ট টোকেন ফেরত দেয়।

গুরুত্বপূর্ণ বিষয়সমূহ

  • বোতাম: PayButton নেটিভ Google Pay বোতামটি রেন্ডার করে।
  • ক্লায়েন্ট: PaymentsClient TEST অথবা PRODUCTION দিয়ে কনফিগার করা আছে।
  • চালু করুন: loadPaymentData ব্যবহার করুন এবং প্রয়োজনে IntentSender দিয়ে সমাধান করুন।
  • টোকেন: PaymentData.toJson() পার্স করে paymentMethodData.tokenizationData.token বের করে আপনার PSP-তে পাঠান।

৬. উপসংহার

এই কোডল্যাবটি সম্পূর্ণ করার জন্য অভিনন্দন! আপনি অ্যান্ড্রয়েডের জন্য একটি জেটপ্যাক কম্পোজ অ্যাপে গুগল পে এপিআই কীভাবে সংহত করবেন তা শিখেছেন।

প্রকল্পটি চালান

আপনার অ্যাপটি শুরু করতে অ্যান্ড্রয়েড স্টুডিও ( Run > Run 'app' ) থেকে প্রকল্পটি চালান।

এখান থেকে কোথায় যাবেন

অতিরিক্ত সম্পদ