设置沙盒付款

订购端到端项目可让您在使用快速测试或沙盒环境时配置沙盒付款模式。在测试数据 Feed 时,您可以在沙盒和生产环境的付款模式之间切换。若要在不对银行卡收费的情况下测试端到端订购项目的付款,请使用沙盒作为付款方式。生产环境不支持沙盒付款方式。

配置

如需在沙盒环境中启用沙盒付费模式,请按以下步骤操作:

  1. Actions Center 中,依次转到 配置 > 功能
  2. 帐号功能卡片上,找到付款方式单选按钮。
  3. 选择沙盒选项,然后点击保存更改

已选择“沙盒模式”的帐号功能卡片

如需在快速测试环境中启用沙盒付款模式,请按以下步骤操作:

  1. Actions Center 中,依次点击 Feed > 快速测试
  2. 选择为 GPay 使用沙盒单选按钮。

选择沙盒模式时的快速测试

选择沙盒付费模式后:

  • “端到端订购”功能将 Google Pay 配置为返回包含测试卡数据(而不是实际卡详细信息)的付款方式令牌。
  • CheckoutRequestMessageSubmitOrderRequestMessage 中的 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\"}} "
    }
}

标记沙盒事务

启用沙盒付费模式后,对于发送到网络服务端点(CheckoutRequestMessageSubmitOrderRequestMessage)的传入请求,isInSandbox 字段会包含在请求中,并且会设置为 true。当 isInSandbox 字段设置为 true 时,请执行以下操作:

  • 在支付网关的令牌化配置中使用沙盒密钥(而非生产密钥)。大多数付款处理方都会同时为沙盒环境和生产环境提供 API 密钥。
  • 不要触发与 Web 服务提供商(通常是餐厅)的任何通信,因为他们不必获知任何沙盒事务。

不支持测试信用卡,即使启用了交易沙盒也是如此。进行交易时,您必须使用真实的信用卡。但是,沙盒付款方式令牌包含无需扣款的测试卡详细信息。

处理付款

当客户提交订单时,端到端订购会将 SubmitOrderRequestMessage 发送到您的网络服务端点。Google Pay 令牌以 base-64 编码字符串的形式包含在 SubmitOrderRequestMessage instrumentToken 字段中。如需处理客户付款,请根据您的支付网关执行以下任一操作:

支付网关
Stripe 或 Braintree 对 base-64 编码的令牌字符串进行解码,并将解码后的令牌载荷中包含的相应数据发送到支付网关来处理付款。
所有其他支付网关(包括 tripv2) 将完整的 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 示例表示使用 scanev2 时解码的付款令牌。

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

如需使用令牌处理付款,请在 source_id 字段中返回 base-64 编码的令牌字符串,并附上您向 Square 付款 API 发出的请求,并以 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 示例会对 Braintree 中采用 base-64 编码的 instrumentToken 进行解码:

Node.js

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