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
receipt.php
error.php
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¤cycode=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: ?>


