0

我有一个创建新事件的表格。创建新事件后,我想将表单信息发布到 PayPal PayFlow 并将用户发送到 paypal 网站以完成付款。我没有经验的猜测是进行 after_create 回调以呈现单独的视图以发布贝宝支付流表单信息。但这似乎不是正确的解决方案。

你能建议一种更“Rails 方式”来做到这一点吗?

以下是有关 PayPal Payflow 流程的更多详细信息:我传递了一些参数

`curl https://pilot-payflowpro.paypal.com -kd "TRXTYPE=S&AMT=23.45&CURRENCY=USD&CREATESECURETOKEN=Y&SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5"`

并收到一个安全令牌 RESULT=0&RESPMSG=Approved&SECURETOKEN[25]=Fj+1AFUWft0+I0CUFOKh5WA==&SECURETOKENID=9a9ea8208de1413abc3d60c86cb1f4c5

然后我可以像这样将值发布到贝宝:

<body>
  <form method="post" action="https://payflowlink.paypal.com">
    <input type=hidden value="Fj+1AFUWft0+I0CUFOKh5WA==" name=SECURETOKEN/>
    <input type=hidden value="9a9ea8208de1413abc3d60c86cb1f4c5" name=SECURETOKENID/>
  </form>
</body>
4

1 回答 1

0

我在这个链接中找到了答案:Rails, How to submit PayPal requests from controller, instead of a form, URL encoding

因为我使用的是 Payflow,所以我添加了更多代码来使用安全令牌。

events_controller.rb

def create
    @event = Event.new(params[:event])

    respond_to do |format|
        if @event.save!
            format.html { redirect_to @event.send_to_paypal }
            format.json { render json: @event, status: :created, location: @event }
        else
            format.html { render action: "new" }
            format.json { render json: @event.errors, status: :unprocessable_entity }
        end
    end
end

event.rb

def send_to_paypal
    token = UUIDTools::UUID.random_create.to_s
    response = Rack::Utils.parse_nested_query(`curl https://pilot-payflowpro.paypal.com -kd "#{GATEWAY.to_param}&TRXTYPE=S&AMT=23.45&CURRENCY=USD&CREATESECURETOKEN=Y&SECURETOKENID=#{token}"`)

    if response['SECURETOKENID'] != token || response['RESULT'] != "0" || response['SECURETOKEN'].blank?
        raise StandardError, response['RESPMSG']
    else
        URI.encode("https://pilot-payflowlink.paypal.com?MODE=test&SECURETOKENID=#{token}&SECURETOKEN=#{response['SECURETOKEN']}")
    end
end

GATEWAY 是一个配置常量,带有我的支付流网关参数 (.

我最初在 payflowlink.paypal.com 中提交测试数据时遇到了一些模糊的错误。与此链接类似,PayPal's Payflow Gateway SDK Example not working这是由于在URI.encode(...). 在取出 PARMLIST 并添加MODE=test之后,一切都按预期工作。希望这可以帮助其他使用 Payflow 的人。

于 2013-01-03T17:34:40.780 回答