2013-01-03 56 views
0

我有一个表单来创建一个新的事件。在创建新事件后,我想将表单信息发送到PayPal PayFlow并将用户发送到PayPal网站以完成付款。我没经验的猜测是做一个after_create回调来渲染一个单独的视图来发布paypal payflow表单信息。但它似乎不是正确的解决方案。表单提交后付款

你能提出更多'Rails方式'来做到这一点吗?

以下是有关贝宝Payflow过程的详细信息: 我通过一些PARAMS

`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

然后我可以张贴值到PayPal像这样:

<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> 

回答

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 

网关是一个配置我payflow网关参数(恒定。

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