【问题标题】:Why is my statement always false? if (isset($_GET['action']) && $_GET['action']=='IPN_Handler')为什么我的陈述总是错误的? if (isset($_GET['action']) && $_GET['action']=='IPN_Handler')
【发布时间】:2020-01-01 15:59:57
【问题描述】:

我为 PayPal 编写了一个 IPN 侦听器,当我第一次这样做时,一切正常。我不知道为什么,它停止工作。我的即时付款通知设置为:https://domainname/webpage/?action=IPN_Handler

网站付款的自动返回网址为:https://domainname/webpage

我的监听器代码是:

if (isset($_GET['action']) && $_GET['action']=='IPN_Handler') {
    echo "Thank you for your payment";
    $amt = $_GET['amt'];
    $txn_id = $_GET['tx'];
    $st = $_GET['st'];
    $msg = $_GET['item_name'];
    $date= date("Y-m-d");
   }

一旦代码返回,页面的位置区域中就有: Link

我在 if 语句中添加了 var_dump,它返回 bool(false)

我的代码做错了什么?

【问题讨论】:

  • 打开sql注入使用prepared statementphp.net/manual/tr/mysqli.prepare.php
  • 请原谅我,但我不得不问@BigUncleE 你是如何在没有安全性的情况下使用该代码获取私人信息的?对不起
  • isset 使用 true&& 使用 AND 。升级该代码,它将起作用。试试print $_GET['action']
  • @Dilek 致力于更改我的代码以防止 sql 注入。代码中的所有数据实际上都已更改。没有一个是有效的。在您发表评论后,我删除了 sql 部分。
  • @BigUncleE 感谢听到我给我一点时间给你举个例子

标签: php get


【解决方案1】:

感谢您的收听,让我向您解释如何在付款过程中特别升级准备声明。 我没有你所有的数据,所以我会用你显示的问题来做。

这是一个简单的prepare语句,希望对你有所帮助。

$conn 是数据库连接字段,将其更改为您的

if (isset($_POST['action']) && $_POST['action']=='IPN_Handler') { 
// we get all params from html form I use post method always if dont need to get a url paratemer
    $amt = htmlspecialchars($_POST['amt']);
    $txn_id = htmlspecialchars($_POST['tx']);
    $st = htmlspecialchars($_POST['st']);
    $msg = htmlspecialchars($_POST['item_name']);
    $date= date("Y-m-d");

//Here we need to validate form inputs
    if(empty($amt) || empty($txn_id) || empty($st) || empty($msg)) { 
        echo "Field all required";
    }else{

        $stmt = $conn->prepare("INSERT INTO Your_table_name (amt, tx, st, item_name, date) VALUES (?, ?, ?, ?, ?)");
        $stmt->bind_param("sssss", $amt, $txn_id, $st, $msg, $date);
         // we used bind_param so now we need to execute 
        if($stmt->execute()){
            echo "New records created successfully";
            header('Location: yourpage.php');
            exit();
        }else{
            echo "Failed to insert new records in database.";
        }

        // Free yourconnection
        $stmt->free_result();
    }
}

更新: 在这里测试我的案例是html表单:

<form action="page.php" method="POST">
	<input type="text" name="amt" placeholder="dsdsd">
	<input type="text" name="tx" placeholder="sdsd">
	<input type="text" name="st" placeholder="dsdsd">
	<input type="text" name="item_name" placeholder="sdsd">
	<input type="text" name="date" placeholder="dsdsd">
	<input type="hidden" name="action" value="IPN_Handler" />
	<input type="submit" name="LoginBtn" placeholder="signup">
</form>

更多解释请看这里https://www.w3schools.com/php/php_mysql_prepared_statements.asp

这里是我修改你的代码的地方:

if (isset($_GET['action']) AND $_GET['action']=='IPN_Handler') {

//Here we need to validate form inputs
  $amt = mysqli_real_escape_string($link, $_GET['amt']);
  $txn_id = mysqli_real_escape_string($link, $_GET['tx']);
  $st = mysqli_real_escape_string($link, $_GET['st']);
  $msg = mysqli_real_escape_string($link, $_GET['item_name']);
  $date= date("Y-m-d");

    $sql = "UPDATE wp_ready2_play SET amount=?, payment_id=?, payment_status=?, message=?,  payment_dte=? WHERE id =?";
    $stmt = mysqli_stmt_init($link);
        if (!mysqli_stmt_prepare($stmt, $sql)) {
        echo "SQL error";
    } else {
        mysqli_stmt_bind_param($stmt, "ssssss", $amt, $txn_id, $st, $msg, $date, $data);
        mysqli_stmt_execute($stmt);
        echo "Thank you for your payment";
        echo "Transaction has been made successfully.";
    }   
    // Free yourconnection
    mysqli_free_result($stmt);

}

【讨论】:

  • 是的,这对我帮助很大。不幸的是,我仍在调查为什么 if 语句仍然是错误的。
  • 哪个 if 语句? if this if (isset($_POST['action']) &amp;&amp; $_POST['action']=='IPN_Handler') { 将其更改为 :if (isset($_POST['action'])) { 并将 html 表单更改为 method=POST
  • 这实际上不是一个按钮,它正在等待Paypal将信息发送回网页。
  • IPN_Handler ?您可以在 if 语句中检查 IPN_Handler 查询成功,而不是在表单检查中。 if($_POST['IPN_Handler'] == paypal_result){ return page or display success}else{Not success}
  • 当我使用 PayPal Sandbox 再次运行代码时,我在 PayPal 的响应中得到了 IPN_Handler。但是,if 语句“(isset($_POST['action']) AND $_POST['action']=='IPN_Handler')”仍然是 False。我还有更多的研究要做。
【解决方案2】:

陈述总是错误的,因为……陈述总是错误的。查看查询字符串:

?amt=0.01&cc=USD&item_name=Subscription%20-%20214&st=Completed&tx=6PK91382LD487075H

在任何地方都没有设置action 项,因此代码执行正确地跳过了该块。您需要实际传入该操作,并且它的关联值以某种方式 以使代码按您预期的方式执行。

最简单、最省力的方法就是在表单中添加一个隐藏的输入。

<input type="hidden" name="action" value="IPN_Handler" />

当您提交表单时,您应该会看到新的查询字符串包含具有指定值的操作参数,如action=IPN_Handler。不过,您应该小心验证操作值,因为用户只需打开开发人员工具即可操作隐藏的输入。

【讨论】:

  • 代码在一开始就有效。我正在调查您发布的信息。
  • 我添加了更多信息,如果有帮助请告诉我
  • 您对声明始终是错误的最初评论是正确的。当我再次使用 PayPal Sandbox 进行测试时,它的回复中有这个:domainname/webpage/?action=IPN_Handler。沙盒仍然不起作用。所以,我还有更多的研究要做。
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多