我正在尝试使用此PayPal IPN脚本,但似乎我没有得到PayPal的响应。 我不知道问题是什么,是在表格中还是在剧本中:
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input name="return" type="hidden" value="http://localhost/home/menu/index.php" />
<input name="cancel_return" type="hidden" value="http://localhost/home/menu/index.php" />
<input name="notify_url" type="hidden" value="http://localhost/home/menu/php/inni.php" />
这是脚本inni.php:
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
$item_name = $_POST['item_name'];
if (!$fp) {
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// vérifier que payment_status a la valeur Completed
if ( $payment_status == "Completed") {
if ( $email_account == $receiver_email) {
//insert in db
}
}
else {
// Statut de paiement: Echec
}
exit();
}
else if (strcmp ($res, "INVALID") == 0) {
// Transaction invalide
}
}
fclose ($fp);
}
答案 0 :(得分:0)
问题是您要将PayPal发送到localhost。
将链接(notify_url)更改为可公开访问的URL或IP地址。
PayPal从他们的服务器发送通知,因此发送到localhost将无法联系到您,因为localhost在这种情况下将是PayPal服务器本身。
答案 1 :(得分:0)
您需要将PayPal IPN请求转发到本地计算机,以使其正常工作。 有几个项目可以解决这个问题,既免费又商业。
免费开放源代码变体为:https://github.com/antoniomika/sish
一个商业变体:https://ngrok.com/
由于不需要配置服务器,因此Ngrok的实现速度更快。
使用Ngrok将http请求转发到本地主机
./ngrok http -host-header=localhost 80
然后在浏览器中打开
http://localhost:4040/inspect/http
从状态页面复制您的ngrok网址
https://d1c7361aebf0.ngrok.io
假设您的IPN通知网址为
https://www.example.com/api/paypal-ipn
将其更新为并开始测试即时付款通知
https://d1c7361aebf0.ngrok.io/api/paypal-ipn
注意:请确保禁用所有与域名相关的重定向,以使其正常工作。