- 集成指南
- 支持的功能(付款方式)
- 设备付款
- Google Pay 支付
Google Pay
Google Pay™ 是 Google 提供的一个移动支付和数字钱包服务,使用保存到 Google 账户或 Android 设备的付款方式,为 Android 应用和移动网络中的付款人提供无缝的在线结账体验。 Google Pay 是 American Express Payment Gateway 支持的设备付款。
此页介绍 Google Pay 设备付款的特定处理。 建议您在构建 Google Pay 集成前,先阅读设备付款集成指南。
American Express Payment Gateway 从 Web-Services API v47 版本开始提供 Google Pay。
先决条件
若要接受 Google Pay 付款:
- 您必须注册 Google 并创建商家 ID(Direct Payment 需要)。
- 您在网关上的商家配置文件必须由 your payment service provider 启用“设备付款”。
- 如果您希望网关执行付款令牌解密,您在网关上的商家配置文件必须具有“启用 Google Pay 设备付款解密”权限(对于 Hosted Checkout 集成为必需,对于 Direct Payment 为可选)。
- 如果您使用的是白标域,请联系您的支付服务提供商,确保已为 Google Pay 启用此域。
Google Pay 集成
Hosted Checkout 集成让您可以通过网关托管和显示的交互来从付款人处收集付款详细信息。
从 API 版本 72 开始,在您的 your payment service provider 为您启用并配置了 Google Pay 后,它会自动成为付款方式之一。
Web-Services API 集成可让您在自己的结账页提供 Google Pay 付款方式。
在您的集成中添加对 Google Pay 的支持
您可以使用 Web-Services API 将 Google Pay 集成到您的移动应用内或您网站的结账页。
- 在付款确认中,请在 Google Pay API 的
tokenizationSpecification
对象中提供以下参数:
- 令牌化类型 (
type
): 将此项设置为PAYMENT_GATEWAY
- 网关识别码 (
gateway
): 将此项设置为mpgs
- 商家的网关识别码 (
gatewayMerchantId
): 网关在解密付款令牌时可以用于验证和识别商家的唯一商家识别码。 此商家识别码必须与在您的网关的 API 请求中提交的merchantId
相同。
在完成付款人与 Google Pay 用户界面的交互后,将为您提供包含 Google 签发的加密付款令牌的支付信息。 付款令牌将为设备付款或卡付款发放。
您可以指定是否希望 Google Pay API 返回 FPAN 或 DPAN。 如果您的收单行不支持设备付款这可能很有用,这时,您可以通过在 Google Pay API 的allowedPaymentMethods
对象中将allowedAuthMethods
设置为PAN_ONLY
来限制对 FPAN 的支持。 - 令牌化类型 (
- (可选)对付款人进行身份验证: 请在 3DS
Check Enrollment
请求中提供以下字段。
order.walletProvider
=GOOGLE_PAY
sourceOfFunds.provided.card.devicePayment.paymentToken
: 从 Google Pay SDK 获取的加密付款令牌。
网关将解密付款令牌,如果令牌包含 FPAN,3DS
Check Enrollment
请求将继续。 如果付款令牌包含 DPAN,请求将被拒绝(DPAN 不支持 3DS 身份验证)。 有关如何使用 3DS 集成到网关的更多信息,请参见 3DS 支付验证。American Express Payment Gateway 从 Web-Services API v53 版本开始在 Google Pay 中提供 3DS 付款人身份验证。 - 请在
Authorize
/Pay
或Update Session
请求中提供以下字段。
order.walletProvider
=GOOGLE_PAY
order.amount
: 您提供的值必须是订单的最终金额(包括运费及其他金额)。order.currency
sourceOfFunds.provided.card.devicePayment.paymentToken
: 从 Google Pay SDK 获取的加密付款令牌。
sourceOfFunds.provided.card.devicePayment.paymentToken [REST][NVP]
- 网关将验证付款令牌上的签名以确保其为 Google 签发。 验证后,网关将为您解密付款令牌,验证网关识别码(付款令牌上商家的网关识别码),并使用解密数据处理交易。
除标准字段外,使用付款令牌成功授权还会返回以下响应字段。
如果支付信息包含 DPAN(对于设备付款):
sourceOfFunds.provided.card.encryption
=DEVICE
sourceOfFunds.provided.card.deviceSpecificNumber
: 隐藏格式的 DPAN。sourceOfFunds.provided.card.deviceSpecificExpiry.month
sourceOfFunds.provided.card.deviceSpecificExpiry.year
sourceOfFunds.provided.card.number
: 隐藏格式的 FPAN。sourceOfFunds.provided.card.expiry.month
sourceOfFunds.provided.card.expiry.year
sourceOfFunds.provided.card.devicePayment.cryptogramFormat
如果支付信息包含 FPAN(对于 Google Pay 数字钱包付款):
sourceOfFunds.provided.card.encryption
=DIGITAL_WALLET
sourceOfFunds.provided.card.number
: 隐藏格式的 FPAN。sourceOfFunds.provided.card.expiry.month
sourceOfFunds.provided.card.expiry.year
如果您希望在服务器上负责解密付款令牌,请参阅解密付款令牌。
下面是付款令牌由网关解密的 REST 中的 Authorization 请求示例。
URL | 'https://gateway-emea.americanexpress.com/api/rest/version/71/merchant/MADA_DMS_AU/order/810663616/transaction/911988788' |
HTTP 方法 | PUT |
标头 | 'Authorization: Basic bWVyY2hhbnQuTUFEQV9ETVNfQVU6M2RjYTQ2YTU1ODYwNDlmMjhhM2FmZGJmZDEwMGNmNWQ=' |
'{ "apiOperation": "AUTHORIZE", "order": { "amount": "30.10", "currency": "USD", "walletProvider": "GOOGLE_PAY" }, "sourceOfFunds": { "provided": { "card": { "devicePayment": { "paymentToken"{\n \"protocolVersion\" : \"ECv1\",\n \"signature\" : \"MEYCIQCiSE4dCSwpXwJLo1lKYOZNmFyL...\",\n \"signedMessage\" : \"{\\\"encryptedMessage\\\":\\\"gTVbbw8Nsv4kTulngmSVsZijvS5x7sAM9UZiqyaKfjkqxxJ1pkqRvhWBFc4FnEiMm2rjUPlX55e0dUqI00iQwAfePuhrna...\\\",\\\"ephemeralPublicKey\\\":\\\"BKoBQYjYIEYgw9nzA+0Q06FD77ZhrOXQh9yNUX0LasjL2W9eMvWZ0pCGGRzPKZLCtk...\\\",\\\"tag\\\":\\\"fnZGEbpCkXzKU3xhS5u1E3c6OoB6RzkHbhHx58...\\\"}\"\n}" //This is only a sample token and will not pass validation. You should substitute this with an actual payment token returned from Google Pay. //The gateway considers this value to be a string, NOT JSON itself. The parenthesis are a part of the string. } } }, "type": "CARD" }, "device": { "ani": "12341234" }, "transaction": { "source": "INTERNET" } }'
{ "authorizationResponse": { "commercialCard": "123", "commercialCardIndicator": "1", "date": "0314", "financialNetworkCode": "MCC", "posData": "1025104006600", "posEntryMode": "812", "processingCode": "003000", "responseCode": "00", "stan": "45467", "time": "105002", "transactionIdentifier": "906660122", "transactionIntegrityClass": "A1" }, "device": { "ani": "12341234" }, "gatewayEntryPoint": "WEB_SERVICES_API", "merchant": "MADA_DMS_AU", "order": { "amount": 30.10, "authenticationStatus": "AUTHENTICATION_NOT_IN_EFFECT", "certainty": "FINAL", "chargeback": { "amount": 0, "currency": "USD" }, "creationTime": "2023-03-14T10:50:01.524Z", "currency": "USD", "id": "810663616", "lastUpdatedTime": "2023-03-14T10:50:02.092Z", "merchantAmount": 30.10, "merchantCategoryCode": "1234", "merchantCurrency": "USD", "status": "AUTHORIZED", "totalAuthorizedAmount": 30.10, "totalCapturedAmount": 0.00, "totalDisbursedAmount": 0.00, "totalRefundedAmount": 0.00, "walletProvider": "GOOGLE_PAY" }, "response": { "acquirerCode": "00", "acquirerMessage": "Approved", "gatewayCode": "APPROVED", "gatewayRecommendation": "NO_ACTION" }, "result": "SUCCESS", "sourceOfFunds": { "provided": { "card": { "brand": "MASTERCARD", "devicePayment": { "cryptogramFormat": "3DSECURE" }, "deviceSpecificExpiry": { "month": "1", "year": "39" }, "deviceSpecificNumber": "512345xxxxxx0008", "fundingMethod": "UNKNOWN", "number": "xxxxxxxxxxxxxxxx", "scheme": "MASTERCARD", "storedOnFile": "NOT_STORED" } }, "type": "CARD" }, "timeOfLastUpdate": "2023-03-14T10:50:02.092Z", "timeOfRecord": "2023-03-14T10:50:01.625Z", "transaction": { "acquirer": { "batch": 20230314, "date": "0314", "id": "SYSTEST_ACQ_S2I", "merchantId": "12345678", "transactionId": "906660122" }, "amount": 30.10, "authenticationStatus": "AUTHENTICATION_NOT_IN_EFFECT", "authorizationCode": "112233", "currency": "USD", "id": "911988788", "receipt": "307310045467", "source": "INTERNET", "stan": "45467", "terminal": "1111", "type": "AUTHORIZATION" }, "version": "71" }
对付款令牌解密
您可以选择在服务器上解密付款令牌,而不是向网关提供要解密的付款令牌。 这种情况下,您需要负责存储加密凭据并执行解密。
- 付款确认后,将 Google Pay 返回的加密付款令牌提交到您的服务器。
- 使用您的私人密钥在服务器上对付款令牌解密。 请参见此处的解密步骤。
- 在 Authorize/Pay 请求或 Update Session 请求中对应的交易字段内提供解密令牌的付款数据密钥。
- 如果解密的付款令牌包含 DPAN,请提供以下字段:
如果付款令牌包含 DPAN,请勿尝试进行 3DS 付款人身份验证。 网关将拒绝请求,因为 DPAN 在 3DS 身份验证中不受支持。Google Pay JSON 密钥对应的 API 请求字段描述pan sourceOfFunds.provided.card.number 为此交易提供资金的卡的设备特定主要账号 (DPAN)。 expirationMonth sourceOfFunds.provided.card.expiry.month pan 的过期月份。 expirationYear sourceOfFunds.provided.card.expiry.year pan 的过期年份。 authMethod sourceOfFunds.provided.card.
devicePayment.cryptogramFormat密文格式。 将此项设置为 3DSECURE。 cryptogram sourceOfFunds.provided.card.devicePayment.
onlinePaymentCryptogram3DSecure 格式的密文。 eciIndicator sourceOfFunds.provided.card.devicePayment.
eciIndicator提供电子商务指示器 (ECI)(如果有)。 sourceOfFunds.provided.card.nameOnCard (可选)持卡人姓名。 order.currency 交易的 ISO 4217 货币代码。 order.amount 订单金额。 - 如果解密的付款令牌包含 FPAN,您可以选择在执行交易前先对付款人进行身份验证。 若要对付款人进行身份验证,请在 3DS
Check Enrollment
请求中提供以下字段。
order.walletProvider
=GOOGLE_PAY
sourceOfFunds.provided.card.number
: 见下表。
有关如何使用 3DS 集成到网关的更多信息,请参见 3DS 支付验证。
Google Pay JSON 密钥对应的 API 请求字段描述pan sourceOfFunds.provided.card.number 为此交易提供资金的卡的卡号 (FPAN)。 当付款人选择使用保存到其 Google Play 账户的卡支付时支付信息将包含 FPAN。
请注意,对于卡付款,Google Pay API 目前不支持过账 CSC。expirationMonth sourceOfFunds.provided.card.expiry.month pan 的过期月份。 expirationYear sourceOfFunds.provided.card.expiry.year pan 的过期年份。 sourceOfFunds.provided.card.nameOnCard (可选)持卡人姓名。 order.currency 交易的 ISO 4217 货币代码。 order.amount 订单金额。
- 如果解密的付款令牌包含 DPAN,请提供以下字段:
- 除上述字段外,将这些字段包含在 Authorize/Pay 或 Update Session 请求中,并提交到网关。
- transaction.source=INTERNET
- order.walletProvider=GOOGLE_PAY
- device.mobilePhoneModel: (可选)用于发起付款的移动设备的识别码。
- posTerminal.location: 您可以指定
PAYER_TERMINAL_OFF_PREMISES
或PAYER_TERMINAL_ON_PREMISES
。 如果您未提供值,将使用PAYER_TERMINAL_OFF_PREMISES
。
这里是将解密付款令牌的值提供到网关的 REST 中的 Authorization 请求示例。
{ "apiOperation": "AUTHORIZE", "order": { "amount": "30.10", "currency": "INR", "walletProvider": "GOOGLE_PAY" }, "sourceOfFunds": { "provided": { "card": { "expiry": { "month": "01", "year": "39" }, "number": "5123450000000008", "devicePayment": { "cryptogramFormat": "3DSECURE", : { "onlinePaymentCryptogram": "IA/8pdiWftSsxpFT6wABoDABhgA=", "eciIndicator": "20" } } } }, "type": "CARD" }, "device": { "ani": "12341234" }, "transaction": { "source": "INTERNET" } }
{ "authorizationResponse": { "commercialCard": "123", "commercialCardIndicator": "1", "date": "0330", "financialNetworkCode": "MCC", "posData": "1025104006600", "posEntryMode": "812", "processingCode": "003000", "responseCode": "00", "stan": "290026", "time": "220509", "transactionIdentifier": "865442937", "transactionIntegrityClass": "A1" }, "device": { "ani": "12341234" }, "gatewayEntryPoint": "WEB_SERVICES_API", "merchant": "LOVECRAFTS2I", "order": { "amount": 30.10, "authenticationStatus": "AUTHENTICATION_NOT_IN_EFFECT", "certainty": "ESTIMATED", "chargeback": { "amount": 0, "currency": "INR" }, "creationTime": "2022-03-30T22:05:09.395Z", "currency": "INR", "id": "09765d59-cdd8-432c-96c9-d6ae91588251", "lastUpdatedTime": "2022-03-30T22:05:09.857Z", "merchantAmount": 30.10, "merchantCategoryCode": "1234", "merchantCurrency": "INR", "status": "AUTHORIZED", "totalAuthorizedAmount": 30.10, "totalCapturedAmount": 0.00, "totalDisbursedAmount": 0.00, "totalRefundedAmount": 0.00, "walletProvider": "GOOGLE_PAY" }, "response": { "acquirerCode": "00", "acquirerMessage": "Approved", "gatewayCode": "APPROVED" }, "result": "SUCCESS", "sourceOfFunds": { "provided": { "card": { "brand": "MASTERCARD", "devicePayment": { "cryptogramFormat": "3DSECURE" }, "deviceSpecificExpiry": { "month": "1", "year": "39" }, "deviceSpecificNumber": "512345xxxxxx0008", "fundingMethod": "UNKNOWN", "number": "xxxxxxxxxxxxxxxx", "scheme": "MASTERCARD", "storedOnFile": "NOT_STORED" } }, "type": "CARD" }, "timeOfLastUpdate": "2022-03-30T22:05:09.857Z", "timeOfRecord": "2022-03-30T22:05:09.410Z", "transaction": { "acquirer": { "batch": 20220330, "date": "0330", "id": "SYSTEST_ACQ_S2I", "merchantId": "123463", "transactionId": "865442937" }, "amount": 30.10, "authenticationStatus": "AUTHENTICATION_NOT_IN_EFFECT", "authorizationCode": "112233", "currency": "INR", "id": "1", "receipt": "208922290026", "source": "INTERNET", "stan": "290026", "terminal": "CBAS2I02", "type": "AUTHORIZATION" }, "version": "71" }
测试 Google Pay 集成
如果您在解密付款令牌,您必须获得由 Google 审批的集成。 请按照此处 Google 提供的测试说明操作: Android/Web。
不过,在向 Google 提交集成进行审批前,您必须先完成一些测试交易。 您可以使用测试商家配置文件和支持的 DPAN 或 FPAN 测试与网关的集成。 有关更多信息,请参阅使用示例令牌测试。
如果您在测试设备付款(卡保存到 Android 设备中),请使用下表中的支持的 DPAN。
组织 |
DPAN |
过期日期 |
---|---|---|
Visa | 4895370012003478 | 12/2027 |
American Express | 370295136149943 | 12/2027 |
如果您在测试卡付款(卡保存到您的 Google Play 账户中),请使用下表中的支持的 FPAN。
组织 |
FPAN |
过期日期 |
---|---|---|
Visa | 4111111111111111 | 12/2027 |
在您的集成获得 Google 批准后,您必须在上线前执行最终生产验证测试。
如果网关解密付款令牌,您的应用需要将网关 ("mpgs") 指定为 your payment service provider。 需要此信息才能使用网关的公钥对 Google 生成的付款令牌进行加密。
若要执行测试交易,您必须使用正在使用的网关生产商家 ID — 测试网关商家 ID 无法解密付款令牌。
如果这些交易是 APPROVED 或 DECLINED,那么网关可以成功处理您的测试交易。
通过 Google Pay Mobile SDK
Mobile SDK 帮助您开发将通过 American Express Payment Gateway 接受数字付款的移动应用程序(应用)。 网关通过 Mobile SDK 提供 Google Pay 支持。 单击此处获取 Android 平台的 Mobile SDK 集成指南。