Braintree с ошибкой node invalidkeysError

#node.js #reactjs #braintree #braintree-sandbox

#node.js #reactjs #braintree #braintree-песочница

Вопрос:

Я интегрирую Braintree (пока в режиме изолированной среды) в свой проект node / react. При отправке полезной нагрузки платежа я получаю сообщение об ошибке

Ошибка [invalidKeysError]: эти ключи недействительны: paymentMethodNonce[одноразовый номер], paymentMethodNonce[детали] [Месяц истечения срока действия], paymentMethodNonce[детали] [Год истечения срока действия], paymentMethodNonce[детали] [bin], paymentMethodNonce[детали][CardType], paymentMethodNonce[детали] [ lastFour], paymentMethodNonce [детали] [lastwo], paymentMethodNonce [тип], paymentMethodNonce[описание], paymentMethodNonce [Привязанные данные] [предоплаченные], paymentMethodNonce [Привязанные данные] [здравоохранение], paymentMethodNonce [Привязанные данные] [дебет], paymentMethodNonce [Привязанные данные] [дебет], paymentMethodNonce [Привязанные данные] [durbinRegulated] , paymentMethodNonce [Привязанные данные] [коммерческие], Метод оплаты один раз [Привязанные данные] [платежная ведомость], Метод оплаты один раз [Привязанные данные] [Банк-эмитент], Метод оплаты один раз [Привязанные данные] [Страна выдачи], Метод оплаты один раз [Привязанные данные] [Идентификатор продукта]

Мой контроллер маршрута для обработки платежей:

 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)
    }
}
  

Внешний вызов chekout

 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)
        }
    }
  

Ответ №1:

Вам просто нужно отправить на сервер только одноразовый ключ (одноразовое поле), а не все данные экземпляра. Измените его на «paymentMethodNonce: одноразовый номер.одноразовый номер». Код в вашем случае является:

 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)
    }
}