2010-05-03 20 views
8

Jestem nowym użytkownikiem systemu PayPal API i mam problem z wywołaniem SetExpressCheckout przy użyciu CURL w PHP. Ustawiłem wszystko poprawnie, o ile mi wiadomo, ale ciągle otrzymywałem błąd 81002 "Metoda określona nie jest obsługiwana".Paypal NVP API - Otrzymuj błąd 81002

Fragment kodu znajduje się poniżej. Dostałem plik certyfikatów głównych CA od here.

<?php 

$paypal_data = array(
    'USER' => urlencode('andree_1272823561_biz_api1.gmail.com'), 
    'PWD' => urlencode('1272823576'), 
    'SIGNATURE' => urlencode('Am1t0wiu2tv7VwZ5ebdeY9zv1GF6Ad0PFz-qTGFFf7vbWU6ee4bxy8KL'), 
    'VERSION' => urlencode('52.0'), 
    'PAYMENTACTION' => urlencode('Sale'), 
    'METHOD' => urlencode('SetExpressCheckout'), 
    'AMT' => urlencode('52.00'), 
    'RETURNURL' => urlencode('get_express_checkout_details.php'), 
    'CANCELURL' => urlencode('index.php') 
); 

$url = 'https://api-3t.sandbox.paypal.com/nvp?' . http_build_query($paypal_data); 
$curl = curl_init(); 

curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem'); 

$result = curl_exec($curl); 
curl_close($curl); 
parse_str($result, $result); 
?> 

<pre>Data sent: <?php print_r($paypal_data); ?></pre> 
<pre>Result: <?php print_r($result); ?></pre> 

Kiedy uruchomić kod, wyjście jest następujący:

Data sent: Array 
(
    [USER] => andree_1272823561_biz_api1.gmail.com 
    [PWD] => 1272823576 
    [SIGNATURE] => Am1t0wiu2tv7VwZ5ebdeY9zv1GF6Ad0PFz-qTGFFf7vbWU6ee4bxy8KL 
    [VERSION] => 52.0 
    [PAYMENTACTION] => Sale 
    [METHOD] => SetExpressCheckout 
    [AMT] => 52.00 
    [RETURNURL] => get_express_checkout_details.php 
    [CANCELURL] => index.php 
) 

Result: Array 
(
    [ACK] => Failure 
    [L_ERRORCODE0] => 81002 
    [L_SHORTMESSAGE0] => Unspecified Method 
    [L_LONGMESSAGE0] => Method Specified is not Supported 
    [L_SEVERITYCODE0] => Error 
) 

Ktoś wie co może być problemem?

Pozdrawiam, Andree.

+0

Działa ze mną dobrze, jedyna różnica. jest to, że nie używam opcji certyfikatu i dodałem te dwie opcje curl_setopt ($ curl, CURLOPT_SSL_VERIFYPEER, FALSE); \t curl_setopt ($ curl, CURLOPT_SSL_VERIFYHOST, FALSE); – falomir

+0

Hm .. dziwne. Zmieniłem opcję CAINFO z dwiema liniami, które zasugerowałeś, i wciąż otrzymałem ten sam komunikat o błędzie. – Andree

Odpowiedz

2

Nie używam PHP API, ale wystąpił ten sam błąd 81002 przy użyciu Callback API (java) i dostałem to, gdy niektóre parametry były albo brakujące, albo źle sformatowane.

Nie wiem, czy problem został rozwiązany, ale moja rada sprawdzałaby, który z parametrów jest wymagający dla SetExpressCheckout (API Reference). A jeśli je ustawiłeś, sprawdź, czy część opisu parametru spełnia ograniczenia.

Niestety, ale czasem rzucają nieodpowiednie błędy (lub błędy, których programista nie może zrozumieć). Z drugiej strony zazwyczaj większość odpowiedzi udzielam na ich forum. Jeśli w "kłopocie" możesz również napisać prywatną wiadomość do członka zespołu PayPal na zmianę (lub do osoby, która już rozwiązała twój problem).

Mam nadzieję, że pomogło!
Despot

+1

Uggh; Dokumentacja referencyjna API nie jest zbyt dobra.Na przykład dla operacji 'SetExpressCheckout', najwyraźniej parametr' AMT' jest "przestarzały", ale jest również "wymagany"! Z pozoru nie jest to bezwzględnie wymagane, ponieważ udało mi się pomyślnie wykonać tę operację bez uwzględnienia tego parametru. –

4

Problem polega na użyciu urlencode + http_build_query. Kończy się podwójnym kodowaniem i system PayPal odrzuci niektóre informacje.

+2

Miałem ten sam problem z moim własnym kodem właśnie teraz. Odkryłem, że "dwukrotnie kodowałem" żądanie i to było przekształcanie separatorów "i" nazwa-wartość jako "% 26", stąd błąd "Nieokreślona metoda". [To jest złe i bardzo mylące, że błąd _ również_ zawiera "długą wiadomość", "Określona metoda nie jest obsługiwana", ponieważ jest to bezpośrednio sprzeczne z "krótką wiadomością"! Pomyślałem, że powiedziano mi, że metoda "SetExpressCheckout" nie jest obsługiwana!] –

+0

Miałem podobny problem, ponieważ używam ";" jako separator. Paypal obsługuje tylko "i". – StrangeElement

3

Miałem ten problem iw końcu odkryłem, że to był problem z przesyłaniem parametrów w ogóle. Używałem następujący rodzaj kodu, aby przekazać parametry (jak pokazano w różnych przykładów na netto na PayPal):

http.set_form_data({"q" => "ruby", "lang" => "en"}, ';') 

Kiedy zmieniłem to:

http.form_data = {"q" => "ruby", "lang" => "en"} 

to przestał dawać mi nieznany błąd metody (i przeniesiony na inne błędy :-)

Dla mnie działał poniższy kod Ruby (usunąłem jednak zwrotne adresy URL). Nazwa użytkownika itp. To standardowe piaskownice.

# http://www.ensta-paristech.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html 
# https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ECGettingStarted 

require 'net/https' 
require 'uri' 

uri = URI('https://api-3t.sandbox.paypal.com/nvp') 

request_object = Net::HTTP::Post.new(uri.path) 

request_object.form_data = { 
'USER'=>'sdk-three_api1.sdk.com', # Sandbox value. See e_howto_api_ECGettingStarted 
'PWD'=>'QFZCWN5HZM8VBG7Q', # Sandbox value. See e_howto_api_ECGettingStarted 
'SIGNATURE'=>'A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU', # Sandbox value. See e_howto_api_ECGettingStarted 
'METHOD'=>'SetExpressCheckout', 
'VERSION'=>'88.0', 
'PAYMENTREQUEST_0_PAYMENTACTION'=>'Sale', 
'PAYMENTREQUEST_0_AMT'=>'23.00', # Must have exactly two decimals for cents. See e_howto_api_ECGettingStarted above. 
'PAYMENTREQUEST_0_CURRENCYCODE'=>'USD', 
'cancelUrl'=>'http://www.add your own URL here', 
'returnUrl'=>'http://www.add your own URL here' 
} 

http = Net::HTTP.new(uri.host,uri.port) 
# HACK: The following two lines turn off secure certificate checking!! 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
response = http.request(request_object) 
Powiązane problemy