WordPress e PayPal un'introduzione

Per questo tutorial seguiremo le fasi necessarie per integrare PayPal come fornitore di servizi di pagamento per un sito alimentato da WordPress. Lavorando con i tipi di post personalizzati creeremo un carrello della spesa base e consentiremo che i pagamenti vengano effettuati tramite PayPal. Anche se l'esempio funzionante è funzionale, è necessario adottare ulteriori misure per disinfettare e archiviare i dati quando si lavora con i pagamenti.


introduzione

Utilizzeremo pagine WP-Admin personalizzate per la visualizzazione di ordini, tipi di post personalizzati per la creazione di prodotti (classe CPT di Jeffrey Way) e modelli di pagina personalizzati per la visualizzazione di prodotti, carrelli ed elaborazione. La nostra funzione raw verrà creata in PHP e applicheremo alcuni stili di base con i CSS.

All'interno dei frammenti di codice al di sotto di alcuni markup potrebbe essere stato spogliato per la leggibilità.

Per coloro che scelgono di partecipare, si prega di andare avanti e raccogliere $ 200 o saltare alla fase 2 di questo tutorial e beneficiare dei dati di esempio.


Step 1 WP-Admin e Struttura della pagina

Pubblichiamo le pagine in WP-Admin che useremo durante il tutorial.

  1. Carrello
  2. Prodotti
  3. Grazie

Visiteremo nuovamente queste pagine e assegneremo un modello personalizzato a ciascuna successiva.


Fase 2 Struttura a tema bambino

Ora creeremo le directory e i file necessari per il nostro progetto.

Stiamo creando un tema per bambini da Twenty Ten qui, abbiamo solo bisogno di creare i file che modificheremo o creeremo da zero. Qualsiasi altro richiesto, ad es. footer.php WordPress riempirà gli spazi vuoti per noi.


Step 3 Tipi di post personalizzati di Jeffrey Way

Lavoreremo con la classe di Jeffrey Way (richiede PHP 5.3) per creare un tipo di messaggio personalizzato del prodotto
che consentirà la creazione di prodotti e non post di blog che fingono di essere prodotti, tramite WP-Admin.

Nel file /wppp/wppp/post_types.php aggiungi i seguenti pezzi di codice.

Per prima cosa includeremo la classe.

include ( 'jw_custom_posts.php');

In secondo luogo, creare un nuovo tipo di post personalizzato e identificare quali componenti della pagina di scrittura utilizzare.

$ product = new JW_Post_type ('Product', array ('supports' => array ('title', 'editor', 'excerpt', 'thumbnail', 'comments')));

Terzo, abbiamo un campo specifico che è più adatto con un campo di testo a sé stante. Prezzo.

$ product-> add_meta_box ('Informazioni sul prodotto', array ('Prezzo' => 'testo'));

Quando tutti insieme assomiglierà a questo.

include ( 'jw_custom_posts.php'); $ product = new JW_Post_type ('Product', array ('supports' => array ('title', 'editor', 'excerpt', 'thumbnail', 'comments'))); $ product-> add_meta_box ('Informazioni sul prodotto', array ('Prezzo' => 'testo'));

Passaggio 5 Recupero di tutti i prodotti

I tipi di post personalizzati di WordPress sono fantastici e l'implementazione della classe di Jeffrey può essere veloce. I dati personalizzati sono accessibili molto velocemente, proprio come faresti per i post del blog all'interno del "loop".

Andiamo a visitare wppp / tpl-products.php file e recuperare i prodotti.

// Nome modello: prodotti

Questa è una convenzione che WordPress richiede da noi per creare un modello personalizzato. Se il tema attivo contiene questo file, possiamo assegnarlo a qualsiasi pagina.

Vai avanti e assegna questo modello alla pagina dei prodotti precedentemente pubblicata.

$ products = new WP_Query (array ('post_type' => 'prodotto'));

Quindi creiamo una nuova istanza di WP_Query e cercare
un post_type di "prodotto".

utilizzando WP_Query abbiamo accesso a molti tag modello esistenti all'interno di WordPress.

Tutto ciò che è necessario ora è eseguire il loop dei prodotti e generare i dati.

while ($ products-> have_posts ()): $ products-> the_post (); il titolo(); eco '

Prezzo: '; echo get_post_meta ($ post-> ID, 'product_info_price', true); eco '

'; the_post_thumbnail ( 'prodotto'); the_excerpt (); ENDWHILE;

