首页 > 解决方案 > 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)
        }
    }

标签: node.jsreactjsbraintreebraintree-sandbox

解决方案


您只需要将 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)
    }
}

推荐阅读