2010-05-03 21 views
8

Soy nuevo en la API de PayPal, y tengo problemas para llamar a SetExpressCheckout usando CURL en PHP. He configurado todo correctamente, en lo que a mí respecta, pero seguí recibiendo un error 81002 "El método especificado no es compatible".Paypal NVP API - Sigue obteniendo el error 81002

El fragmento de código está a continuación. Obtuve el archivo de certificados de CA Root desde 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> 

Cuando ejecuto el código, la salida es la siguiente:

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 
) 

alguien sabe lo que podría ser el problema?

Saludos, Andree.

+0

Corre bien conmigo, la única diferencia. es que no estoy usando la opción de certificado, y agregué estas dos opciones curl_setopt ($ curl, CURLOPT_SSL_VERIFYPEER, FALSE); \t curl_setopt ($ curl, CURLOPT_SSL_VERIFYHOST, FALSE); – falomir

+0

Hm .. raro. Cambié la opción CAINFO con las dos líneas que sugirió, y aun así obtuve el mismo mensaje de error. – Andree

Respuesta

2

No estoy usando la API de PHP, pero encontré el mismo error 81002 usando la API de devolución de llamada (java) y lo obtuve cuando algunos de los parámetros faltaban o estaban mal formateados.

No sé si usted ha resuelto el problema, pero mi consejo sería revisar cuáles de los parámetros son requred para la SetExpressCheckout (API Reference). Y si lo ha configurado, compruebe si se cumplen las limitaciones de de la descripción del parámetro.

Lamentablemente, a veces arrojan errores inapropiados (o errores que el desarrollador no puede entender). Por otro lado, generalmente recibo la mayoría de mis respuestas en su foro. Si tiene "problemas", también puede escribir un mensaje privado al miembro del equipo de paypal en el turno (o a una persona que ya ha resuelto su problema).

Espero que haya ayudado!
Despot

+1

Uggh; la documentación de referencia API no es muy buena.Por ejemplo, para la operación 'SetExpressCheckout', aparentemente el parámetro' AMT' ha sido "obsoleto" pero de alguna manera también es "obligatorio". Aparentemente no es necesario, ya que pude realizar una solicitud exitosa para esa operación sin incluir ese parámetro. –

4

El problema es cuando utiliza urlencode + http_build_query. Terminará con doble codificación y PayPal rechazará parte de la información.

+2

Tuve el mismo problema con mi propio código justo ahora. Descubrí que estaba "codificando dos veces" la solicitud y que estaba convirtiendo los delimitadores de par nombre-valor '&' como '% 26', de ahí el error" Método no especificado ". [Es malo, y muy confuso, que el error _también_ incluye el 'mensaje largo' "El método especificado no es compatible" ya que eso contradice directamente el 'mensaje corto'. ¡Pensé que me estaban diciendo que el método 'SetExpressCheckout' no era compatible!] –

+0

Tuve un problema similar porque estoy usando ';' como separador PayPal solo es compatible con '&'. – StrangeElement

3

Tuve este problema y al final descubrí que era un problema que se transmitieran los parámetros . Yo estaba usando el siguiente tipo de código para pasar los parámetros (como se muestra en varios ejemplos en la red para PayPal):

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

Cuando cambié esto:

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

dejó de darme el error de método desconocido (y se trasladó a otros errores :-)

El código de Ruby a continuación funcionó para mí (sin embargo, he eliminado las URL de devolución). El nombre de usuario, etc. son los estándares de sandbox.

# 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) 
Cuestiones relacionadas