rollincode / RCPaiementCMCICBundle

Bundle Symfony 2 de paiement pour les banques Credit Mutuel et Crédit Industriel et Commercial - paiement cmcic bundle
0 stars 6 forks source link

Utilisation apres import ? #9

Closed dedioweb closed 7 years ago

dedioweb commented 7 years ago

@nicovak Ayant réussi l'import hier via composer, je souhaite maintenant poursuivre l'utilisation. Je n'arrive pas trop bien a comprendre le Readme. Dois-je modifier les "fichiers" dans le dossier RC\PaiementCMCICBundle\ où dois-je faire une public function dans mon controller 'CommandesController' par exemple :

public function validationCommandeAction($id)
{

    $em = $this->getDoctrine()->getManager();
    $commande = $em->getRepository('EcommerceBundle:Commandes')->find($id);

    if (!$commande || $commande->getValider() == 1)
    {
        throw $this->createNotFoundException('La commande n\'existe pas !');
    } else {
            $commande = $this->container->get('rc.paiementcmcic_tpe');    
    }
    return $this->redirect($this->generateUrl('xxx'));
}

Je ne sais pas par quoi continuer cette fonction Par avance, merci

nicovak commented 7 years ago

Il y a plusieurs fichiers que tu dois étudier : https://github.com/rollincode/RCPaiementCMCICBundle/blob/master/Controller/SamplePaiementController.php

L'action: paiementAllerAction permet de rendre le formulaire de paiement qui une fois validé envois l'internaute vers CMCIC.

L'action paiementRetourAction permet de mapper le retour de paybox c'est juste une route avec un code success error etc. L'url sera a définir dans l'interface commerçant.

L'action retourServeurAction permet de controller le veritable retour de CMCIC c'est à dire le retour de leurs serveurs avec toutes les infos de retour de paiement.

Le service https://github.com/rollincode/RCPaiementCMCICBundle/blob/master/Services/SampleLogicTpeService.php permet de gérer la logique lors de la validation ou non du paiement en fonction du retour de CMCIC.

Le cas qui t'intéressera surement sera:

            case "paiement":
                // Payment has been accepted on the productive server
                // put your code here (email sending / Database update)
                break;

Pour résumer soit tu copies colle le controller sample (1er lien) soit tu l'inclus dans une de tes vues avec {{ render(controller() }} (je ne me souviens plus de la syntax exact) afin d'avoir ton bouton payer. Ce sera le plus simple.

Etape 2 tu overrides le service pour y inclure ta logique. Pour info le service est appelé ici : $serviceLogicPaiement = $this->container->get('rc.paiementcmcic_logic_tpe'); dans le controller sample. Et sa déclaration se trouve ici: https://github.com/rollincode/RCPaiementCMCICBundle/blob/master/Resources/config/services.yml C'est le fonctionnement par défaut des bundles sur Symfony.

dedioweb commented 7 years ago

@nicovak Oui un render ce fait bien de la façon suivante : {{ render(controller('') ) }}.

J'ajoute donc dans ma vue layout/validation.html.twig : {{ render(controller('RCPaiementCMCICBundle:SamplePaiement:paiementAller') ) }} ? J'obtiens une erreur qui me semble logique ? "RC\PaiementCMCICBundle\Controller\SamplePaiementController::paiementAllerAction()" requires that you provide a value for the "$tarif" argument (because there is no default value or because there is a non optional argument after this one).").

PS: désolé, c'est mon premier SF :-)

nicovak commented 7 years ago

Dans ce cas là copies colle le controller et modifies l'action paiement aller pour ne plus avoir l'érreur. $tarif est le montant en centimes comme renseigné dans la doc paiement cmcic.

Tu feras l'envois d'email de commande validé et tu définiras le status validé de la commande dans le service dont je t'ai parlé plus haut (avec le switch case).

dedioweb commented 7 years ago

