【问题标题】:Verify my notify_url code for PayPal验证我的 PayPal 的 notify_url 代码
【发布时间】:2015-05-17 13:14:15
【问题描述】:

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 网站生成的表单(购买按钮)。

【问题讨论】:

    标签: php paypal checkout


    【解决方案1】:

    编辑:

    你有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['amount'] 而没有定义为 POST 的方法,则它将默认为 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 表单和 DB 架构,以确保绝对确定。

    【讨论】:

      【解决方案2】:

      你可以尝试重写代码如下:

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

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

      并尝试改变

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

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

      【讨论】:

      • 直接查询仅用于测试阶段。我很沮丧,它不起作用!顺便说一句,语法上的更改不起作用。
      • 您从 POST 收到的值是否正确?你从 var_dump($_POST['amount']) 得到什么
      • 我不知道我收到了什么。显然 notify_url.php 文件永远不会被加载。它只是获取 post 变量。否则我会让 print_r($_POST) 查看变量。
      • 对不起尼克。仍然没有运气。我正试图让某人支付通话时间。 devtools-paypal.com/guide/digitalgoods_ec/…
      猜你喜欢
      • 2014-12-26
      • 1970-01-01
      • 2019-03-26
      • 2016-04-06
      • 1970-01-01
      • 2017-05-02
      • 2015-09-30
      • 1970-01-01
      • 2012-09-22
      相关资源
      最近更新 更多