2013-12-26 5 views
3

Я работаю над интеграцией своего сайта с PayPal и получением его для работы в режиме песочницы. Я работаю в Codeigniter (PHP). Я получил уведомления IPN отлично, но не могу понять, где я ошибаюсь в PDT (нужно это, чтобы показать правильную страницу подтверждения и вернуться). Я много раз проверял токен идентификации, убедился, что файл htaccess не ограничивает доступ к обратному вызову, убедился, что электронное письмо проверено для бизнес-поля, убедитесь, что все идет в песочницу, а не на сайте, и сделана верный автозапуск включен с правильными параметрами, и даже попросил техническую поддержку (без получения какой-либо полезной помощи). Но я продолжаю получать возврат ($ response) от «FAIL» с кодом ошибки 4002. Любая помощь в том, как отлаживать это, будет с благодарностью.Ошибка передачи данных Paypal (PDT) 4002

Вот моя форма:

<form class="paypal login" action="http://########.com/paypal/purchase" method="post" id="paypal_form">  
    <fieldset id="inputs"> 
     <input type="hidden" name="first_name" value=""> 
     <input type="hidden" name="last_name" value=""> 
     <input type="hidden" name="email" value=""> 
     <input type="hidden" name="quantity" value=""> 
     <input type="hidden" name="order_tc_id" value="###########"> 
    </fieldset> 
    <fieldset id="actions"> 
     <input type="submit" id="paypal-btn" class="paypal-order" alt="Order" value="Purchase"/> 
    </fieldset> 
</form> 

Вот где он идет:

$querystring = '?'; 
$querystring .= "business=".urlencode("[email protected]#######.net")."&"; 
$querystring .= "cmd=".urlencode("_xclick")."&"; 
$querystring .= "amount=".urlencode(krw_usd($items_no_tax_price))."&"; 
$querystring .= "rm=".urlencode(2)."&"; 
$querystring .= "quantity=".urlencode($quant)."&"; 
$querystring .= "first_name=".urlencode($first_name)."&"; 
$querystring .= "last_name=".urlencode($last_name)."&"; 
$querystring .= "email=".urlencode($email)."&"; 
$querystring .= "currency_code=".urlencode("USD")."&"; 
$querystring .= "return=".urlencode(stripslashes($return_url))."&"; 
$querystring .= "cancel_return=".urlencode(stripslashes($cancel_url))."&"; 
$querystring .= "notify_url=".urlencode(stripslashes($notify_url)); 

header('location:https://www.sandbox.paypal.com/cgi-bin/webscr'.$querystring); 

А вот возвращение URL:

$request = curl_init(); 

curl_setopt_array($request, array 
(
    CURLOPT_URL => 'https://www.sandbox.paypal.com/cgi-bin/webscr', 
    CURLOPT_POST => 1, 
    CURLOPT_POSTFIELDS => http_build_query(array 
    (
     'cmd' => '_notify-synch', 
     'tx' => $tx, 
     'at' => '#############################', 
    )), 
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_HEADER => 0, 
)); 

$response = curl_exec($request); 
$status = curl_getinfo($request, CURLINFO_HTTP_CODE); 

curl_close($request); 

$response = substr($response, 7); 
$response = urldecode($response); 

preg_match_all('/^([^=\s]++)=(.*+)/m', $response, $m, PREG_PATTERN_ORDER); 
$response = array_combine($m[1], $m[2]); 

if(isset($response['charset']) AND strtoupper($response['charset']) !== 'UTF-8') 
{ 
    foreach($response as $key => &$value) 
    { 
    $value = mb_convert_encoding($value, 'UTF-8', $response['charset']); 
    } 
    $response['charset_original'] = $response['charset']; 
    $response['charset'] = 'UTF-8'; 
} 

ksort($response); 

foreach($response as $k=>$v) 
{ 
    echo "Key: " . $k . ", Value: " . $v; 
    echo "<br>"; 
} 
+0

Кажется, что проблема с возвратом url и paypal не может вернуться после оплаты и дает вам 4002 (Внутренняя ошибка). Пожалуйста, убедитесь, что вы можете связаться с возвращаемым URL-адресом, указанным вами –

+0

Спасибо за ответ, но я думаю, что возвращаемый URL-адрес определенно доступен, потому что перенаправление идет туда идеально. И уведомление IPN не имеет проблем попасть на свою страницу с аналогичным маршрутом с теми же настройками. – briamkin

ответ

6

$ tx_token = strtoupper ($ _ GET ['tx']), это работа.

+0

Непонятно, что вы предлагаете OP. Вы говорите, что преобразование идентификатора транзакции в верхний регистр, прежде чем отправлять его в PayPal, должно исправить их проблему? Если да, не могли бы вы объяснить, почему? –

+1

да, конвертировать идентификатор транзакции перед отправкой – Lance

+0

Вау, это, по-видимому, проблема. Примерно в 2015-05-07 мы начали получать прерывистые сбои с ошибками PDT с ошибкой 4002 - с кодом, который работал некоторое время. Я могу подтвердить, что «curl --data» cmd = _notify-synch & tx = abcde12345 & at = MyToken 'https: // www.paypal.com/cgi-bin/webscr' не удается, но точно такая же команда с верхним регистром tx преуспевает (где " abcde12345 '- это tx PayPal, предоставляемый в обратном URL, а MyToken - наш живой токен PayPal). – medmunds

Смежные вопросы