Как исправить ошибку javascript braintree"t.getVersion не является функцией" в последней версии
Получаю ошибку TypeError: t.getVersion is not a function
, Я искал только решение я нашел об использовании обновленной версии Брэйнтри-сети здесь. В моем случае я использую3.60.0
, но все равно получаю сообщение об ошибке, когда добавляю braintree.dataCollector.create
.
https://js.braintreegateway.com/web/3.60.0/js/client.min.js
https://js.braintreegateway.com/web/3.60.0/js/data-collector.min.js
https://js.braintreegateway.com/web/dropin/1.22.1/js/dropin.min.js
var form = document.querySelector('#payment-form');
var client_token = "<?php echo $clientToken;?>";
braintree.dropin.create({
authorization: client_token,
container: '#dropin-container',
paypal: {
flow: 'vault'
}
}, function (createErr, instance) {
if (createErr) {
console.log('Create Error', createErr);
return;
}
form.addEventListener('submit', function (event) {
event.preventDefault();
braintree.dataCollector.create({
client: instance,
paypal: true
}, function (err, dataCollectorInstance) {
if (err) {
return;
}
document.querySelector('#device').value = dataCollectorInstance.deviceData;
});
instance.requestPaymentMethod(function (err, payload) {
if (err) {
console.log('Request Payment Method Error', err);
return;
}
// Add the nonce to the form and submit
document.querySelector('#nonce').value = payload.nonce;
form.submit();
});
});
});
2 ответа
Я начинал, пытаясь реализовать простой пример Drop In, и столкнулся с той же проблемой! Я знаю, что вы разместили вопрос некоторое время назад, но это может помочь любому, кто столкнется с этим вопросом, как и я.
Ключ к разгадке был ответом @Simon_Weaver на вопрос Braintree PayPal checkout: "e.client.getVersion не является функцией", и эти две строчки...
Оказывается, экземпляр НЕ является клиентским объектом. Это объект Dropin;-) Он создает своего собственного клиента, хранящегося в частной собственности _client.
Вместо этого мне нужно было сделать braintree.client.create(...), чтобы получить настоящий объект Client.
К сожалению, @Simon_Weaver не предоставил надлежащего примера и "обманул".
По сути, вам нужно создать отдельный
clientInstance
и передав это при создании
dataCollector
вместо
instance
var form = document.querySelector('#payment-form');
var client_token = "<?php echo $clientToken;?>";
braintree.client.create({
authorization: client_token
}, function(err, clientInstance) { // this is the client instance we need when creating a `dataCollector`
braintree.dataCollector.create({
client: clientInstance, // `clientInstance` not dropIn `instance`
paypal: true
}, function (err, dataCollectorInstance) {
if (err) {
return;
}
document.querySelector('#device').value = dataCollectorInstance.deviceData;
});
/* ... rest of the `braintree.dropin.create`
just without the above `braintree.dataCollector.create` stuff in the submit handler...
*/
braintree.dropin.create({
authorization: client_token,
container: '#dropin-container',
paypal: {
flow: 'vault'
}
}, function (createErr, instance) {
if (createErr) {
console.log('Create Error', createErr);
return;
}
form.addEventListener('submit', function (event) {
event.preventDefault();
instance.requestPaymentMethod(function (err, payload) {
if (err) {
console.log('Request Payment Method Error', err);
return;
}
// Add the nonce to the form and submit
document.querySelector('#nonce').value = payload.nonce;
form.submit();
});
});
});
});
Я также переместил инициализацию
dataCollector
вне обработчика отправки формы - тогда не нужно делать все это.
*** Это не было проверено, но должно помочь вам двигаться в правильном направлении ***
Может быть, немного поздно для этого... но для Drop-In UI должно быть достаточно включения объекта dataCollector в ваш вызов create и последующего получения данных устройства из полезной нагрузки:
var form = document.getElementById('my-form-id');
var deviceDataInput = form['device_data'];
var nonceInput = form['payment_method_nonce'];
braintree.dropin.create({
authorization: 'CLIENT_AUTHORIZATION',
container: '#dropin-container',
dataCollector: true
}, function (createErr, instance) {
if (deviceDataInput == null) {
deviceDataInput = document.createElement('input');
deviceDataInput.name = 'device_data';
deviceDataInput.type = 'hidden';
form.appendChild(deviceDataInput);
}
button.addEventListener('click', function () {
instance.requestPaymentMethod(function (requestPaymentMethodErr, payload) {
deviceDataInput.value = payload.deviceData;
nonceInput.value = payload.nonce;
});
});
});