Paypal Webhook响应

时间:2015-02-15 19:48:51

标签: php sql web paypal

我一直试图让Paypal的Webhooks工作,但我遇到的只是问题。我正在尝试进行简单的付款流程,用户只需支付产品费用,然后我想设置webhooks以在付款,退款或撤销时提醒我。我有付款流程设置,这不是问题。我还在启用SSL的URL上托管webhook网址。

当我进行购买时,它会将链接的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);
}
?>

就像我说的那样,我看到它插入&#34;测试&#34;进入数据库,但当我尝试通过post变量(从我理解应该有一些)它没有上传任何变量。

但是当我在paypal开发人员沙箱上使用IPN模拟器并将其发送到链接时,它会插入所有的帖子变量。

那为什么要联系网址但不包括任何信息?我是否错误地接收了它而没有正确处理它?<​​/ p>

谢谢。

2 个答案:

答案 0 :(得分:2)

首先,您应该验证此请求是否真的来自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 [&#39; payment_status&#39;]变量。它可能是&#34;已完成&#34; (当正常处理付款时,这是正常的),或者退款&#34;,&#34;反转&#34;。并按此处理付款。当然,我强烈建议验证输入 - 检查_POST请求(可用性,可能的SQL注入等),然后继续。

答案 1 :(得分:1)

$bodyReceived = file_get_contents('php://input');

这是您作为json对象从paypal收到的信息