将 text_field 自定义参数传递给 link_to paypal IPN
Posted
技术标签:
【中文标题】将 text_field 自定义参数传递给 link_to paypal IPN【英文标题】:Pass a text_field custom parameter to a link_to paypal IPN 【发布时间】:2015-11-07 02:05:39 【问题描述】:当客户成功使用贝宝进行交易时,我正在尝试向客户发送电子邮件。
我已经设法在他们提供的custom 参数中将自定义email
参数发送到贝宝。
我现在拥有的东西
我的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
的参数,以便贝宝返回电子邮件,以便我可以将其存储在数据库中并向客户发送电子邮件?
谢谢
【问题讨论】:
【参考方案1】:这可能比您预期的更多...但请继续阅读。
在进一步深入实施之前,请记住,您使用的是 sandbox
版本的 Paypal 进行测试,而在生产中,您' d 希望paypal_url
为user
返回一个加密的网址,以避免篡改 交易,例如更改价格(更多详情请参阅Railscast #143 )。
现在,请意识到客户端通过 javascript 获取用户电子邮件字段和修改链接的任何方法都不会是安全,因为 链接应该在之后从您的服务器生成加密(您需要在通话过程中传递用户电子邮件)。
那么,你能做什么?使用 ajax 将请求发送到包含参数(例如 return_url、user_email 等)的服务器,并在服务器中使用 加密链接 进行响应。然后,您可以使用 javascript 替换链接并允许用户单击该链接。
如您所知,上述实现非常笼统,任何答案都不适合您的具体情况。您应该牢记以上几点,因为无论如何您都必须这样做。
【讨论】:
有道理,我得到了链接来获取第三个参数(客户电子邮件),正如@nicolasmaloeuvre 所说。我将看看如何加密paypal_url
。谢谢(你的)信息!另外,paypal_url
是否相同,但没有 sandbox
用于现场/制作的词?
@Johhan 是的,只需删除 sandbox
进行生产,加密后的 paypal_url
看起来像这样 https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_s-xclick&encrypted=-----BEGIN+PKCS7----------END+PKCS7-----
你能给我指出一个关于如何加密 url 的教程吗?
@Johhan 查看由 Ryan Bates (railscasts.com/episodes/143-paypal-security) 编写的 Railscast #143
太棒了,能够进行加密,现在让我在现场测试时看看它是如何进行的。非常感谢【参考方案2】:
你不应该使用link_to,而是form_tag with method: :get
<%= form_tag (@product.paypal_url(payment_notification_index_url, root_url, :custom)),method: :post do %>
<%= text_field_tag :custom %>
<%= submit_tag 'checkout' %>
<% end %>
【讨论】:
能够将第三个参数添加为:custom
和 method: :post
并且有效以上是关于将 text_field 自定义参数传递给 link_to paypal IPN的主要内容,如果未能解决你的问题,请参考以下文章
将参数传递给自定义 UITableViewCell [重复]
Sklearn Pipeline:将参数传递给自定义变压器?