2013-03-11 18 views
14

Sto tentando di impostare il pagamento PayPal Express tramite l'API NVP "classica".Impossibile connettersi all'API di PayPal tramite cURL

Cercando di connettersi dal mio server a PayPal-Sandbox utilizzando cURL, la connessione si blocca e scade dopo circa 2 minuti.

Sto utilizzando il example call dalla documentazione:

curl -v --insecure https://api-3t.sandbox.paypal.com/nvp -d "USER=platfo_1255077030_biz_api1.gmail.com&PWD=1255077037&SIGNATURE=Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf&METHOD=SetExpressCheckout&VERSION=78&PAYMENTREQUEST_0_PAYMENTACTION=SALE&PAYMENTREQUEST_0_AMT=19&PAYMENTREQUEST_0_CURRENCYCODE=USD&cancelUrl=http://www.yourdomain.com/cancel.html&returnUrl=http://www.yourdomain.com/success.html" 

uscita Shell è:

* About to connect() to api-3t.sandbox.paypal.com port 443 (#0) 
* Trying 173.0.82.83... Connection timed out 
* couldn't connect to host 
* Closing connection #0 
curl: (7) couldn't connect to host 

Quando provo a fare questo tramite PHP curl non ottengo errori e semplicemente un handle di risorse vuoto.

Posso facilmente eseguire le richieste (e ottenere di nuovo i dati corretti) dalla mia macchina locale e da altri server a cui posso accedere, quindi suppongo che si tratti di un'errata configurazione del server. Non essendo una persona server, sono un po 'incapace.

cURL è abilitato e viene registrato il seguente in phpinfo:

libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6 

OpenSSL è attivato pure. Inoltre, sto riscontrando gli stessi problemi quando tento di connettermi alla versione live dell'API.

+2

Forse c'è qualche regola del firewall sul tuo server che blocca queste richieste, sei in grado di accedere con arricciare altri siti web da questo server? che dire di altri siti Web HTTPS? – talkol

+0

Grazie, stranamente posso facilmente usare curl per altri domini, comprese le connessioni 'https'. – m90

+1

guarda i commenti qui http://stackoverflow.com/questions/12936733/timeout-on-connecting-to-https sono tutti correlati a una restrizione firewall in uscita .. e qualcuno menziona anche paypal :) – talkol

risposta

0

A) In primo luogo cercare di wget https://api-3t.sandbox.paypal.com/nvp e vedere se è possibile ottenere una semplice connessione con "Bad Request" risposta, e se non v'è stato bloccato da server di Paypal o il firewall si blocca sulla porta 443 per accedere a Paypal

B) provare ad aggiungere header personalizzato: -H "Host: api-3t.sandbox.paypal.com"

curl -v --insecure https://api-3t.sandbox.paypal.com/nvp -d "USER=platfo_1255077030_biz_api1.gmail.com&PWD=1255077037&SIGNATURE=Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf&METHOD=SetExpressCheckout&VERSION=78&PAYMENTREQUEST_0_PAYMENTACTION=SALE&PAYMENTREQUEST_0_AMT=19&PAYMENTREQUEST_0_CURRENCYCODE=USD&cancelUrl=http://www.yourdomain.com/cancel.html&returnUrl=http://www.yourdomain.com/success.html" -H "Host: api-3t.sandbox.paypal.com"

C) che versione di CURL e sul quale piattaforma stai usando? Ho:

curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2 
0

Prova

$ch = curl_init(); 
# Merchant Account Credentials 
$ppUserID = "User Id Email"; //Take it from sandbox dashboard for test mode or take it from paypal.com account in production mode, help: https://developer.paypal.com/docs/classic/api/apiCredentials/ 
$ppPass = "User Pass"; //Take it from sandbox dashboard for test mode or take it from paypal.com account in production mode, help: https://developer.paypal.com/docs/classic/api/apiCredentials/ 
$ppSign = "Paypal Sign"; //Take it from sandbox dashboard for test mode or take it from paypal.com account in production mode, help: https://developer.paypal.com/docs/classic/api/apiCredentials/ 

$ppAppID = "APP-80W284485P519543T"; //if it is sandbox then app id is always: APP-80W284485P519543T 

$paypal_header_options = array(); 
    $paypal_header_options[] = "X-PAYPAL-SECURITY-USERID: $ppUserID"; 
    $paypal_header_options[] = "X-PAYPAL-SECURITY-PASSWORD: $ppPass"; 
    $paypal_header_options[] = "X-PAYPAL-SECURITY-SIGNATURE: $ppSign"; 
    $paypal_header_options[] = "X-PAYPAL-REQUEST-DATA-FORMAT: NV"; 
    $paypal_header_options[] = "X-PAYPAL-RESPONSE-DATA-FORMAT: NV"; 
    $paypal_header_options[] = "X-PAYPAL-APPLICATION-ID: $ppAppID"; 

