Gateway Consorzio Triveneto per WP e-commerce

Recentemente ho dovuto integrare il gateway di pagamento del Consorzio Triveneto nel plugin WP e-commerce, uno dei più noti plugin di commercio elettronico per Wordpress.
All'inizio pensavo di utilizzare l'ottima classe PgConsTriv di Davide Gullo, poi ho realizzato un'integrazione veramente minimale partendo dagli esempi forniti dal Consorzio e dalla documentazione di WP e-commerce.
E' puro spaghetti-code ma forse a qualcuno può tornare utile :)
Di seguito il codice del nuovo gateway da salvare nel folder /wp-content/plugins/wp-e-commerce/wpsc-merchants/ del vostro server.
Tutte le funzioni andrebbero raccolte in un unico file (compresi i callback di ritorno dal gateway), per intenderci $responseURL dovrebbe essere qualcosa del genere:

get_option('siteurl')."/?constriv=ok";


e quindi tutte le azioni verrebbero gestite dalla funzione gateway_constriv_gateway, purtroppo ho avuto qualche problema nella gestione degli indirizzi da parte del gateway e siccome sono pigro, non ho investigato più di tanto:
Alla fine ho utilizzato un work-around che segue passo-passo l'esempio fornito nella documentazione: ho usato i file receipt.php ed error.php per gestire la comunicazione con il gateway, questi poi fanno un redirect per completare la gestione dell'ordine e la visualizzazione di eventuali messaggi.
Nel file receipt.php dovreste implementare eventuali meccanismi di verifica della provenienza della transazione tramite i parametri udf*, io ho usato udf3 per trasportare l'id di sessione necessario a completare le operzioni sull'ordine.

constriv.merchant.php

