将 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_urluser 返回一个加密的网址,以避免篡改 交易,例如更改价格(更多详情请参阅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&amp;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 %>

【讨论】:

能够将第三个参数添加为 :custommethod: :post 并且有效

以上是关于将 text_field 自定义参数传递给 link_to paypal IPN的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义参数传递给事件处理程序

将参数传递给自定义 UITableViewCell [重复]

Sklearn Pipeline:将参数传递给自定义变压器?

Omnipay - 如何将“自定义”或“发票”参数传递给 Paypal?

如何将参数传递给自定义作曲家脚本

如何将附加参数传递给自定义 python 排序函数