2012-05-01 2 views
0

나는 joomla 1.5 웹 사이트에서 paypal 지불을 veryfied 문제가 있습니다. 나는 지불이 성공하더라도 항상 "INVALID"를 얻는다. paypal에서 POST 값을 가져올 수 없으며 GET 값만 얻을 수 있습니다. 이 코드 또는 설정의 문제점. 내 controller.php에를 MyComponent의 줌라에서 sandbox.paypal.comJoomla 페이팔 IPN은 항상 INVALID를 반환합니다

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 

에서

내 페이팔 설정
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="[email protected]" 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> 

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, ''); 
} 

이 인 결과 페이팔 (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? 
+0

나는 happenned 무슨 일인지 확실하지 않은 것 같습니다, 아마도 페이팔은 그들의 문자열 또는 더 이상 일치하지 않도록 뭔가를 강화했다 것 같습니다. 그것의 진짜 깡패, 나는 하루 종일 고투하고있다. 내가 해결책을 얻으면 게시 할 것이다 ... –

답변

0

오케이 저는 오늘 비슷한 문제가 있었는데 일반적으로 제출 된 데이터가 수신 된 데이터와 정확하게 일치하지 않을 때 이러한 'INVALID'응답이 보통 발생한다고 생각합니다.

제게 그것은 주소를 쓰는 데 문제가되었지만 여러분에게는 아마 그 Itemid입니다. 내 문제 (다른 사람들에게 도움이 될 수 있기 때문에 여기에서 언급하겠다)로 페이팔은 사용자 주소를 다시 보내 달라는 요청을 받았습니다. 페이팔은 주소가 여러 줄로 길게 허용하기 때문에 주소의 줄 사이에 \ r \ n을 추가합니다. 당신이 주소를 요청한 경우는 \ 연구 \에서 슬래시를 제거하기 때문에 일반적으로 가장 좋은 방법

그것의이 값을 다시 보내도록 뭔가 라인을 사용하는 ...

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

하지만이 작동하지 않습니다 N 그래서 당신은 단지 조건부하고 싶지 그래서 열쇠는 당신이 단지를 urlencode가

귀하의 경우에는 당신이

에 위의 코드를 변경할 수 있습니다 (또는 다른 내가하고 결국 방법으로 주소를 얻기) address_street 경우
foreach ($post as $key => $value) { 
     if ($key != 'Itemid') 
     { 
     $value = urlencode(stripslashes($value)); 
     $req .= "&$key=$value"; 
     } 
    } 

호프는 그것을 해결합니다;)

관련 문제