يشرح هذا الدليل كيفية استخدام ميزة معاودة الاتصال باستخدام Google Wallet API. عند إنشاء قيمة أو حذفها، يمكن أن تُجري Google معاودة الاتصال بنقطة نهاية HTTPS من اختيارك. وتكون معاودة الاتصال هذه خاصة بفئة معيّنة وتتضمّن بيانات عن الحدث، مثل الفئة والعنصر ونوع الحدث. ويمكن استخدام هذه البيانات للبقاء متزامنة مع عدد عمليات إضافة المستخدمين وحذفهم. على سبيل المثال، يمكن ضبط عمليات معاودة الاتصال لإرسال الأحداث إلى تطبيق إحصاءات لتتبُّع تفاعل العملاء أثناء الأحداث الترويجية.
المتطلبات الأساسية
قبل البدء، راجِع المتطلبات الأساسية التالية:
- استخدِم نقطة نهاية HTTPS تعالج طلبات POST. يجب أن تكون نقطة النهاية هذه متاحة للجميع.
-
تعديل نقطة نهاية معاودة الاتصال آليًا لكل صف اطّلِع على السمة
callbackOptions
حسب الفئة في واجهة برمجة تطبيقات REST. - إجراء يُنصح به: استخدام مكتبة Tink للتحقّق من التوقيعات.
تنفيذ عمليات معاودة الاتصال
بالنسبة إلى كل عملية إضافة أو حذف يجريها المستخدم على عنصر، تُرجع Google الطلب إلى التجّار مع تقديم تفاصيل حول عملية الإضافة أو الحذف في عنوان URL لكل فئة. ويجب أن يستخدم التجّار أولاً المفاتيح العامة للتحقّق من صحة الرسالة. بعد التحقّق من الرسالة من خلال عمليات معاودة الاتصال، يمكن استخدام عمليات رد الاتصال لعمليات تنزيل البيانات.
إثبات صحة التوقيع
ننصحك باستخدام مكتبة Tink للتحقّق من توقيع الرسائل عند تنفيذ نقطة نهاية HTTPS. توفّر مكتبة Tik
PaymentMethodTokenRecipient
، وهي أداة
تتحقّق تلقائيًا من التوقيع وتعرض الرسالة الفعلية عند
إثبات الملكية بنجاح.
يوضِّح المثال التالي كيفية استخدام مكتبة Tink لتنفيذ PaymentMethodTokenRecipient
:
import java.io.IOException; import javax.servlet.http.*; import com.google.common.io.CharStreams; import com.google.crypto.tink.apps.paymentmethodtoken.*; // Replace ISSUER_ID with your issuer id private static final String RECIPIENT_ID = "ISSUER_ID"; private static final String PUBLIC_KEY_URL = "https://pay.google.com/gp/m/issuer/keys"; private static final String SENDER_ID = "GooglePayPasses"; private static final String PROTOCOL = "ECv2SigningOnly"; private static final GooglePaymentsPublicKeysManager keysManager = new GooglePaymentsPublicKeysManager.Builder() .setKeysUrl(PUBLIC_KEY_URL) .build(); public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { try { // Extract signed message with signature from POST request body. String signedMessage = CharStreams.toString(request.getReader()); PaymentMethodTokenRecipient recipient = new PaymentMethodTokenRecipient.Builder() .protocolVersion(PROTOCOL) .fetchSenderVerifyingKeysWith(keysManager) .senderId(SENDER_ID) .recipientId(RECIPIENT_ID) .build(); String serializedJsonMessage = recipient.unseal(signedMessage); // Use serializedJsonMessage to extract the details } catch (Exception e) { // Handle the error } }
Expected message format
The message format is JSON that's serialized into a string with the following properties:
Identifier | Description |
---|---|
classId |
Fully qualified class ID. Uses the following format: <issuer_id.class_id> objectId
رقم تعريف العنصر المؤهل بالكامل. تستخدم التنسيق التالي: <issuer_id.object_id> expTimeMillis
وقت انتهاء الصلاحية بالملي ثانية منذ تاريخ EPOCH. وبعد وقت انتهاء الصلاحية، يجب اعتبار الرسالة غير صالحة.
eventType
ويمكن أن تكون القيمة del أو save
لـ
DELETE وSAVE .
nonce
لا يوجد مكان لتتبُّع أي عمليات تسليم مكرّرة.
معالجة الطلب من خادم Googleفي ما يلي قائمة بالحقول الرئيسية في عنوان الطلب والتي يتم إرسالها إلى نقطة نهاية معاودة الاتصال:
اضبط الخادم حتى لا يرفض الطلب. لإجراء ذلك، يمكنك ضبط ما يلي في User-agent: Googlebot Disallow: مرات إعادة المحاولةتُجرى عمليات معاودة الاتصال على أساس أفضل جهد. ويحاول Google مرتين لتفسير الإخفاقات العابرة. وبعد المحاولة مرّتين، تحذفها Google ولا تحاول إعادة إرسالها مرة أخرى. عمليات تسليم مكرّرة
قد تكون هناك عمليات تسليم مكررة في بعض الحالات. وننصحك باستخدام
إنّ محتوى هذه الصفحة مرخّص بموجب ترخيص Creative Commons Attribution 4.0 ما لم يُنصّ على خلاف ذلك، ونماذج الرموز مرخّصة بموجب ترخيص Apache 2.0. للاطّلاع على التفاصيل، يُرجى مراجعة سياسات موقع Google Developers. إنّ Java هي علامة تجارية مسجَّلة لشركة Oracle و/أو شركائها التابعين. تاريخ التعديل الأخير: 2024-03-26 (حسب التوقيت العالمي المتفَّق عليه)
[{
"type": "thumb-down",
"id": "missingTheInformationINeed",
"label":"لا يحتوي على المعلومات التي أحتاج إليها."
},{
"type": "thumb-down",
"id": "tooComplicatedTooManySteps",
"label":"الخطوات معقدة للغاية / كثيرة جدًا."
},{
"type": "thumb-down",
"id": "outOfDate",
"label":"المحتوى قديم."
},{
"type": "thumb-down",
"id": "translationIssue",
"label":"ثمة مشكلة في الترجمة."
},{
"type": "thumb-down",
"id": "samplesCodeIssue",
"label":"مشكلة في العيّنات / التعليمات البرمجية"
},{
"type": "thumb-down",
"id": "otherDown",
"label":"غير ذلك"
}]
[{
"type": "thumb-up",
"id": "easyToUnderstand",
"label":"يسهُل فهم المحتوى."
},{
"type": "thumb-up",
"id": "solvedMyProblem",
"label":"ساعَدني المحتوى في حلّ مشكلتي."
},{
"type": "thumb-up",
"id": "otherUp",
"label":"غير ذلك"
}]
|