Commit c8a82722 by Yvon Kerdoncuff

Merge branch '4241-fix-online-payment' into 'develop'

4241 fix online payment

See merge request cooperatic/kohinos-tav!25
parents 0a7b3ecd 742fbf03
......@@ -229,6 +229,13 @@ services:
tags:
- { name: payum.gateway_factory_builder, factory: payzen }
app.payum.extension.payment_status:
class: App\EventListener\PaymentStatusExtension
public: true
autowire: true
tags:
- { name: payum.extension, all: true, prepend: false }
###### Configuration de l'admin ######
admin.block.dashboard:
......
......@@ -55,7 +55,11 @@ class CaptureAction implements ActionInterface, GatewayAwareInterface, GenericTo
// Notify url
if (empty($model['vads_url_check']) && $this->tokenFactory) {
// Custom action
$model['vads_url_check'] = $request->getToken()->getAfterUrl();
$notifyToken = $this->tokenFactory->createNotifyToken(
$request->getToken()->getGatewayName(),
$request->getToken()->getDetails()
);
$model['vads_url_check'] = $notifyToken->getTargetUrl();
}
}
......
......@@ -74,7 +74,7 @@ class AdhesionController extends AbstractController
$jsondata = $serializer->serialize($data, 'json');
// Redirect to payment page
return $this->forward('App\Controller\FluxController::preparePaymentAction', [
return $this->forward('App\Controller\PaymentController::preparePaymentAction', [
'form' => $form,
'type' => Payment::TYPE_ADHESION,
'extra_data' => $jsondata,
......
<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Translation\TranslatorInterface;
use Payum\Core\Payum;
use Payum\Core\Request\Notify;
use Payum\Core\Request\GetHumanStatus;
use App\Entity\Flux;
use App\Entity\Payment;
use App\Entity\User;
use App\Entity\GlobalParameter;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use App\Security\LoginAuthenticator;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
/**
* Gestion des paiements avec Payum
*/
class PaymentController extends AbstractController
{
protected $em;
protected $translator;
protected $payum;
protected $authenticator;
protected $guardHandler;
public function __construct(EntityManagerInterface $em,
TranslatorInterface $translator,
LoginAuthenticator $authenticator,
GuardAuthenticatorHandler $guardHandler,
Payum $payum)
{
$this->em = $em;
$this->translator = $translator;
$this->payum = $payum;
$this->authenticator = $authenticator;
$this->guardHandler = $guardHandler;
}
/**
* Crée une instance de Payment, les tokens associés, et redirige vers la page de paiement
*/
public function preparePaymentAction(Form $form, $type, $extra_data = null)
{
// Enregistre les données du Flux en json, pour l'enregistrer une fois le paiement validé
$serializer = $this->container->get('serializer');
$toSerialize = Payment::TYPE_ADHESION == $type ? $form->get('cotisation')->getData() : $form->getData();
$data = $serializer->normalize($toSerialize,
null,
[AbstractNormalizer::ATTRIBUTES => [
'reference',
'moyen',
'montant',
'role',
'don' => [
'reference',
'moyen',
'montant',
'role',
'type',
'expediteur' => ['id'],
'destinataire' => ['id'],
'operateur' => ['id'],
],
'expediteur' => ['id'],
'destinataire' => ['id'],
'operateur' => ['id']]
]);
$jsondata = $serializer->serialize($data, 'json');
// Prepare CB Payment
if ($this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::USE_PAYZEN) === 'true') {
$gatewayName = 'payzen';
} else {
$this->addFlash(
'error',
$this->translator->trans('Une erreur est survenue due à la configuration du paiement dans l\'application. Il est pour l\'instant impossible de payer par CB, merci de contacter votre monnaie locale.')
);
return $this->redirectToRoute('index');
}
$storage = $this->payum->getStorage('App\Entity\Payment');
$payment = $storage->create();
$payment->setNumber(uniqid());
$payment->setCurrencyCode('978');
$payment->setDescription($type);
$payment->setFluxData($jsondata);
// Data to persist when payment is valid (other than Flux data)
if (null != $extra_data) {
$payment->setExtraData($extra_data);
}
if ($type == Payment::TYPE_ADHESION) {
$payment->setTotalAmount($form->get('cotisation')->get('montant')->getData()*100); // 1.23 EUR
$payment->setClientId('Nouvel adhérent');
$payment->setClientEmail($form->get('user')->get('email')->getData());
} else {
if ($form->has('don') && $form->get('don')->getData()->getMontant() > 0) {
$payment->setTotalAmount(($form->get('montant')->getData() * 100) + ($form->get('don')->getData()->getMontant() * 100)); // 1.23 EUR
} else {
$payment->setTotalAmount($form->get('montant')->getData() * 100); // 1.23 EUR
}
$payment->setClientId($this->getUser()->getId());
$payment->setClientEmail($this->getUser()->getEmail());
}
$storage->update($payment);
$captureToken = $this->payum->getTokenFactory()->createCaptureToken(
$gatewayName,
$payment,
'payment_done' // the route to redirect after capture
);
// Symfony creates URLs with http and not https -> replace
$targetUrl = preg_replace('/^http:/', 'https:', $captureToken->getTargetUrl());
$afterUrl = preg_replace('/^http:/', 'https:', $captureToken->getAfterUrl());
$captureToken->setTargetUrl($targetUrl);
$captureToken->setAfterUrl($afterUrl);
$this->em->persist($captureToken);
$this->em->flush();
return $this->redirect($captureToken->getTargetUrl());
}
/**
* Fonction de retour sur le site par l'utilisateur après paiement
*
* @Route("/payment/done/", name="payment_done")
*/
public function doneAction(Request $request)
{
try {
$token = $this->payum->getHttpRequestVerifier()->verify($request);
} catch (\Exception $e) {
// Token expired
return $this->redirectToRoute('index');
}
// Get payment
$gateway = $this->payum->getGateway($token->getGatewayName());
$gateway->execute($status = new GetHumanStatus($token));
$payment = $status->getFirstModel();
if ($payment->getStatus() == GetHumanStatus::STATUS_NEW) {
// No notification arrived at this point: execute Notify action
$gateway->execute(new Notify($token));
} else {
// Invalidate token
$this->payum->getHttpRequestVerifier()->invalidate($token);
}
// Set flash message according to payment status
if ($payment->getStatus() == GetHumanStatus::STATUS_CAPTURED || $payment->getStatus() == GetHumanStatus::STATUS_AUTHORIZED) {
$type = $payment->getDescription();
if (Payment::TYPE_ACHAT_MONNAIE_ADHERENT == $type || Payment::TYPE_ACHAT_MONNAIE_PRESTA == $type) {
$this->addFlash(
'success',
$this->translator->trans('Achat de monnaie locale bien effectué !')
);
} else if (Payment::TYPE_COTISATION_ADHERENT == $type || Payment::TYPE_COTISATION_PRESTA == $type) {
$this->addFlash(
'success',
$this->translator->trans('Cotisation bien reçue. Merci !')
);
} else if (Payment::TYPE_ADHESION == $type) {
$this->addFlash(
'success',
$this->translator->trans('Votre adhésion a bien été prise en compte, bienvenue !')
);
// Connect new user
return $this->guardHandler
->authenticateUserAndHandleSuccess(
$this->em->getRepository(User::class)->findOneBy(array('id' => $payment->getClientId())),
$request,
$this->authenticator,
'main'
);
} else if (Payment::TYPE_PAIEMENT_COTISATION_TAV == $type) {
$this->addFlash(
'success',
$this->translator->trans('Cotisation payée !')
);
}
} else if ($payment->getStatus() == GetHumanStatus::STATUS_CANCELED ||
$payment->getStatus() == GetHumanStatus::STATUS_EXPIRED ||
$payment->getStatus() == GetHumanStatus::STATUS_FAILED)
{
$this->addFlash(
'error',
$this->translator->trans('La transaction a été annulée.')
);
}
return $this->redirectToRoute('index');
}
}
......@@ -104,10 +104,10 @@ class UserAdherentController extends FluxController
if ($form->has('payOther') && $form->get('payOther')->isClicked()) {
return $this->redirectToRoute('achatMonnaieAConfirmerAdherent');
} elseif ($form->has('save') && $form->get('save')->isClicked()) {
return $this->preparePaymentAction(
$form,
Payment::TYPE_ACHAT_MONNAIE_ADHERENT
);
return $this->forward('App\Controller\PaymentController::preparePaymentAction', [
'form' => $form,
'type' => Payment::TYPE_ACHAT_MONNAIE_ADHERENT
]);
} elseif ($form->has('saveHelloAsso') && $form->get('saveHelloAsso')->isClicked()) {
$url = $this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::HELLOASSO_URL_EMLC_ADHERENT);
......@@ -166,19 +166,25 @@ class UserAdherentController extends FluxController
$flux->setDon(null);
}
$this->em->persist($flux);
$this->operationUtils->executeOperations($flux);
// TODO redirect to paiement
return $this->forward('App\Controller\PaymentController::preparePaymentAction', [
'form' => $form,
'type' => Payment::TYPE_PAIEMENT_COTISATION_TAV // TODO
]);
// $this->em->persist($flux);
// $this->operationUtils->executeOperations($flux);
// Apply cotisation rate, create new flux
$this->tavCotisationsUtils->applyTauxCotisation($flux);
// // Apply cotisation rate, create new flux
// $this->tavCotisationsUtils->applyTauxCotisation($flux);
$this->em->flush();
$this->addFlash(
'success',
$this->translator->trans('Cotisation payée ! [Paiement via Payzen temporairement désactivé]')
);
// $this->em->flush();
// $this->addFlash(
// 'success',
// $this->translator->trans('Cotisation payée ! [Paiement via Payzen temporairement désactivé]')
// );
return $this->redirectToRoute('index');
// return $this->redirectToRoute('index');
}
return $this->render('@kohinos/flux/transaction.html.twig', [
......
......@@ -135,7 +135,7 @@ class UserController extends AbstractController
return $this->redirect($url);
} elseif (MoyenEnum::MOYEN_CB == $cotisation->getMoyen()) {
// Redirect to payment page
return $this->forward('App\Controller\FluxController::preparePaymentAction', [
return $this->forward('App\Controller\PaymentController::preparePaymentAction', [
'form' => $form,
'type' => $payment_type,
]);
......
......@@ -259,10 +259,11 @@ class UserPrestataireController extends FluxController
return $this->redirect($url);
} elseif ($form->get('save')->isClicked()) {
return $this->preparePaymentAction(
$form,
Payment::TYPE_ACHAT_MONNAIE_PRESTA
);
return $this->forward('App\Controller\PaymentController::preparePaymentAction', [
'form' => $form,
'type' => Payment::TYPE_ACHAT_MONNAIE_PRESTA
]);
}
}
......
......@@ -17,6 +17,7 @@ class Payment extends BasePayment
const TYPE_COTISATION_ADHERENT = 'cotisation_adherent';
const TYPE_COTISATION_PRESTA = 'cotisation_presta';
const TYPE_ADHESION = 'adhesion';
const TYPE_PAIEMENT_COTISATION_TAV = 'paiement_cotisation_tav';
/**
* @var \Ramsey\Uuid\UuidInterface
......
......@@ -83,8 +83,8 @@ class TAVCotisationUtils
$fluxCotis->setReference("Prélèvement cotisation après paiement de " . $cotisationAmount . "€ et application du taux " . $cotisationTaux);
}
$fluxCotis->setOperateur($this->security->getUser());
$fluxCotis->setRole($this->security->getUser()->getGroups()[0]->__toString());
$fluxCotis->setOperateur($flux->getOperateur());
$fluxCotis->setRole($flux->getRole());
$fluxCotis->setMoyen(MoyenEnum::MOYEN_EMLC);
$this->em->persist($fluxCotis);
$this->operationUtils->executeOperations($fluxCotis);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment