0

このクラスを使用しています

<?php
class paypalIPN {
    //sandbox:
    private $paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
    //live site:
    //private $paypal_url = 'https://www.paypal.com/cgi-bin/webscr';
    private $data = null;

    public function __construct()
    {
        $this->data = new stdClass;
    }

    public function isa_dispute()
    {
        //is it some sort of dispute.
        return $this->data->txn_type == "new_case";
    }

    public function validate()
    {
        // parse the paypal URL
        $response = "";
        $url_parsed = parse_url($this->paypal_url); 
        // generate the post string from the _POST vars aswell as load the
        // _POST vars into an arry so we can play with them from the calling
        // script.
        $post_string    = '';    
        foreach ($_POST as $field=>$value) {        
            $this->data->$field = $value;
            $post_string .= $field.'='.urlencode(stripslashes($value)).'&'; 
        }
        $post_string.="cmd=_notify-validate"; // append ipn command

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->paypal_url);
        //curl_setopt($ch, CURLOPT_VERBOSE, 1);
        //keep the peer and server verification on, recommended 
        //(can switch off if getting errors, turn to false)
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); 
        $response = curl_exec($ch);

        if (curl_errno($ch))
        {
            die("Curl Error: " . curl_errno($ch) . ": " . curl_error($ch));
        } 
        curl_close($ch);
        return $response;
        if (preg_match("/VERIFIED/", $response))
        {  
            // Valid IPN transaction.
           return $this->data;
        }
        else
        {  
            return false;         
        }
    }
}

そして、私はこのモードで思い出します:

 public function get_ipn()
{
    $ipn = new paypalIPN();
    $result = $ipn->validate();
    $logger = new Log('/error.log');
    $logger->write(print_r($result));
}

しかし、「VERIFIED」または「1」しか取得できません(抜き差しまたはprint_r関数を使用)。

生のカール応答を直接返すことも試みました

return $response;

また

return $this->response;

またはまた

return $this->parse_string;

しかし、毎回「1」または「VERIFIED」しか受け取りません.......

どうもありがとうございました

4

2 に答える 2

1

Paypal IPN 通知は、投稿されたデータとしてスクリプトに入ります。そのクラスでは、コードがスーパーグローバル$_POSTを使用してこの受信データを参照していることがわかります。クラスを使用する代わりに、投稿されたデータを直接操作することができます。

危険なのは、それが Paypal からのものではない可能性があることです。

ここに示したスクリプトは、ポストバック検証を行っています。つまり、Paypal が投稿したと思われる情報を取得し、すぐに戻します。あなたは彼らに「これは本当ですか?」と尋ねています。Paypal は、はい、この情報が彼らからのものであることを確認しています。その$responseコードに表示される変数には、Paypal からのこの確認のみが含まれています。

あなたのコードでは、 を呼び出す$result = $ipn->validate();と、興味深いデータがバリデーターによって次の行で返されますreturn $this->data;(同じデータが$_POST静止しています)。あなたのコードによれば、それは variable になります$result。それが処理したいもので、トランザクション データがあり、IPN 通知です。クラス内の$response値もまた、これから扱うデータが本物であることを知らせる Paypal からの興味のないうなずきにすぎません。

余談ですが、このクラスは少し面倒で柔軟性がありません。チュートリアルコード? いくつかの提案: データを直接読み取るよりも、データを validate メソッドに挿入する方が良いでしょう$_POST:

<?php
...
public function validate($data)
{
    ...

    foreach ($data as $field=>$value) { 
        ...
    }

    ...
}

//use
$result = $ipn->validate($_POST);

?>

dieまた、 curl リクエストに問題がある場合は、バリデータが呼び出されます。おそらく代わりに false を返すか、try...catch. Paypal が遅く、リクエストがタイムアウトしたという理由だけで、謎のエラー コードが表示された白い画面がプロセス全体に表示されるのは望ましくありません。エラーを処理し、しないでくださいdie。最後に、バリデーターと同様に、URL をクラスにハードコーディングするのではなく、コンストラクターに挿入する必要があります。そうすれば、クラス ファイルを変更する代わりに、外部からライブとサンドボックスを切り替えることができます。

于 2013-11-08T03:35:50.513 に答える
0

よくわかりません。$_POSTスーパーグローバルです。したがって、すでに値を持っているので、値を伝えるためにこのクラスは必要ありません。VERIFIED 応答は、データが本物であることを知らせることです。

于 2013-11-08T03:28:40.960 に答える