১. ভূমিকা
আপনি যা তৈরি করবেন
এই কোডল্যাবটি সম্পন্ন করার পর, আপনার কাছে অ্যান্ড্রয়েডের জন্য একটি কার্যকরী গুগল পে ইন্টিগ্রেশন সহ একটি ন্যূনতম কার্যকর জেটপ্যাক কম্পোজ অ্যাপ থাকবে। এই প্রজেক্টটি একটি পেমেন্ট টোকেন সংগ্রহ করে, যা প্রক্রিয়াকরণের জন্য কোনো পেমেন্ট পরিষেবা প্রদানকারীর কাছে পাঠানো যেতে পারে।
আপনি যা শিখবেন
- Google Pay Jetpack Compose লাইব্রেরি কীভাবে ইনস্টল এবং কনফিগার করবেন
- গুগল পে বাটন কীভাবে প্রদর্শন করবেন এবং ক্লিকগুলো কীভাবে সামলাবেন
- গুগল পে থেকে কীভাবে পেমেন্ট টোকেনের জন্য অনুরোধ করবেন
আপনার যা যা লাগবে
- অ্যান্ড্রয়েড স্টুডিও (সর্বশেষ স্থিতিশীল সংস্করণ) ইনস্টল করা হয়েছে।
- অ্যান্ড্রয়েড এসডিকে এবং অ্যান্ড্রয়েড স্টুডিওতে সেট আপ করা একটি এমুলেটর বা ডিভাইস।
- প্রোডাকশনের জন্য আপনার একটি Google Pay
merchantIdলাগবে। Google Pay ও ওয়ালেট কনসোলে এটি রেজিস্টার করতে মাত্র এক মিনিট সময় লাগে, তাই এখনই করে ফেলা ভালো।
২. জেটপ্যাক কম্পোজ প্রজেক্ট তৈরি করুন।
প্রজেক্ট ফাইল তৈরি করুন
- অ্যান্ড্রয়েড স্টুডিওতে
gpay-composeনামে একটি নতুন জেটপ্যাক কম্পোজ প্রজেক্ট তৈরি করুন:- অ্যান্ড্রয়েড স্টুডিও খুলুন এবং
New Projectনির্বাচন করুন। -
Empty Activity (Jetpack Compose)টেমপ্লেটটি বেছে নিন। - নাম:
gpay-compose, প্যাকেজের নাম:com.example.gpay। - ভাষা: কোটলিন, ন্যূনতম এসডিকে: এপিআই ২১+।
- প্রকল্পটি তৈরি করা শেষ করুন।
- অ্যান্ড্রয়েড স্টুডিও খুলুন এবং
- Google Pay Compose Button ডিপেন্ডেন্সিটি যোগ করুন। আপনার
app/build.gradle(.kts)ফাইলে, নিম্নলিখিতটি যোগ করুন: গ্রুভি ডিএসএল:dependencies { implementation("com.google.pay.button:compose-pay-button:1.2.0") }dependencies { implementation 'com.google.pay.button:compose-pay-button:1.2.0' } - Google Play services Wallet ডিপেন্ডেন্সি যোগ করুন (Google Pay শীট খোলার জন্য): আপনার
app/build.gradle(.kts)ফাইলে, নিম্নলিখিত ডিপেন্ডেন্সিটি যোগ করুন: আপনার প্রজেক্টে Groovy DSL ব্যবহৃত হলে, ব্যবহার করুন:dependencies { implementation("com.google.android.gms:play-services-wallet:19.5.0") }dependencies { implementation 'com.google.android.gms:play-services-wallet:19.5.0' } - Android Studio-তে
MainActivity.ktখুলুন এবং এর ভেতরের লেখাগুলো নিচের ন্যূনতম Compose অ্যাপ স্কাফোল্ড দিয়ে প্রতিস্থাপন করুন (এরপরে আমরা বাটনটি সংযুক্ত করব):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 } } } } }
৩. গুগল পে কনফিগার করুন
একটি গুগল পে পেমেন্ট অনুরোধের জন্য একটি রিকোয়েস্ট অবজেক্ট প্রয়োজন। এখানে 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()
সম্পদ
- এপিআই রেফারেন্স : গুগল পে এপিআই অনুরোধ অবজেক্টের ডকুমেন্টেশন
- এপিআই রেফারেন্স : অনুমোদিত অনুমোদন পদ্ধতি, অনুমোদিত কার্ড নেটওয়ার্ক এবং সঠিক গেটওয়ে মান সহ টোকেনাইজেশন স্পেসিফিকেশন সম্পর্কে আরও তথ্যের জন্য
PaymentMethodদেখুন।
৪. গুগল পে বাটনটি যোগ করুন
একটি নেটিভ গুগল পে বাটন রেন্ডার করতে কম্পোজ পে বাটন এবং গুগল পে শিটটি খুলতে ওয়ালেট এপিআই ব্যবহার করুন।
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(...) আপনার baseGooglePayRequest এ transactionInfo যোগ করে একটি PaymentDataRequest তৈরি করে, Google Pay শীটটি খোলে এবং একটি পেমেন্ট টোকেন ফেরত দেয়।
মূল বিষয়গুলো
- Button:
PayButtonগুগল পে-এর নিজস্ব বাটনটি প্রদর্শন করে। - ক্লায়েন্ট:
PaymentsClientTEST অথবা PRODUCTION দিয়ে কনফিগার করা হয়েছে। - চালু করার জন্য:
loadPaymentDataব্যবহার করুন এবং প্রয়োজনেIntentSenderদিয়ে সমাধান করুন। - টোকেন:
PaymentData.toJson()পার্স করেpaymentMethodData.tokenizationData.tokenবের করুন এবং আপনার PSP-তে পাঠান।
৬. উপসংহার
এই কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন! আপনি শিখেছেন কিভাবে অ্যান্ড্রয়েডের জন্য একটি জেটপ্যাক কম্পোজ অ্যাপে গুগল পে এপিআই (Google Pay API) ইন্টিগ্রেট করতে হয়।
প্রকল্পটি চালান
আপনার অ্যাপটি চালু করতে অ্যান্ড্রয়েড স্টুডিও থেকে প্রজেক্টটি রান করুন ( Run > Run 'app' )।
এখান থেকে কোথায় যাওয়া যায়
অতিরিক্ত সম্পদ
- ডিসকর্ডের #payments চ্যানেলে আলোচনায় যোগ দিন।
- X-এ @GooglePayDevs-কে অনুসরণ করুন
- ইউটিউবে গুগল পে সম্পর্কিত ভিডিও দেখুন