【发布时间】:2023-03-20 13:55:02
【问题描述】:
已解决:请参阅下面的答案
HOLD:阅读最新的 paypal 文档我意识到自从我多年前实施下面显示的脚本以来,paypal 的程序发生了很大变化。我正在浏览贝宝的文档,并将相应地修改我的脚本,所以请暂时不要采取任何行动。感谢您阅读。
我有一个非常好的贝宝监听器脚本,它与 PHP5.3 中的旧 mysql 配合得很好。
我前段时间升级到了 mysqli 方法,但是这次升级错过了 paypal ipn 监听器脚本。几个月前我从 Php5.3 升级到 Php7.1 后才注意到这一点。我最近开始将此脚本升级到 mysqli,我认为这将是一个 5 分钟的工作(即在转换为准备好的语句和实施其他安全措施之前)。现在已经过去了 5 天,而不是 5 分钟,而我仍然没有接近解决方案!
我的问题是 mysqli 插入功能在侦听器脚本中不起作用。我可以采用完全相同的代码块(mysqli 连接字符串和 mysqli 插入查询),它将在不同的脚本中工作 - 但不在 ipn 侦听器内。
我什至可以在浏览器中查看侦听器页面并单击浏览器的刷新按钮,这将使用我提供的任意数据值执行 mysqli 插入!但是,当付款后从 paypal 触发脚本时,mysqli 插入不起作用。
我通过标准序列: 在实时环境中使用按钮付款后从贝宝接收 POST 数据。 返回完全相同的数据,并附加 cmd,以进行验证。 接收 VERIFIED 验证。
然后我尝试连接到 mysqli 并将 POST 数据插入数据库。 最后,我发送一封电子邮件以确认收到已验证的数据。
除了中间的 mysqli 插入部分外,一切都很好。
由于相同的 mysqli 代码块在不同的脚本中工作,我无法终生思考问题出在哪里。我显然尝试了许多不同的排列和组合(例如改变右大括号的位置),但无济于事。
我想知道是否有鹰眼的人可以发现问题的根源?过去曾在 s/o 上提出过一些类似的问题,但没有与此相同的问题。再重复一遍,我以为这将是一个非常简单的 5 分钟工作,将几行 mysql 更改为 mysqli!
编辑 #1:我将“如果已验证”邮件的主题字符串从“已验证 IPN”更改为“已验证 IPN 测试”,只是为了调查邮件为何通过已验证但 mysqli 插入失败。结果是经过验证的邮件停止通过!我后来将主题字符串改回了以前的状态,但邮件没有恢复。所以看起来问题比仅仅 mysqli 插入失败更深。不知paypal是否还支持fsockopen/$header的校验方式。
这是我的代码:
<?php
error_reporting(E_ALL);
//error_reporting(E_STRICT);/*This throws up nothing spurious*/
$req = 'cmd=_notify-validate';
/*Now loop through the incoming $_POST array*/
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";/*& sign denotes 'by reference' (see 4Tsale.php)*/
}
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: www.paypal.com:443\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n";
$header .= "Connection: close\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
$mc_gross = htmlentities($_POST['mc_gross']);//Repeat htmlentities
$invoice = $_POST['invoice'];
$protection_eligibility = $_POST['protection_eligibility'];
$payer_id = $_POST['payer_id'];
//etc
if (!$fp) {
//echo "$errstr ($errno)<br />\n";
}
else {
fputs ($fp, $header . $req);
while (!feof($fp))
{
$res = fgets ($fp, 1024);
$res = trim($res);
}//while
if (strcmp ($res, "VERIFIED") == 0)
{
$link = mysqli_connect('servername', 'username', 'password', 'databasename');
if (mysqli_connect_errno()) {
//printf("Connect failed: %s\n", mysqli_connect_error());
mail($mail_To, "Mysql Connect failed", $mail_From);
exit();
}
else {
//echo "Connected OK!<br />";
mail($mail_To, "Mysql Connect succeeded", $mail_From);
}
$query_stmt1 = "INSERT INTO paypal_ipns (mail_Subject, mc_gross, invoice, protection_eligibility, payer_id, tax, payment_date, payment_status, first_name, option_selection1, option_selection2, mc_fee, custom, payer_status, business, verify_sign, payer_email, option_name1, option_name2, txn_id, payment_type, payer_business_name, btn_id, last_name, receiver_email, receiver_id, txn_type, mc_currency, residence_country, req)
VALUES('$mail_Subject', '$mc_gross', '$invoice', '$protection_eligibility', '$payer_id', '$tax', '$payment_date', '$payment_status', '$first_name', '$option_selection1', '$option_selection2', '$mc_fee', '$custom', '$payer_status', '$business', '$verify_sign', '$payer_email', '$option_name1', '$option_name2', '$txn_id', '$payment_type', '$payer_business_name', '$btn_id', '$last_name', '$receiver_email', '$receiver_id', '$txn_type', '$mc_currency', '$residence_country', '$req')";
if (mysqli_query($link, $query_stmt1))
{
echo "New record created successfully<br>";
} else {
echo "Error: " . $query_stmt1 . "<br>" . mysqli_error($link);
}
mysqli_close($link);
$mail_From = "From: sale@mybiz.com";
$mail_To = "xxx@yahoo.co.uk";
$mail_Subject = "VERIFIED IPN";
$mail_Body = $req;
foreach ($_POST as $key => $value){
$emailtext .= $key . " = " .$value ."\n\n";
}
mail($mail_To, $mail_Subject, $emailtext . "\n\n" . $mail_Body, $mail_From);
}//if (strcmp ($res, "VERIFIED") == 0)
else if (strcmp($res, "INVALID") == 0)
{
$mail_From = "From: sale@mybiz.com";
$mail_To = "xxx@yahoo.co.uk";
$mail_Subject = "INVALID IPN";
$mail_Body = $req;
foreach ($_POST as $key => $value)
{
$emailtext .= $key . " = " .$value ."\n\n";
}
}//if (strcmp($res, "INVALID") == 0). Tried locating above as well
//}//while tried here as well
fclose ($fp);//Tried locating these 2 lines above as well
}//if (!$fp). Ditto
?>
【问题讨论】:
-
您听说过 BBoM 和意大利面条代码吗?就代码风格和良好实践而言,您的代码看起来很糟糕。我建议你阅读一些关于设计模式的文章,关于 MVC、ORM、DRY、KISS 和 SOLID。阅读什么是重构以及如何应用它来使您的代码更好。
-
非常感谢。会研究这些
标签: php database mysqli paypal