Merci Nicolas,
Les variables dont j'ai parlé sont celles qui servent pour transmettre les informations au serveur. J'ai précédemment évoqué register et getOrderStatus en citant des parties du code pour WP que j'ai récupéré.
Le premier (register.do) est dans l'adresse initiale de connexion au serveur, le second (getOrderStatus.do) sert à demander l'état de la transaction.
J'ai essayé d'utiliser l'adresse de notification donnée dans le plugin exemple
pluginConfig['return_url'][2]
qui est définie comme
$this->pluginConfig['notify_url'][2] = HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify&notif_payment='.$this->name.'&tmpl=component';
Mais avec elle, je n'accède plus à la page du formulaire ClicToPay. Aucune erreur, je passe de la page de commande à la racine de la boutique.
En utilisant précisément cette adress au lieu de $this->pluginConfig[2] défini plus haut dans le code, j'accède enfin au paiement ClicToPay
Je n'ai pas non plus de documentation d'intégration, ce PDF sans aucun rapport avec les boutiques est la seule information qu'a transmise ClicToPay avec les infos d'accès au serveur, l'adresse du serveur de tests et les n° de CB de tests. Il semble que leur seul mode de fonctionnement prévu (en dehors de plugin tiers pour d'autres boutiques) est la création de formulaires sur leur site depuis l'administration du compte, leur validation, puis leur intégration un à un sur le site final. La seule documentation dont je dispose est le plugin WP dont j'ai parlé et qui me permet de savoir quelles variables passer et la réinterrogation du serveur pour la vérification de la transaction.
Dans la mesure où il faut ouvrir une URL avec les informations de commande, récupérer la réponse avec l'adresse "formUrl" qui, elle, ouvre le formulaire sur le site ClicToPay, cette première partie fonctionne en appelant cette formUrl par
$app->redirect($data->formUrl);
placé à la fin de la fonction OnAfterOrderConfirm
L'URL de retour utilisée est
index.php?option=com_hikashop&ctrl=checkout&task=after_end
Si je change pour
index.php?option=com_hikashop&ctrl=checkout&task=notify¬if_payment=clictopay&tmpl=component
qui est l'exemple, je peux payer mais je reviens sur la page d'accueil de la boutique sans passer par la fonction onAfterOrderConfirm
Y aurait-il une autre syntaxe pour que le retour se fasse sur la fonction onPaymentNotification ?
Ce qu'il me faut donc, c'est comprendre où récupérer le passage dans le code après la validation du paiement puisque je n'ai pas d'info montrant le passage dans onPaymentNotification.
Faudrait-il , au lieu de la redirection cURL dans cette fonction, la gérer dans une nouvelle fonction pour obtenir la valeur de formUrl dont le retour se ferait alors dans onAfterOrderConfirm ?
Pour savoir si on passe par onPaymentNotification, j'ai ajouté ce code d'insertion dans les logs
//After submiting the plateform payment form, this is where the website will receive the response information from the payment gateway servers and then validate or not the order
function onPaymentNotification(&$statuses)
{
if($this->payment_params->debug)
$this->writeToLog('onPaymentNotification');
//We first create a filtered array from the parameters received
$vars = array();
Voici le code de onAfterOrderConfirm
//This function is called at the end of the checkout. That's the function which should display your payment gateway redirection form with the data from HikaShop
function onAfterOrderConfirm(&$order,&$methods,$method_id)
{
parent::onAfterOrderConfirm($order,$methods,$method_id); // This is a mandatory line in order to initialize the attributes of the payment method
//Here we can do some checks on the options of the payment method and make sure that every required parameter is set and otherwise display an error message to the user
if (empty($this->payment_params->identifier)) //The plugin can only work if those parameters are configured on the website's backend
{
$this->app->enqueueMessage('You have to configure an identifier for the ClicToPay plugin payment first : check your plugin\'s parameters, on your website backend','error');
//Enqueued messages will appear to the user, as Joomla's error messages
return false;
}
elseif (empty($this->payment_params->password))
{
$this->app->enqueueMessage('You have to configure a password for the ClicToPay plugin payment first : check your plugin\'s parameters, on your website backend','error');
return false;
}
elseif (empty($this->payment_params->payment_url))
{
$this->app->enqueueMessage('You have to configure a payment url for the ClicToPay plugin payment first : check your plugin\'s parameters, on your website backend','error');
return false;
}
else
{
//Here, all the required parameters are valid, so we can proceed to the payment platform
$amout = round($order->cart->full_total->prices[0]->price_value_with_tax,2)*100;
//The order's amount, here in cents and rounded with 2 decimals because of the payment platform's requirements
//There is a lot of information in the $order variable, such as price with/without taxes, customer info, products... you can do a var_dump here if you need to display all the available information
//This array contains all the required parameters by the payment plateform
//Not all the payment platforms will need all these parameters and they will probably have a different name.
//You need to look at the payment gateway integration guide provided by the payment gateway in order to know what is needed here
$vars = array(
'userName' => $this->payment_params->identifier, //User's identifier on the payment platform
'password' => $this->payment_params->password,
//'CLIENTIDENT' => $order->order_user_id, //The id of the customer
//'DESCRIPTION' => "order number : ".$order->order_number, //Order's description
'orderNumber' => $order->order_id, //The id of the order which will be given back by the payment gateway when it will notify your plugin that the payment has been done and which will allow you to know the order corresponding to the payment in order to confirm it
//'VERSION' => 2.0, //The platform's API version, needed by the payment platform
'returnUrl' => HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify&notif_payment='.$this->name.'&tmpl=component', //$this->pluginConfig['return_url'][2], //$this->payment_params->return_url , //.'/onPaymentNotification&userName=' . $this->payment_params->identifier,
//'returnURL' => $this->pluginConfig['notify_url'][2],
'paymentUrl'=> $this->payment_params->payment_url,
'currency' => '788',
'amount' => $amout, //The amount of the order
);
//To certifiate the values integrity, payment platform use to ask a hash
//This hash is generated according to the platform requirements
$vars['token'] = $this->clictopay_signature($this->payment_params->password,$vars);
$this->vars = $vars;
$checkpayment_url = $vars['paymentUrl'];
$checkpayment_url = str_replace('register', 'getOrderStatus',$vars['paymentUrl']);
$orderId = $vars['orderNumber'];
$password = $vars['password'];
$userName = $vars['userName'];
$url = $vars['paymentUrl'] . '?currency=788&amount=' . $vars['amount'] . '&orderNumber=' . $vars['orderNumber'] . '&password=' . $vars['password'] . '&returnUrl='.$vars['returnUrl']. '&userName=' . $vars['userName'];
$check_url = $checkpayment_url . '?orderId=' . $orderId . '&password=' . $password . '&userName=' . $userName ;
if($this->payment_params->debug){
$this->writeToLog($check_url);
}
//Add the data sent to the payment gateway to the payment log when the debug setting of the payment method is activated
if($this->payment_params->debug)
$this->writeToLog($vars);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
$data = json_decode($result);
$app = JFactory::getApplication();
$app->redirect($data->formUrl);
// Check if the payment is successful or not and redirect to correct page //où le placer ? neutralisé pour le moment
/*$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
$data = json_decode($result);
$app = JFactory::getApplication();
if($this->payment_params->debug)
$this->writeToLog($data['ErrorMessage']);
if ($data['ErrorMessage'] === 'Success') {
$app->redirect($this->pluginConfig['return_url'][2]);
} else {
$app->redirect($this->pluginConfig['cancel_url'][2]);
}*/
//Ending the checkout, ready to be redirect to the plateform payment final form
//The showPage function will call the clictopay_end.php file which will display the redirection form containing all the parameters for the payment platform
//return $this->showPage('end');
}
}