Việc đặt hàng dự án Toàn diện cho phép định cấu hình Chế độ thanh toán trong Hộp cát khi sử dụng môi trường Kiểm thử nhanh hoặc Hộp cát. Trong khi kiểm thử nguồn cấp dữ liệu, bạn có thể chuyển đổi giữa Chế độ thanh toán trong hộp cát và Chế độ thanh toán chính thức. Để kiểm thử các khoản thanh toán cho dự án Đặt hàng toàn diện mà không tính phí thẻ, hãy sử dụng Hộp cát làm Chế độ thanh toán. Môi trường sản xuất không hỗ trợ Chế độ thanh toán trong hộp cát.
Cấu hình
Để bật Chế độ thanh toán trong Hộp cát trong môi trường Hộp cát, hãy làm theo các bước sau:
- Trên Trung tâm hành động, hãy chuyển đến Cấu hình > Tính năng.
- Trên thẻ Tính năng của tài khoản, hãy tìm nút chọn Chế độ thanh toán.
- Chọn tuỳ chọn Sandbox (Hộp cát) rồi nhấp vào Save changes (Lưu thay đổi).
Để bật Chế độ thanh toán trong hộp cát trong môi trường Kiểm thử nhanh, hãy làm theo các bước sau:
- Trên Trung tâm hành động, hãy chuyển đến Nguồn cấp dữ liệu > Kiểm thử nhanh.
- Chọn nút chọn Use sandbox for GPay (Sử dụng hộp cát cho GPay).
Khi bạn chọn Phương thức thanh toán Sandbox:
- Tính năng Đặt hàng toàn diện sẽ định cấu hình Google Pay để trả về mã thông báo phương tiện chứa dữ liệu thẻ thử nghiệm thay vì thông tin chi tiết về thẻ thực tế.
- Trường
isInSandbox
được đặt thànhtrue
trong CheckoutRequestMessage và SubmitOrderRequestMessage.
Các tổ hợp khác nhau của Môi trường, Chế độ thanh toán và isInSandbox như sau:
Môi trường | Phương thức thanh toán | isInSandbox |
---|---|---|
Thử nghiệm nhanh | Hộp cát | đúng |
Thử nghiệm nhanh | Sản xuất | false |
Hộp cát | Hộp cát | đúng |
Hộp cát | Sản xuất | false |
Sản xuất | Sản xuất | false |
Thông báo phản hồi quy trình thanh toán
CheckoutResponseMessage
do dịch vụ web Đặt món ăn gửi chứa
PaymentOptions
. Khi thiết lập quy trình thanh toán, bạn sẽ cung cấp một phương thức thanh toán giữ chỗ bằng một cổng thanh toán mẫu.
- Hãy nhớ cập nhật
CheckoutResponseMessage
do dịch vụ web gửi bằng cấu hình mã hoá thích hợp.
Ví dụ về phương thức thanh toán
Sau đây là ví dụ về đối tượng PaymentOptions
JSON từ CheckoutResponseMessage
cho nhiều cổng thanh toán sử dụng khoá hộp cát:
"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\"}} " } }
Gắn cờ giao dịch trong hộp cát
Khi bạn bật Chế độ thanh toán trong hộp cát, trường isInSandbox
sẽ được đưa vào yêu cầu và đặt thành true
cho các yêu cầu đến điểm cuối dịch vụ web (CheckoutRequestMessage
và SubmitOrderRequestMessage
). Hãy làm như sau khi trường isInSandbox
được đặt thành true
:
- Sử dụng khoá hộp cát thay vì khoá phát hành chính thức trong cấu hình mã hoá cho cổng thanh toán. Hầu hết các trình xử lý thanh toán đều cung cấp khoá API cho cả môi trường hộp cát và môi trường phát hành công khai.
- Đừng kích hoạt bất kỳ hoạt động giao tiếp nào với nhà cung cấp dịch vụ web, thường là nhà hàng, vì họ không cần được thông báo về bất kỳ giao dịch nào trong hộp cát.
Thẻ tín dụng thử nghiệm không được hỗ trợ, ngay cả khi hộp cát giao dịch được bật. Bạn phải sử dụng thẻ tín dụng thực khi thực hiện giao dịch. Tuy nhiên, mã thông báo đo lường hộp cát chứa thông tin chi tiết về thẻ thử nghiệm không tính phí.
Xử lý khoản thanh toán
Khi khách hàng gửi đơn đặt hàng, tính năng Đặt hàng toàn diện sẽ gửi SubmitOrderRequestMessage đến điểm cuối dịch vụ web của bạn. Mã thông báo của Google Pay được đưa vào dưới dạng chuỗi được mã hoá base-64 trong trường SubmitOrderRequestMessage
instrumentToken. Để xử lý khoản thanh toán của khách hàng, hãy làm theo một trong những cách sau tuỳ thuộc vào cổng thanh toán của bạn:
Cổng thanh toán | |
---|---|
Stripe hoặc Braintree | Giải mã chuỗi mã thông báo được mã hoá base-64 và gửi dữ liệu thích hợp có trong tải trọng mã thông báo đã giải mã đến cổng thanh toán của bạn để xử lý khoản thanh toán. |
Tất cả các cổng thanh toán khác (bao gồm cả stripev2) | Gửi chuỗi mã thông báo được mã hoá hoàn chỉnh theo cơ sở 64 đến API cổng thanh toán để xử lý khoản thanh toán. Cấu trúc mã thông báo phương thức thanh toán của Google Pay chứa các trường được mã hoá mà cổng thanh toán của bạn có thể giải mã để xử lý khoản thanh toán. |
Ví dụ về tải trọng đã giải mã
Các ví dụ sau đây cho thấy tải trọng đã giải mã được trả về trong trường instrumentToken
cho nhiều cổng thanh toán:
Ví dụ JSON này thể hiện một mã thông báo thanh toán đã giải mã khi sử dụng Braintree. Trích xuất giá trị của trường nonce
và gửi giá trị đó đến Braintree để xử lý khoản thanh toán.
{ "androidPayCards": [{ "type": "AndroidPayCard", "nonce": "aeeb8297-4242...", "description": "AndroidPay", "consumed": false, "details": { "cardType": "Visa", "lastTwo": "29" } }] }
Nếu bạn chưa bật Google Pay trong bảng điều khiển Braintree, thì trường instrumentToken
sẽ giải mã thành lỗi sau:
{ "error": { "message": "Record not found" }, "fieldErrors": [] }
Ví dụ JSON này thể hiện một mã thông báo thanh toán đã giải mã khi sử dụng Stripe.
Trích xuất giá trị của trường id
và gửi giá trị đó đến Stripe để xử lý khoản thanh toán.
{ "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 }
Ví dụ JSON này thể hiện một mã thông báo thanh toán đã giải mã khi sử dụng 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\"}" }
Ví dụ JSON này thể hiện một mã thông báo thanh toán đã giải mã khi sử dụng 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\"}" }
Để xử lý khoản thanh toán bằng mã thông báo, hãy trả về chuỗi mã thông báo được mã hoá bằng cơ sở 64 cùng với yêu cầu của bạn đến API thanh toán của Square trong trường source_id
có tiền tố là 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" } }
Sau đây là ví dụ về Node.js giải mã instrumentToken
được mã hoá base-64 từ Braintree:
function decodeToken(instrumentToken) { let decodedString = new Buffer(instrumentToken, 'base64').toString('ascii') if (decodedString.androidPayCards) { return decodedString.androidPayCards[0].nonce; } }