@nicovak quand tu dis que le copie colle le controller, tu parles de tout le controller SamplePaiementController ? et que je colle dans mon dossier SRC au niveau de mon bundle ? Dsl, ce n'est pas très clair Ce que je n'arrive pas a comprendre, c'est pourquoi dans le controller class SamplePaiementController au niveau de la function paiementAllerAction($tarif), il y a $paiement = $servicePaiement->getPaiementObjet($tarif, $this->getUser()->getEmail()); car lorsqu'on regarde le TpeService.php

on peut voir public function getPaiementObjet($montant, $email) { $paiement = new Paiement(); $this->handleMandatoryParameters($paiement); $paiement->setMontantNum($montant); $paiement->setMontant($montant.$paiement->getDevise()); $paiement->setReference("ref".date("His")); $paiement->setMail($email); return $paiement; }

pourquoi les deux get ne demandes pas la meme chose ? $tarif / $montant

nicovak commented 7 years ago

Le premier est l'appel d'une fonction, le deuxième est une déclaration et n'a donc pas d'incidence. J'aurais pu mettre $toto et $titi dans public function getPaiementObjet($montant, $email) ce ne sont que des arguments de fonction instancier automatiquement lors de l'appel. En faisant ça j'aurais cependant du changer le code dans la fonction et mettre $toto pour le premier et $titi pour faire référence au deuxième argument.

Essais {{ render(controller('RCPaiementCMCICBundle:SamplePaiement:paiementAller', { tarif: 10000 })) }} au pire dans ta vue.

https://stackoverflow.com/questions/11717438/symfony2-twig-how-to-render-a-twig-template-from-inside-a-twig-template

dedioweb commented 7 years ago

@nicovak 👍
Y'a du mieux ! Effectivement, ca fonctionne, j'ai meme remplacé tarif: 10000 par ma variable tarif: commande.commande.prixTTC :-) Par contre, y'a une erreur sur https://p.monetico-services.com/test/paiement.cgi Le site de votre commerçant n'a pas été identifié par notre serveur. Nous ne sommes pas en mesure de traiter la demande de paiement relative à votre commande. Tous les champs requis sont présents.

dedioweb commented 7 years ago

J'ai corrigé, c'était une erreur de clé monetico Grand merci, je laisse ouvert pour le moment au besoin.

nicovak commented 7 years ago

Pas de soucis :)

dedioweb commented 7 years ago

@nicovak Pour info, il y a une faute de conjugaison dans la vue Paiement/retour.html.twig :-) tu as mis : Votre paiement à bien été pris en compte. Merci. il n'y a pas d'accent à "a" (c'est le verbe avoir) :-)

nicovak commented 7 years ago

Effectivement, merci. https://github.com/rollincode/RCPaiementCMCICBundle/commit/180279e1b854a7977c53098d12e8e67810d5dca6

dedioweb commented 7 years ago

@nicovak Les test paiements passent bien, mais (car il en faut toujours) je reçois un mail en retour qui me dit : Votre serveur nous a envoyé un accusé de reception invalide et le paiement a été validé. Peux tu me guider sur ce sujet ? Par avance, merci

dedioweb commented 7 years ago

sur la page de paiement monetico, j'ai : Réponse : Code retour : payetest CGI2 : NOT OK

nicovak commented 7 years ago

Tu as mis quoi en URL de retour (OK ET KO) sur l'interface commerçant ?

dedioweb commented 7 years ago

L'interface commerçant, tu parles des URL communiqués à Monetico ? ok, ne cherche pas, c'est parce que je suis encore en localhost, le site n'est pas en ligne actuellement, c'est donc pour cela ?

nicovak commented 7 years ago

Normalement oui. Il y a deux logiques à comprendre.

1 / url de retours lors du paiement, c'est juste une redirection avec dans l'url success ou error 2 / url de validation interroger par les serveurs CMCIC quand la banque à validé le paiement. Car le validation peut prendre un peu de temps. C'est pour ça qu'il y a un listener qui s'occupe de gérer la logique quand la banque retourne la réponse. Essais donc sur une pré-prod dispo en ligne et tu verras s'il y a encore l'erreur.

PS: N'oublis pas de surcharger https://github.com/rollincode/RCPaiementCMCICBundle/blob/master/Services/SampleLogicTpeService.php avec ta logique (status de la commande à valider, envois d'email, etc.)

