הגדרת תשלומים בסביבת חול

כשמזמינים פרויקטים מקצה לקצה, אפשר להגדיר את מצב התשלום בארגז החול כשמשתמשים בסביבת הבדיקה המהירה או בסביבת ארגז החול. בזמן בדיקת פיד הנתונים, אפשר לעבור בין מצבי התשלום 'ארגז חול' ו'ייצור'. כדי לבדוק את התשלומים בפרויקט שלכם בנושא הזמנות מקצה לקצה בלי לחייב את הכרטיסים, צריך להגדיר את Payment Mode (מצב תשלום) בתור Sandbox (ארגז חול). סביבת הייצור לא תומכת במצב התשלום בסביבת ה-Sandbox.

תצורה

כדי להפעיל את סטטוס התשלום בארגז החול בסביבת ארגז החול:

  1. במרכז הפעולות, עוברים אל הגדרה > תכונות.
  2. בכרטיס תכונות החשבון, מאתרים את לחצן הבחירה Payment Mode.
  3. בוחרים באפשרות Sandbox ולוחצים על Save changes.

כרטיס של מאפייני החשבון עם מצב ארגז חול שנבחר

כדי להפעיל את סטטוס התשלום בארגז החול בסביבת הבדיקה המהירה:

  1. במרכז הפעולות, עוברים אל פידים  > בדיקה מהירה.
  2. בוחרים בלחצן הבחירה שימוש בארגז חול ל-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 בשדה SubmitOrderRequestMessageinstrumentToken. כדי לעבד את התשלום של הלקוח, מבצעים אחת מהפעולות הבאות בהתאם לשער התשלומים:

שער תשלום
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:

Node.js
function decodeToken(instrumentToken) {
  let decodedString = new Buffer(instrumentToken, 'base64').toString('ascii')
  if (decodedString.androidPayCards) {
    return decodedString.androidPayCards[0].nonce;
  }
}