1. مقدمة
ما ستنشئه
عند الانتهاء من هذا الدرس العملي، سيكون لديك تطبيق Flutter جاهز للاستخدام يتضمّن عملية تكامل ناجحة مع Google Pay على Android. يستردّ هذا المشروع رمزًا مميزًا للدفع يمكن إرساله إلى مقدّم خدمة الدفع لمعالجته.
أهداف الدورة التعليمية
- كيفية تثبيت مكتبة Google Pay Flutter وإعدادها
- كيفية عرض زر Google Pay والتعامل مع النقرات
- كيفية طلب رمز مميّز للدفع من Google Pay
المتطلبات
- محرّر نصوص من اختيارك لتعديل ملفات Dart
- بيئة تطوير Flutter تم إعدادها لنظام التشغيل Android
- بالنسبة إلى بيئة الإنتاج، ستحتاج إلى
merchantIdفي Google Pay. لا يستغرق التسجيل في Google Pay & Wallet Console سوى دقيقة واحدة، لذا ننصحك بإكمال هذه الخطوة الآن.
2. إنشاء مشروع Flutter
إنشاء ملفات المشروع
- أنشئ مشروع Flutter جديدًا باسم
googlepay_flutter.flutter create googlepay_flutter
- ثبِّت مكتبة Google Pay Flutter.
cd googlepay_flutter flutter pub add pay
- افتح
lib/main.dartفي بيئة التطوير المتكاملة التي تختارها واستبدِل المحتوى بالرمز التالي:import 'package:flutter/material.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp( home: PaySampleApp(), ); } } class PaySampleApp extends StatefulWidget { const PaySampleApp({super.key}); @override State<PaySampleApp> createState() => _PaySampleAppState(); } class _PaySampleAppState extends State<PaySampleApp> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Google Pay Codelab'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('Transaction info and errors will be logged to the console.'), ], ), ), ); } }
3- ضبط إعدادات Google Pay
يتطلّب طلب الدفع في Google Pay عنصر طلب. يحتوي العنصر المحدّد هنا باسم _paymentItems على الحدّ الأدنى من الإعدادات الشائعة لجميع الطلبات. ستتم إضافة إعدادات إضافية حسب الطلب المقدَّم، وسنراجعها في هذا الدرس العملي.
- أضِف ثوابت إعداد Google Pay إلى
lib/main.dart:
import 'package:pay/pay.dart';
const _paymentItems = [
PaymentItem(
label: 'Total',
amount: '14.95',
status: PaymentItemStatus.final_price,
)
];
- أضِف ملف JSON لإعدادات الدفع التلقائية إلى المسار
assets/google_pay_config.json:
{
"provider": "google_pay",
"data": {
"environment": "TEST",
"apiVersion": 2,
"apiVersionMinor": 0,
"allowedPaymentMethods": [
{
"type": "CARD",
"tokenizationSpecification": {
"type": "PAYMENT_GATEWAY",
"parameters": {
"gateway": "example",
"gatewayMerchantId": "exampleGatewayMerchantId"
}
},
"parameters": {
"allowedCardNetworks": ["VISA", "MASTERCARD"],
"allowedAuthMethods": ["PAN_ONLY", "CRYPTOGRAM_3DS"],
"billingAddressRequired": true,
"billingAddressParameters": {
"format": "FULL",
"phoneNumberRequired": true
}
}
}
],
"merchantInfo": {
"merchantName": "Example Merchant Name"
},
"transactionInfo": {
"countryCode": "US",
"currencyCode": "USD"
}
}
}
الموارد
- مرجع واجهة برمجة التطبيقات: مستندات عناصر الطلب في Google Pay API
- مرجع واجهة برمجة التطبيقات: يُرجى الرجوع إلى
PaymentMethodللحصول على مزيد من المعلومات حول طرق التفويض المسموح بها وشبكات البطاقات المسموح بها ومواصفات الترميز، بما في ذلك قيمة البوابة الصحيحة.
4. إضافة زر Google Pay
تتضمّن مكتبة pay مكوّن زر Google Pay أصليًا.
عدِّل الفئة _PaySampleAppState في lib/main.dart باستخدام الرمز التالي:
class _PaySampleAppState extends State<PaySampleApp> {
late final Future<PaymentConfiguration> _gpayConfig;
void onGooglePayResult(paymentResult) {
// Send 'token' to your payment service provider (PSP)
print(paymentResult);
}
@override
void initState() {
super.initState();
_gpayConfig = PaymentConfiguration.fromAsset('google_pay_config.json');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Google Pay Codelab')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FutureBuilder<PaymentConfiguration>(
future: _gpayConfig,
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return const Center(child: CircularProgressIndicator());
}
if (snapshot.hasError || !snapshot.hasData) {
return const Text('Error loading Google Pay config');
}
return GooglePayButton(
paymentConfiguration: snapshot.data!,
onPaymentResult: onGooglePayResult,
paymentItems: _paymentItems,
height: 48,
type: GooglePayButtonType.buy,
theme: GooglePayButtonTheme.dark,
margin: const EdgeInsets.only(top: 15.0),
loadingIndicator: const Center(
child: CircularProgressIndicator(),
),
);
},
),
const Text('Transaction info and errors will be logged to the console.'),
],
),
),
);
}
}
شرح الرمز البرمجي
- تصف
_paymentItemsالمعاملة التي يجب معالجتها عند النقر على هذا الزر. - تحمّل
paymentConfigurationAssetفي التطبيق المصغّرGooglePayButtonالإعدادات من الملفassets/google_pay_config.json. - عند الضغط على
GooglePayButton، يتم استدعاء الدالةonGooglePayResult. تتلقّى هذه الدالة نتيجة الدفع. - بعد الحصول على رمز الدفع المميّز من الردّ، عليك إرساله إلى بوابة الدفع لمعالجة المعاملة.
5- تفعيل الدفع عند النقر
يؤدي النقر على GooglePayButton إلى فتح ورقة Google Pay وعرض نتيجة، ولا يلزم إجراء طلب منفصل "إجراء دفعة". أضِف معالِجات لتسجيل الرمز المميز وعرض الأخطاء وتسجيل الضغط على الزر اختياريًا.
- أضِف معالج النتائج أو عدِّله داخل
_PaySampleAppState:
void onGooglePayResult(dynamic paymentResult) {
try {
final token = paymentResult['paymentMethodData']['tokenizationData']['token'];
debugPrint('Google Pay payment token: $token');
} catch (e) {
debugPrint('Unexpected payment result: $e');
}
}
- عدِّل
GooglePayButtonلتضمين معالجات الضغط والأخطاء:
GooglePayButton(
paymentConfiguration: snapshot.data!,
paymentItems: _paymentItems,
onPaymentResult: onGooglePayResult,
onError: (Object err) => debugPrint('Google Pay error: $err'),
onPressed: () => debugPrint('Google Pay button pressed'),
height: 48,
type: GooglePayButtonType.buy,
theme: GooglePayButtonTheme.dark,
margin: const EdgeInsets.only(top: 15.0),
loadingIndicator: const Center(child: CircularProgressIndicator()),
)
ملاحظات
- يؤدي النقر نفسه إلى تشغيل ورقة الدفع، ويتلقّى
onPaymentResultالحمولة. - في مرحلة الإنتاج، أرسِل الرمز المميّز إلى مقدّم خدمة الدفع لإكمال عملية تحصيل الرسوم.
6. الخاتمة
تهانينا على إكمال هذا الدرس التطبيقي حول الترميز. لقد تعرّفت على كيفية دمج Google Pay API في تطبيق Flutter على Android.
تشغيل المشروع
نفِّذ الأمر التالي لبدء تطبيقك:
flutter run
الخطوة التالية
مراجع إضافية
- الانضمام إلى المحادثة في قناة #payments على Discord
- متابعة @GooglePayDevs على X
- مشاهدة فيديوهات ذات صلة بـ Google Pay على YouTube