我一直在尝试让 Paypal 的 Webhooks 工作,但我遇到的都是问题。我正在尝试进行一个简单的付款流程,用户只需为产品付款,然后我想设置 webhooks 以在付款、退款或撤销时提醒我。我有付款流程设置,这不是问题。我还在启用 SSL 的 URL 上托管 webhook url。
当我进行购买时,它会将 webhook 响应发送到链接,我让它上传一个基本的“测试”变量到数据库,只是为了表明它确实被联系了。我还尝试将所有发布数据插入数据库,但这似乎不起作用。这是 webhook 联系的代码:
<?php
header('HTTP/1.1 200 OK');
$servername = "xxxx";
$username = "xxxx";
$password = "xxxx";
$db = "xxxx";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $db);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$sql = "INSERT INTO vars (var) VALUES ('test')";
$conn->query($sql);
foreach ($_POST as $param_name => $param_val) {
echo "Param: $param_name; Value: $param_val<br />\n";
$sql = "INSERT INTO vars (var) VALUES ('" . $param_name . "')";
$conn->query($sql);
}
?>
所以就像我说的那样,我看到它将“测试”插入到数据库中,但是当我尝试通过后变量(据我了解应该有一些)时,它不会上传任何变量。
但是当我在 paypal 开发人员沙箱上使用 IPN 模拟器并将其发送到链接时,它会插入所有发布变量。
那么为什么它会联系 URL 但不包括任何信息呢?我是否错误地接收了它并且没有正确处理它?</p>
谢谢。
最佳答案
首先您应该确认这个请求确实来自 PayPal。为此,您应该将稍微修改过的 POST 请求发送回 PayPal。
$paypalurl = 'https://www.paypal.com/cgi-bin/webscr';
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
$ch = curl_init($paypalurl);
if ($ch == false) {
return false;
}
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
$res = curl_exec($ch);
在响应中你应该检查它是否已经过验证:
if ($res) && strcmp($res, "VERIFIED") == {
// your code here
}
所以最好总是使用 IPN 模拟器来测试这个东西,否则(通过向你的脚本发送普通的 POST 请求)它不会被正常验证。
此外,我建议您仔细查看 $_POST['payment_status'] 变量。可以是“已完成”(正常支付时可以),也可以是“退款”、“撤销”。并据此处理付款。当然,我强烈建议验证输入 — 检查 _POST 请求(可用性、可能的 SQL 注入(inject)等),然后继续进行其余操作。
关于php - Paypal Webhook 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28530376/