این راهنما نحوه استفاده از فراخوانیهای برگشتی با Google Wallet API را توضیح میدهد. وقتی مجوزی ایجاد یا حذف میشود، Google میتواند به نقطه پایانی HTTPS انتخابی شما فراخوانی برگشتی انجام دهد. این برگشتی مختص کلاس است و شامل دادههایی درباره رویداد مثل کلاس، شیء، و نوع رویداد است. از این گزارش میتوان برای پیگیری تعداد افزودنها و حذفهای کاربر استفاده کرد. برای مثال، میتوان فراخوانیهای برگشتی را برای ارسال رویدادها به برنامه تجزیهوتحلیل پیکربندی کرد تا تعامل مشتری درطول رویدادهای تبلیغاتی پیگیری شود.
پیشنیازها
قبلاز شروع، پیشنیازهای زیر را مرور کنید:
- نقطه پایان HTTPS را که درخواستهای POST را مدیریت میکند راهاندازی کنید. این نقطه پایانی باید بهطور عمومی دردسترس باشد.
-
نقطه پایانی فراخوانی برگشتی را بهصورت برنامهنویسیشده برای هر کلاس بهروز کنید. ویژگی
callbackOptionsرا براساس کلاس در REST API ببینید. - توصیه میشود: از کتابخانه Tink برای درستیسنجی امضاها استفاده کنید.
پیادهسازی پاسخ تماس
برای هر افزودن یا حذفی که کاربر روی یک شیء انجام میدهد، Google با جزئیات مربوط به افزودن یا حذف در یک نشانی وب بهازای هر کلاس به فروشندگان بازخوانی میکند. فروشندگان ابتدا باید از «کلیدهای عمومی» برای درستیسنجی اصالت پیام استفاده کنند. پساز اینکه کارگزاریهای تماس برگشتی پیام را درستیسنجی کردند، میتوان از کارگزاریهای تماس برگشتی برای عملیات پاییندستی استفاده کرد.
درستیسنجی امضا
توصیه میکنیم هنگام پیادهسازی نقطه پایانی HTTPS، از کتابخانه Tink برای تأیید امضای پیام استفاده کنید. کتابخانه Tink
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 } }
قالب پیام موردانتظار
قالب پیام JSON است که بهصورت رشتهای با ویژگیهای زیر سریالسازی شده است:
| شناسه | شرح |
|---|---|
classId |
شناسه کلاس کاملاً واجدشرایط. از قالب زیر استفاده میکند: <issuer_id.class_id> |
objectId |
شناسه شیء کاملاً واجدشرایط. از قالب زیر استفاده میکند: <issuer_id.object_id> |
expTimeMillis |
زمان انقضا برحسب میلیثانیه از تاریخ. پساز زمان انقضا، پیام باید نامعتبر تلقی شود. |
eventType |
میتواند del یا save برای
DELETE و SAVE باشد.
|
nonce |
Nonce برای ردیابی هرگونه تحویل تکراری. |
رسیدگی به درخواست از سرور Google
در زیر فهرستی از فیلدهای کلیدی در سرایند درخواست ارائهشده به نقطه پایانی تماس برگشتی شما آمده است:
- User-Agent:
GooglebotیاGoogle-Valuables - نوع محتوا:
application/json
سرورتان را طوری پیکربندی کنید که درخواست را رد نکند. برای انجام این کار، میتوانید
موارد زیر را در robots.txt تنظیم کنید:
User-agent: Googlebot Disallow:
تلاشهای مجدد
تماسهای برگشتی براساس حداکثر تلاش انجام میشود. Google از استراتژیهای تلاش مجدد رایج استفاده خواهد کرد تا در مواردی که نقطه پایانی تماس برگشتی پاسخ نمیدهد یا قطعی متناوب دارد انعطافپذیر باشد و تلاشها را بهتدریج کاهش دهد.
ارسالهای تکراری
در برخی موارد ممکن است ارسالهای تکراری وجود داشته باشد. توصیه میکنیم از
nonce برای حذف موارد تکراری استفاده کنید.