350 lines
10 KiB
Ruby
350 lines
10 KiB
Ruby
# -*- encoding : utf-8 -*-
|
|
|
|
class Public::OrdersController < ApplicationController
|
|
|
|
layout "ebook"
|
|
skip_before_filter :verify_authenticity_token, :only => [:ipn]
|
|
|
|
def new
|
|
@order = Order.new
|
|
|
|
end
|
|
|
|
def create
|
|
@order = Order.new(params.require(:order).permit!)
|
|
@order.order_products << OrderProduct.new(:name => "Observer et photographier la faune sans déranger", :description => "Exemplaire personnel", :price => 10.0, :slug => "observer-et-photographier-la-faune-sans-deranger")
|
|
if @order.save
|
|
respond_to do |format|
|
|
format.html { redirect_to paid_by_paypal_public_order_path(@order.token)}
|
|
|
|
format.js { }
|
|
end
|
|
else
|
|
render :action => :new
|
|
end
|
|
end
|
|
|
|
def download
|
|
@order = Order.find_by_token(params[:id])
|
|
|
|
if @order and @order.paid
|
|
if params[:file] == "pdf"
|
|
@order.downloads_count = @order.downloads_count.to_i+1
|
|
@order.save
|
|
|
|
|
|
@temp_file = "#{Rails.root}/pdf/#{@order.token}_temp.pdf"
|
|
@final_file = "#{Rails.root}/pdf/#{@order.token}.pdf"
|
|
spacing = 5
|
|
|
|
pdf = WickedPdf.new.pdf_from_string("<br />",
|
|
:no_background => true,
|
|
:page_size => "A4",
|
|
|
|
:footer => {:spacing => 19, :content => "<html><body style='background:transparent;'><p style='text-align:right;font-family:arial;font-size:10px; color:#E2E4E6;'> Exemplaire personnel de #{@order.firstname} #{@order.name}</p></body></html>" },
|
|
:margin => {
|
|
:top => 0,
|
|
:bottom => 30,
|
|
:left =>20,
|
|
:right => 13
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
File.open(@temp_file, 'wb') do |file|
|
|
file << pdf
|
|
end
|
|
|
|
|
|
require 'posix/spawn'
|
|
|
|
|
|
|
|
child = ::POSIX::Spawn::Child.new 'pdftk', Rails.root.to_s+'/pdf/plaquette-cabane.pdf', 'background', @temp_file, 'output', @final_file
|
|
|
|
|
|
@data_to_send = File.open( @final_file).read
|
|
File.delete(@temp_file)
|
|
File.delete(@final_file)
|
|
# @data_to_send = File.open( @temp_file).read
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
send_data @data_to_send, :filename => "plaquette-cabane-#{@order.token}.pdf" , :type => 'application/pdf'
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
def paid
|
|
@order = Order.find_by_token(params[:id])
|
|
if @order.paid
|
|
redirect_to public_order_path(@order.token)
|
|
else
|
|
|
|
respond_to do |format|
|
|
format.html { redirect_to paid_by_paypal_public_order_path(@order.token)}
|
|
|
|
end
|
|
|
|
|
|
end
|
|
end
|
|
def show
|
|
@order = Order.find_by_token(params[:id])
|
|
|
|
|
|
end
|
|
def paid_by_paypal
|
|
@order = Order.find_by_token(params[:id])
|
|
if @order.paid
|
|
redirect_to public_order_path(@order.token)
|
|
end
|
|
|
|
products = []
|
|
@order.order_products.each do |order_product|
|
|
products << {:Name => order_product.name,:Quantity => 1,:Amount => {:currencyID => "EUR",:value => order_product.price } }
|
|
end
|
|
|
|
require 'paypal-sdk-merchant'
|
|
@api = PayPal::SDK::Merchant::API.new
|
|
|
|
|
|
@set_express_checkout = @api.build_set_express_checkout({
|
|
:SetExpressCheckoutRequestDetails => {
|
|
:custom => @order.token,
|
|
:ReturnURL => do_paypal_payment_public_order_url(@order),
|
|
:CancelURL => paid_public_order_url(@order),
|
|
:NoShipping => 1,
|
|
:PaymentDetails => [{
|
|
:OrderTotal => {
|
|
:currencyID => "EUR",
|
|
:value =>@order.total },
|
|
|
|
:NotifyURL => "http fdgdgf"+ipn_public_order_path(@order),
|
|
:ShipToAddress => {
|
|
:Name => @order.name+" "+@order.firstname.to_s,
|
|
:Street1 => @order.street1,
|
|
:Street2 => @order.street2,
|
|
:CityName => @order.cityname,
|
|
:StateOrProvince => "",
|
|
:Country => @order.country,
|
|
:PostalCode => @order.postal_code },
|
|
:PaymentDetailsItem => products,
|
|
:PaymentAction => "Sale" }] } })
|
|
|
|
# Make API call & get response
|
|
@set_express_checkout_response = @api.set_express_checkout(@set_express_checkout)
|
|
|
|
# Access Response
|
|
if @set_express_checkout_response.success?
|
|
|
|
@get_express_checkout_details = @api.build_get_express_checkout_details({
|
|
:Token => @order.token })
|
|
|
|
@get_express_checkout_details_response = @api.get_express_checkout_details(@get_express_checkout_details)
|
|
|
|
|
|
|
|
|
|
@payment_detail = @get_express_checkout_details_response.GetExpressCheckoutDetailsResponseDetails.PaymentDetails[0]
|
|
|
|
|
|
redirect_to @api.express_checkout_url(@set_express_checkout_response.Token)
|
|
else
|
|
@set_express_checkout_response.Errors
|
|
end
|
|
end
|
|
|
|
|
|
|
|
def do_paypal_payment
|
|
|
|
|
|
require 'paypal-sdk-merchant'
|
|
@api = PayPal::SDK::Merchant::API.new
|
|
|
|
|
|
@get_express_checkout_details = @api.build_get_express_checkout_details({:Token => params[:token] })
|
|
|
|
@get_express_checkout_details_response = @api.get_express_checkout_details(@get_express_checkout_details)
|
|
|
|
|
|
|
|
|
|
# Access Response
|
|
if @get_express_checkout_details_response.success?
|
|
|
|
@order = Order.find_by_token(@get_express_checkout_details_response.GetExpressCheckoutDetailsResponseDetails.Custom.to_s)
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
@get_express_checkout_details_response.Errors
|
|
end
|
|
|
|
# Build request object
|
|
@do_express_checkout_payment = @api.build_do_express_checkout_payment({
|
|
:DoExpressCheckoutPaymentRequestDetails => {
|
|
:PaymentAction => "Sale",
|
|
:Token => params[:token],
|
|
:PayerID => params[:PayerID],
|
|
:PaymentDetails => [{
|
|
:OrderTotal => {
|
|
:currencyID => "EUR",
|
|
:value => @order.total },
|
|
:NotifyURL => "http:// "+ipn_public_order_path(@order) }] } })
|
|
|
|
# Make API call & get response
|
|
@do_express_checkout_payment_response = @api.do_express_checkout_payment(@do_express_checkout_payment)
|
|
|
|
# Access Response
|
|
if @do_express_checkout_payment_response.success?
|
|
@payment_info = @do_express_checkout_payment_response.DoExpressCheckoutPaymentResponseDetails.PaymentInfo[0]
|
|
|
|
@do_express_checkout_payment_response.DoExpressCheckoutPaymentResponseDetails
|
|
@do_express_checkout_payment_response.FMFDetails
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if @payment_info.PaymentStatus.to_s == "Completed"
|
|
@order.payment_type = "1"
|
|
@order.paid = true
|
|
@order.paid_at = Time.now
|
|
@order.save
|
|
|
|
EbookMailer.confirm(@order.email, public_order_url(:id => @order.token)).deliver
|
|
|
|
|
|
redirect_to public_order_path(:id => @order.token, :download => true)
|
|
else
|
|
render :file => 'public/500.html', :status => 500, :layout => false
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else
|
|
render :file => 'public/500.html', :status => 500, :layout => false
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
def ipn
|
|
|
|
|
|
@api = PayPal::SDK::Merchant.new
|
|
if @api.ipn_valid?(request.raw_post) # return true or false
|
|
@order = Order.find_by_token(params[:custom].to_s)
|
|
if params[:payment_status] == "Completed"
|
|
|
|
|
|
@order.payment_type= 1
|
|
@order.paid = true
|
|
@order.paid_at = Time.now
|
|
|
|
@order.paypal_test_ipn= params[:test_ipn]
|
|
|
|
@order.paypal_txn_type = params[:txn_type]
|
|
@order.paypal_txn_id = params[:txn_id]
|
|
@order.paypal_payment_date = params[:payment_date]
|
|
|
|
@order.paypal_payment_status = params[:payment_status]
|
|
@order.paypal_reason_code = params[:reason_code]
|
|
@order.paypal_payment_type = params[:payment_type]
|
|
|
|
@order.paypal_mc_currency = params[:mc_currency]
|
|
@order.paypal_mc_fee = params[:mc_fee]
|
|
@order.paypal_mc_gross = params[:mc_gross]
|
|
|
|
@order.paypal_residence_country = params[:residence_country]
|
|
@order.paypal_last_name = params[:last_name]
|
|
@order.paypal_first_name = params[:first_name]
|
|
@order.paypal_payer_email = params[:payer_email]
|
|
@order.paypal_payer_id = params[:payer_id]
|
|
@order.paypal_payer_status = params[:payer_status]
|
|
|
|
@order.paypal_receiver_id = params[:receiver_id]
|
|
@order.paypal_receiver_email = params[:receiver_email]
|
|
|
|
@order.paypal_protection_eligibility = params[:protection_eligibility]
|
|
@order.paypal_ipn_track_id = params[:ipn_track_id]
|
|
|
|
@order.save
|
|
puts "le paiement de la commande #{@order.id} par paypal est validé"
|
|
|
|
else
|
|
@order.paypal_test_ipn= params[:test_ipn]
|
|
|
|
@order.paypal_txn_type = params[:txn_type]
|
|
@order.paypal_txn_id = params[:txn_id]
|
|
@order.paypal_payment_date = params[:payment_date]
|
|
|
|
@order.paypal_payment_status = params[:payment_status]
|
|
@order.paypal_reason_code = params[:reason_code]
|
|
@order.paypal_payment_type = params[:payment_type]
|
|
|
|
@order.paypal_mc_currency = params[:mc_currency]
|
|
@order.paypal_mc_fee = params[:mc_fee]
|
|
@order.paypal_mc_gross = params[:mc_gross]
|
|
|
|
@order.paypal_residence_country = params[:residence_country]
|
|
@order.paypal_last_name = params[:last_name]
|
|
@order.paypal_first_name = params[:first_name]
|
|
@order.paypal_payer_email = params[:payer_email]
|
|
@order.paypal_payer_id = params[:payer_id]
|
|
@order.paypal_payer_status = params[:payer_status]
|
|
|
|
@order.paypal_receiver_id = params[:receiver_id]
|
|
@order.paypal_receiver_email = params[:receiver_email]
|
|
|
|
@order.paypal_protection_eligibility = params[:protection_eligibility]
|
|
@order.paypal_ipn_track_id = params[:ipn_track_id]
|
|
@order.paid_at = nil
|
|
@order.paid = false
|
|
@order.save
|
|
|
|
end
|
|
|
|
else
|
|
|
|
end
|
|
render :inline => "test"
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|