带有节点invalidkeysError

问题描述

我正在我的节点/反应项目上集成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'
  }
}

来自客户的金额显示为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,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)
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...