این راهنما نحوه استفاده از فراخوانیهای برگشتی با API کیف پول گوگل را توضیح میدهد. هنگامی که یک گذر ایجاد یا حذف میشود، گوگل میتواند یک فراخوانی برگشتی به یک نقطه پایانی HTTPS مورد نظر شما انجام دهد. این فراخوانی برگشتی مختص کلاس است و شامل دادههایی در مورد رویداد مانند کلاس، شیء و نوع رویداد میشود. از این میتوان برای پیگیری تعداد اضافه و حذفهای کاربر که رخ میدهد استفاده کرد. به عنوان مثال، فراخوانیهای برگشتی را میتوان طوری پیکربندی کرد که رویدادها را به یک برنامه تحلیلی ارسال کنند تا تعامل مشتری را در طول رویدادهای تبلیغاتی ردیابی کنند.
پیشنیازها
قبل از شروع، پیشنیازهای زیر را بررسی کنید:
- یک نقطه پایانی HTTPS ایجاد کنید که درخواستهای POST را مدیریت کند. این نقطه پایانی باید به صورت عمومی در دسترس باشد.
- به صورت برنامهنویسیشده، نقطه پایانی فراخوانی (callback endpoint) را برای هر کلاس بهروزرسانی کنید. به ویژگی
callbackOptionsبر اساس کلاس در REST API مراجعه کنید. - توصیه میشود: برای تأیید امضاها از کتابخانه Tink استفاده کنید.
پیادهسازی فراخوانیهای برگشتی
برای هر اضافه یا حذفی که توسط کاربر روی یک شیء انجام میشود، گوگل فراخوانیهای برگشتی (callbacks) را با جزئیات مربوط به اضافه یا حذف در یک URL مربوط به هر کلاس به فروشندگان ارسال میکند. فروشندگان ابتدا باید از کلیدهای عمومی برای تأیید صحت پیام استفاده کنند. پس از تأیید پیام توسط فراخوانیهای برگشتی، میتوان از این فراخوانیها برای عملیات بعدی استفاده کرد.
امضا را تأیید کنید
توصیه میکنیم هنگام پیادهسازی نقطه پایانی 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 | زمان انقضا بر حسب میلیثانیه از زمان EPOCH. پس از زمان انقضا، پیام باید نامعتبر تلقی شود. |
eventType | برای DELETE و SAVE میتوان از del یا save استفاده کرد. |
nonce | Nonce برای ردیابی هرگونه تحویل تکراری. |
درخواست از سرور گوگل را مدیریت کنید
در زیر لیستی از فیلدهای کلیدی در هدر درخواستی که به نقطه پایانی فراخوانی شما ارسال میشود، آمده است:
- نماینده کاربر:
Googlebot - نوع محتوا:
application/json
سرور خود را طوری پیکربندی کنید که درخواست را رد نکند. برای انجام این کار، میتوانید موارد زیر را در robots.txt تنظیم کنید:
User-agent: Googlebot Disallow:
تلاشهای مجدد
فراخوانیهای مجدد بر اساس بهترین تلاش انجام میشوند. گوگل از استراتژیهای معمول تلاش مجدد برای مقاوم بودن در مواردی که نقطه پایانی فراخوانی پاسخ نمیدهد یا دچار قطعی متناوب است، استفاده میکند و به آرامی تلاشها را متوقف میکند.
تحویلهای تکراری
در برخی موارد ممکن است تحویلهای تکراری وجود داشته باشد. توصیه میکنیم از nonce برای حذف آنها استفاده کنید.