get_post_meta (); recupererà i dati memorizzati all'interno dei campi personalizzati, e poiché una meta-box è stata aggiunta usando la classe di JW in precedenza questo è cosa usare per recuperarne il valore.

Si noti che utilizziamo "product_info_price" come secondo parametro per get_post_meta. Questo è il nome applicato al nostro campo personalizzato quando si utilizza la classe CPT di JW. La convenzione sembra essere Nome-del-post-type_info_field.


Passaggio 6 Recupero di un singolo prodotto

Servirà WordPress singolo-custom-post-type.php se esiste un tipo di messaggio personalizzato e un file singolo-custom-post-name.php esiste all'interno del tema attivo. Questo è utile quando si crea un nuovo modello per singoli prodotti.

Molto simile al recupero di multipli che potremmo utilizzare WP_Query (per query personalizzate) e i tag modello forniti da WordPress. Tuttavia, quando si guarda un singolo oggetto, tecnicamente non abbiamo più bisogno di un loop o di una custom WP_Query.

the_post (); the_post_thumbnail ( 'prodotto'); il titolo(); echo get_post_meta ($ post-> ID, 'product_info_price', true); il contenuto();

Un'altra aggiunta al nostro single-Product.php file, un modulo che consentirà di aggiungere questo articolo alla sessione del carrello degli acquisti.

Due campi nascosti sono stati aggiunti a questo modulo, 1 che memorizzerà l'ID post (o ID prodotto) e l'altro verrà utilizzato un po 'più tardi. Viene impostata anche una quantità predefinita di 1.


Passaggio 7 Aggiunta di un elemento alla sessione

Il pulsante "Aggiungi al carrello" si trova sulla pagina del singolo prodotto come illustrato nel passaggio precedente, dopo che un utente ha scelto di aggiungere un prodotto il modulo verrà inviato alla pagina del carrello.

Lavoriamo con il wppp / tpl-cart.php file ora.

/ * NOME DEL MODELLO: Carrello * /

TPL-cart.php è un modello personalizzato, quindi è necessario comunicare a WordPress e assegnare il modello alla pagina del carrello tramite WP-Admin.

if ($ _ POST ['wppp_product_id']): $ product_id = $ _POST ['wppp_product_id']; $ qty = $ _POST ['wppp_qty']; $ action = $ _POST ['wppp_action']; switch ($ action) case "add": $ _SESSION ['carrello'] [$ product_id] = $ _SESSION ['carrello'] [$ product_id] + $ qty; rompere; case "empty": unset ($ _ SESSION ['cart']); rompere; case "remove": unset ($ _ SESSION ['cart'] [$ product_id]); rompere;  finisci se;

Ora controlliamo se sono stati inviati dati post adatti e, se è vero, memorizziamo i dati per comodità come variabili.

Utilizzando un interruttore per determinare l'azione corrente e il processo di conseguenza.

foreach ($ _ SESSION ['cart'] come $ product => $ qty): $ row = get_post ($ product); echo $ row-> post_name echo $ row-> post_title; echo get_post_meta ($ product, 'product_info_price', true); echo $ qty; echo number_format (get_post_meta ($ product, 'product_info_price', true) * $ qty, 2); endforeach;

Per stampare il carrello sulla pagina viene utilizzato un loop per iterare sui dati della sessione.

Mentre in questo ciclo richiediamo dati leggibili dall'uomo anziché la rappresentazione numerica di ogni prodotto / post archiviato all'interno della sessione.

Per fare questo get_post () è perfetto che consente un modo rapido per interrogare WordPress passando un post ID. I dati restituiti sono una versione ridotta di WP_Query ed è memorizzato all'interno $ row.

$ row ora può essere stampato sulla pagina insieme a un totale parziale che mostra il prezzo del prodotto moltiplicato per la quantità.

All'interno del ciclo viene inserito un modulo che, per comodità, consente all'utente di rimuovere un oggetto interamente dal proprio carrello.

Utilizzando l'interruttore scritto in precedenza, un controllo per il caso di "rimuovere" consentirà di rimuovere l'elemento dalla sessione.


Passaggio 8 Preparazione per PayPal

PayPal offre una serie di modi per inviare e recuperare dati, utilizzeremo la Notifica immediata del pagamento o l'IPN.

  • Informazioni su IPN
  • Test con guida IPN

