Việc sắp xếp thứ tự các dự án từ đầu đến cuối cho phép định cấu hình Chế độ thanh toán cho Hộp cát khi sử dụng Kiểm thử nhanh hoặc môi trường 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 Hộp cát và Phương thức thanh toán chính thức. Để kiểm thử các khoản thanh toán cho dự án Đặt hàng hai đầu của bạ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 hộp cát.
Cấu hình
Để bật Chế độ thanh toán hộp cát trong Môi trường Hộp cát, hãy làm theo các bước sau:
- Trong Trung tâm hành động, hãy chuyển đến phần Cấu hình > Tính năng.
- Trên thẻ Tính năng 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 Hộp cát trong Môi trường kiểm thử nhanh, hãy làm theo các bước sau:
- Trong Actions Center, 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 phương thức thanh toán Hộp cát được chọn:
- Thao tác Đặt hàng hai đầu sẽ định cấu hình Google Pay để trả về các mã thông báo phương thức có chứa dữ liệu thẻ thử nghiệm thay vì thông tin chi tiết thực tế của thẻ.
- Trường
isInSandbox
được đặt thànhtrue
trong CheckoutRequestMessage và SubmitOrderRequestMessage.
Các cách kết hợp khác nhau giữ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 về quy trình thanh toán
CheckoutResponseMessage
do dịch vụ web Đặt món ăn của bạn gửi có chứa PaymentOptions
. Khi thiết lập quy trình thanh toán, bạn cung cấp các lựa chọn thanh toán giữ chỗ bằng cách sử dụng một cổng thanh toán mẫu.
- Hãy nhớ cập nhật
CheckoutResponseMessage
do dịch vụ web của bạn gửi bằng cấu hình mã hoá thích hợp.
Ví dụ về lựa chọn thanh toán
Sau đây là ví dụ về các đối tượng PaymentOptions
JSON từ CheckoutResponseMessage
cho nhiều cổng thanh toán bằng cách sử dụng khoá hộp cát:
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\"}} " } }
Gắn cờ giao dịch trong hộp cát
Khi bật Chế độ thanh toán trong môi trường hộp cát, trường isInSandbox
sẽ được đưa vào yêu cầu và được đặt thành true
cho các yêu cầu đến đối với điểm cuối của dịch vụ web (CheckoutRequestMessage
và SubmitOrderRequestMessage
). Hãy thực hiện như sau khi trường isInSandbox
được đặt thành true
:
- Dùng khoá hộp cát thay vì khoá sản xuất trong cấu hình mã hoá cho cổng thanh toán của bạn. Hầu hết các công ty xử lý thanh toán đều cung cấp khoá API cho cả hộp cát và phiên bản chính thức.
- Đừ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 phải nhận thông báo về bất kỳ giao dịch hộp cát nào.
Thẻ tín dụng thử nghiệm không được hỗ trợ, ngay cả khi hộp cát giao dịch đang 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 công cụ trong hộp cát chứa thông tin chi tiết về thẻ kiểm thử không tính phí được.
Xử lý khoản thanh toán
Khi khách hàng gửi đơn đặt hàng, dịch vụ Đặt hàng hai đầu sẽ gửi SubmitOrderRequestMessage đến điểm cuối dịch vụ web của bạn. Mã thông báo Google Pay được đưa vào dưới dạng chuỗi mã hoá base-64 trong trường instrumentToken SubmitOrderRequestMessage
. Để xử lý khoản thanh toán của khách hàng, tuỳ thuộc vào cổng thanh toán, hãy thực hiện một trong những cách sau:
Cổng thanh toán | |
---|---|
Kẻ sọc hoặc cây não | 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 phần tải 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ổng thanh toán khác (bao gồm cả Stripe2) | Gửi chuỗi mã thông báo đã mã hoá base-64 hoàn chỉnh đến API cổng thanh toán của bạ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 có chứa các trường đã 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:
JSON
Ví dụ JSON này minh hoạ một mã thông báo thanh toán đã giải mã khi bạn sử dụng Healthtree. Trích xuất giá trị của trường nonce
và gửi giá trị đó đếnBraintree để 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 não bộ, trường instrumentToken
sẽ giải mã thành lỗi sau:
{ "error": { "message": "Record not found" }, "fieldErrors": [] }
JSON
Ví dụ JSON này minh hoạ một mã thông báo thanh toán đã giải mã khi bạn sử dụng Stripe.
Trích xuất giá trị của trường id
rồi gửi giá trị đó cho 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 }
JSON
Ví dụ JSON này minh hoạ một mã thông báo thanh toán đã giải mã khi sử dụng Stripe2.
{ "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
Ví dụ JSON này minh hoạ 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á base-64 cùng với yêu cầu của bạn tới API thanh toán của Square trong trường source_id
có tiền tố 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ừ nãotree:
Node.js
function decodeToken(instrumentToken) { let decodedString = new Buffer(instrumentToken, 'base64').toString('ascii') if (decodedString.androidPayCards) { return decodedString.androidPayCards[0].nonce; } }