【问题标题】:Laravel Odd POST behaviourLaravel 奇怪的 POST 行为
【发布时间】:2015-03-06 15:23:40
【问题描述】:

我正在 Laravel 4 中设置支付门户,使用服务器集成连接到 SagePay。

结帐连接到 SagePay 没有任何问题,但在用户输入他们的卡详细信息并返回到网站后,我无法读取 SagePay 的响应,

SagePay 正在向我的一个页面发送 POST 请求,但 Laravel 仅在我 route::GET 请求(route::POST 返回 HttpMethodNotAllowed)且未收到任何 POST 数据时才显示该页面。

当请求是 POST 时,Laravel 如何将请求读取为 GET?

我试过 Route::any 但这仍然没有 POST 数据,

Route::post('cardpayment/result', array('uses'=>'CartController@postSageResult'));

public function postSageResult() {
   $data = Input::all();            
   Log::info('data:'.var_dump($data));
}

【问题讨论】:

  • 你试过Route::post吗?你知道他们发布到哪个 URL 吗?我想这是向他们发送请求的同一个 URL。
  • 是的,我收到 HTTPmethodNotAllowed 错误,我定义了通知 url,我的日志和他们的日志都显示它找到了页面 ok
  • 等一下,当 SagePay 向您发送 POST 请求时,您是否希望看到一个页面?这不是它的工作原理。
  • 记录器将一组信息作为第二个参数,并会为您提供很好的格式。 var_dump 可能是导致您看不到请求的问题。试试Log::info('SavePay post data', $data)
  • 我正要提到 var_dump() 可能是导致它的原因。 var_dump() 输出数据,它不会为您返回数据字符串。

标签: php post laravel


【解决方案1】:

您在尝试获取设置为 POST 的路由时收到HTTPmethodNotAllowed?这正是它应该如何工作的。 SagePay 应该向您发送 POST 请求。

  • “如果我作为 GET 请求路由,Laravel 只会显示页面” - 这是正常的。在浏览器中打开 URL 时,它会自动向该 URL 发送 GET 请求。如果你定义了 Route::post,Laravel 不会在 GET 请求中提供任何服务,除了明显的 HTTPmethodNotAllowed 异常。

  • “并且没有显示任何 POST 数据”- 什么 POST 数据?通过浏览器访问页面时,您正在发送 GET 请求。

整个安全支付网关的工作原理如下:

1) 在您的网站上获取表单请求

2) 用户在表单中填写了一些数据(不是信用卡数据!)

3) 使用 SagePay API,您可以将用户重定向到 SagePay.com 上的页面。

4) 用户在这里填写信用卡数据。此页面与您的网站绝对没有任何联系。

5) 用户提交 SagePay 表单。他被告知他的交易将被处理,他将被重定向回您网站上的页面。您还不应该将此交易视为已处理。您必须等待 SagePay 对此进行确认。它会通过发送该 POST 请求...

这里发生了一些魔法。可能需要 1 秒或 1 天。你无法控制它。

6) SagePay 处理请求(与银行交谈等)。如果交易成功,则 SagePay 将在您配置的 Route::post 路由上向您的网站发出 POST 请求。在这里,您可以访问$data = Input::all();,其中很可能包含有关刚刚发生的交易的一些详细信息。很可能在第 (3) 步中,您向 SagePay 发送了一个唯一 ID。此唯一 ID 将出现在 $data 中,以便您了解 什么 交易成功。

【讨论】:

  • 谢谢 Sergiu,但问题是我在尝试 Route::post 时遇到了 HTTPmethodNotAllowed,它似乎只适用于 Route::get 但没有 POST 数据。跨度>
  • 但是如何你是想发送那个 POST 请求吗?如果您尝试在浏览器窗口中打开 URL,则发送的是 GET 请求,而不是 POST 请求。显然没有与 GET 请求关联的 POST 数据。那将是零意义。再说一次,为什么你要访问那条路线? SagePay 应该访问它,而不是您自己。
  • 实际上我在您的故障中的第六步,等待 SagePay 的响应,他们正在发送包含交易结果的 POST。他们希望我输出如下字符串:“STATUS:OK VendorTxCode:12345 Redirect:www.website.com” VendorTxCode 是发布数据的一部分,因此我需要先阅读此内容。目前,当我创建一个 Route::post 并尝试收集这些数据时,我得到了 httpnotallowederror。我能够避免此错误的唯一方法是切换到 route::get,这会激活页面上的代码,但由于没有发布数据,该字段最终为空白。
  • Log::info('data:'.var_export($data, true)); 工作吗?
  • 只是一个空数组:[2015-01-08 14:27:11] production.INFO: data:array () [] []
【解决方案2】:

它仍然表现为 GET 请求,但我至少能够使用 POST 数据获取

public function postSageResult() {
   $get_dump = print_r($_POST, true); 
   Log::info('data:'.$get_dump);

感谢任何人解释为什么当 Var_dump、var_export、Request::instance() 和 Input::all() 都失败时这会起作用

【讨论】:

  • “仍然表现为 GET 请求” - 这没有意义
  • 我也遇到了发布请求的问题。你能帮忙吗? link
猜你喜欢
  • 2021-02-11
  • 2011-01-09
  • 2012-06-05
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多