THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

voilà après un début laborieux, la boutique est fonctionnelle.

Un premier paiement a été fait via paypal, la commande est bien indiquée comme "payée" dans le BO, mais le champ "Référence de la transaction" est vide. Je pense que je peux retrouver quelle est la transaction en comparant log/log-paypal.txt à l'historique dans mon compte paypal, mais je pensais que ça se ferait tout seul (vu que le champ est prévu).

Je vais éditer core/lib/Thelia/Core/Event/Order/OrderEvent.php pour rajouter setTransactionRef / getTransactionRef , puis le module de paiement pour qu'il utilise ces fonctions.

Comme ça ne fait que quelques semaines que j'utilise Thélia sans une bonne connaissance du système , est ce que j'oublie quelque chose ? Est ce que ça vaut le coup que je fasse un PR pour ça ? Ou… est ce que je me trompe complètement ?


Michaël Marinetti
arrive à Thélia doucement mais surement.
@Asenar

Offline


L'identifiant de transaction est calculée par le module de paiement dans de nombreux cas (PayZen, Atos, Paybox, ...) avant l'appel de la plate forme de paiement. C'est à ce moment là que l'Order est mise à jour. Cet identifiant de transaction est ensuite passé à la banque, qui le retourne dans sa réponse.

Pour PayPal, l'identifiant de transaction est généré par la plate-forme après le paiement, et tu peux le récupérer avec la méthode GetTransactionDetails(). C'est bien ça ?

Comme la gestion de cet identifiant de transaction est spécifique à chaque module de paiement, il ne faut pas apporter de modifiucation à OrderEvent. Je te recommande de faire une PR sur le module PayPal, pour mettre à jour l'identifiant de transaction de l'order dans le contrôleur PaypalResponse.


OpenStudio Toulouse

Offline


Ah zut j'avais pas vu la réponse ! Vous êtes trop rapide (et j'apprécie beaucoup smile )

"La gestion de cet identifiant de transaction est spécifique à chaque module de paiement"

Je suis d'accord c'est ce que je voulais faire, mais je veux remplir le champ `transaction_ref` dans les tables `order_version` et `order` (et il y a un {set/get}TransactionRef() dans la classe Order de base (core/lib/Thelia/Model/Base/Order.php), donc j'aurais voulu remplir ces champs-ci.

Pour Paypal, voici la partie du code concernée, je rajoute des commentaires pour le contexte + ce que j'aurais bien voulu faire:

<?php

$response = $paypal_machin->send(); // je simplifie, mais dans $response on a un tableau associatif
// $response = ['PAYPAL_STATUS' => 'Completed', 'TRANSACTION_ID' => '123456789abcdefghi' ]
if ($payment_has_been_completed)
    $event = new OrderEvent($order); // un peu plus haut, $order est l'objet retourné par $order = $this->checkorder($order_id,$token);
    $event->setStatus(OrderStatusQuery::getPaidStatus()->getId());
    // ici, j'aurais voulu "simplement rajouter" $event->setTransactionRef($response['TRANSACTION_ID']);
    $this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS,$event);
    $this->redirectToSuccessPage($order_id);

mais OrderEvent (extends ActionEvent) n'a pas de méthode setTransactionRef … On a getRef/setRef, mais ils correspondent à la référence genre "ORD000001"

Donc je veux faire comme tu as dit… mais avant je pense que je dois modifier OrderEvent (pour que ça apparaisse dans order_version) non ?

Dans Payzen ça se fait plus simplement, directement avec l'objet "$order", mais il n'utilise pas du tout "dispatch event" :

$order->setTransactionRef($transaction_id)->save();

Last edited by Asenar (10-12-2015 18:20:55)


Michaël Marinetti
arrive à Thélia doucement mais surement.
@Asenar

Offline


J'aurais tendance a faire comme dans Payzen, mettre directement à jour l'order, je ne suis pas sûr qu'il y ait un intérêt à passer par le dispatching d'un event dans ce cas.

Tu n'a pas pas te préoccuper de la table 'order_version' , qui est gérée par le behaviour "versionable" de Propel: http://propelorm.org/documentation/beha … nable.html


OpenStudio Toulouse