כשמזמינים פרויקטים מקצה לקצה, אפשר להגדיר את מצב התשלום בארגז החול כשמשתמשים בסביבת הבדיקה המהירה או בסביבת ארגז החול. בזמן בדיקת פיד הנתונים, אפשר לעבור בין מצבי התשלום 'ארגז חול' ו'ייצור'. כדי לבדוק את התשלומים בפרויקט שלכם בנושא הזמנות מקצה לקצה בלי לחייב את הכרטיסים, צריך להגדיר את Payment Mode (מצב תשלום) בתור Sandbox (ארגז חול). סביבת הייצור לא תומכת במצב התשלום בסביבת ה-Sandbox.
תצורה
כדי להפעיל את סטטוס התשלום בארגז החול בסביבת ארגז החול:
- במרכז הפעולות, עוברים אל הגדרה > תכונות.
- בכרטיס תכונות החשבון, מאתרים את לחצן הבחירה Payment Mode.
- בוחרים באפשרות Sandbox ולוחצים על Save changes.
כדי להפעיל את סטטוס התשלום בארגז החול בסביבת הבדיקה המהירה:
- במרכז הפעולות, עוברים אל פידים > בדיקה מהירה.
- בוחרים בלחצן הבחירה שימוש בארגז חול ל-GPay.
כשמגדירים את שיטת התשלום Sandbox:
- כשמגדירים הזמנה מקצה לקצה, Google Pay מחזירה אסימונים של כלי תשלום שמכילים נתונים של כרטיס בדיקה במקום את פרטי הכרטיס בפועל.
- השדה
isInSandbox
מוגדר ל-true
ב-CheckoutRequestMessage וב-SubmitOrderRequestMessage.
השילובים השונים של הסביבה, סטטוס התשלום והערך של isInSandbox הם:
סביבה | שיטת תשלום | isInSandbox |
---|---|---|
בדיקה מהירה | ארגז חול | TRUE |
בדיקה מהירה | ייצור | FALSE |
ארגז חול | ארגז חול | TRUE |
ארגז חול | ייצור | FALSE |
ייצור | ייצור | FALSE |
הודעת תגובה בקופה
ה-CheckoutResponseMessage
שנשלח על ידי שירות האינטרנט להזמנת אוכל מכיל את הערך PaymentOptions
. כשמגדירים את תהליך התשלום, צריך לספק אפשרויות תשלום זמניות באמצעות שער תשלום לדוגמה.
- חשוב לעדכן את
CheckoutResponseMessage
שנשלח על ידי שירות האינטרנט בהגדרות המתאימות ליצירת האסימונים.
דוגמאות לאפשרויות תשלום
בהמשך מפורטות דוגמאות לאובייקטים מסוג JSON PaymentOptions
מ-CheckoutResponseMessage
עבור פורטים שונים של תשלומים באמצעות מפתחות בסביבת חול:
"paymentOptions": { "googleProvidedOptions": { "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"USD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"31.85\"}} " } }
"paymentOptions": { "googleProvidedOptions": { "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gateway\":\"braintree\",\"braintree:apiVersion\":\"v1\",\"braintree:sdkVersion\":\"1.4.0\",\"braintree:merchantId\":\"YOUR_MERCHANT_ID\",\"braintree:clientKey\":\"YOUR_BRAINTREE_SANDVOX_OR_PRODUCTION_KEY\"}}}],\"transactionInfo\":{\"currencyCode\":\"USD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"31.85\"}} " } }
"paymentOptions": { "googleProvidedOptions": { "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gateway\":\"stripe\",\"stripe:version\":\"2018-10-31\",\"stripe:publishableKey\":\"YOUR_PRODUCTION_OR_SANDBOX_STRIPE_KEY\"}}}],\"transactionInfo\":{\"currencyCode\":\"USD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"31.85\"}} " } }
"paymentOptions": { "googleProvidedOptions": { "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gateway\":\"stripev2\",\"gatewayMerchantId\":\"YOUR_PRODUCTION_OR_SANDBOX_STRIPE_KEY\"}}}],\"transactionInfo\":{\"currencyCode\":\"USD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"31.85\"}} " } }
סימון עסקאות בארגז החול
כשמצב התשלומים בסביבת ה-Sandbox מופעל, השדה isInSandbox
נכלל בבקשה ומוגדר כ-true
לבקשות נכנסות לנקודת הקצה של שירות האינטרנט (CheckoutRequestMessage
ו-SubmitOrderRequestMessage
). כשהשדה isInSandbox
מוגדר כ-true
, צריך לבצע את הפעולות הבאות:
- להשתמש במפתחות של ארגז חול במקום במפתחות של סביבה לייצור בהגדרת האסימונים של שער התשלומים. רוב מעבדי התשלומים מספקים מפתחות API גם לסביבת חול וגם לסביבת ייצור.
- אין להפעיל תקשורת עם ספק שירות האינטרנט, בדרך כלל מסעדה, כי אין צורך להודיע לו על עסקאות ב-sandbox.
אין תמיכה בכרטיסי אשראי לבדיקה, גם אם ארגז החול לעסקאות מופעל. עליכם להשתמש בכרטיס אשראי אמיתי כשאתם מבצעים עסקה. עם זאת, אסימוני כלי בסביבת החול מכילים פרטי כרטיס בדיקה שלא ניתן לחייב.
עיבוד תשלומים
כשלקוח שולח את ההזמנה, המערכת 'הזמנה מקצה לקצה' שולחת את ההודעה SubmitOrderRequestMessage לנקודת הקצה של שירות האינטרנט. אסימון Google Pay נכלל כמחרוזת בקידוד base64 בשדה SubmitOrderRequestMessage
instrumentToken. כדי לעבד את התשלום של הלקוח, מבצעים אחת מהפעולות הבאות בהתאם לשער התשלומים:
שער תשלום | |
---|---|
Stripe או Braintree | מפענחים את מחרוזת האסימון בקידוד base-64 ושולחים את הנתונים המתאימים שמכילים את עומס העבודה (payload) של האסימון המפוענח לשער התשלומים כדי לעבד את התשלום. |
כל שאר פורטל התשלומים (כולל stripev2) | שולחים את מחרוזת האסימון המלאה בקידוד base-64 ל-API של פורטל התשלומים כדי לעבד את התשלום. מבנה האסימון של אמצעי התשלום ב-Google Pay מכיל שדות מוצפנים ששער התשלומים יכול לפענח כדי לעבד את התשלום. |
דוגמה למטען ייעודי (payload) מפוענח
בדוגמאות הבאות מוצגים עומסי נתונים מפוענחים שמוחזרים בשדה instrumentToken
עבור פורטים שונים של תשלומים:
דוגמת ה-JSON הזו מייצגת טוקן תשלום מפוענח בזמן השימוש ב-Braintree. מחלצים את הערך של השדה nonce
ומעבירים אותו ל-Braintree לצורך עיבוד התשלום.
{ "androidPayCards": [{ "type": "AndroidPayCard", "nonce": "aeeb8297-4242...", "description": "AndroidPay", "consumed": false, "details": { "cardType": "Visa", "lastTwo": "29" } }] }
אם Google Pay לא מופעל בלוח הבקרה של Braintree, השדה instrumentToken
מפענח את השגיאה הבאה:
{ "error": { "message": "Record not found" }, "fieldErrors": [] }
דוגמת ה-JSON הזו מייצגת טוקן תשלום מפוענח בזמן השימוש ב-Stripe.
מחלצים את הערך של השדה id
ושולחים אותו ל-Stripe כדי לעבד את התשלום.
{ "id": "tok_abcdefg1234...", "object": "token", "card": { "id": "card_abcde...", "object": "card", "address_city": null, "address_country": null, "address_line1": null, "address_line1_check": null, "address_line2": null, "address_state": null, "address_zip": null, "address_zip_check": null, "brand": "Visa", "country": "US", "cvc_check": null, "dynamic_last4": "1234", "exp_month": 1, "exp_year": 2019, "funding": "credit", "last4": "1234", "metadata": {}, "name": null, "tokenization_method": "android_pay" }, "client_ip": "74.125.177.36", "created": 1500483670, "livemode": false, "type": "card", "used": false }
דוגמת ה-JSON הזו מייצגת טוקן תשלום מפוענח כשמשתמשים ב-stripev2.
{ "protocolVersion":"ECv2", "signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d", "intermediateSigningKey":{ "signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}", "signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"] }, "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}" }
דוגמת ה-JSON הזו מייצגת טוקן תשלום מפוענח בזמן השימוש ב-Square.
{ "signature": "MEYCIQCMAsWCrY2GfHM/gMAKiK3QCKJJOIkjZeTQGzcdWgvrhwIhAJ3mXwe+wmU9z+Apv1rTDsCVQBzayvWzT4ywxytrSPla", "protocolVersion": "ECv1", "signedMessage": "{\"encryptedMessage\":\"WkYz21EYxojwTqWh6A3oYXtmctu1PlqF+tNYPA4cq017nqj16Ge7kaVR7MI1XG1OrCmcMwP20u5Zb5E28XYan8UI8M4L120orvE9XU1ivZuO4Myq2O3ue8v0lY1MDx8Mnk+5mkAv1kLmzJc91gEQ2leIwrPuMDYqsQUHzTR3Jikh5/v+iWRkyQPKKxgj5c6Erdu/pkg1xV6fQJcHNdq9Jw11zl95x6eQurxw2Uy8v811azGr+noKJbw0uye72MkhmzMS5QKOzwGT9nBfO+zPLYSEewsdOcPbNZF94zk/KU9nxom/gQ+eYEMIZvOj9lO4gQqDqR6DyWyStk7MjeXQTvXWZBI1JpqvOrlTHL0Ct18RpbfOio7hAtafzb0NnqEKlsun+SSpJmvI7U6n6Cnu1JUMUGfT/Jsi6RJ3N6pRw2BubeR1925Xl3jXQnlz5io6X1YRlAcnshZyf6CjBpKES32aTf1m1IHRhZ2Jj6i/g7Y\\u003d\",\"ephemeralPublicKey\":\"BDQA0Cf//BHPcnB0R/GRrWa2g7T1QF97eOhAYy7l45M+kJnsoeL9OaUQV/KIMLvcgbmKkZIm2FQeL7ftd6S4q4c\\u003d\",\"tag\":\"DHtVyXNo+PDr7Thi/EjBBbsr2k7y1SwGIn0D9mmPTJc\\u003d\"}" }
כדי לעבד את התשלום באמצעות האסימון, מחזירים את מחרוזת האסימון המקודדת בבסיס 64 עם הבקשה ל-Payment API של Square בשדה source_id
עם הקידומת gpay:
{ "idempotency_key": "ID", "source_id": "gpay:GOOGLE_PAY_BASE64_ENCODED_TOKEN", "amount_money": { "amount": 50, "currency": "USD" }, "location_id": "LOCATION_ID", "billing_address": { "postal_code": "11111" } }
דוגמה ל-Node.js שמפענחת את instrumentToken
בקידוד Base64 מ-Braintree:
function decodeToken(instrumentToken) { let decodedString = new Buffer(instrumentToken, 'base64').toString('ascii') if (decodedString.androidPayCards) { return decodedString.androidPayCards[0].nonce; } }