一步一步在rubyonrails上使用paypal创建简单的结账

时间:2015-08-13 15:32:52

标签: ruby-on-rails paypal paypal-sandbox

我目前正试图以固定价格进行“立即购买”按钮。

用户付款后,我想将它们重定向到根网址,并向他们发送附带PDF文件的电子邮件。

我一直在研究如何使用paypal创建一个简单的结账但没有成功,我发现这些教程已经存在了很多年,而且有些代码已被弃用。

我尝试过使用BRAINTREE,它在测试/沙盒上工作得很好,但由于我目前居住在波多黎各,因此无法创建生产帐户(这限制了我支付网关的选项)。

到目前为止我做了什么

遵循教程

我使用productsname

unit_price创建了一个脚手架

在我的product模型中:

# This defines the paypal url for a given product sale
def paypal_url(return_url)
values = {
:business => YOUR_MERCHANT_EMAIL,
:cmd => '_cart',
:upload => 1,
:return => return_url,
:invoice => UNIQUE_INTEGER
}

values.merge!({
"amount_1" => unit_price,
"item_name_1" => name,
"item_number_1" => id,
"quantity_1" => '1'
})

# This is a paypal sandbox url and should be changed for production.
# Better define this url in the application configuration setting on environment
# basis.
"https://www.sandbox.paypal.com/cgi-bin/webscr?" + values.to_query

end

在教程中他们说这应该足以处理付款但是他们要求点击“立即购买”链接,我不知道在哪里指出它或如何创建它。

如果问的不多,有人可以指出我在这里正确的方向(一步一步 - >使用paypal轻松单一结账支付 - >文件)。

万分感谢。

修改

能够创建checkout按钮:

<%= link_to 'checkout', product.paypal_url(products_url) %>

现在它可以工作但我如何制作它以便您通过notice重定向回我的网站?

谢谢!

1 个答案:

答案 0 :(得分:4)

好的,经过一整天的研究和测试,我已经设法让几乎一切正常。这就是我所做的

第1步

rails g scaffold product name:string unit_price:decimal

product控制器:

def index
    @products = Product.all
    if @products.length != 0
      @product = Product.find(1)
    end
  end

然后创建您的第一个产品

第2步

在产品索引中,您可以为paypal结帐添加这样的按钮:

<%= link_to 'checkout', @product.paypal_url(payment_notification_index_url, root_url) %>

第3步

<{1>}模型中的

product

您可以找到有关HTML Variables for PayPal Payments Standard

的更多信息

在这段代码中,对我来说最重要的是:

# This defines the paypal url for a given product sale def paypal_url(return_url, cancel_return) values = { :business => 'your_sandbox_facilitato_email@example.com', :cmd => '_xclick', :upload => 1, :return => return_url, :rm => 2, # :notify_url => notify_url, :cancel_return => cancel_return } values.merge!({ "amount" => unit_price, "item_name" => name, "item_number" => id, "quantity" => '1' }) # For test transactions use this URL "https://www.sandbox.paypal.com/cgi-bin/webscr?" + values.to_query end has_many :payment_notifications

  

PayPal重定向买家的网址&#39;浏览器完成付款后。例如,在您的网站上指定一个显示&#34;感谢您付款的网址&#34;页。

:return

  

PayPal以即时付款通知邮件的形式发布付款信息的网址。

:notify_url

  

PayPal重定向买家的网址&#39;浏览器,如果他们在完成付款前取消结帐。例如,在您的网站上指定一个显示&#34;已取消的付款&#34;页。

:cancel_return

  

退货方式。 FORM METHOD用于将数据发送到指定的URL   由return变量。允许值为:

     

0 - 所有购物车付款都使用GET方法

     

1 - 通过使用,将买家的浏览器重定向到返回URL   GET方法,但不包括付款变量

     

2 - 通过使用,将买家的浏览器重定向到返回URL   POST方法,包括所有付款变量

第4步

:rm

在这里,您需要添加以下内容:

rails g controller PaymentNotification create

第5步

class PaymentNotificationController < ApplicationController
    protect_from_forgery except: [:create]

  def create
    # @payment = PaymentNotification.create!(params: params, product_id: params[:invoice], status: params[:payment_status], transaction_id: params[:txn_id] )
    @payment = PaymentNotification.create!(params: params, product_id: 1, status: params[:payment_status], transaction_id: params[:txn_id])
    # render nothing: true

    if @payment.status == 'Completed'
        redirect_to root_url, notice: 'Success!'
      else
        redirect_to root_url, notice: 'Error'
      end

  end
end

在这里添加以下内容

rails g model PaymentNotification
路线中的

class PaymentNotification < ActiveRecord::Base
  belongs_to :product
  serialize :params
  after_create :success_message

  private

  def success_message
    if status == "Completed"
      puts 'Completed'
      ...
    else
      puts 'error'
      ...
    end
  end
end

现在您应该可以通过PayPal进行全面的处理付款。

每次resources :payment_notification, only: [:create] rake db:migrate创建后,不要忘记scaffold

另一件事,为了获得自动重定向,你必须在paypal的沙箱中指定url。 Click here to know how

如果我忘记了什么让我知道,已经工作超过10个小时才能得到这个工作lol