node.js - Braintree with node invalidkeysError
问题描述
我正在我的节点/反应项目中集成 Braintree(目前为沙盒模式)。发送付款有效负载时,我收到错误消息
错误 [invalidKeysError]:这些键无效:paymentMethodNonce[nonce]、paymentMethodNonce[details][expirationMonth]、paymentMethodNonce[details][expirationYear]、paymentMethodNonce[details][bin]、paymentMethodNonce[details][cardType]、paymentMethodNonce[details ] [lastFour]、paymentMethodNonce[details][lastTwo]、paymentMethodNonce[type]、paymentMethodNonce[description]、paymentMethodNonce[binData][prepaid]、paymentMethodNonce[binData][healthcare]、paymentMethodNonce[binData][debit]、paymentMethodNonce[binData ][durbinRegulated]、paymentMethodNonce[binData][commercial]、paymentMethodNonce[binData][payroll]、paymentMethodNonce[binData][issuingBank]、paymentMethodNonce[binData][countryOfIssuance]、paymentMethodNonce[binData][productId]
我用于支付处理的路由控制器:
exports.braintreePayment = async (req, res) => {
let nonceFromClient = req.body.paymentMethodNonce;
let amountFromClient = req.body.amount;
console.log(nonceFromClient)
console.log(typeof amountFromClient)
let newTransaction = gateway.transaction.sale({
amount: amountFromClient,
paymentMethodNonce: nonceFromClient,
options: {
submitForSettlement: true
}
}, (err, result) => {
if (err) {
console.log(err)
res.status(500).json(err)
} else {
res.json(result)
}
})
}
从前端返回的随机数(作为对象)
{
nonce: 'tokencc_bd_n6g4d4_38t2p2_8896c8_dj3wqq_6v2',
details: {
expirationMonth: '12',
expirationYear: '2021',
bin: '411111',
cardType: 'Visa',
lastFour: '1111',
lastTwo: '11'
},
type: 'CreditCard',
description: 'ending in 11',
binData: {
prepaid: 'Unknown',
healthcare: 'Unknown',
debit: 'Unknown',
durbinRegulated: 'Unknown',
commercial: 'Unknown',
payroll: 'Unknown',
issuingBank: 'Unknown',
countryOfIssuance: 'Unknown',
productId: 'Unknown'
}
}
来自客户的金额显示为 204,并以数字形式输入。
我没有看到任何文件说明必须填写所有“错误”字段才能处理付款。关于我正在监督什么的任何线索?
以防万一前端获取调用
export const processTransaction = async (userId, token, paymentData) => {
try {
const braintreeTransaction = await fetch(`http://localhost/api/braintree/payment/${userId}`, {
method: 'POST',
headers: {
Accept: 'application/json',
"Content-Type": 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify(paymentData)
})
return await braintreeTransaction.json();
} catch (err) {
console.log(err)
}
}
前端结账调用
const createPurchase = async () => {
// Send payment information thru nonce to backend
try {
let nonce = await data.instance.requestPaymentMethod()
if (!nonce) return setData({...data, error: nonce.error}) // TODO: set error properly
const paymentData = {
paymentMethodNonce: nonce,
amount: getTotal(products)
}
console.log(paymentData)
let transactionSuccess = await processTransaction(userId, token, paymentData)
console.log(transactionSuccess)
} catch (err) {
console.log(err)
}
}
解决方案
您只需要将 nonce 键(nonce 字段)发送到服务器,而不是整个实例数据。将其更改为“paymentMethodNonce:nonce.nonce”。您的案例中的代码是:
const createPurchase = async () => {
// Send payment information thru nonce to backend
try {
let nonce = await data.instance.requestPaymentMethod()
if (!nonce) return setData({...data, error: nonce.error}) // TODO: set error properly
const paymentData = {
paymentMethodNonce: nonce.nonce,
amount: getTotal(products)
}
console.log(paymentData)
let transactionSuccess = await processTransaction(userId, token, paymentData)
console.log(transactionSuccess)
} catch (err) {
console.log(err)
}
}
推荐阅读
- azure-data-lake - 如何使用 Azure CLI 重命名 Data Lake Gen2 文件夹?
- github - 如何使用 graphql (v4 api) 访问 github 存储库内容?
- javascript - 如何使用 Vuex 设置 Vuetify 数据表中的项?
- asp.net - 如何在包含的 aspx 文件中设置断点?
- python - Jinja2 Network Automation - 增加一个变量(子网+1)
- dialogflow-es - 是否有解决方案可以在本地测试 dialogflow fullfilment 而无需在生产环境中部署?
- sql - 对于两者之间的每个值,两列之间的差异分为单独的行
- mlr - MLR:找不到函数“predict.WrappedModel”
- flask - 用于循环的烧瓶形式
- javascript - 在 .ejs 模板中应用函数