将 text_field 自定义参数传递给 link_to 贝宝 IPN

Pass a text_field custom parameter to a link_to paypal IPN

我正在尝试在客户成功使用 paypal 进行交易时向他发送电子邮件。

我已经设法在他们提供的 custom 参数中将自定义 email 参数发送到 paypal。

我现在拥有的

我的product模特:

class Product < ActiveRecord::Base

    # This defines the paypal url for a given product sale
        def paypal_url(return_url, cancel_return, useremail) 
        values = { 
        :business => 'your_business_email@example.com',
           :cmd => '_xclick',
        :upload => 1,
        :return => return_url,
        :rm => 2,
        :cancel_return => cancel_return,
        :custom => useremail
        }   
        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


end

在这里,我为 :custom 对象传递了一个参数,我在按钮 link_to 帮助程序中硬编码

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

这非常有效,我可以将 custom 电子邮件存储在数据库中:

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], email: params[:custom] )
    # render nothing: true

    if @payment.status == 'Completed'
      PaymentTransactions.success(@payment).deliver_now
      redirect_to root_url, notice: 'Success!'
    else
      redirect_to root_url, notice: 'Error'
    end

  end
end

问题

如何让客户在一个字段中输入他们的电子邮件并将该值传递到 link_to 的参数中,以便 paypal return 电子邮件,以便我可以将其存储在数据库中并向客户发送电子邮件?

谢谢

这可能 比您预期的要多...但请继续阅读。

在进一步深入实施之前,请记住,您使用的是 sandbox 版本的 Paypal 测试,并且在 production,你想要 paypal_url 到 return 一个 加密的 url 对于 user避免篡改 交易,例如更改价格(更多详情请见Railscast #143)。

现在,意识到在客户端通过 javascript 获取用户电子邮件字段并修改 link 的任何方法都不会 安全 因为 link 应该在加密后从您的服务器生成(并且您需要在调用过程中传递用户电子邮件)。

那么,你能做什么?使用ajax向服务器发送包含参数(如return_url、user_email等)的请求,并在服务器中响应使用 加密 link。然后,您可以使用 javascript 替换 link 并允许用户点击它。

如您所知,上面的实现非常笼统,任何答案都不适合您的具体情况。您应该牢记以上几点,因为无论如何您都需要这样做。

你不应该使用 link_to,而是 form_tag 方法::get

<%= form_tag (@product.paypal_url(payment_notification_index_url, root_url, :custom)),method: :post do %>
  <%= text_field_tag :custom %>
  <%= submit_tag 'checkout' %>
<% end %>