1. ホーム
  2. php

[解決済み] HTTPSによるPaypal IPN検証のポストバック

2022-02-02 04:25:06

質問

新しいセキュリティ要件(2016、2017、2018)によると、"IPN"の際に、サーバーとPaypal間のやり取りにHTTPSが必要になるようです。 この質問は、このテーマにリンクしています また これ .

このPHP IPNコードをどのように適応させればよいのでしょうか?

$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: www.paypal.com:80\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);

$req = 'cmd=_notify-validate';

...

fputs ($fp, $header . $req);

の2つの出現を置き換えることはできますか? www.paypal.comhttps://www.paypal.com 足りるのか?

また、私のショップサイトがHTTPSでないことが問題で、この接続は拒否されるのでしょうか?


Paypalから届いたメールの一部です。


編集 (2018/06/22) が、実際に受理された回答コードを適用した後のIPNコードがこちらです。不思議なことに、まだ次のように表示されます: "IPN Verification postback to HTTPS. 更新が必要です。YES"と表示されます。ということは、以下のコードはまだ100%HTTPSに準拠していないことになります。なぜでしょうか?

<?php
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
  $value = trim(urlencode(stripslashes($value)));
  $req .= "&$key=$value";
}

$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: www.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen('tls://www.paypal.com', 443, $errno, $errstr, 30);

// variables
$item_name = $_POST['item_name'];
$business = $_POST['business'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
// and many more

if (!$fp)
{
  // HTTP ERROR
} else
{
  fputs ($fp, $header . $req);
  while (!feof($fp))
  {
    $res = fgets ($fp, 1024);
    if (strcmp ($res, "VERIFIED") == 0)
    {
        // send email to customer, etc.
    }
  }
  fclose ($fp);
}
?>

解決方法は?

<ブロッククオート

hostname

OpenSSLサポートがインストールされている場合、プレフィックスとして hostname のどちらかを使用します。 ssl:// または tls:// を使用すると、TCP/IP 上の SSL または TLS クライアント接続を使用してリモートホストに接続できます。

http://www.php.net/fsockopen

また、ポートも以下のように変更する必要があります。 443 . だから

$header .= "Host: www.paypal.com\r\n";
...
$fp = fsockopen('ssl://www.paypal.com', 443, $errno, $errstr, 30);
...
fputs ($fp, $header . $req);

https:// を開いているため、うまくいきません。 ソケット これは低レベルのトランスポートである。HTTPはその上のアプリケーションレベルのプロトコルであり、ソケットはそのことを知りませんし、気にもしません。ソケットレベルでは TLS 接続になります。

また、私のショップサイトがHTTPSでないことが問題で、この接続は拒否されるのでしょうか?

ブラウザがあなたのサーバーとどのような接続をしているかは関係なく、誰もそれを知りません。あなたはPHPプログラムからPaypalにソケットを開いていますが、それはコマンドラインから直接行っているのと同じで、quot;HTTP"接続は全く関係ありません。