إعداد الدفعات في وضع الحماية Sandbox

يتيح طلب المشروعات الشاملة ضبط وضع الدفع في الوضع التجريبي عند استخدام الاختبار السريع أو بيئة الوضع التجريبي. أثناء اختبار خلاصة بياناتك، يمكنك التبديل بين وضعَي الدفع "الإصدار التجريبي" و"الإنتاج". لاختبار الدفعات في مشروع "الطلب من البداية إلى النهاية" بدون تحصيل الرسوم من البطاقات، استخدِم وضع الحماية كـ وضع الدفع. لا تسمح بيئة الإنتاج باستخدام "وضع الدفع في الوضع التجريبي".

الإعداد

لتفعيل "وضع الدفع في بيئة الاختبار" في بيئة الاختبار، اتّبِع الخطوات التالية:

  1. في مركز الإجراءات، انتقِل إلى الإعداد > الميزات.
  2. في بطاقة ميزات الحساب، ابحث عن زر الاختيار وضع الدفع.
  3. اختَر Sandbox (منطقة اختبار) وانقر على حفظ التغييرات.

بطاقة ميزات الحساب مع وضع Sandbox المحدّد

لتفعيل "وضع الدفع في وضع الحماية" في بيئة الاختبار السريع، اتّبِع الخطوات التالية:

  1. في مركز الإجراءات، انتقِل إلى الخلاصات  > اختبار سريع.
  2. انقر على زر الاختيار استخدام وضع المحاكاة لتطبيق GPay.

اختبار سريع مع تحديد وضع "وضع الحماية"

عند اختيار وضع الدفع Sandbox:

  • تعمل ميزة "الطلب من البداية إلى النهاية" على ضبط Google Pay لعرض الرموز المميّزة لوسائل الدفع التي تحتوي على بيانات البطاقة الاختبارية بدلاً من تفاصيل البطاقة الفعلية.
  • تم ضبط الحقل isInSandbox على true في CheckoutRequestMessage و SubmitOrderRequestMessage.

في ما يلي التركيبات المختلفة لـ "البيئة" و"وضع الدفع" و"isInSandbox":

البيئة وضع الدفع isInSandbox
اختبار سريع وضع الحماية صحيح
اختبار سريع الإنتاج خطأ
وضع الحماية وضع الحماية صحيح
وضع الحماية الإنتاج خطأ
الإنتاج الإنتاج خطأ

رسالة الردّ على الدفع

يحتوي CheckoutResponseMessage الذي أرسلته خدمة Food Ordering على الويب على PaymentOptions. عند إعداد عملية الدفع، يمكنك تقديم عنصر نائب لخيارات الدفع باستخدام مثال على بوابة دفع.

  • احرص على تعديل CheckoutResponseMessage الذي ترسله لخدمة الويب باستخدام إعدادات إنشاء الرموز المميّزة المناسبة.
.

أمثلة على خيارات الدفع

في ما يلي أمثلة على عناصر PaymentOptions بتنسيق JSON من ملف CheckoutResponseMessage لبوابات دفع مختلفة باستخدام مفاتيح وضع المحاكاة:

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

الإبلاغ عن معاملات وضع الحماية

عند تفعيل وضع الدفع في بيئة الاختبار، يتم تضمين حقل isInSandbox في الطلب ويتم ضبطه على true للطلبات الواردة إلى نقطة نهاية خدمة الويب (CheckoutRequestMessage وSubmitOrderRequestMessage). يُرجى اتّباع الخطوات التالية عند ضبط حقل isInSandbox على true:

  • استخدِم مفاتيح وضع الحماية بدلاً من مفاتيح الإنتاج في إعدادات رمز الاعتماد لبوابة الدفع. توفّر معظم الجهات المسؤولة عن معالجة المعاملات مفاتيح واجهة برمجة التطبيقات لكل من وضع المحاكاة ووضع الإنتاج.
  • لا تُجري أي تواصل مع مقدّم خدمة الويب، والذي يكون عادةً مطعمًا، لأنّه ليس من الضروري إبلاغه بأي معاملات في وضع المحاكاة.

لا يمكن استخدام بطاقات الائتمان التجريبية، حتى في حال تفعيل وضع "منطقة اختبار المعاملات". يجب استخدام بطاقة ائتمان حقيقية عند إجراء معاملة. ومع ذلك، تحتوي رموزا أدوات وضع الحماية على تفاصيل البطاقة الاختبارية التي لا يتم تحصيل رسومها.

معالجة الدفعات

عندما يرسل عميل طلبه، تُرسِل ميزة "الطلب من البداية إلى النهاية" الرسالة SubmitOrderRequestMessage إلى نقطة نهاية خدمة الويب. يتم تضمين الرمز المميّز لخدمة Google Pay كسلسلة مشفّرة بترميز base-64 في الحقل SubmitOrderRequestMessage instrumentToken. لمعالجة دفعة العميل، نفِّذ أحد الإجراءات التالية استنادًا إلى بوابة الدفع:

بوابة الدفع
Stripe أو Braintree فك ترميز سلسلة الرمز المميّز بترميز base-64 وأرسِل البيانات المناسبة الواردة في الحمولة الخاصة بالرمز المميّز الذي تم فك تشفيره إلى بوابة الدفع لمعالجة الدفعة.
جميع بوابات الدفع الأخرى (بما في ذلك stripev2) أرسِل سلسلة الرمز المميّز الكاملة بترميز base-64 إلى واجهة برمجة تطبيقات بوابة الدفع لمعالجة الدفعة. تحتوي بنية رمز مفتاح طريقة الدفع في Google Pay على حقول مشفَّرة يمكن لبوابة الدفع فك تشفيرها لمعالجة الدفعة.

مثال على الحمولة بعد فك ترميزها

تعرض الأمثلة التالية الحمولات المفكَّكة التي يتم عرضها في الحقل instrumentToken لبوابات دفع مختلفة:

JSONJSONJSONJSON

يمثّل مثال 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\"}"
  }
    

لمعالجة الدفعة باستخدام الرمز المميّز، يجب إرجاع سلسلة الرمز المميّز المشفَّرة بترميز base-64 مع طلبك إلى واجهة برمجة تطبيقات 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 من Braintree:

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