订购端到端项目时,您可以在使用快速测试或沙盒环境时配置沙盒付款模式。在测试数据 Feed 时,您可以在沙盒付款模式和生产付款模式之间切换。如需在不向卡中扣款的情况下测试端到端订购项目的付款,请将沙盒用作付款方式。生产环境不支持沙盒付款模式。
配置
如需在沙盒环境中启用沙盒付款模式,请按以下步骤操作:
- 在操作中心中,依次选择配置 > 功能。
- 在账号功能卡片上,找到付款方式单选按钮。
- 选择 Sandbox 选项,然后点击 Save changes(保存更改)。
如需在快速测试环境中启用沙盒付款模式,请按以下步骤操作:
- 在操作中心,依次前往Feed > 快速测试。
- 选择 Use sandbox for GPay(使用沙盒测试 GPay)单选按钮。
选择沙盒付款模式时:
- 配置端到端订购后,Google Pay 会返回包含测试卡数据(而非实际卡详细信息)的付款工具令牌。
- 在 CheckoutRequestMessage 和 SubmitOrderRequestMessage 中,将
isInSandbox
字段设置为true
。
以下是“环境”“付款模式”和“isInSandbox”的不同组合:
环境 | 付费模式 | isInSandbox |
---|---|---|
快速测试 | 沙盒 | true |
快速测试 | 生产 | false |
沙盒 | 沙盒 | true |
沙盒 | 生产 | false |
生产 | 生产 | false |
结账响应消息
您的食品订餐网站服务发送的 CheckoutResponseMessage
包含 PaymentOptions
。在设置结账流程时,您可以使用示例付款网关提供占位符付款选项。
- 请务必使用适当的令牌化配置更新您的网站服务发送的
CheckoutResponseMessage
。
付款方式示例
以下是使用沙盒密钥的各种付款网关的 CheckoutResponseMessage
中的 JSON PaymentOptions
对象示例:
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\"}} " } }
标记沙盒交易
启用沙盒付款模式后,系统会在请求中包含 isInSandbox
字段,并将其设置为 true
,以便处理传入到您的 Web 服务端点 (CheckoutRequestMessage
和 SubmitOrderRequestMessage
) 的请求。当 isInSandbox
字段设置为 true
时,请执行以下操作:
- 在付款网关的令牌化配置中,使用沙盒密钥,而不是生产密钥。大多数付款处理服务提供沙盒环境和生产环境的 API 密钥。
- 请勿触发与 Web 服务提供商(通常是餐厅)的任何通信,因为他们无需获知任何沙盒交易。
不支持测试信用卡,即使启用了交易沙盒也是如此。您在进行交易时必须使用真实的信用卡。不过,沙盒插桩令牌包含不可扣款的测试卡详细信息。
处理付款
当客户提交订单时,端到端订购会向您的 Web 服务端点发送 SubmitOrderRequestMessage。Google Pay 令牌以 base-64 编码的字符串形式包含在 SubmitOrderRequestMessage
instrumentToken 字段中。如需处理客户的付款,请根据您的付款网关执行以下操作之一:
支付网关 | |
---|---|
Stripe 或 Braintree | 解码 base-64 编码的令牌字符串,并将解码后的令牌载荷中包含的适当数据发送到您的付款网关以处理付款。 |
所有其他付款网关(包括 stripev2) | 将完整的 base-64 编码令牌字符串发送到您的付款网关 API 以处理付款。Google Pay 付款方式令牌结构包含加密字段,您的付款网关可以对其进行解密以处理付款。 |
解码的载荷示例
以下示例显示了针对各种付款网关在 instrumentToken
字段中返回的解码载荷:
JSON
此 JSON 示例表示使用 Braintree 时解码的付款令牌。提取 nonce
字段的值,并将该值发送给 Braintree 以处理付款。
{ "androidPayCards": [{ "type": "AndroidPayCard", "nonce": "aeeb8297-4242...", "description": "AndroidPay", "consumed": false, "details": { "cardType": "Visa", "lastTwo": "29" } }] }
如果未在 Braintree 控制台中启用 Google Pay,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 编码的令牌字符串作为请求返回到 Square 的付款 API 的 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" } }
以下是用于解码 Braintree 中 base-64 编码的 instrumentToken
的 Node.js 示例:
Node.js
function decodeToken(instrumentToken) { let decodedString = new Buffer(instrumentToken, 'base64').toString('ascii') if (decodedString.androidPayCards) { return decodedString.androidPayCards[0].nonce; } }