0

joomla 1.5 Web サイトでのペイパル支払いを検証するのに問題がありました。支払いは成功していますが、常に「INVALID」と表示されます。Paypal から POST 値を取得できず、GET 値しか取得できません。これらのコードまたは設定の何が問題なのですか。

sandbox.paypal.com での私のペイパル設定

IPN : Turn On 
Message delivery : enabled
notification url : http://mysite.com/index.php?option=com_order&type=orders
auto return : on
return url : http://mysite.com/index.php?option=com_order&type=orders
PDT : on
Encrypted Website Payments : off
PayPal Account Optional : off

mycomponent joomla payment.php

<form method="post" action="https://www.sandbox.paypal.com/cgi-bin/webscr" name="paypal">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="myname_1335697493_biz@gmail.com" name="business">
  <input type="hidden" value="test payment" name="item_name" id="item_name">
  <input type="hidden" value="11" name="item_number" id="item_number">
  <input type="hidden" value="0.1" name="amount" id="amount">
  <input type="hidden" value="USD" name="currency_code" id="currency_code">
  <input type="hidden" value="<?php echo JURI::base();?>index.php?option=com_order&type=orders" name="return" id="return">
  <input type="hidden" value="<?php echo JURI::base();?>index.php?option=com_order&type=orders" name="cancel_return" id="cancel_return">
  <input type="hidden" value="<?php echo JURI::base();?>index.php?option=com_order&task=orders" name="notify_url" id="notify_url">
  <input type="hidden" name="rm" value="2">
  <table class="tblpay">
  .....
  </table>
</form>

私のcontroller.phpで

function display()
{   
    $user =& JFactory::getUser();
    $type = JRequest::getVar('type');
    switch($type) {
        ...
            case 'orders':
            $viewName    = 'orders'; 
            $viewLayout  = 'orderslayout';
            if (JRequest::getVar('tx') != null){
                $this->processpayment();
                $viewLayout  = 'paymentlayout';
            }
            break;
        ...
}

function processpayment(){
    // Response from Paypal

    // read the post from PayPal system and add 'cmd'
    $req = 'cmd=_notify-validate';
    $get = JRequest::get('get');
    foreach ($get as $key => $value) {
        $value = urlencode(stripslashes($value));
        $req .= "&$key=$value";
    }
    // assign posted variables to local variables
    $data['amount']         = JRequest::getVar('amt');
    $data['currency']       = JRequest::getVar('cc');
    $data['cm']             = JRequest::getVar('cm');
    $data['idorder']        = JRequest::getVar('item_number');
    $data['st']             = JRequest::getVar('st');
    $data['tx']             = JRequest::getVar('tx');
    $data['option']         = JRequest::getVar('option');
    $data['type']           = JRequest::getVar('type');
    $data['paymentresult']  = "";

    // post back to PayPal system to validate
    $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); 
    if (!$fp) {
        // HTTP ERROR
    } else {    

        fputs ($fp, $header . $req);
        while (!feof($fp)) {
            $res = fgets ($fp, 1024);
            if (strcmp($res, "VERIFIED") == 0) {
                ...
            }else if (strcmp ($res, "INVALID") == 0) {
                ...
            }       
        }       
    fclose ($fp);
    }

    //$redirectTo = str_replace("amp;","",JRoute::_('index.php?option='.JRequest::getVar('option').'&type=orders&layout=paymentlayout')); 
    //$this->setRedirect($redirectTo, '');
}

これは、paypal から取得した結果です (jdump を使用):

[string] option = "com_order"
[string] type = "orders"
[string] tx = "9D9224627W344360N"
[string] st = "Completed"
[string] amt = "0.10"
[string] cc = "USD"
[string] cm = ""
[string] item_number = "41"
[string] Itemid = "" --> why i get this because i never send itemid?
4

1 に答える 1

0

今日も同様の問題がありましたが、通常、これらの「INVALID」応答は、送信されたデータが受信したデータとまったく同じでない場合に発生すると思います。

私にとっては住所の問題でしたが、あなたにとってはおそらくそのItemidです。私の問題 (他の人に役立つかもしれないのでここで言及します) で、paypal はユーザーのアドレスを返送するように要求されていました。Paypal では住所を複数行にできるため、住所の行間に \r\n が追加されます。

通常、何か行を使用して値を送り返すのがベストプラクティスです...

$value = urlencode( stripslashes( $value ) );

ただし、アドレスを要求した場合、これは機能しません。\r\n からスラッシュが削除されるため、キーが address_street の場合に urlencode (または別の方法でアドレスを取得するだけ) の条件を実行するだけです。私がやったこと)

あなたの場合、上記のコードを次のように変更できます

foreach ( $post as $key => $value ) {
        if ($key != 'Itemid')
        {
        $value = urlencode( stripslashes( $value ) );
        $req .= "&$key=$value";
        }
    }

それがあなたのためにそれを解決することを願っています;)

于 2012-05-01T17:04:23.557 に答える