Per consentire a PayPal di calcolare ed elaborare qualsiasi transazione, i dati possono essere inviati da un modulo con campi corrispondenti alle convenzioni di denominazione e di dati previsti stabiliti da PayPal.
La guida IPN può essere trovata nell'intestazione o nei menu a piè di pagina di paypal.com/ipn.

Andiamo avanti ... dentro TPL-cart.php, al di sotto di tutto un modulo viene aggiunto con i requisiti essenziali di PayPal.

$ qtà):?>

Controlla developer.paypal.com per un sandbox e un ambiente di test.

Una volta effettuato l'accesso al tuo account sviluppatore, sarai in grado di creare account compratore e venditore di prova e "Entra nel sito di test sandbox".

Invio del carrello a "https://www.sandbox.paypal.com/cgi-bin/webscr"consentirà l'uso dell'ambiente di test.

Se decidi di andare in diretta, l'URL per l'azione modulo cambierebbe semplicemente in "https://www.paypal.com/cgi-bin/webscr".

developer.paypal.com può essere un buggy e un'esperienza lenta, avere pazienza. Scrivendo questo tutorial ho dovuto aspettare che PayPal si aggiustasse da solo e tornasse un paio d'ore dopo.

  $ qtà):?>      

Proprio come il precedente ciclo di sessione, i dati vengono recuperati e presentati con una combinazione di PHP raw e una funzione WordPress.

A condizione che tu invii a PayPal il tipo corretto di dati che verranno elaborati tramite IPN.

Nel modulo sopra il nome del prodotto, vengono inviati tutti i quantitativi e i prezzi relativi a ciascun prodotto. PayPal eseguirà il calcolo questa volta per multipli in base al prezzo per articolo e quantità.

        

"Le variabili di transazione e di notifica" come descritte nella Guida IPN sono state implementate come campi modulo nascosti in modo molto simile agli altri tipi di variabile diretti da PayPal.

Passando una email all'input con un nome di "business" si indica a PayPal quale account è il venditore. Qui per comodità usiamo l'attuale e-mail dell'amministratore di WordPress.

