验证我的PayPal的notify_url代码

时间:2015-03-15 10:31:35

标签: php paypal checkout

notify_url.php

<?php
include('connection.php');
$sql = "UPDATE tablename 
        SET credit = credit + {$_POST['amount']} 
        WHERE username = '123456789'";
mysqli_query($con, $sql);
?>

表单html

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
          <input type="hidden" name="cmd" value="_s-xclick">
          <input type="hidden" name="hosted_button_id" value="6RNT8A4HBBJRE">
          <input type="image" 
            src="https://www.sandbox.paypal.com/en_US/i/btn/btn_buynowCC_LG.gif" 
            border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
          <img alt="" border="0" src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif" 
            width="1" height="1">
            <input name="amount" value=10.95 type="hidden"> <<< not sure if this line should be here
            <input name="notify_url" value="notify_url.php" type="hidden">
    </form>

上面的代码就是我在notify_url.php文件中的代码。我的数据库没有更新:(。我的连接文件没问题。当我输入一个数字而不是POST变量时,它工作正常。这只意味着我的POST变量可能是错误的,或者根本没有调用脚本!

修改 第二个代码是从PayPal网站(购买按钮)生成的表单。

2 个答案:

答案 0 :(得分:2)

修改

你有value=10.95,用引号value="10.95"包裹它 - 这不是什么大不了的事,而是良好的做法。

if(isset($_POST['amount'])){...}if(!empty($_POST['amount'])){...}

同时确保您的列为DECIMAL,其长度/值为10,2,例如,为了能够接受小数,例如10.95

咨询:

我测试的方式是使用:

$amount = $_POST['amount'];

$sql = "UPDATE tablename 
        SET credit = credit + $amount 
        WHERE username = '123456789'";

或者您可以尝试使用连接:

SET credit = credit + '".$amount."' 

此外,您的帖子操作应为action="notify_url.php",而不是您现在使用的内容。


发布HTML表单之前的原始答案:

我怀疑你的表单元素没有名称属性和/或值,也没有使用POST方法。

如果你的表单没有定义的方法是POST,因为你使用$_POST['amount'],它将默认为GET方法,反过来无声地失败。

由于您尚未发布HTML表单,因此您可以自行了解以下任何内容:

如果使用具有预设值的隐藏类型:(在这种情况下,我使用了1000)。

<form method="post" action="your_handler.php">

<input type="hidden" name="amount" value="1000">
<input type="submit" name="submit">

</form>

如果来自用户输入:

<form method="post" action="your_handler.php">

<input type="text" name="amount">
<input type="submit" name="submit">

</form>

您还可以使用以下方法检查表单的元素是否设置为空

if(isset($_POST['amount'])){...}if(!empty($_POST['amount'])){...}

  • 另外,请确保您的列是int而不是varchar,这也可能是您的代码失败的原因之一。

我需要注意您目前的代码是SQL injection开放的。使用prepared statementsPDO with prepared statements他们更安全


error reporting添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

以及or die(mysqli_error($con))mysqli_query()

旁注:错误报告应仅在暂存时完成,而不是生产。


  • 如果仍然无效,请发布您的HTML表单和数据库架构,以确保无误。

答案 1 :(得分:0)

您可以尝试重写代码,如下所示:

$sql = "UPDATE tablename SET credit = credit + ". $_POST['amount'] ." WHERE username = '123456789'";

无论如何我不鼓励这种方法(直接将POST传递给查询)因为mysql注入容易受到攻击。

并尝试更改

    <input name="notify_url" value="notify_url.php" type="hidden">

in

    <input name="notify_url" value="http://www.domain.com/notify_url.php" type="hidden">