2013-02-12 18 views
16

Sto sviluppando un sito in cui i clienti hanno diverse opzioni di pagamento, tra cui PayPal Payments Standard. Poiché sto raccogliendo una discreta quantità di dati sul cliente, vorrei elaborare il modulo sul mio server prima di inviare l'utente al server di PayPal. Un'opzione consiste nel concatenare i dati in una singola stringa, assegnare la stringa al campo custom e quindi elaborarla nella risposta IPN, ma trovo che questa sia una soluzione molto poco elegante. Invece, dopo aver raccolto i dati dell'utente, sto tentando di utilizzare cURL per inviare un modulo PayPal HTML standard. Come posso reindirizzare l'utente a PayPal per completare la procedura di checkout?Invia modulo tramite cURL e reindirizza il browser a PayPal

// Process PayPal payment 
    if ($method == 'PayPal') { 

    // Prepare POST data 
    $query = array(); 
    $query['notify_url'] = 'http://example.com/ipn'; 
    $query['cmd'] = '_cart'; 
    $query['upload'] = '1'; 
    $query['business'] = '[email protected]'; 
    $query['address_override'] = '1'; 
    $query['first_name'] = $first_name; 
    $query['last_name'] = $last_name; 
    $query['email'] = $email; 
    $query['address1'] = $ship_to_address; 
    $query['city'] = $ship_to_city; 
    $query['state'] = $ship_to_state; 
    $query['zip'] = $ship_to_zip; 
    $query['item_name_'.$i] = $item['description']; 
    $query['quantity_'.$i] = $item['quantity']; 
    $query['amount_'.$i] = $item['info']['price']; 

    // Prepare query string 
    $query_string = ''; 
    foreach ($query as $key=>$value) { 
     $query_string .= $key.'='.urlencode($value).'&'; 
    } 
    $query_string = rtrim($query_string, '&'); 

    // Open connection 
    $ch = curl_init(); 

    //set the url, number of POST vars, POST data 
    curl_setopt($ch,CURLOPT_URL, 'https://www.paypal.com/cgi-bin/webscr'); 
    curl_setopt($ch,CURLOPT_POST, count($query)); 
    curl_setopt($ch,CURLOPT_POSTFIELDS, $query_string); 

    // Execute post 
    $result = curl_exec($ch); 

    // Close connection 
    curl_close($ch); 
    } 
+0

Cosa contiene $ result dopo curl_exec? – Drahcir

+0

@Gerve: ho fatto un print_r e mi sto solo dicendo in modo incomprensibile: '<ÿÿ1' –

risposta

38

ATTENZIONE: questa risposta ha un deficit di sicurezza. Il trasferimento di dati sensibili (come voce e prezzo) tramite il client consente al cliente di modificare la transazione. vale a dire. cambia l'articolo o cambia il prezzo. Vedere la documentazione di PayPal su how to implement IPN.

È necessario reindirizzare l'utente con la funzione php header e inviare VAR come GET non POST.

// Process PayPal payment 
if ($method == 'PayPal') { 

    // Prepare GET data 
    $query = array(); 
    $query['notify_url'] = 'http://jackeyes.com/ipn'; 
    $query['cmd'] = '_cart'; 
    $query['upload'] = '1'; 
    $query['business'] = '[email protected]'; 
    $query['address_override'] = '1'; 
    $query['first_name'] = $first_name; 
    $query['last_name'] = $last_name; 
    $query['email'] = $email; 
    $query['address1'] = $ship_to_address; 
    $query['city'] = $ship_to_city; 
    $query['state'] = $ship_to_state; 
    $query['zip'] = $ship_to_zip; 
    $query['item_name_'.$i] = $item['description']; 
    $query['quantity_'.$i] = $item['quantity']; 
    $query['amount_'.$i] = $item['info']['price']; 

    // Prepare query string 
    $query_string = http_build_query($query); 

    header('Location: https://www.paypal.com/cgi-bin/webscr?' . $query_string); 
} 
+0

Ti amo! Ovviamente la soluzione è di non usare affatto cURL! Ma come facevi a sapere che le variabili GET avrebbero funzionato? È comune che una API Web accetti entrambi? –

+1

Ho usato l'API di PayPal molto tempo fa, ho appena ricordato come l'ho fatto. Lieto che funzionasse – Drahcir

+0

Bene, grazie per aver condiviso la tua conoscenza. –

1

facendo arricciare farà capo all'altro chiamate a lato back-end, non si rifletta sulla comportamento frontend.

devi compilare un modulo con campo nascosto e javascript per inviare automaticamente il modulo una volta caricata la pagina.

4

Piuttosto che cercare di inviare tutti i dati su PayPal e viceversa, è necessario conservare i dati sul server e inviare solo un token identificativo. Tutti i dati inviati a PayPal (tramite il browser dell'utente) possono essere intercettati e modificati. Questo è un serio pericolo per la sicurezza.

Se si invia solo il token non c'è possibilità di manomissione.

Leggi le specifiche PayPal, ha linee guida su come implementare queste cose.

È must uso IPN o qualche simile post processing perché PayPal è l'unico che sa se un pagamento è stato effettivamente fatto. Do non fidati di tutti i dati che ricevi dall'utente.

+0

In realtà, sto facendo esattamente ciò che PayPal suggerisce di fare: https://www.x.com/developers/paypal/documentation- Strumenti/PayPal-pagamenti standard/integrazione-guida/cart_upload. Sto solo cercando di farlo in cURL per rendere più semplice conservare alcuni dei dati sul mio server. Nel mio caso, non mi interessa se il pagamento passa o no - mi piacerebbe comunque raccogliere le informazioni sui clienti. –

+0

Questo non ha alcun senso. Hai intenzione di chiedere all'utente le loro credenziali PayPal e di effettuare il pagamento per loro conto? Questo è assolutamente inaccettabile. Non devi fare richiesta a PayPal, l'utente deve, e poi PayPal ti contatti. – Halcyon

+2

Quando si utilizza PayPal Payments Standard, l'utente viene semplicemente reindirizzato al sito web di PayPal. Inseriscono le loro credenziali da soli. L'unica cosa che fa questo modulo è inviare informazioni sul carrello. Penso che potresti sentirti confuso con i metodi di integrazione avanzati, che non sto utilizzando qui. –

Problemi correlati