1:  <?php  
2:  /**  
3:    * Gateway wp e-commerce per Consorzio Triveneto  
4:    * Marco Montesi 2012-04-26  
5:    * marco.montesi@gmail.com  
6:   *  
7:   * @package wp-e-comemrce  
8:   * @since 3.7.6  
9:   * @subpackage wpsc-merchants  
10:   */  
11:  $nzshpcrt_gateways[$num]['name'] = 'Consorzio Triveneto';  
12:  $nzshpcrt_gateways[$num]['internalname'] = 'constriv_gateway';  
13:  $nzshpcrt_gateways[$num]['function'] = 'gateway_constriv_gateway';  
14:  $nzshpcrt_gateways[$num]['form'] = "form_constriv_gateway";  
15:  $nzshpcrt_gateways[$num]['submit_function'] = "submit_constriv_gateway";  
16:  // admin form per memorizzare ID e password dell'account del cliente  
17:  function form_constriv_gateway()  
18:  {  
19:    $output ='<tr><td>';  
20:    $output.='<input name="constriv_tranportalid" type="text" value="'.get_option('constriv_tranportalid').'"/>';  
21:    $output.='TranPortalID';  
22:    $output.='<input name="constriv_password" type="text" value="'.get_option('constriv_password').'"/>';  
23:    $output.='Password';  
24:    $output .='</tr></td>';  
25:    return $output;  
26:  }  
27:  //  
28:  function submit_constriv_gateway()  
29:  {  
30:    if($_POST['constriv_tranportalid'] != null) {  
31:      update_option('constriv_tranportalid', $_POST['constriv_tranportalid']);  
32:    }  
33:    if($_POST['constriv_password'] != null) {  
34:      update_option('constriv_password', $_POST['constriv_password']);  
35:    }  
36:    return true;  
37:  }  
38:  // gateway   
39:  function gateway_constriv_gateway($seperator, $sessionid)  
40:  {  
41:    global $wpdb, $wpsc_cart;  
42:    //This grabs the purchase log id from the database  
43:    //that refers to the $sessionid  
44:    $purchase_log = $wpdb->get_row( "SELECT * FROM `".WPSC_TABLE_PURCHASE_LOGS."` WHERE `sessionid`= ".$sessionid." LIMIT 1", ARRAY_A) ;  
45:    // costruisco la stringa da passare al gateway per l'auth  
46:    $ID     = get_option('constriv_tranportalid');  
47:    $Password = get_option('constriv_password');  
48:    $Action   = "4";  
49:    $Amt    = number_format($wpsc_cart->total_price,2);  
50:    // sostituire con il proprio dominio  
51:    $ResponseURL = "<il_mio_dominio>/constriv/receipt.php";  
52:    $ErrorURL =  "<il_mio_dominio>/constriv/error.php";  
53:    $TrackId = "<il_mio_dominio>-".$purchase_log['id'];  
54:    $DataToSend ="id=$ID&password=$Password&action=$Action&amt=$Amt&currencycode=978&langid=ITA&responseURL= $ResponseURL&errorURL=$ErrorURL&trackid=$TrackId&udf1=AA&udf2=BB&udf3=$sessionid&udf4=DD&udf5=EE";   
55:    // ambiente di test, da sostituire con URL di produzione  
56:    $URL = "https://test4.constriv.com/cg301/servlet/PaymentInitHTTPServlet";  
57:    //Apro la connessione  
58:    $ch=curl_init($URL);   
59:    //Imposto gli headers HTTP  
60:    //imposto curl per protocollo https  
61:    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, FALSE);  
62:    curl_setopt($ch,CURLOPT_POST,1);  
63:    //Invio i dati  
64:    curl_setopt($ch,CURLOPT_POSTFIELDS,$DataToSend);  
65:    //imposta la variabile PHP   
66:    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);   
67:    //Ricevo la risposta dal server  
68:    $varResponse=curl_exec($ch);   
69:    //chiudo la connessione   
70:    curl_close($ch);   
71:    if (substr($varResponse,0,7) == '!ERROR!') {  
72:      echo $varResponse;  
73:    } else {  
74:      //Separo il contenuto della stringa ricevuta (PaymentID:RedirectURL)  
75:      $varPosiz= strpos($varResponse, ':http');  
76:      $varPaymentId= substr($varResponse,0,$varPosiz);  
77:      $nc=strlen($varResponse);  
78:      $nc=($nc-17);  
79:      $varRedirectURL=substr($varResponse,$varPosiz+1);  
80:      //Creo l'URL di redirezione  
81:      $varRedirectURL ="$varRedirectURL?PaymentID=$varPaymentId";  
82:      //echo $varRedirectURL;  
83:      //Redirezione finale del browser sulla HPP  
84:      //echo $varRedirectURL;  
85:      echo "<meta http-equiv=\"refresh\" content=\"0;URL=$varRedirectURL\">";  
86:    }  
87:  }  
88:  function nzshpcrt_constriv_callback()  
89:  {  
90:   global $wpdb;  
91:   if( isset($_GET['constriv']) && ($_GET['constriv'] == 'transok')) {  
92:      $sessionid = $_REQUEST["udf3"];  
93:      $PayID=$_REQUEST["paymentid"];  
94:      $TransID=$_REQUEST["tranid"];  
95:      $ResCode=$_REQUEST["resultcode"];  
96:      $AutCode=$_REQUEST["auth"];  
97:      $PosDate=$_REQUEST["postdate"];  
98:      $TrckID=$_REQUEST["trackid"];  
99:      $Brand = $_REQUEST["cardtype"];  
100:      $Protocol = $_REQUEST["payinst"];  
101:      $Protection = $_REQUEST["liability"];  
102:      $HostResponseCode = $_REQUEST["responsecode"];  
103:      $Mistake = $_REQUEST["Error"];  
104:      $MistakeText = $_REQUEST["ErrorText"];  
105:      if( strlen(trim($AutCode)) and $ResCode == 'APPROVED' ) {  
106:        $sql = "UPDATE `".WPSC_TABLE_PURCHASE_LOGS."` SET `processed`= '3' WHERE `sessionid`=".$sessionid;  
107:        $wpdb->query($sql);  
108:        $transact_url = get_option('transact_url');  
109:        unset($_SESSION['WpscGatewayErrorMessage']);  
110:        echo '<script>document.location="'.$transact_url.'&sessionid='.$sessionid.'&status=ok";</script>';        
111:      } else {  
112:        $sql = "UPDATE `".WPSC_TABLE_PURCHASE_LOGS."` SET `processed`= '5' WHERE `sessionid`=".$sessionid;  
113:        $wpdb->query($sql);  
114:        $transact_url = get_option('transact_url');  
115:        $_SESSION['WpscGatewayErrorMessage'] = $Mistake.' '.$MistakeText;  
116:        echo '<script>document.location="'.$transact_url.'&sessionid='.$sessionid.'&status=ko";</script>';        
117:      }  
118:    }  
119:    if( isset($_GET['constriv']) && ($_GET['constriv'] == 'transko')) {  
120:      $sql = "UPDATE `".WPSC_TABLE_PURCHASE_LOGS."` SET `processed`= '5' WHERE `sessionid`=".$sessionid;  
121:      $wpdb->query($sql);  
122:      $transact_url = get_option('transact_url');  
123:      $_SESSION['WpscGatewayErrorMessage'] = $Mistake.' '.$MistakeText;  
124:      echo '<script>document.location="'.$transact_url.'&sessionid='.$sessionid.'";</script>';    
125:    }  
126:  }  
127:  //  
128:  add_action('init', 'nzshpcrt_constriv_callback');  
129:  ?>  

