ruby-on-rails - 没有 token 通过 Rails 5 中的 PayPal 快速结帐

标签 ruby-on-rails ruby activemerchant paypal

我正在组装一个具有 PayPal Express Checkout 功能的基本购物车。一切似乎都正常,直到我点击结账按钮,然后我得到一个空白页面,上面写着“没有 token 通过”。在服务器日志中似乎没有创建 token ,但我不确定为什么。我认为这很可能是创建快速结帐 token 时出现的问题,但我真的不确定自己做错了什么。 这是服务器日志的样子:

Started GET "/express_checkout" for 10.240.0.204 at 2017-05-27 16:54:43 +0000
Cannot render console from 10.240.0.204! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by OrdersController#express_checkout as HTML
  Order Load (0.1ms)  SELECT  "orders".* FROM "orders" WHERE "orders"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  OrderItem Load (0.1ms)  SELECT "order_items".* FROM "order_items" WHERE "order_items"."order_id" = ?  [["order_id", 1]]
  Product Load (0.2ms)  SELECT  "products".* FROM "products" WHERE "products"."active" = ? AND "products"."id" = ? LIMIT ?  [["active", true], ["id", 1], ["LIMIT", 1]]
Redirected to https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=
Completed 302 Found in 615ms (ActiveRecord: 0.5ms)

这是我的 Order.rb:

class Order < ApplicationRecord
  has_many :order_items
  before_save :update_subtotal

  def subtotal
    order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.unit_price) : 0 }.sum
  end

  def purchase
    response = EXPRESS_GATEWAY.purchase(order.total, express_purchase_options)
    order.update_attribute(:purchased_at, Time.now) if response.success?
    response.success?
  end

  def express_token=(token)
      self[:express_token]=token
      if new_record? && !token.blank?
        details = EXPRESS_GATEWAY.details_for(token)
        self.express_payer_id = details.payer_id
      end
  end 

private

  def update_subtotal
    self[:subtotal] = subtotal
  end

  def express_purchase_options
    {
      :ip => ip,
      :token => express_token,
      :payer_id => express_payer_id
    }
  end
end

我的 orders_controller.rb:

class OrdersController < ApplicationController

    def express_checkout
        @order = current_order
        response = EXPRESS_GATEWAY.setup_purchase(@order.subtotal,
        ip: request.remote_ip,
        return_url: 'carts/show',
        cancel_return_url: 'carts/cancel',
        currency: "USD",
        allow_guest_checkout: true,
        items: [{name: "Order", description: "Order description", quantity: "1", amount: @order.subtotal}]
    )
        redirect_to EXPRESS_GATEWAY.redirect_url_for(response.token)
    end

def new
    @order = Order.new(:express_token => params[:token])
end

def create
    @order = current_order.create!(order_params)
    @order.ip = request.remote_ip
    if @order.save
        if @order.purchase
            redirect_to order_url(@order)
        else
            render :action => "failure"
        end
    else
        render :action => 'new'
    end
end

private
def order_params
  params.require(:order).permit(:subtotal, :total, :ip, :express_token, :express_payer_id)
end
end

我的 application_controller.rb:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  helper_method :current_order

  def current_order
    if !session[:order_id].nil?
      Order.find(session[:order_id])
    else
      Order.new(order_params)
    end
  end

end

我的 development.rb 中的 Active Merchant 代码:

config.after_initialize do
ActiveMerchant::Billing::Base.mode = :test
paypal_options = {
  login: "merchant_api1.christianorourke.com",
  password: ************,
  signature: ***************************
}
::EXPRESS_GATEWAY = ActiveMerchant::Billing::PaypalExpressGateway.new(paypal_options)
  end

我的路线文件:

Rails.application.routes.draw do

  root "products#index"
  resources :products, only: [:index]
  resource :cart, only: [:show]
  resources :order_items, only: [:create, :update, :destroy]
  get 'express_checkout', to: 'orders#express_checkout'
  resources :orders do 
    collection do
      post 'express_checkout'
    end
  end
end

最佳答案

我刚找到这个链接,它解释了如何配置

paypal-express

https://github.com/nov/paypal-express/wiki

paypal_options = {
  no_shipping: true, # if you want to disable shipping information
  allow_note: false, # if you want to disable notes
  pay_on_paypal: true # if you don't plan on showing your own confirmation step
}

request = Paypal::Express::Request.new(
  :username   => SET_YOUR_OWN,
  :password   => SET_YOUR_OWN,
  :signature  => SET_YOUR_OWN
)
payment_request = Paypal::Payment::Request.new(
  :currency_code => :JPY,   # if nil, PayPal use USD as default
  :description   => FOO,    # item description
  :quantity      => 1,      # item quantity
  :amount        => 1.00,   # item value
  :custom_fields => {
    CARTBORDERCOLOR: "C00000",
    LOGOIMG: "https://example.com/logo.png"
  }
)
response = request.setup(
  payment_request,
  YOUR_SUCCESS_CALLBACK_URL,
  YOUR_CANCEL_CALLBACK_URL,
  paypal_options  # Optional
)
response.redirect_uri

然后你有 ActiveMerchant 配置,你可以找到指南听到:

https://duckduckgo.com/?q=rails+paypal+active+merchant+gem&atb=v52-6_b&ia=qa

How to integrate Paypal with Ruby on Rails

https://spin.atomicobject.com/2011/10/24/integrating-paypal-express-with-rails-3-1-part-1/

关于ruby-on-rails - 没有 token 通过 Rails 5 中的 PayPal 快速结帐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44219571/

相关文章:

mysql - 如何在 Rails 中编写代码以在 SQL 中运行我想要的查询

ruby-on-rails - "The Ruby way"(mixins 和类重新打开)与依赖注入(inject)

ruby-on-rails - 如何使用 ActiveMerchant 进行 Paypal 网站支付标准?

ruby-on-rails - Rails 测试,仅针对某些测试进行设置

javascript - Rails 呈现部分 Ajax 错误但正确响应显示在调试器中

java - Pentaho Acegi 安全框架摘要式身份验证和 Ruby on Rails

Ruby - Digest::Digest 已弃用;使用摘要

Ruby 类实例变量和继承

ruby-on-rails - 在 Heroku 上的 Rails 中为 Authorize.net AIM API 使用自定义证书

ruby-on-rails - ActiveMerchant 支持确定 PayPal Express Checkout 客户/买家的帐户状态(已验证/未验证)