问题描述
我正在我的节点/反应项目上集成Braintree(目前为沙盒模式)。发送付款有效载荷时,我收到错误提示
错误[invalidKeysError]:这些密钥无效:paymentMethodNonce [nonce],paymentMethodNonce [details] [expirationMonth],paymentMethodNonce [details] [expirationYear],paymentMethodNonce [details] [bin],paymentMethodNonce [details] [cardType], paymentMethodNonce [详细信息] [lastFour],paymentMethodNonce [details] [lastTwo],paymentMethodNonce [type],paymentMethodNonce [description],paymentMethodNonce [binData] [prepaid],paymentMethodNonce [binData] [healthcare],paymentMethodNonce [binData] [debit],paymentMethodNonce [binData] [杜宾调节] ,paymentMethodNonce [binData] [商业],paymentMethodNonce [binData] [工资单],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'
}
}
我没有看到任何文档说明必须填写所有“错误”字段才能处理付款。关于我正在监督的事情有什么线索吗?
以防万一前端获取呼叫
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,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)
}
}