Rails PayPal Checkout SDK сохраняет тело запроса в представлении вместо контроллера - PullRequest
0 голосов
/ 04 августа 2020

Я использую Rails 5.2, и в настоящее время у меня есть такая настройка PayPal Checkout:

Просмотр:

paypal.Buttons({
      
      env: "#{ENV['PAYPAL_ENV']}",

      createOrder: async () => {
        const response = await fetch('/create_order', {method: 'POST'});
        const responseData = await response.json();
        return responseData.token;
      },

Контроллер:

def create_order
    price = '100.00'
   
    request = PayPalCheckoutSdk::Orders::OrdersCreateRequest::new
    request.request_body({
      :intent => 'CAPTURE',
      :purchase_units => [
        {
          :amount => {
            :currency_code => 'USD',
            :value => price
          }
        }
      ]
    })
    begin
      response = @client.execute request
      order = Order.new(order_params)
      order.price_cents = price.to_i
      order.token = response.result.id
      if order.save
        return render :json => {:token => response.result.id}, :status => :ok
      end
    rescue PayPalHttp::HttpError => ioe
      return render html: ERROR_MESSAGE
    end
  end

НО. .. Я бы предпочел обработать тело запроса в JavaScript так:

 createOrder: function(data, actions) {
      
      return actions.order.create({
        
        purchase_units: [{
          amount: {
            value: document.getElementById('payprice').value
          }
        }]
      });
      
    },

Как мне настроить мой контроллер, чтобы он по-прежнему выдавал мне токен PayPal ... но он принимает тело запроса из JavaScript в представлении вместо того, как он настроен сейчас? Или ... если это не так ... Как я могу получить данные формы из представления (цены) в контроллер, чтобы заменить "цену", которая там есть?

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Preston PHX заслуживает большой похвалы за то, что указал мне правильное направление ... но именно мой друг Гэри решил эту маленькую дилемму за два часа go:

просмотр:

 paypal.Buttons({
      
      env: "#{ENV['PAYPAL_ENV']}",
      createOrder: async () => {
        const response = await fetch('/create_order', {method: 'POST',
    headers: {'Content-Type': 'application/json'}, 
    body: JSON.stringify({"price" : document.getElementById('amount').value})
  });
        const responseData = await response.json();
        return responseData.token;
      },

контроллер:

def create_order
    price = params[:amount]
    request = PayPalCheckoutSdk::Orders::OrdersCreateRequest::new
    request.request_body({
      :intent => 'CAPTURE',
      :purchase_units => [
        {
          :amount => {
            :currency_code => 'USD',
             :value => price
          }
        }
      ]
    })

И все. Это полностью отвечает на вопрос о том, как ввести цену в контроллер ... и как получить цену из формы в javascript, чтобы она была отправлена ​​в контроллер.

Меня поражает, что после месяца поисков я ни разу не встретил ни одного упоминания о том, как это сделать. Я предполагаю, что существует МНОГО приложений, в которых вы хотите, чтобы пользователь сам выбирал сумму, которую он собирается платить, и валюту.

0 голосов
/ 04 августа 2020

Кажется, вы хотите, чтобы ваш код JS вызывал ваш код Ruby для получения токена заказа - и, возможно, позже, чтобы зафиксировать транзакцию после утверждения.

Вам нужен сервер - боковой шаблон интеграции, например: https://developer.paypal.com/demo/checkout/# / pattern / server

Затем вам нужно будет создать два маршрута на вашем сервере, которые может вызывать ваш код JS, и указать его на им.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...