Ruby on rails RubyonRails贝宝RESTAPI来宾签出
我正在尝试调试另一个开发人员的Rails应用程序。请记住,我对Ruby和Rails都没有多少经验。目标是允许用户在进入PayPal支付页面时使用信用卡支付,而无需注册 model/shopping card.rb中的实际代码是:Ruby on rails RubyonRails贝宝RESTAPI来宾签出,ruby-on-rails,ruby,paypal,payment-processing,Ruby On Rails,Ruby,Paypal,Payment Processing,我正在尝试调试另一个开发人员的Rails应用程序。请记住,我对Ruby和Rails都没有多少经验。目标是允许用户在进入PayPal支付页面时使用信用卡支付,而无需注册 model/shopping card.rb中的实际代码是: include PayPal::SDK::REST class ShoppingCart def initialize(session) @session = session @session["delivery"] ||= "shipping"
include PayPal::SDK::REST
class ShoppingCart
def initialize(session)
@session = session
@session["delivery"] ||= "shipping"
@session[:coupon] ||= {"token" => nil, "discount" => nil}
@session[:shopping_cart] ||= []
end
def delivery=(v)
@session["delivery"] = v
end
def delivery
@session["delivery"]
end
def should_add_shipping_costs?
@session["delivery"] == "shipping"
end
def cart
@session[:shopping_cart]
end
def discount
val = @session["coupon"]["discount"]
if val.nil?
nil
else
val.to_f
end
end
def token
@session["coupon"]["token"]
end
def coupon=(c)
@session["coupon"]["token"] = c.try("token")
@session["coupon"]["discount"] = c.try("discount")
end
def subtotal_discount
subtotal.to_f / 100 * discount.to_f
end
def subtotal_after_discount
[(subtotal.to_f - subtotal_discount), 0].max
end
def subtotal_after_discount_with_vat
subtotal_after_discount + subtotal_after_discount / 100 * 21
end
def add(product, quantity)
quantity = quantity.to_i
index = cart.find_index do |item|
item["id"] == product.id
end
# Not in chart
if index.nil?
item = product.to_cart
item[:quantity] = quantity
cart << item
else
item = cart[index]
item["quantity"] = item["quantity"].to_i + quantity
end
end
def remove(id)
cart.delete_if do |item|
item["id"].to_s == id.to_s
end
end
def clear
cart.clear
end
def each(&block)
cart.each(&block)
end
def each_with_index(&block)
cart.each_with_index(&block)
end
def empty?
cart.empty?
end
def to_paypal
f = cart.map do |item|
{
name: item["name"],
price: "%.2f" % item["price_or_promo"],
quantity: item["quantity"],
currency: "EUR",
}
end
f
end
def subtotal
amount = 0
each do |item|
amount += item["price_or_promo"].to_f * item["quantity"].to_i
end
"%.2f" % amount
end
def total_iva
subtotal.to_f * 0.21
end
def total_for(user)
t = subtotal_after_discount.to_f + total_iva + surcharge_for(user)
if self.should_add_shipping_costs?
t + shipping_cost
else
t
end
end
def surcharge_for(user)
user.surcharge ? subtotal.to_f * 0.052 : 0
end
def shipping_cost
total = 0
each do |item|
total += (item['shipping'].to_f * item['quantity'].to_i)
end
total
end
def create_payment(description, user)
payment = Payment.new({
:intent => :sale,
:payer => {
:payment_method => :paypal
},
:redirect_urls => {
:return_url => ENV['PAYPAL_RETURN_URL'],
:cancel_url => ENV['PAYPAL_CANCEL_URL']
},
:transactions => [{
:item_list => {
:items => {
:name => description,
:price => "%.2f" % total_for(user),
:quantity => 1,
:currency => "EUR"
}
},
:amount => {
:total => "%.2f" % total_for(user),
:currency => "EUR"
},
:description => description
}],
})
if payment.create
@session[:payment_id] = payment.id
end
payment
end
def build_order
order = Order.new(user_id: @session[:user_id])
each do |item|
order.operations << Operation.new(
product_id: item["id"],
quantity: item["quantity"].to_i
)
end
order
end
def complete_payment(params)
payment = Payment.find(@session[:payment_id])
if payment.execute(payer_id: params[:PayerID])
build_order.save!
@session[:payment] = nil
@session[:coupon] = nil
clear
end
if(coupon = Coupon.find_by(token: token))
coupon.used = true
coupon.save!
end
payment
end
end
包括PayPal::SDK::REST
类购物车
def初始化(会话)
@会话=会话
@会话[“交付”]| |=“装运”
@会话[:优惠券]| |={“代币”=>nil,“折扣”=>nil}
@会话[:购物车]| |=[]
结束
def交付=(v)
@会话[“传递”]=v
结束
def输送
@会议[“交付”]
结束
def是否应添加运输成本?
@会话[“传送”]=“传送”
结束
def车
@会话[:购物车]
结束
def折扣
val=@session[“优惠券”][“折扣”]
如果val.nil?
无
其他的
瓦尔·托夫
结束
结束
def令牌
@会话[“优惠券”][“代币”]
结束
def优惠券=(c)
@会话[“优惠券”][“代币”]=c.try(“代币”)
@会话[“优惠券”][“折扣”]=c.try(“折扣”)
结束
def小计折扣
小计.至_f/100*折扣.至_f
结束
def折扣后小计
[(小计.至-小计折扣),0].max
结束
def小计(含增值税的折扣后)
折扣后小计+折扣后小计/100*21
结束
def添加(产品、数量)
数量=数量。至_i
index=cart.find_index do| item|
项目[“id”]==产品id
结束
#不在图表中
如果index.nil?
项目=产品到购物车
物料[:数量]=数量
购物车:出售,
:付款人=>{
:付款方式=>:贝宝
},
:重定向\u URL=>{
:return\u url=>ENV['PAYPAL\u return\u url'],
:cancel\u url=>ENV['PAYPAL\u cancel\u url']
},
:交易=>[{
:项目列表=>{
:项目=>{
:name=>description,
:价格=>“%.2f”%total_(用户),
:数量=>1,
:货币=>“欧元”
}
},
:金额=>{
:total=>“%.2f”%total\u(用户),
:货币=>“欧元”
},
:description=>description
}],
})
如果付款。创建
@会话[:payment\u id]=payment.id
结束
付款
结束
def生成顺序
order=order.new(user\u id:@session[:user\u id])
每个do |项目|
order.operations因此,最后,与PP交谈时,必须启用信用卡选项,检查PP帐户设置上的选项。即使这样,该选项也仅适用于“易购买家”
include PayPal::SDK::REST
class PaymentsController < ApplicationController
def checkout
@payment = shopping_cart.create_payment("Cultius Purchase", current_user)
if @payment.success?
redirect_to @payment.links.find{|v| v.method == "REDIRECT" }.href
else
logger.error "Error while creating payment:"
logger.error @payment.error.inspect
end
end
def success
shopping_cart.complete_payment(params)
end
end