我正在尝试将SagePay Inframe Server集成到使用Laravel作为框架的我的站点。我已经购买了SSL证书,除了Sagepay的通知回复之外,一切都运行良好。我联系了他们的客户支持,并通过电子邮件发送了一个用于2.23版本的旧开发工具包(显然他们没有使用他们的最新协议,从中获取),并且大部分代码都是从原始(过时的)代码库中修改的。
在过去的3周里,我一直在尝试在控制器(OrdersController)中创建一组函数来处理SagePays各种POST发送/响应,希望我可以为Laravel创建一个公共库,这样就没有其他人了需要经历试图整合这个系统梦魇的地狱。
目前我的系统正确注册了交易,并将notificationURL发送到Sagepay,我将Sagepay所需的VendorTxCode(i create)/ VPSTxId和SecurityKey(sagepay created)字段存储在我的数据库中,我的用户被重定向在iframe中输入他们的卡片详细信息。
根据文档,在用户输入了他们的详细信息并继续他们的事务之后,脚本应该检查Status / VendorTxCode / VPSTxId,并使用这些值从数据库中撤回SecurityKey。如果SecurityKey不存在,则会将用户(使用RedirectURL)重定向到我指定的页面以处理错误。
我会停在这里,因为目前我没有从数据库中绘制SecurityKey,因此它不存在,这是确切的问题 - SagePay应该从这一点将用户重定向到/ failure页面,但是它不会,而是抛出这个通用错误:
错误代码:5006
错误说明:无法重定向到供应商的网站。供应商未能提供RedirectionURL。
现在奇怪的是,如果我将相同的脚本(在Laravel /控制器框架之外)上传到例如“http://www.thisisanothersite/test/notification.php”,并更改NotificationURL以反映这一点,则将iframe重定向到所需的RedirectURL。如果我在浏览器中加载脚本,则显示以下(正确)响应:
Status = INVALID RedirectURL = https://development.myproject.co.uk/sagepay/failure StatusDetail =无法在我们的数据库中找到该交易。
但是,如果我尝试在Laravel的上下文中查看脚本(例如'https://development.myproject.co.uk/sagepay/notification'),脚本将使用您希望看到Laravel错误的常用Illuminate异常处理程序进行响应。 / p>
我的问题是:有没有办法执行以下任何操作:
1)有没有办法关闭与laravel相关的单个函数的错误处理,这样我就可以获得与Laravel上下文之外的完全相同的消息?
2)在Laravel的上下文中创建一个独立的脚本,所以我可以使用数据库连接但是作为一个独立的页面(sagepay / notification.php)访问它而不会妨碍控制器路由?
我目前对上述代码如下:
<?php
class OrdersController extends BaseController {
protected $layout = 'layouts.admin';
public function __construct(Order $order)
{
$this->order = $order;
}
public function notification() {
header("Content-type: text/plain");
$eoln = chr(13) . chr(10);
$strConnectTo = "TEST";
$strStatus=$this->cleanInput($_REQUEST["Status"],"Text");
$strVendorTxCode=$this->cleanInput($_REQUEST["VendorTxCode"],"VendorTxCode");
$strVPSTxId=$this->cleanInput($_REQUEST["VPSTxId"],"Text");
$strSecurityKey="";
$VendorTxCode = $strVendorTxCode;
$VPSTxId = $strVPSTxId;
$strSQL = Order::select('SecurityKey')->where('VendorTxCode', $VendorTxCode)->where('VPSTxId', $VPSTxId)->first();
if (strlen($strSQL->SecurityKey)==0)
{
ob_flush();
header("Content-type: text/html");
echo "Status=INVALID" . $eoln;
if ($strConnectTo=="LIVE") {
echo "RedirectURL=https://development.myproject.co.uk/sagepay/failure" . $eoln;
}
else {
echo "RedirectURL=https://development.myproject.co.uk/sagepay/failure" . $eoln;
}
echo "StatusDetail=Unable to find the transaction in our database." . $eoln;
exit();
}
else
{
// CODE TO DEAL WITH SUCCESS
}
}
}
路线是:
Route::any('sagepay/notification', 'OrdersController@notification');
Route::any('sagepay/failure', 'OrdersController@failure');
Route::resource('orders', 'OrdersController');
对这个问题的大小抱歉,但我真的很难过:/
答案 0 :(得分:0)
以防其他人在将来的某个时刻遇到同样的问题,问题是laravel会发送一些自己的错误处理代码以及消息(虽然ob_flush会刷新整个缓冲区)。我找到的唯一方法是搜索位于vendors / laravel / src / illuminate / foundation / start.php的库,并切换error_reporting(-1);到error_reporting(0);
可能有一种方法可以将此功能扩展到相关的类,因此不是在站点范围内将其关闭,而是专门为该控制器关闭,如果我发现如何操作,我将在此处添加它。