将 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 %>
我正在尝试在客户成功使用 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 %>