php - Paypal Webhook 响应

标签 php sql web paypal

我一直在尝试让 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/

相关文章:

php - ajax帮助在php中调用js函数

php - 如果我有获取参数,刷新页面的按钮不起作用

php - 如何根据屏幕大小在php中调整图像大小?

mysql - 如何在数据库上设置特定注册

sql - 是否有一个聚合函数可以返回组内的第一个非空值?

java - 是否可以创建一个准备好的语句并稍后在 postgres 下使用 Java 重用它?

java - 每次运行或调试 Web 应用程序后显示的 IntelliJ 更新框架

php - 如何将此变量添加到此代码?

javascript - 为什么我的边栏在缩小时消失了?

apache - Apache-多个网站-允许顶级文件夹访问