Rails 5中没有令牌通过PayPal Express结帐 [英] No Token Passed PayPal Express Checkout in Rails 5
问题描述
我正在将一个具有PayPal Express Checkout功能的基本购物车放在一起.直到我单击签出"按钮,所有内容似乎都可以正常使用,然后我得到一个空白页,上面写着未传递令牌".在服务器日志中,似乎没有创建令牌,但是我不确定为什么.我认为这很可能与Express Checkout令牌的创建有关,但是我真的不确定自己做错了什么. 服务器日志如下所示:
I'm putting together a basic shopping cart with PayPal Express Checkout functionality. Everything appears to be working until I click on the checkout button, then I get a blank page that says "no token passed". In the server logs it appears that no token is being created but I'm not sure why. I think that this is most likely a problem with the creation of the express checkout token but I'm really not sure what I'm doing wrong. Here is what the server log looks like:
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:
Here is my 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:
My 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:
My 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代码:
The Active Merchant code in my development.rb:
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
推荐答案
我刚刚找到此链接,它说明了如何配置
I just found this link it explains how to configure
贝宝快递
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配置,您可以找到指南来聆听:
Then you have the ActiveMerchant cofiguration and you can find guides hear:
https://duckduckgo.com/?q=rails+paypal+active+merchant+gem&atb=v52-6_b&ia=qa
https://spin.atomicobject.com/2011/10/24/integrating-paypal-express-with-rails-3-1-part-1/
这篇关于Rails 5中没有令牌通过PayPal Express结帐的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!