Я пытаюсь сделать так, чтобы платежный шлюз платежной системы Брэйнтри работал нормально. (https://developers.braintreepayments.com/guides/drop-in/overview/javascript/v3) Я использую следующее как единственное Ruby
руководство, которое они публикуют, которое является Rails
приложением, а не чистым Ruby
(я использую Sinatra
): https://github.com/braintree/braintree_rails_example
Я достиг прогресса в этом вопросе: в форме Pay with card отображаются оба значения: Номер карты и Дата истечения срока действия . Больше ничего так что это означает, что client_token
генерируется, который генерирует эту форму. Я заполняю поля карты и срок действия, затем нажимаю кнопку Запросить способ оплаты , чтобы отправить форму. Он знает, что это карта VISA, затем исчезает, выдает ошибку, затем на /checkout
, что является пустым.
Сначала мой JavaScript
:
var form = document.querySelector('#payment-form');
var client_token = "<%= @client_token %>";
var button = document.querySelector('#submit-button');
braintree.dropin.create({
authorization: '<%= @client_token %>',
container: '#dropin-container'
}, function (createErr, instance) {
button.addEventListener('click', function () {
instance.requestPaymentMethod(function (requestPaymentMethodErr, payload) {
// Submit payload.nonce to your server
console.log("line 59 JS dropin.create")
console.log("payload.nonce: " + payload.nonce); // this works
document.querySelector('#nonce').value = payload.nonce;
form.submit();
$.post( '/checkout', {'paymentMethodNonce': payload.nonce} ).done(function(result) {
console.log("done!");
instance.teardown(function (teardownErr) { // Tear down the Drop-in UI
if (teardownErr) {
console.error('Could not tear down Drop-in UI!');
} else {
console.info('Drop-in UI has been torn down!');
$('#submit-button').remove(); // Remove the 'Submit payment' button
}
if (result.success) {
$('#checkout-message').html('<h1>Success</h1><p>Your Drop-in UI is working! Check your <a href="https://sandbox.braintreegateway.com/login">sandbox Control Panel</a> for your test transactions.</p><p>Refresh to try another transaction.</p>');
} else {
console.log(result);
$('#checkout-message').html('<h1>Error</h1><p>Check your console.</p>');
}
}); // teardown
}); // $.post
});
});
});
Мой /checkout
route
:
post "/checkout" do
puts
puts
puts "Params at post /checkout 61: #{ params.inspect }"
amount = params['amount']
puts "amount: #{ amount } / #{ amount.class }" if $t
nonce_from_the_client = params['payment_method_nonce']
puts "nonce at server /checkout 65 and amount: #{ nonce_from_the_client } / #{ amount }"
sleep 3
gateway = Braintree::Gateway.new(
:environment => BT_ENVIRONMENT,
:merchant_id => BT_MERCHANT_ID,
:public_key => BT_PUBLIC_KEY,
:private_key => BT_PRIVATE_KEY)
puts
puts "gateway 74: #{ gateway.inspect }"
result = gateway.transaction.sale(
amount: amount,
payment_method_nonce: nonce_from_the_client,
options: {
submit_for_settlement: true
}
)
puts
puts "result 86: #{ result.inspect }"
if result.success? || result.transaction
puts "redirect 84"
@res = result.transaction
# redirect_to checkout_path(result.transaction.id)
else
error_messages = result.errors.map { |error| "Error: #{ error.code }: #{ error.message }" }
puts error_messages
end
puts "Transaction result: #{ result.inspect }"
# erb :braintree_checkout, :layout => false
puts "#############################################################"
end
В журнале показано, что /checkout
посещается минимум минимум дважды, при этом nonce
не имеет значения. Тогда amount
здесь не имеет значения в этом пробном журнале, в итоге получая полный parameters
, который запускает функцию обратного вызова done()
(я понятия не имел, что это ударит его более одного раза):
App 19342 output: Params at post /checkout 61: {"amount"=>"10", "payment_method_nonce"=>""}
App 19342 output: amount: 10 / String
App 19342 output: nonce at server /checkout 65 and amount: / 10
App 19356 output:
App 19356 output:
App 19356 output: Params at post /checkout 61: {"paymentMethodNonce"=>"55008c69-15a5-0f69-60d7-c914471dd70e"}
App 19356 output: amount: / NilClass
App 19356 output: nonce at server /checkout 65 and amount: /
App 19363 output:
App 19363 output:
App 19363 output: Params at post /checkout 61: {"amount"=>"10", "payment_method_nonce"=>"55008c69-15a5-0f69-60d7-c914471dd70e"}
App 19363 output: amount: 10 / String
App 19363 output: nonce at server /checkout 65 and amount: 55008c69-15a5-0f69-60d7-c914471dd70e / 10
Быстро появляется сообщение Error. Check your console.
, которое по какой-то причине переходит к /checkout
URI. Ничто не просит систему сделать это, поскольку /checkout
специально для вызова AJAX
, а не для пункта назначения. В console
ничего нет, поскольку он стирается, когда браузер переходит на /checkout
.
Итак, в журнале nginx
есть отзывы:
App 21232 output: gateway 74: #<Braintree::Gateway:0x00007ffd9493b5e0 @config=#<Braintree::Configuration:0x00007ffd9493b5b8 @custom_user_agent=nil, @endpoint=nil, @http_open_timeout=nil, @http_read_timeout=nil, @logger=nil, @merchant_id="6q2mkkkmmpvdjh66", @public_key="svpnrj7sd52n9wq8", @private_key="[FILTERED]", @environment=:sandbox, @proxy_address=nil, @proxy_port=nil, @proxy_user=nil, @proxy_pass=nil, @ssl_version=nil>>
App 21246 output:
App 21246 output: gateway 74: #<Braintree::Gateway:0x00007ffd9493b928 @config=#<Braintree::Configuration:0x00007ffd9493b900 @custom_user_agent=nil, @endpoint=nil, @http_open_timeout=nil, @http_read_timeout=nil, @logger=nil, @merchant_id="6q2mkkkmmpvdjh66", @public_key="svpnrj7sd52n9wq8", @private_key="[FILTERED]", @environment=:sandbox, @proxy_address=nil, @proxy_port=nil, @proxy_user=nil, @proxy_pass=nil, @ssl_version=nil>>
App 21253 output:
App 21253 output: gateway 74: #<Braintree::Gateway:0x00007ffd9493bdd8 @config=#<Braintree::Configuration:0x00007ffd9493bd10 @custom_user_agent=nil, @endpoint=nil, @http_open_timeout=nil, @http_read_timeout=nil, @logger=nil, @merchant_id="6q2mkkkmmpvdjh66", @public_key="svpnrj7sd52n9wq8", @private_key="[FILTERED]", @environment=:sandbox, @proxy_address=nil, @proxy_port=nil, @proxy_user=nil, @proxy_pass=nil, @ssl_version=nil>>
App 21232 output: I, [2019-03-10T09:34:25.909295 #21232] INFO -- : [Braintree] [10/Mar/2019 13:34:25 UTC] POST /merchants/6q2mkkkmmpvdjh66/transactions 422
App 21232 output:
App 21232 output: result 86: #<Braintree::ErrorResult params:{...} errors:<transaction:[(91508) Cannot determine payment method.]>>
App 21232 output: Error: 91508: Cannot determine payment method.
App 21232 output: Transaction result: #<Braintree::ErrorResult params:{...} errors:<transaction:[(91508) Cannot determine payment method.]>>
App 21232 output: #############################################################
App 21232 output: 127.0.0.1 - - [10/Mar/2019:09:34:25 -0400] "POST /checkout HTTP/1.1" 200 - 3.6112
App 21246 output: I, [2019-03-10T09:34:26.010203 #21246] INFO -- : [Braintree] [10/Mar/2019 13:34:26 UTC] POST /merchants/6q2mkkkmmpvdjh66/transactions 422
App 21246 output:
App 21246 output: result 86: #<Braintree::ErrorResult params:{...} errors:<transaction:[(81502) Amount is required., (91508) Cannot determine payment method.]>>
App 21246 output: Error: 81502: Amount is required.
App 21246 output: Error: 91508: Cannot determine payment method.
App 21246 output: Transaction result: #<Braintree::ErrorResult params:{...} errors:<transaction:[(81502) Amount is required., (91508) Cannot determine payment method.]>>
App 21246 output: #############################################################
App 21246 output: 127.0.0.1 - - [10/Mar/2019:09:34:26 -0400] "POST /checkout HTTP/1.1" 200 - 3.6034
По какой-то причине он создает три шлюза (я думаю, по одному на nonce
пробную версию), а затем выдает ошибку gateway.transaction.sale
, указывая, что он не знает способ оплаты транзакции. Но это то, что определяет nonce
, поскольку он определяет тип карты. VISA отображается в форме и повторно отображается в процессе отправки. Очевидно, какой тип оплаты я использую. nonce
задается в форме и отправляется для продолжения. Таким образом, amount
, card no
и nonce
отправляются с формой в виде от POST
до /submit
. По некоторым причинам payment method
и amount
неизвестны для gateway.transaction.sale
, и я понятия не имею, почему. Я проверял их, и они есть в журнале.
Как мне заставить это работать должным образом, учитывая, что я отправил все необходимое? Любое понимание приветствуется.