dedioweb commented 7 years ago

je comprend la logique 1/ redirection avec dans l'url success ou error Par contre la 2/ tu dis : Essais donc sur une pré-prod dispo, il faut que je mette en ligne mon symfony ?

Pour la surchage LogicTpeService, je ne l'ai pas encore fait, j'ai ajouté directement avec ma logique mais ca n'a pas l'air de fonctionner, j'ai mis :

case "payetest":
                // Payment has been accepeted on the test server
                // put your code here (email sending / Database update)
                $em = $this->getDoctrine()->getManager();
                $commande = $em->getRepository('EcommerceBundle:Commandes')->find($id);

                $commande->setValider(1);
                $commande->setReference(1); //service à faire
                $em->flush();

                $session = $this->getRequest()->getSession();
                $session->remove('adresse');
                $session->remove('panier');
                $session->remove('commande');
                break;

mais rien ne se passe

nicovak commented 7 years ago

C'est normal on ne peut tester que quand l'appli est en ligne sur un serveur test.

hayusama commented 7 years ago

Salut,

Merci pour ton bundle, qui devrait me faciliter la vie.

Par contre j'ai une petite question

Etape 2 tu overrides le service pour y inclure ta logique. Pour info le service est appelé ici : $serviceLogicPaiement = $this->container->get('rc.paiementcmcic_logic_tpe'); dans le controller sample. Et sa déclaration se trouve ici: https://github.com/rollincode/RCPaiementCMCICBundle/blob/master/Resources/config/services.yml C'est le fonctionnement par défaut des bundles sur Symfony.

Quand tu parles de surcharges, tu demandes d'écrire directement son code dans le bundle??? Car si un jour tu fais un update et que j'update mon projet mon code va sauter?

nicovak commented 7 years ago

Il suffit juste de créer le service avec le meme nom dans ton bundle à toi (services.yml), de copier coller le contenu de la classe du bundle et de changer les namespaces.

dedioweb commented 6 years ago

@nicovak Hello,

Je reviens sur le sujet, afin de finaliser le tout, le CMCIC me demande l'URL de retour serveur ? j'ai bien : pour les erreurs : /paiement/retour/error pour les succès : /paiement/retour/success

Mais pour la phase retour effectué par les serveurs CMCIC ?? je ne sais pas quoi ni comment paramétrer la chose ! Par avance, merci

nicovak commented 6 years ago

@dedioweb Salut,

L'URL de verification pour les serveurs CMCIC est /paiement/verification Normalement pas de config à prévoir.

dedioweb commented 6 years ago

@nicovak Hello,

Les URLS sont bien enregistrés chez Monético, ça c'est ok, j'ai effectué différents test. J'ai toujours sur la page test Monético : CGI2 : NOT OK

Dans le mail envoyé par Monético j'ai :

  | "  Bonjour, "  Votre serveur nous a envoyé un accusé de reception invalide et le paiement a été validé. | " | Bonjour, | " | Votre serveur nous a envoyé un accusé de reception invalide et le paiement a été validé.

