Thiết lập thanh toán trong hộp cát

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:

  1. Trong Trung tâm hành động, hãy chuyển đến phần Cấu hình > Tính năng.
  2. Trên thẻ Tính năng tài khoản, hãy tìm nút chọn Chế độ thanh toán.
  3. Chọn tuỳ chọn Sandbox (Hộp cát) rồi nhấp vào Save changes (Lưu thay đổi).

Thẻ tính năng của tài khoản đã chọn Chế độ hộp cát

Để 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:

  1. Trong Actions Center, hãy chuyển đến Nguồn cấp dữ liệu > Kiểm thử nhanh.
  2. Chọn nút chọn Use Sandbox for GPay (Sử dụng hộp cát cho GPay).

Đã chọn Kiểm thử nhanh với chế độ Hộp cát

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ành true trong CheckoutRequestMessageSubmitOrderRequestMessage.

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 (CheckoutRequestMessageSubmitOrderRequestMessage). 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;
  }
}