Invia module tramite cURL e reindirizza il browser a PayPal

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 module sul mio server prima di submit l'utente al server di PayPal. Un'opzione consiste nel concatenare i dati in una singola string, assegnare la string al field 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 submit un module PayPal HTML standard. Come posso redirect l'utente a PayPal per completare la procedura di checkout?

  // Process PayPal payment if ($method == 'PayPal') { // Prepare POST data $query = arrays(); $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); } 

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

Dovresti redirect l'utente con la function di header php e submit VAR come GET non POST.

 // Process PayPal payment if ($method == 'PayPal') { // Prepare GET data $query = arrays(); $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); } 

Piuttosto che cercare di submit tutti i dati su PayPal e viceversa, è necessario conservare i dati sul server e submit 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 di PayPal, ha le linee guida su come implementare queste cose.

È necessario utilizzare l'IPN o alcune elaborazioni post simili perché PayPal è l'unico a sapere se è stato effettivamente effettuato un pagamento. Non fidarti dei dati che ottieni dall'utente.

facendo arricciare farà chiamate end-to-end nel back-end, non si rifletterà sul comportmento del frontend.

devi creare un module con field nascosto e javascript per submit automaticamente il module una volta caricata la pagina.