Requête émise par notre serveur : https://e3digit.com:443/e-boutique/livraison/validation/paiement/verification?TPE=6771...&date=26%2f10%2f2017%5fa%5f16%3a22%3a43&montant=501%2e12EUR&reference=ref162159&MAC=CD003D9529AB53E5F802C058F2C6E4CD1...&texte-libre=&code-retour=payetest&cvx=oui&vld=1219&brand=VI&status3ds=1&numauto=000000&originecb=FRA&bincb=000001&hpancb=C426B0D2BFE6E68BD27E122E4D310B4D.....&ipclient=80%2e12%2e95%....&originetr=FRA&veres=&pares=&modepaiement=CB

  Méthode retenue : POST   TPE : 6771...   Hôte appelé : e3digit.com   Port : 443   CGI appelé : /e-boutique/livraison/validation/paiement/verification   Requête émise : TPE=677....&date=26%2f10%2f2017%5fa%5f16%3a22%3a43&montant=501%2e12EUR&reference=ref162159&MAC=CD003D9529AB53E5F802C058F2C6E......&texte-libre=&code-retour=payetest&cvx=oui&vld=1219&brand=VI&status3ds=1&numauto=000000&originecb=FRA&bincb=000001&hpancb=C426B0D2BFE6E68BD27E122E4D310B4D.....&ipclient=80%2e12%2e....&originetr=FRA&veres=&pares=&modepaiement=CB

Erreur : 0

Monético m'indique que c'est une erreur 500 de mon serveur, mais l'url simple de vérification passe bien, en utilisant: e-boutique/livraison/validation/paiement/verification

Mais dès que l'on ajoute les différentes variable = erreur 500

Par avance, merci

dedioweb commented 6 years ago

en faite, je viens de regarder les logs "Prod"

[2017-10-27 00:14:05] request.INFO: Matched route "eboutique_eboutique_commandes_retourserveur". {"route_parameters":{"_controller":"Eboutique\EboutiqueBundle\Controller\CommandesController::retourServeurAction","_route":"eboutique_eboutique_commandes_retourserveur"},"request_uri":"https://e3digit.com/e-boutique/livraison/validation/paiement/verification"} [] [2017-10-27 00:14:05] security.INFO: Populated the TokenStorage with an anonymous Token. [] [] [2017-10-27 00:14:05] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\UndefinedMethodException: "Attempted to call an undefined method named "getDoctrine" of class "Eboutique\EboutiqueBundle\Services\LogicTpeService"." at /home/e3dcom/public_html/src/Eboutique/EboutiqueBundle/Services/LogicTpeService.php line 33 {"exception":"[object] (Symfony\Component\Debug\Exception\UndefinedMethodException(code: 0): Attempted to call an undefined method named \"getDoctrine\" of class \"Eboutique\EboutiqueBundle\Services\LogicTpeService\". at /home/e3dcom/public_html/src/Eboutique/EboutiqueBundle/Services/LogicTpeService.php:33)"} []

Je pense que j'ai oublié un/des USE dans le LogicTpeService ?

dedioweb commented 6 years ago

@nicovak hello, Donc je confirme que c'est bien un probleme dans le LogicTpeService public function handlePaiementLogic donc le traitement de "case" car j'ai enlevé dans la partie payetest :

` // Payment has been accepeted on the test server // put your code here (email sending / Database update) $em = $this->getDoctrine()->getManager(); $commande = $em->getRepository('EboutiqueBundle:Commandes')->find($id);

            $commande->setValider(1);
            $commande->setReference($this->container->get('setNewReference')->reference());
            $em->flush();

            $session = $this->getRequest()->getSession();
            $session->remove('adresse');
            $session->remove('panier');
            $session->remove('commande');

            // ici le mail de validation
            $message = \Swift_Message::newInstance()
              ->setSubject('Validation de votre commande')
              ->setFrom(array('contact@xxx.com' => "xxxx"))
              ->setTo($commande->getUtilisateur()->getEmailCanonical())
              ->setBcc('secretariat@xxxxx')
              ->setCharset('utf-8')
              ->setContentType('text/html')
              ->setBody($this->renderView('EboutiqueBundle:Default:swiftlayout/validationCommande.html.twig'));
            $this->get('mailer')->send($message);`

Sans se traitement, le CGI est ok donc le problème est là