3

ここでPaypalIPNをテストしています。サンドボックスで設定しました。偽のIPNリクエストを送信していて、IPNを受信して​​います。次に、確認のために情報を返すように取得し、自分でチェックアウトできるようにテキストファイルに応答を書き込んでいます。IPNは正常に起動しており、応答はテキストファイルに書き込まれています。

問題が1つだけあります...応答が空白です。

応答は「VERIFIED」または「INVALID」として受信されることになっています。これらは2つの可能な応答のみです...したがって、何が起こっているのか=Sです。どんな助けでも大歓迎です。

コード全体は以下に掲載されています:

$ipn_post_data = $_POST;

$response = "";

    // Choose url
    $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';

    // Set up request to PayPal
    $request = curl_init();
    curl_setopt_array($request, array
    (
        CURLOPT_URL => $url,
        CURLOPT_POST => TRUE,
        CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-validate') + $ipn_post_data),
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_HEADER => FALSE,
        CURLOPT_SSL_VERIFYPEER => TRUE,
        CURLOPT_CAINFO => 'cacert.pem',
    ));

    // Execute request and get response and status code
    $response = curl_exec($request);
    $status   = curl_getinfo($request, CURLINFO_HTTP_CODE);

    // Close connection
    curl_close($request);


$fh = fopen( "ipntest.txt", 'a+' );
$date = date( "Y-M-j H:i" );
fwrite( $fh, $date . " Response: " . $response . "\n" );
fclose( $fh );

if($status == 200 && $response == 'VERIFIED')
{
    // All good! Proceed...
}
else
{
    // Not good. Ignore, or log for investigation...
}

テキストファイルの出力:

2012-Nov-26 23:24 Response: 
2012-Nov-26 23:25 Response: 

私は以前このコードを使用していましたが、1週間機能させようとしていたので、一時的な障害などではありません...

みんな乾杯。

4

3 に答える 3

3

今後の参考のために、同じ問題を抱えている人のために:

ここでの問題は、CA ファイルがないことでした。

CA ファイルが正確に何をするのかはわかりませんが、Paypal の SSL 証明書と SSL 接続の確立に関係があることはわかっています。cURL のエラーを調べ始めたとき、次のことがわかりました。

[27-Nov-2012 21:46:11 UTC] cURL error: [77] error setting certificate verify locations:
  CAfile: /etc/ssl/certs/api_cert_chain.crt
  CApath: /etc/ssl/certs

私が見つけた簡単な解決策は、 IpnListener.phpクラスをダウンロードすることでした。(これはeldblzによって推奨されました。これにより、IPN の処理がはるかに簡単になり、CAFile を持っていないという解決策が提供されました。IpnListener.php パッケージ全体をダウンロードすると、certというフォルダーが含まれます。必要であり、すでに使用できるように構成されています。

于 2012-11-28T14:01:15.713 に答える
0

私はいつも以下を使用しました、そしてそれはうまく働きます...

// Validate with curl
$curl_result=$curl_err='';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'https://'.$ppHost.'/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt($ch, CURLOPT_HEADER , 1);   
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $ssl);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

$curl_result = curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);

//are we verified? If so, let's process the IPN
if (strpos($curl_result, "VERIFIED")!==false) 
    $valid = true;
else
    $valid = false;

トランザクションがサンドボックスからのものかライブサーバーからのものかによって、このサンプルの$ ppHostが正しいことを確認し、それに応じて$reqと$sslを入力する必要があります。

于 2012-11-27T07:01:47.070 に答える
0
class Paypal_IPN
{
    /** @var string $_url The paypal url to go to through cURL
    private $_url;

    /**
    * @param string $mode 'live' or 'sandbox' 
    */
    public function __construct($mode = 'live')
    {
        if ($mode == 'live')
        $this->_url = 'https://www.paypal.com/cgi-bin/webscr';

        else
        $this->_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
    }

    public function run()
    {
        $postFields = 'cmd=_notify-validate';

        foreach($_POST as $key => $value)
        {
            $postFields .= "&$key=".urlencode($value);
        }

        $ch = curl_init();

        curl_setopt_array($ch, array(
            CURLOPT_URL => $this->_url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $postFields
        ));

        $result = curl_exec($ch);
        curl_close($ch);

        $fh = fopen('result.txt', 'w');
        fwrite($fh, $result . ' -- ' . $postFields);
        fclose($fh);

        echo $result;
    }
}

別のphpファイルでこれを呼び出します:

<?php
require 'Paypal_IPN.php';
$paypal= new Paypal_IPN('sandbox');
$paypal->run();

?>
于 2012-11-27T07:08:12.783 に答える