receipt.php
1:  <?php   
2:  $PayID=$_POST["paymentid"];  
3:  $TransID=$_POST["tranid"];  
4:  $ResCode=$_POST["result"];  
5:  $AutCode=$_POST["auth"];  
6:  $PosDate=$_POST["postdate"];  
7:  $TrckID=$_POST["trackid"];  
8:  $UD1=$_POST["udf1"];  
9:  $UD2=$_POST["udf2"];  
10:  $UD3=$_POST["udf3"];  
11:  $UD4=$_POST["udf4"];  
12:  $UD5=$_POST["udf5"];  
13:  $Brand = $_POST["cardtype"];  
14:  $Protocol = $_POST["payinst"];  
15:  $Protection = $_POST["liability"];  
16:  $HostResponseCode = $_POST["responsecode"];  
17:  $Mistake = $_POST["Error"];  
18:  $MistakeText = $_POST["ErrorText"];  
19:  // Nell URL seguente inserire l'indirizzo corretto del proprio server  
20:  if( strlen(trim($AutCode)) and $ResCode == 'APPROVED' and $UD1=='AA' and $UD2 == 'BB' ) {  
21:    $ReceiptURL="REDIRECT=http://<mio_dominio>/?page_id=<id_carrello>&constriv=transok&PaymentID=".$PayID."&TransID=".$TransID."&TrackID=".$TrckID."&postdate=".$PosDate."&resultcode=".$ResCode."&auth=".$AutCode."&Error=".$Mistake."&ErrorText=".$MistakeText."&cardtype=".$Brand."&payinst=".$Protocol."&liability=".$Protection."&responsecode=".$HostResponseCode."&udf3=".$UD3;       
22:  } else {  
23:    $ReceiptURL="REDIRECT=http://<mio_dominio>/?page_id=<id_carrello>&constriv=transko&PaymentID=".$PayID."&TransID=".$TransID."&TrackID=".$TrckID."&postdate=".$PosDate."&resultcode=".$ResCode."&auth=".$AutCode."&Error=".$Mistake."&ErrorText=".$MistakeText."&cardtype=".$Brand."&payinst=".$Protocol."&liability=".$Protection."&responsecode=".$HostResponseCode."&udf3=".$UD3;       
24:  }  
25:  echo $ReceiptURL;   
26:  ?>  


error.php
1:  <?php   
2:  $PayID=$_POST["paymentid"];  
3:  $TransID=$_POST["tranid"];  
4:  $ResCode=$_POST["result"];  
5:  $AutCode=$_POST["auth"];  
6:  $PosDate=$_POST["postdate"];  
7:  $TrckID=$_POST["trackid"];  
8:  $UD1=$_POST["udf1"];  
9:  $UD2=$_POST["udf2"];  
10:  $UD3=$_POST["udf3"];  
11:  $UD4=$_POST["udf4"];  
12:  $UD5=$_POST["udf5"];  
13:  $Brand = $_POST["cardtype"];  
14:  $Protocol = $_POST["payinst"];  
15:  $Protection = $_POST["liability"];  
16:  $HostResponseCode = $_POST["responsecode"];  
17:  $Mistake = $_POST["Error"];  
18:  $MistakeText = $_POST["ErrorText"];  
19:  $ReceiptURL="REDIRECT=http://<mio_dominio>/?page_id=<id_carrello>&constriv=transko&PaymentID=".$PayID."&TransID=".$TransID."&TrackID=".$TrckID."&TransID=".$TransID."&TrackID=".$TrckID."&postdate=".$PosDate."&resultcode=".$ResCode."&auth=".$AutCode."&Error=".$Mistake."&ErrorText=".$MistakeText."&cardtype=".$Brand."&payinst=".$Protocol."&liability=".$Protection."&responsecode=".$HostResponseCode."&udf3=".$UD3;       
20:  echo $ReceiptURL;   
21:  ?>  


Commenti

  1. salve, ho provato il vostro gateway - in ambiente di test - utilizzando la versione 3.8.9.1 di wpsc e ho riscontrato il seguente errore:

    405 Verb used to access this page is not allowed.
    the page you are looking for cannot be displayed beacause an invalid method (http verb) was used to attempt access.

    ?PaymentID=">

    sapreste darmi una dritta per sistemarlo?

    RispondiElimina
  2. Ciao e complimenti per il tutorial! Perdona la mia ignoranza ma... in quale cartella vanno i files receipt.php e error.php?

    Grazie ancora!

    RispondiElimina
  3. Perdono!! Ho fatto una domanda idiotissima!!

    RispondiElimina
  4. Ciao,
    sono riuscito a configurare correttamente il gateway: i pagamenti funzionano, rispedendo il cliente alla pagina corretta che indica se la transazione è avvenuta o meno.
    L'unico problema che ho è che non vengono inviate le email al cliente, mentre pagando ad esempio con paypal queste email vengono inviate correttamente.
    In pratica non viene inviata nè la mail di riepilogo degli acquisti ne quella con il messaggio di pagamento avvenuto con successo.
    Uso la versione 3.8.9.4 di wp-ecommerce quindi probabilmente ci sono stati cambiamenti dal momento in cui hai scritto questo gateway ad oggi.
    Ho bisogno di una mano per risolvere questo problema, ovviamente se ritieni che sia complesso puoi anche fornirmi una quotazione per l'intervento.

    A presto!

    RispondiElimina
  5. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  6. Ciao, nel caso siate interessati il plugin che trovate al seguente link da me sviluppato é costantemente aggiornato e completo www.lincetto.me

    RispondiElimina

Posta un commento

Post popolari in questo blog

Jolie micro services on Kubernetes

Ansible, Azure & WSL survival guide (VS Code bonus track)