【问题标题】:Paypal Webhook ResponsePaypal Webhook 响应
【发布时间】:2015-02-15 19:48:50
【问题描述】:

我一直试图让 Paypal 的 Webhooks 工作,但我遇到的只是问题。我正在尝试制作一个简单的付款流程,用户只需为产品付款,然后我想设置 webhook 以在付款、退款或撤销时提醒我。我已经设置了付款流程,这不是问题。我还在启用 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 但不包含任何信息?我是否错误地接收它并且没有正确处理它?

谢谢。

【问题讨论】:

    标签: php sql web paypal


    【解决方案1】:

    首先,您应该验证此请求确实来自 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 注入等),然后继续进行其余操作。

    【讨论】:

    • 但问题是我似乎没有从 webhook 收到任何 POST 变量。不过我是从 IPN sim 做的。
    • 您的 webhook 脚本应该处理 IPN 的 POST 请求。您还期望什么其他 POST 请求?
    【解决方案2】:
    $bodyReceived = file_get_contents('php://input');
    

    这是您将从贝宝收到的 json 对象信息

    【讨论】:

      猜你喜欢
      • 2020-10-06
      • 2016-03-07
      • 2017-04-20
      • 2017-11-03
      • 2022-09-29
      • 2016-04-24
      • 2018-12-13
      • 2020-12-05
      • 1970-01-01
      相关资源
      最近更新 更多