הגדרת תשלומים ב-Sandbox

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

הגדרות אישיות

כדי להפעיל את מצב התשלום ב-Sandbox בסביבת ה-Sandbox, עליכם לבצע את הפעולות הבאות:

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

כרטיס 'תכונות חשבון' שבו נבחר מצב Sandbox

כדי להפעיל את מצב התשלום ב-Sandbox בסביבת הבדיקה המהירה:

  1. במרכז הפעולות, עוברים אל פידים > בדיקה מהירה.
  2. לוחצים על לחצן הבחירה שימוש ב-Sandbox ל-GPay.

בדיקה מהירה עם מצב Sandbox נבחר

כשבוחרים במצב תשלום של Sandbox:

  • השירות 'סידור מקצה לקצה' מגדיר את Google Pay כך שיחזיר אסימונים של אמצעי תשלום שמכילים נתונים של כרטיסי בדיקה, במקום את פרטי הכרטיס בפועל.
  • השדה isInSandbox מוגדר לערך true בעמודות CheckoutRequestMessage ו-SubmitOrderRequestMessage.

אלה השילובים השונים של Environment, Payment Mode ו-isInSandbox:

סביבה שיטת תשלום isInSandbox
בדיקה מהירה ארגז חול true
בדיקה מהירה Production false
ארגז חול ארגז חול true
ארגז חול Production false
Production Production false

הודעת תגובה לקופה

הערך CheckoutResponseMessage שנשלח על ידי שירות האינטרנט להזמנת אוכל מכיל את הערך PaymentOptions. כשאתם מגדירים את התשלום בקופה, אתם צריכים לספק placeholder של אפשרויות תשלום באמצעות שער תשלום לדוגמה.

  • הקפידו לעדכן את ההגדרה CheckoutResponseMessage של שירות האינטרנט בהתאם לאסימונים.

דוגמאות לאפשרויות תשלום

האובייקטים הבאים הם דוגמאות לאובייקטים מסוג PaymentOptions של JSON מתוך CheckoutResponseMessage עבור שערי תשלום שונים באמצעות מפתחות Sandbox:

JSON

"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\"}} "
    }
}

JSON

"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\"}} "
    }
}

JSON

"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\"}} "
    }
}

JSON

"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:

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

אין תמיכה בכרטיסי אשראי לבדיקה, גם אם ארגז החול של הטרנזקציה מופעל. עליך להשתמש בכרטיס אשראי אמיתי בעת ביצוע עסקה. עם זאת, אסימונים של מכשירים בארגז חול מכילים פרטים של כרטיס בדיקה שלא ניתן לחייב.

עיבוד תשלומים

כשלקוח שולח את ההזמנה, התכונה 'הזמנה מקצה לקצה' שולחת את האירוע SubmitOrderRequestMessage לנקודת הקצה של שירות האינטרנט שלכם. האסימון של Google Pay נכלל כמחרוזת בקידוד base-64 בשדה SubmitOrderRequestMessage instrumentToken. כדי לעבד את התשלום של הלקוח, עליכם לבצע אחת מהפעולות הבאות, בהתאם לשער התשלום שלכם:

שער תשלום
Stripe או Braintree פענוח של מחרוזת האסימון המקודדת ב-base-64 ושליחה של הנתונים המתאימים שכלולים במטען הייעודי (payload) של האסימון המפוענח לשער התשלומים כדי לעבד את התשלום.
כל שאר שערי התשלום (כוללtripev2) כדי לעבד את התשלום, עליך לשלוח את מחרוזת האסימון המלאה בקידוד base-64 לממשק ה-API של שער התשלומים. מבנה האסימון של אמצעי התשלום של Google Pay מכיל שדות מוצפנים ששער התשלום שלכם יכול לפענח כדי לעבד את התשלום.

דוגמה למטען ייעודי (payload) מפוענח

בדוגמאות הבאות מוצגים מטענים ייעודיים (payload) מפוענחים שמוחזרים בשדה instrumentToken עבור שערי תשלום שונים:

JSON

הדוגמה הזו ל-JSON מייצגת אסימון תשלום מפוענח בזמן השימוש ב-Brainree. מחלצים את הערך בשדה nonce ושולחים את הערך ל-Brainree לעיבוד התשלום.

{
  "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

הדוגמה הזו ל-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

הדוגמה הזו ל-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

הדוגמה הזו ל-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\"}"
  }
    

כדי לעבד את התשלום באמצעות האסימון, יש להחזיר את מחרוזת האסימון בקידוד base-64 עם הבקשה לממשק ה-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 בקידוד base-64 מ-Brainree:

Node.js

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