business - Indirizzo email o ID account del destinatario del pagamento (ovvero, il
mercante). Equivalente ai valori di receiver_email (se il pagamento è
inviato all'account principale) e il business impostato nel Pagamento del sito web
HTML.
- Guida IPN -

I 3 URL passati con il modulo (ritorno, cancel_return e notify_url) consente di inserire i link all'interno del processo di checkout mentre un utente visita paypal.com dal carrello. Il "Annulla"L'URL verrà mostrato prima e durante la transazione, mentre"ritorno"viene mostrato dopo la transazione.

Potresti dire che il campo più importante qui è "notify_url"che consente a uno sviluppatore di ascoltare le istruzioni di PayPal dietro le quinte mentre l'utente elabora la propria transazione.

Quando PayPal invia una risposta al ipn.php file i dettagli della transazione possono essere memorizzati all'interno di un database, e-mail possono essere inviati e download presentati. Spetta a te elaborare i dati utilizzando metodi che riflettono il tipo di prodotto in vendita.

Quindi creiamo la tabella del database nel ipn.php file e passare al recupero degli ordini.


Passo 9 Database

Per la velocità di implementazione un campo longtext per items_ordered viene creato per memorizzare gli articoli acquistati con ogni ordine e la quantità come dati serializzati. Potrebbe essere consigliabile con un negozio dal vivo per normalizzare qualsiasi tabella di database dietro il tuo negozio a 4NF o considerare l'utilizzo di un tipo di messaggio personalizzato quando si memorizzano gli ordini.


Fase 10 Test

Ora dovresti essere in grado di pubblicare nuovi prodotti, aggiungere un prodotto (i) alla sessione del carrello, visualizzare la sessione del carrello e procedere a PayPal.

Dopo che un cliente ha pagato la merce su PayPal, allora? Come possiamo identificare se la transazione ha avuto successo, quali beni sono stati acquistati e dove dovrebbero essere spediti?

Al punto 8, gli account compratori e venditori sono stati evidenziati per gli acquisti di prova.

Inoltre, in precedenza "return_url"è stato creato come un campo modulo nascosto all'interno TPL-cart.php, questo file può essere utilizzato se l'utente deve scegliere di "Torna al sito del commerciante" dopo la transazione su PayPal.

In loop sui dati del post mostrerà cosa sta succedendo.

foreach ($ _ POST come $ chiave => $ valore): echo '

Chiave: 'Chiave $..'

'; eco '

Valore: 'Valore di $.'

'; endforeach;

Questo ciclo stamperà tutti i dati restituiti da PayPal tramite posta. Potresti decidere di usarlo per archiviare i dati, non è davvero pratico farlo.

Per arrivare alla pagina di ringraziamento speriamo che l'utente faccia clic su "Torna al sito web del venditore" da PayPal. Nel caso in cui un utente decida di chiudere il browser, allora?

A causa di questa trappola, tutto ciò dovrebbe essere fatto tramite TPL-thankyou.php è quello di svuotare il carrello e visualizzare il contenuto come mostrato di seguito.

/ * NOME DEL MODELLO: Pagina: Grazie * / session_destroy (); the_post (); il titolo(); il contenuto();

Veniamo quindi informati da PayPal, indipendentemente da cosa l'utente decida di fare dopo il pagamento. È qui che entra in gioco la "Notifica" della Notifica immediata del pagamento.

Quando il modulo è stato inizialmente inviato a PayPal "notify_url"ha avuto un valore. Ciò ha indicato PayPal che vorremmo utilizzare il file http://yoursite.com/wp-content/themes/wppp/ipn.php per la comunicazione.

Con questo in mente, ora possiamo "ascoltare" PayPal (e non l'utente) per gli aggiornamenti sullo stato e il processo di pagamento. Creiamo il file finale e chiamiamolo ipn.php.

$ req = 'cmd = _notify-validate'; foreach ($ _ POST come $ key => $ valore): $ value = urlencode (stripslashes ($ valore)); $ req. = "& $ chiave = $ valore"; endforeach; $ header. = "POST / cgi-bin / webscr HTTP / 1.0 \ r \ n"; $ header. = "Content-Type: application / x-www-form-urlencoded \ r \ n"; $ header. = "Content-Length:". strlen ($ req). "\ R \ n \ r \ n"; $ fp = fsockopen ('ssl: //www.sandbox.paypal.com', 443, $ errno, $ errstr, 30); if (! $ fp): // HTTP ERROR else: fputs ($ fp, $ header. $ req); while (! feof ($ fp)): $ res = fgets ($ fp, 1024); $ fh = fopen ('result.txt', 'w'); fwrite ($ fh, $ res); fclose ($ FH); if (strcmp ($ res, "VERIFIED") == 0): // Assicurati di avere accesso alle funzioni di WP, vale a dire WPDB include_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ wp-load.php'); // Dovresti convalidare contro questi valori. $ firstName = $ _POST ['first_name']; $ lastName = $ _POST ['last_name']; $ payerEmail = $ _POST ['payer_email']; $ addressStreet = $ _POST ['address_street']; $ addressZip = $ _POST ['address_zip']; $ addressCity = $ _POST ['address_city']; $ productsBought = $ _POST ["]; $ txnID = $ _POST ['txn_id']; // Usato per archiviare rapidamente oggetti acquistati $ i = 1; foreach ($ _ POST come $ chiave => $ valore): if ($ chiave == 'item_name'. $ i): $ products_bought [] = $ valore; $ i ++; endif; endforeach; $ products = serialize ($ products_bought); $ wpdb-> insert ('customers', array ('forename' = > $ firstName, 'cognome' => $ lastName, 'email' => $ payerEmail, 'address_line_1' => $ addressStreet, 'postcode' => $ addressZip, 'town' => $ addressCity, 'items_ordered' => $ prodotti, 'created' => current_time ('mysql'), 'txn_id' => $ txnID, 'user_ip' => $ _SERVER ['REMOTE_ADDR']), array ('% s', // FORENAME '% s' , // SURNAME '% s', // EMAIL '% s', // INDIRIZZO 1 '% s', // PCODE '% s', // TOWN '% s', // ORDINATO '% s', // STATUS '% s', // CREATO '% s' // USER IP)); elseif (strcmp ($ res, "INVALID") == 0): // È preferibile memorizzare la transazione anche se non è riuscita per ulteriori indagini. endif; endwhile; fclose ($ fp); endif;

Il codice sopra sembra un po 'spaventoso, puoi vedere come viene assemblato guardando il codice-sample.php semplificato su PayPal.

Senza spiegare l'esempio che PayPal ha fornito come guida, stiamo ascoltando le risposte VALID o INVALID e l'elaborazione di conseguenza. WPDB è utilizzato per memorizzare tutti i dati richiesti restituiti da PayPal.

foreach ($ _ POST come $ chiave => valore $): if ($ chiave == 'nome_oggetto _'. $ i): $ products_bought [] = $ valore; $ I ++; finisci se; endforeach;

Questo snippet esegue il loop dei dati del post e controlla se l'elemento corrente è un item_name_x che conosciamo è il nome del nostro prodotto. I dati vengono quindi serializzati e memorizzati all'interno di un array.

Il metodo di inserimento WPDB viene utilizzato in seguito per inviare i dati serializzati insieme ad altri valori alla tabella dei clienti.


Passo 12 Pagina degli ordini WP-Admin

Il nostro passaggio finale prevede la creazione di una pagina del menu WP-Admin e la compilazione di quella pagina con i dati dei clienti / ordini precedentemente memorizzati.

Puoi decidere di creare una pagina degli ordini più robusta per consentire l'impaginazione, contrassegnare ogni articolo per la spedizione, stampare facilmente le etichette di spedizione e qualsiasi altra cosa.

Seguiamo le convenzioni di stile di WordPress e creiamo un lungo elenco di ordini ragionevolmente ben presentato.

define (ADMIN_URL, admin_url ()); // Funzione di supporto wppp_orders () add_menu_page ('Ordini', 'Ordini', 'amministratore', __FILE__, 'wppp_orders_page', ADMIN_URL.'images / generic.png '); 

add_menu_page () viene eseguito con 6 parametri di un possibile 7.

  1. Titolo della pagina
  2. Titolo del menu
  3. Ruolo utente
  4. URL per la nostra pagina delle opzioni. Invece di competere per il grado usiamo il percorso e il nome del file
  5. Funzione da eseguire durante l'accesso a questa pagina
  6. Icona per il menu

Un parametro facoltativo "posizione del menu" potrebbe essere passato, ma di nuovo non lottiamo con altri Autori.

function wppp_orders_page () ?> 

Ordini

Di seguito è riportato un elenco di tutti gli ordini.

# nome di battesimo Cognome E-mail Indirizzo Prodotti acquistati Ip utente
ID nome di battesimo Cognome E-mail Indirizzo Prodotti acquistati Ip utente

Sopra, viene creata una funzione e all'interno di alcuni markup per visualizzare gli ordini. Quando si aggiunge la nuova pagina del menu, è stata inoltrata anche questa funzione che ordina a WordPress di eseguire questo codice quando visualizza la pagina del menu corrispondente.

utilizzando wpdb per produrre gli ordini sarà la fase finale.

function wppp_orders_page ()  

Ordini

Di seguito è riportato un elenco di tutti gli ordini.

get_results ("SELECT * FROM customers"); ?> items_ordered); ?>
# nome di battesimo Cognome E-mail Indirizzo Prodotti acquistati Ip utente
id; ?> nome; ?> cognome; ?> e-mail; ?> Indirizzo Linea 1; ?>, codice postale; ?>, cittadina; ?>
    '$ prodotti [$ i].''; EndFor; ?>
user_ip; ?>
Nessun ordine ancora.

Quando si inviavano prodotti e quantità al database, i dati venivano serializzati. Adesso è il momento di capovolgerlo con unserialize ad ogni iterazione.

Un ciclo annidato consente di suddividere ogni riga di dati non serializzati e mostrarli come voci di elenco.

add_action ('admin_menu', 'wppp_orders');

Finalmente le funzioni create in precedenza vengono eseguite usando il add_action funzione e il admin_menu azione in particolare. Per un elenco completo di azioni visita il riferimento all'azione.


Conclusione

In questo tutorial sono state mostrate una combinazione di best practice, hack e tecniche, molte delle quali saranno aperte al dibattito. Alcuni codici e discussioni sono stati omessi dal tutorial, ovvero additional.css, e functions.php.

additional.css viene importato all'interno del foglio di stile per Twenty Ten (style.css) e applica alcuni stili di base per la visualizzazione in tutto l'esempio.

functions.php richiede qualsiasi file per i messaggi personalizzati e la visualizzazione degli ordini all'interno di WP-Admin. Viene inoltre impostata una nuova dimensione dell'immagine che ritaglia la miniatura del prodotto in modo che corrisponda.

Facciamo uso della funzionalità di menu di Twenty Ten per mostrare i collegamenti del menu in alto per "Prodotti" e "Carrello".

Fateci sapere nei commenti cosa ne pensate di questa introduzione all'utilizzo di PayPal con WordPress.