$URL = 'https://api-3t.sandbox.paypal.com/nvp' 
    .'?USER='.$ppUserID 
    .'&PWD='.$ppPass 
.'&SIGNATURE='.$ppSign 
    .'&METHOD=SetExpressCheckout' 
    .'&VERSION=93' 
    .'&RETURNURL=https://localhost/express-checkout-single-product/success.php?success=true' 
    .'&CANCELURL=https://localhost/express-checkout-single-product/index.php' 
.'&PAYMENTREQUEST_0_CURRENCYCODE=USD' 
.'&PAYMENTREQUEST_0_AMT=250.00' #The payment amount for the first receiver # Merchant(Primary AC) Account Amount 
.'&PAYMENTREQUEST_0_ITEMAMT=225.00'       # Merchant(Primary AC) Account Email 
.'&PAYMENTREQUEST_0_TAXAMT=25.00' #Receiver designation (there can be only 1 primary receiver) 
.'&PAYMENTREQUEST_0_PAYMENTACTION=Order' 
.'&PAYMENTREQUEST_0_SELLERPAYPALACCOUNTID=email' 
.'&PAYMENTREQUEST_0_PAYMENTREQUESTID=CART110-PAYMENT0' #The payment amount for the second receiver # Seller(Secondry AC) Account Amount 
.'&PAYMENTREQUEST_1_CURRENCYCODE=USD' 
.'&PAYMENTREQUEST_1_AMT=75.00' #The payment amount for the first receiver # Merchant(Primary AC) Account Amount 
.'&PAYMENTREQUEST_1_ITEMAMT=65.00'       # Merchant(Primary AC) Account Email 
.'&PAYMENTREQUEST_1_TAXAMT=10.00' #Receiver designation (there can be only 1 primary receiver) 
.'&PAYMENTREQUEST_1_PAYMENTACTION=Order' 
.'&PAYMENTREQUEST_1_SELLERPAYPALACCOUNTID=email' 
.'&PAYMENTREQUEST_1_PAYMENTREQUESTID=CART110-PAYMENT1' 
    .'&L_PAYMENTREQUEST_0_NAME0=Departs2' 
    .'&L_PAYMENTREQUEST_0_NAME0=Sunset' 
.'&L_PAYMENTREQUEST_0_QTY0=1' 
    .'&L_PAYMENTREQUEST_0_AMT0=125' 
    .'&L_PAYMENTREQUEST_0_TAXAMT0=15' 
    .'&L_PAYMENTREQUEST_0_NAME1=Departs' 
.'&L_PAYMENTREQUEST_0_QTY1=1' 
    .'&L_PAYMENTREQUEST_0_AMT1=100.00' 
    .'&L_PAYMENTREQUEST_0_TAXAMT1=10.00'; 
    curl_setopt($ch, CURLOPT_URL, $URL); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    // curl_setopt($ch, CURLOPT_HTTPHEADER, $paypal_header_options); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    $paypal_response = curl_exec($ch); 

$responseAr = explode('&', $paypal_response); 
$parsedResponseAr = array(); 
foreach($responseAr as $i => $value) { 
    $tmpAr = explode('=', $value); 
    if(!empty($tmpAr)) 
     $parsedResponseAr[strtoupper($tmpAr[0])] = urldecode($tmpAr[1]); 
} 
print_r(json_encode($parsedResponseAr)); 
curl_close($ch); 
0

Molto probabilmente il Pagamento express servizio di pagamento arresto/tagliare tua connessione a causa di autenticazione sbagliato o certificato SSL non valido emesso. In questo caso, provare a chiedere al fornitore di servizi su questo problema.

Speriamo che risolva il problema.

0

L'errore è dovuto alla versione del pacchetto nss del server e api-3t.sandbox.paypal.com utilizzando un certificato SNI. È possibile verificarlo eseguendo

openssl s_client -servername api-3t.sandbox.paypal.com -tlsextdebug -connect api-3t.sandbox.paypal.com:443 2>/dev/null | grep "server name"

su bash. L'output è TLS server extension "server name" (id=0), len=0 che indica che questo server è con certificato SNI.

La soluzione è in realtà semplice.

Per RedHat varianti:

sudo yum -y update nss* 

Per Debian varianti:

sudo apt-get update nss* 

Non avete davvero bisogno di modificare il codice (per il collegamento saggi problemi)

Problemi correlati