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

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

תצורה

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

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

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

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

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

נבחרה האפשרות 'בדיקה מהירה באמצעות מצב Sandbox'

כאשר נבחר מצב התשלום Sandbox:

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

השילובים השונים של סביבה, מצב תשלום ו-isInSandbox הן:

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

הודעת תגובה לבקשת תשלום

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

  • חשוב לעדכן את CheckoutResponseMessage שנשלחו על ידי האינטרנט שלך שירות עם תצורת האסימונים המתאימה.

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

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

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:

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

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

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

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

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

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

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

JSON

הדוגמה הבאה בפורמט JSON מייצגת אסימון תשלום מפוענח כשמשתמשים Braintree. צריך לחלץ את הערך מהשדה 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 שמפענחים את זה בקידוד base-64 instrumentToken מ-Brainree:

Node.js

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