我正在尝试将PayPal的IPN代码集成到CakePHP 3中。
namespace App\Controller;
use PayPal\Api\PaypalIPN;
class IpnController extends AppController
{
public function index()
{
$this->autoRender = false;
$ipn = new PayPalIPN();
// Use the sandbox endpoint during testing.
$ipn->useSandbox();
$verified = $ipn->verifyIPN();
if ($verified) {
/*
* Process IPN
* A list of variables is available here:
* https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNandPDTVariables/
*/
}
// Reply with an empty 200 response to indicate to paypal the IPN was received correctly.
header("HTTP/1.1 200 OK");
}
}
这无法在PayPal端进行验证,我怀疑这与在控制器视图中设置标头有关。
有没有一种方法可以在CakePHP的控制器中正确设置标题。
我让此代码独立运行(仅在一个php文件中),而且似乎工作正常。
答案 0 :(得分:1)
您不应在控制器操作中输出任何数据-这意味着您不应使用echo
,header()
或任何会向浏览器返回任何内容的函数或构造。如果这样做,您将遇到“已发送标题”错误。
如果要设置标题,则应使用withHeader()
的{{1}}或withAddedHeader()
方法。
对于状态码,您还可以使用Cake\Http\Response
方法:
withStatus()
有关设置标头的更多信息,请参见文档:
答案 1 :(得分:0)
也许这不是很讲究,但实际上可以以这种方式发送标头-只需后面跟die;
或exit;
即可阻止应用程序进一步处理响应。
无论如何,请确保您的问题与标题无关。 IPN似乎不适用于Paypal Sandbox。也许您应该使用ApiContext类尝试其他方式?