如何通过Google Pay JS API提供网关公钥以解密生成的Token?
Google Pay集成问题解答
1. 什么是「Wallet Request」?
就是你通过Google Pay JavaScript API向Google发起的支付请求结构体,里面包含了Google处理支付所需的所有核心配置(比如支持的卡组织、验证方式、网关信息等)。Google会基于这个请求加密支付数据,并生成对应的Token返回给你。
2. 如何配置网关公钥解决「fluidData.value」无效问题?
你当前的tokenizationSpecification缺少网关公钥参数,这就是网关无法解密Token、提示INVALID_DATA的核心原因。
操作步骤:
- 从CyberSource后台获取你的网关RSA公钥(通常是PEM格式)
- 去掉公钥首尾的
-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----标识,把多行内容合并成一行 - 在
tokenizationSpecification.parameters中添加gatewayPublicKey参数
修改后的代码示例:
const tokenizationSpecification = { type: 'PAYMENT_GATEWAY', parameters: { 'gateway': 'cybersource', 'gatewayMerchantId': '*********', 'gatewayPublicKey': 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...' // 替换成你的公钥内容 } }
Google会用这个公钥加密支付数据,网关侧用对应的私钥解密,即可解决Token解析失败的问题。
3. 完整的Wallet Request配置示例
Wallet Request对应JS API中的paymentDataRequest,需要整合所有必要配置:
const baseRequest = { apiVersion: 2, apiVersionMinor: 0 }; const allowedCardNetworks = ["MASTERCARD", "VISA"]; const allowedCardAuthMethods = ["PAN_ONLY", "CRYPTOGRAM_3DS"]; const tokenizationSpecification = { type: 'PAYMENT_GATEWAY', parameters: { 'gateway': 'cybersource', 'gatewayMerchantId': '*********', 'gatewayPublicKey': '你的公钥内容' } }; const baseCardPaymentMethod = { type: 'CARD', parameters: { allowedAuthMethods: allowedCardAuthMethods, allowedCardNetworks: allowedCardNetworks } }; const cardPaymentMethod = { ...baseCardPaymentMethod, tokenizationSpecification: tokenizationSpecification }; // 最终的Wallet Request const paymentDataRequest = { ...baseRequest, allowedPaymentMethods: [cardPaymentMethod], transactionInfo: { totalPriceStatus: 'FINAL', totalPrice: '10.00', currencyCode: 'USD' // 根据业务调整货币代码 } };
之后你可以用这个paymentDataRequest调用paymentsClient.loadPaymentData(paymentDataRequest)发起支付请求。
额外检查点
- 确保公钥和网关侧的私钥完全配对,不要用错商户的密钥
- 公钥必须是纯Base64编码格式,不能有多余的换行或空格
- 确认网关侧的解密逻辑使用RSA-OAEP算法(Google Pay默认加密方式)
内容的提问来源于stack exchange,提问作者MOJ
相关产品推荐
相关产品推荐

