Braintree AJAX Drop-In Ошибки отправки - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь сделать так, чтобы платежный шлюз платежной системы Брэйнтри работал нормально. (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, и я понятия не имею, почему. Я проверял их, и они есть в журнале.

Как мне заставить это работать должным образом, учитывая, что я отправил все необходимое? Любое понимание приветствуется.

...