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