Se agrega parametro de configuracion para ambiente en la pagina de

inicio
parent 290b5e88
......@@ -69,3 +69,8 @@ front_datos_usuario:
path: mi/cuenta/datos/actualizar
controller: App\FrontendBundle\Controller\CuentaController::actualizarDatos
methods: POST
front_kushki_confirmacion_pago:
path: app/lista/canciones/confirm
controller: App\FrontendBundle\Controller\PagosController::confirmacion
methods: POST
\ No newline at end of file
......@@ -135,7 +135,7 @@ class PluListaRepository extends EntityRepository {
$fechaActual = new \DateTime();
$sql = "SELECT count(*) as cantidad
FROM plu_suscripcion AS plusus
WHERE plusus.sus_vigente = 1 and plusus.lis_id = " . $listid ." and plusus.sus_msisdn= " . $msisdn . " and plusus.sus_Ultimo_Tipo_Xml = 1 and plusus.sus_inicio <= '". $fechaActual->format('Y-m-d H:i:s')."' and plusus.sus_fin >= '". $fechaActual->format('Y-m-d H:i:s')."'";
WHERE plusus.sus_vigente = 1 and plusus.lis_id = " . $listid ." and plusus.sus_msisdn= " . $msisdn . " and plusus.sus_ultimo_tipo_xml = 1 and plusus.sus_inicio <= '". $fechaActual->format('Y-m-d H:i:s')."' and plusus.sus_fin >= '". $fechaActual->format('Y-m-d H:i:s')."'";
$stmt = $this->getEntityManager()->getConnection()->prepare($sql);
$stmt->execute();
......
<?php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use App\Entity\PluSuscripcion;
use App\Entity\PluEstadoSuscripcionKushki;
use App\Repository\PluEstadoSuscripcionKushkiRepository;
use App\Utilities\Utiles;
class VerificarSuscripcionKushkiCommand extends Command {
const successfulCharge = "successfulCharge";
const failedRetry = "failedRetry";
const lastRetry = "lastRetry";
const subscriptionDelete = "subscriptionDelete";
const error = "ERROR";
const maxRetry = 3;
protected static $defaultName = 'app:verificar-suscripcion-kushki';
private $em;
public function __construct($name = null, EntityManagerInterface $em) {
parent::__construct($name);
$this->em = $em;
}
protected function configure() {
$this
->setDescription('Command que permite verificar el estado de las suscripciones del tipo kushki registrados en el sistema.')
;
}
protected function execute(InputInterface $input, OutputInterface $output) {
$log = Utiles::setLog('App\Command::VerificarSuscripcionKushkiCommand', 'command/verificarSuscripcionKushki');
$io = new SymfonyStyle($input, $output);
$suscripciones = $this->em
->getRepository(PluSuscripcion::class)
->findBy(array("susVigente" => PluSuscripcion::VIGENTE,"susUltimoTipoXml" => PluSuscripcion::TIPO_XML_SUSCRIPCION ,"susTipoSuscripcion" => PluSuscripcion::TIPO_SUSCRIPCION_KUSHKI));
$fechaActual = new \DateTime();
foreach ($suscripciones as $index => $suscripcion):
$log->debug("Analizando suscripcion " . $suscripcion->getSusId() . " de la lista " . $suscripcion->getLisId()->getLisId() . " del msisdn " . $suscripcion->getSusMsisdn());
$fechaTermino = $suscripcion->getSusFin();
if ($fechaTermino < $fechaActual) {
$log->debug("suscripcion con id " . $suscripcion->getSusId() . " presentaba vigencia fuera de fecha");
$suscripcion->setSusVigente(PluSuscripcion::NO_VIGENTE);
$this->em->persist($suscripcion);
$this->em->flush();
$log->debug("Se modifica vigencia de la suscripcion " . $suscripcion->getSusId());
} else if ($fechaTermino >= $fechaActual && $suscripcion->getSusSuscriptionIdKushki() != null) {
$log->debug("suscripcion con id " . $suscripcion->getSusId() . " presentaba vigencia dentro de la vigencia...comenzando analisis");
$publicKey = Utiles::getParametroConfiguracion("publicKeyKushki", $this->em);
$clientId = Utiles::getParametroConfiguracion("clientIdKushki", $this->em);
$subscriptionId = $suscripcion->getSusSuscriptionIdKushki();
$url = Utiles::getParametroConfiguracion("obtenerInformacionSuscripcion", $this->em) . "$publicKey/$clientId/$subscriptionId";
try {
$log->debug('obteniendo informacion suscripcion kushki kushki... url:' . $url);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$output = curl_exec($ch);
$status_code_informacion = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$log->debug('Retorno status a obtener informacion suscripcion:' . $status_code_informacion . ' | desc:' . $output);
$data = json_decode($output, true);
if($data['code'] == 200){
switch ($data["event"]) {
case $this::successfulCharge:
$fechaActual = new \DateTime();
$fecha = new \DateTime();
$fechaUnaSemana = $fecha->modify('+7 days');
$suscripcion->setSusInicio($fechaActual);
$suscripcion->setSusFin($fechaUnaSemana);
$suscripcion->setSusStartDateKushki($data["startDate"]);
$suscripcion->setUpdatedAt(new \DateTime());
$this->em->persist($suscripcion);
$this->em->flush();
$log->debug("Se actualizo suscripcion " . $suscripcion->getSusId() . " de la lista " . $suscripcion->getLisId()->getLisId() . " del msisdn " . $suscripcion->getSusMsisdn()." para estado successfulCharge");
break;
case $this::failedRetry:
$registro = PluEstadoSuscripcionKushkiRepository::buscarRegistroEstado($suscripcion->getLisId()->getLisId());
if($registro == null){
//si no existe
$nuevoRegistroEstadoSuscripcion = new PluEstadoSuscripcionKushki();
$nuevoRegistroEstadoSuscripcion->setEskTipo(PluEstadoSuscripcionKushki::TIPO_SUSCRIPCION);
$nuevoRegistroEstadoSuscripcion->setEskEstado(PluEstadoSuscripcionKushki::VIGENTE);
$nuevoRegistroEstadoSuscripcion->setEskIntento(1);
$nuevoRegistroEstadoSuscripcion->setEskRespuestaNotificacion($this::failedRetry);
$nuevoRegistroEstadoSuscripcion->setCreatedAt(new \DateTime());
$nuevoRegistroEstadoSuscripcion->setUpdatedAt(new \DateTime());
$this->em->persist($nuevoRegistroEstadoSuscripcion);
$this->em->flush();
$fechaTermino = $suscripcion->getSusFin();
$fechaTermino->modify("+1 day");
$suscripcion->setSusFin($fechaTermino);
$suscripcion->setUpdatedAt(new \DateTime());
$this->em->persist($suscripcion);
$this->em->flush();
}else{
//si existe
$intentos = $registro->getEskIntento();
$intentos = $intentos + 1;
$registro->setEskIntento($intentos);
$registro->setUpdatedAt(new \DateTime());
$this->em->persist($registro);
$this->em->flush();
}
$log->debug("Intento fallido $intentos, suscripcion " . $suscripcion->getSusId() . " de la lista " . $suscripcion->getLisId()->getLisId() . " del msisdn " . $suscripcion->getSusMsisdn()." para estado failedRetry");
break;
case $this::lastRetry:
//cuando todos los intentos fallan (3), se deben marcar la suscripcion actual como no valida
$registro = PluEstadoSuscripcionKushkiRepository::buscarRegistroEstado($suscripcion->getLisId()->getLisId());
$intentos = $registro->getEskIntento();
$intentos = $intentos + 1;
$registro->setEskIntento($intentos);
$registro->setUpdatedAt(new \DateTime());
$this->em->persist($registro);
$this->em->flush();
$suscripcion->setSusVigente(PluSuscripcion::NO_VIGENTE);
$suscripcion->setUpdatedAt(new \DateTime());
$this->em->persist($suscripcion);
$this->em->flush();
$log->debug("Intento fallido $intentos, suscripcion " . $suscripcion->getSusId() . " de la lista " . $suscripcion->getLisId()->getLisId() . " del msisdn " . $suscripcion->getSusMsisdn()." para estado failedRetry");
break;
}
}else{
$log->err(' Error al verificar. url:' . $url . ' .Exception: ' . $e);
}
} catch (\Exception $e) {
$log->err(' Error al verificar. url:' . $url . ' .Exception: ' . $e);
}
} else if($suscripcion->getSusTipoSuscripcion() == 1){
$log->debug('suscripcion de entel' . $suscripcion->getSusId() . ' no aplica...');
}
endforeach;
$io->success('Finalizando proceso');
}
}
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="plu_estado_suscripcion_kushki", indexes={@ORM\Index(name="idx_fk_plu_suscripcion_kushki", columns={"sus_id"})})
* @ORM\Entity(repositoryClass="App\Repository\PluEstadoSuscripcionKushkiRepository")
*/
class PluEstadoSuscripcionKushki
{
const VIGENTE = 1;
const NO_VIGENTE = 0;
const TIPO_SUSCRIPCION = 1;
/**
* @var int
*
* @ORM\Column(name="esk_id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $eskId;
/**
* @var \PluSuscripcion
*
* @ORM\ManyToOne(targetEntity="PluSuscripcion")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="sus_id", referencedColumnName="sus_id")
* })
*/
private $susId;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $eskTipo;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $eskEstado;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $eskIntento;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $eskRespuestaNotificacion;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $createdAt;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $updatedAt;
public function getEskId(): ?int
{
return $this->eskId;
}
public function setEskId(int $eskId): self
{
$this->eskId = $eskId;
return $this;
}
public function getEskTipo(): ?int
{
return $this->eskTipo;
}
public function setEskTipo(?int $eskTipo): self
{
$this->eskTipo = $eskTipo;
return $this;
}
public function getEskEstado(): ?int
{
return $this->eskEstado;
}
public function setEskEstado(?int $eskEstado): self
{
$this->eskEstado = $eskEstado;
return $this;
}
public function getEskIntento(): ?int
{
return $this->eskIntento;
}
public function setEskIntento(?int $eskIntento): self
{
$this->eskIntento = $eskIntento;
return $this;
}
public function getEskRespuestaNotificacion(): ?string
{
return $this->eskRespuestaNotificacion;
}
public function setEskRespuestaNotificacion(?string $eskRespuestaNotificacion): self
{
$this->eskRespuestaNotificacion = $eskRespuestaNotificacion;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(?\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(?\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function getSusId(): ?PluSuscripcion
{
return $this->susId;
}
public function setSusId(?PluSuscripcion $susId): self
{
$this->susId = $susId;
return $this;
}
}
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="plu_metodo_pago")
* @ORM\Entity(repositoryClass="App\Repository\PluMetodoPagoRepository")
*/
class PluMetodoPago
{
const TIPO_VIGENTE = 1;
const TIPO_NO_VIGENTE = 0;
const ELIMINADO_TRUE = 1;
const ELIMINADO_FALSE = 0;
const ESTADO_VALIDO = 1;
const ESTADO_NO_VALIDO = 0;
const ESTADO_PAGO_OK = 1;
const ESTADO_PAGO_NOK = 0;
/**
* @var int
*
* @ORM\Column(name="mpa_id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $mpaId;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $mpaUserIdentifier;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $mpaSusId;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $mpaTipo;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $mpaPrecio;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $mpaEstadoPago;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $mpaEstado;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $mpaEliminado;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $createdAt;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $updatedAt;
public function getMpaId(): ?int
{
return $this->mpaId;
}
public function setMpaId(?int $mpaId): self
{
$this->mpaId = $mpaId;
return $this;
}
public function getMpaUserIdentifier(): ?string
{
return $this->mpaUserIdentifier;
}
public function setMpaUserIdentifier(?string $mpaUserIdentifier): self
{
$this->mpaUserIdentifier = $mpaUserIdentifier;
return $this;
}
public function getMpaSusId(): ?int
{
return $this->mpaSusId;
}
public function setMpaSusId(?int $mpaSusId): self
{
$this->mpaSusId = $mpaSusId;
return $this;
}
public function getMpaTipo(): ?int
{
return $this->mpaTipo;
}
public function setMpaTipo(?int $mpaTipo): self
{
$this->mpaTipo = $mpaTipo;
return $this;
}
public function getMpaPrecio(): ?int
{
return $this->mpaPrecio;
}
public function setMpaPrecio(?int $mpaPrecio): self
{
$this->mpaPrecio = $mpaPrecio;
return $this;
}
public function getMpaEstadoPago(): ?int
{
return $this->mpaEstadoPago;
}
public function setMpaEstadoPago(?int $mpaEstadoPago): self
{
$this->mpaEstadoPago = $mpaEstadoPago;
return $this;
}
public function getMpaEstado(): ?int
{
return $this->mpaEstado;
}
public function setMpaEstado(?int $mpaEstado): self
{
$this->mpaEstado = $mpaEstado;
return $this;
}
public function getMpaEliminado(): ?int
{
return $this->mpaEliminado;
}
public function setMpaEliminado(?int $mpaEliminado): self
{
$this->mpaEliminado = $mpaEliminado;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(?\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(?\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
}
......@@ -23,6 +23,10 @@ class PluSuscripcion
const TIPO_XML_DESINSCRIPCION = 2;
const ORIGEN_PETICION_GEARLABS = 1;
const ORIGEN_PETICION_ENTEL = 2;
const TIPO_SUSCRIPCION_ENTEL = 1;
const TIPO_SUSCRIPCION_KUSHKI = 2;
const TIPO_KUSHKI_SUSCRIPCION = 1;
const TIPO_KUSHKI_DESINSCRIPCION = 2;
/**
* @var int
......@@ -43,6 +47,13 @@ class PluSuscripcion
*/
private $lisId;
/**
* @var int|null
*
* @ORM\Column(name="sus_tipo_suscripcion", type="smallint", nullable=true)
*/
private $susTipoSuscripcion;
/**
* @var string|null
......@@ -138,7 +149,66 @@ class PluSuscripcion
*/
private $susXmlDesinscripcion;
/**
* @var int|null
*
* @ORM\Column(name="sus_ultimo_tipo_kushki", type="integer", nullable=true)
*/
private $susUltimoTipoKushki;
/**
* @var int|null
*
* @ORM\Column(name="sus_http_code_kushki", type="integer", nullable=true)
*/
private $susHttpCodeKushki;
/**
* @var text|null
*
* @ORM\Column(name="sus_response_kushki", type="text", nullable=true)
*/
private $susResponseKushki;
/**
* @var string|null
*
* @ORM\Column(name="sus_token_kushki", type="string", length=1000, nullable=true)
*/
private $susTokenKushki;
/**
* @var string|null
*
* @ORM\Column(name="sus_pay_type_kushki", type="string", length=1000, nullable=true)
*/
private $susPayTypeKushki;
/**
* @var string|null
*
* @ORM\Column(name="sus_start_date_kushki", type="string", length=1000, nullable=true)
*/
private $susStartDateKushki;
/**
* @var string|null
*
* @ORM\Column(name="sus_suscription_id_kushki", type="string", length=1000, nullable=true)
*/
private $susSuscriptionIdKushki;
/**
* @var int|null
*
* @ORM\Column(name="sus_transaction_id_kushki", type="integer", nullable=true)
*/
private $susTransactionIdKushki;
/**
* @var \DateTime|null
*
......@@ -348,18 +418,126 @@ class PluSuscripcion
$this->susHttpDescr = $susHttpDescr;
return $this;
}
public function getSusHttpXmlDescr(): ?string
{
return $this->susHttpXmlDescr;
}
public function setSusHttpXmlDescr(?string $susHttpXmlDescr): self
{
$this->susHttpXmlDescr = $susHttpXmlDescr;
return $this;
}
public function getSusHttpXmlDescr(): ?string
{
return $this->susHttpXmlDescr;
}
public function setSusHttpXmlDescr(?string $susHttpXmlDescr): self
{
$this->susHttpXmlDescr = $susHttpXmlDescr;
return $this;
}
public function getSusTipoSuscripcion(): ?int
{
return $this->susTipoSuscripcion;
}
public function setSusTipoSuscripcion(?int $susTipoSuscripcion): self
{
$this->susTipoSuscripcion = $susTipoSuscripcion;
return $this;
}
public function getSusUltimoTipoKushki(): ?int
{
return $this->susUltimoTipoKushki;
}
public function setSusUltimoTipoKushki(?int $susUltimoTipoKushki): self
{
$this->susUltimoTipoKushki = $susUltimoTipoKushki;
return $this;
}
public function getSusHttpCodeKushki(): ?int
{
return $this->susHttpCodeKushki;
}
public function setSusHttpCodeKushki(?int $susHttpCodeKushki): self
{
$this->susHttpCodeKushki = $susHttpCodeKushki;
return $this;
}
public function getSusTokenKushki(): ?string
{
return $this->susTokenKushki;
}
public function setSusTokenKushki(?string $susTokenKushki): self
{
$this->susTokenKushki = $susTokenKushki;
return $this;
}
public function getSusPayTypeKushki(): ?string
{
return $this->susPayTypeKushki;
}
public function setSusPayTypeKushki(?string $susPayTypeKushki): self
{
$this->susPayTypeKushki = $susPayTypeKushki;
return $this;
}
public function getSusStartDateKushki(): ?string
{
return $this->susStartDateKushki;
}
public function setSusStartDateKushki(?string $susStartDateKushki): self
{
$this->susStartDateKushki = $susStartDateKushki;
return $this;
}
public function getSusSuscriptionIdKushki(): ?string
{
return $this->susSuscriptionIdKushki;
}
public function setSusSuscriptionIdKushki(?string $susSuscriptionIdKushki): self
{
$this->susSuscriptionIdKushki = $susSuscriptionIdKushki;
return $this;
}
public function getSusTransactionIdKushki(): ?int
{
return $this->susTransactionIdKushki;
}
public function setSusTransactionIdKushki(?int $susTransactionIdKushki): self
{
$this->susTransactionIdKushki = $susTransactionIdKushki;
return $this;
}
public function getSusResponseKushki(): ?string
{
return $this->susResponseKushki;
}
public function setSusResponseKushki(?string $susResponseKushki): self
{
$this->susResponseKushki = $susResponseKushki;
return $this;
}
}
......@@ -37,7 +37,8 @@ class IndexController extends AbstractController {
$modal = $request->get("m", 0);
$log->debug("entrando...HOST : $host |IP : $ip |MSISDN ENTRANTE: $msisdn| MSISDN SESION : $msisdnSesion | MODAL : $modal");
//prueba
$session->set('msisdn','998240036');
if ($session->get('msisdn')) {
$log->debug("1-MSISDN sesion encontrado....");
$msisdn = $session->get('msisdn');
......@@ -52,7 +53,7 @@ class IndexController extends AbstractController {
$log->debug("generando registro de sesion en BD para el msisdn $msisdn....");
$this->generarRegistroSession($em, $msisdn);
}
}else if (!$session->get('msisdn') && $msisdn == "" && $modal == 0) {
}/*else if (!$session->get('msisdn') && $msisdn == "" && $modal == 0) {
$log->debug("3-No se pudo obtener el msisdn....");
$code = Utiles::generarCodiogUnico($ip);
//redirect a php que esta en otro servidor
......@@ -61,7 +62,7 @@ class IndexController extends AbstractController {
));
$statusCode = 302;
return new RedirectResponse($url, $statusCode);
}
}*/
if ($session->get('msisdn')=="") {
......
<?php
namespace App\FrontendBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\PluRelacionesListas;
use App\Entity\PluLista;
use App\Entity\PluSuscripcion;
use App\Entity\PluMetodoPago;
use App\Utilities\Utiles;
use App\Utilities\Kushki;
class PagosController extends AbstractController {
public function confirmacion(Request $request): Response {
$log = Utiles::setLog('App\FrontendBundle\Controller::PagosController::confirmacion', 'app/frontend/kushki/confirmacion');
$em = $this->getDoctrine()->getManager('default');
$ua = $request->headers->get('User-Agent');
$headers = $request->headers->all();
$content = $request->getContent();
$json = new JsonResponse();
$fechaActual = new \DateTime();
$fechaInicioKushki = new \DateTime();
$fechaInicioKushki->modify('+1 days');
$fecha = new \DateTime();
$fechaUnaSemana = $fecha->modify('+7 days');
$log->debug("datos recolectados status : " . print_r($content,true));
$log->debug("leyendo parametros de la transaccion kushki....");
$kushkiToken = $request->get('kushkiToken');
$kushkiPaymentMethod = $request->get('kushkiPaymentMethod');
$userIdentifier = $request->get('userIdentifier');
$productId = $request->get('productId');
$productName = $request->get('productName');
$productPrice = $request->get('productPrice');
$listas = $em->getRepository(PluLista::class)->getListasVigentes($userIdentifier);
$lista = $em->getRepository(PluLista::class)->find($productId);
$log->debug("generando objeto de suscripcion relacionado a pago con kushki....");
$suscripcion = new PluSuscripcion();
$suscripcion->setLisId($lista);
$suscripcion->setSusTipoSuscripcion(PluSuscripcion::TIPO_SUSCRIPCION_KUSHKI);
$suscripcion->setSusMsisdn($userIdentifier);
$suscripcion->setSusInicio($fechaActual);
$suscripcion->setSusFin($fechaUnaSemana);
$suscripcion->setSusVigente(PluSuscripcion::NO_VIGENTE);
$suscripcion->setSusEliminado(PluSuscripcion::ELIMINADO_FALSE);
$suscripcion->setSusUltimoTipoKushki(PluSuscripcion::TIPO_KUSHKI_SUSCRIPCION);
$suscripcion->setSusTokenKushki($kushkiToken);
$suscripcion->setSusPayTypeKushki($kushkiPaymentMethod);
$suscripcion->setSusStartDateKushki($fechaInicioKushki->format('Y-m-d'));
$suscripcion->setCreatedAt(new \DateTime());
$suscripcion->setUpdatedAt(new \DateTime());
$em->persist($suscripcion);
$em->flush();
$log->debug("generando registro de metodo de pago...");
$metodoPago = new PluMetodoPago();
$metodoPago->setMpaSusId($suscripcion->getSusId());
$metodoPago->setMpaUserIdentifier($userIdentifier);
$metodoPago->setMpaTipo(PluMetodoPago::TIPO_NO_VIGENTE);
$metodoPago->setMpaPrecio($lista->getLisPrecio());
$metodoPago->setMpaEstadoPago(PluMetodoPago::ESTADO_PAGO_NOK);
$metodoPago->setMpaEstado(PluMetodoPago::ESTADO_NO_VALIDO);
$metodoPago->setMpaEliminado(PluMetodoPago::ELIMINADO_FALSE);
$metodoPago->setCreatedAt(new \DateTime());
$metodoPago->setUpdatedAt(new \DateTime());
$em->persist($metodoPago);
$em->flush();
$log->debug("realizando peticion a gateway de kushki - SUSCRIPCION....");
//llamada a curl de gateway-suscripcion
$kushkiSuscripcion = new Kushki();
$kushkiSuscripcion->setToken($kushkiToken);
$kushkiSuscripcion->setUserIdentifier($userIdentifier);
$kushkiSuscripcion->setInternalId($suscripcion->getSusId());
$kushkiSuscripcion->setPeriodicity(Utiles::getParametroConfiguracion("periodoSuscripcion", $em));
$kushkiSuscripcion->setProductDescription("Lista");
$kushkiSuscripcion->setProductName($productName);
$kushkiSuscripcion->setProductPrice($productPrice);
$kushkiSuscripcion->setProductId($productId);
$kushkiSuscripcion->setName(null);
$kushkiSuscripcion->setLastName(null);
$kushkiSuscripcion->setEmail(null);
$kushkiSuscripcion->setSubscriptionStartDate($suscripcion->getSusStartDateKushki());
$result = $kushkiSuscripcion->callSuscripcionKushki($em);
$log->debug("analizando respuesta KUSHKI- SUSCRIPCION.....");
$http_status = $result["code"];
$message = $result["message"];
$internalId = $result["internalId"];
$subscriptionId = $result["subscriptionId"];
$error = 0;
if($http_status > 201){
$log->debug("ha ocurrido un error con la suscripcion KUSHKI- SUSCRIPCION.....");
$error = 1;
$metodoPago->setUpdatedAt(new \DateTime());
$em->persist($metodoPago);
$em->flush();
$suscripcion->setSusHttpCodeKushki($http_status);
$suscripcion->setSusResponseKushki(json_encode($result));
$suscripcion->setSusTransactionIdKushki($internalId);
$suscripcion->setUpdatedAt(new \DateTime());
$em->persist($suscripcion);
$em->flush();
}else{
$log->debug("la suscripcion se ha realizado correctamente KUSHKI- SUSCRIPCION.....");
$metodoPago->setMpaTipo(PluMetodoPago::TIPO_VIGENTE);
$metodoPago->setMpaEstadoPago(PluMetodoPago::ESTADO_PAGO_OK);
$metodoPago->setMpaEstado(PluMetodoPago::ESTADO_VALIDO);
$metodoPago->setUpdatedAt(new \DateTime());
$em->persist($metodoPago);
$em->flush();
$suscripcion->setSusVigente(PluSuscripcion::VIGENTE);
$suscripcion->setSusUltimoTipoXml(PluSuscripcion::TIPO_XML_SUSCRIPCION);
$suscripcion->setSusHttpCodeKushki($http_status);
$suscripcion->setSusResponseKushki(json_encode($result));
$suscripcion->setSusTransactionIdKushki($internalId);
$suscripcion->setSusSuscriptionIdKushki($subscriptionId);
$suscripcion->setUpdatedAt(new \DateTime());
$em->persist($suscripcion);
$em->flush();
}
return $this->render('frontend/paginas/confirm.html.twig', [
"listas" => $listas,
"lista" => $lista,
"msisdn"=> $userIdentifier,
"message" => $message,
"error" => $error
]);
}
}
......@@ -48,6 +48,7 @@ class PluSuscripcionRepository extends ServiceEntityRepository {
public function getUltimaSuscripcionLista($msisdn, $idLista) {
return $this->createQueryBuilder('p')
->where('p.susVigente = 1')
->andWhere('p.susTipoSuscripcion = 1')
->andWhere('p.susUltimoTipoXml = 1')
->andWhere('p.susEliminado = 0')
->andWhere('p.susMsisdn = :msisdn')
......@@ -57,6 +58,21 @@ class PluSuscripcionRepository extends ServiceEntityRepository {
->getQuery()
->getOneOrNullResult();
}
public function getUltimaSuscripcionListaKushki($msisdn, $idLista) {
return $this->createQueryBuilder('p')
->where('p.susVigente = 1')
->andWhere('p.susUltimoTipoXml = 1')
->andWhere('p.susTipoSuscripcion = 2')
->andWhere('p.susUltimoTipoKushki = 1')
->andWhere('p.susEliminado = 0')
->andWhere('p.susMsisdn = :msisdn')
->andWhere('p.lisId = :id')
->setParameters(array("id" => $idLista, "msisdn" => $msisdn))
->orderBy('p.susId', 'DESC')
->getQuery()
->getOneOrNullResult();
}
public function getUltimaSuscripcionListaByCode($msisdn, $code) {
$qb = $this->createQueryBuilder('sus');
......
<?php
namespace App\Repository;
use App\Entity\PluEstadoSuscripcionKushki;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;
/**
* @method PluEstadoSuscripcionKushki|null find($id, $lockMode = null, $lockVersion = null)
* @method PluEstadoSuscripcionKushki|null findOneBy(array $criteria, array $orderBy = null)
* @method PluEstadoSuscripcionKushki[] findAll()
* @method PluEstadoSuscripcionKushki[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PluEstadoSuscripcionKushkiRepository extends ServiceEntityRepository
{
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, PluEstadoSuscripcionKushki::class);
}
public function buscarRegistroEstado($value)
{
return $this->createQueryBuilder('p')
->andWhere('p.susId = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
// /**
// * @return PluEstadoSuscripcionKushki[] Returns an array of PluEstadoSuscripcionKushki objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('p')
->andWhere('p.exampleField = :val')
->setParameter('val', $value)
->orderBy('p.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?PluEstadoSuscripcionKushki
{
return $this->createQueryBuilder('p')
->andWhere('p.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}
<?php
namespace App\Repository;
use App\Entity\PluMetodoPago;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;
/**
* @method PluMetodoPago|null find($id, $lockMode = null, $lockVersion = null)
* @method PluMetodoPago|null findOneBy(array $criteria, array $orderBy = null)
* @method PluMetodoPago[] findAll()
* @method PluMetodoPago[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PluMetodoPagoRepository extends ServiceEntityRepository
{
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, PluMetodoPago::class);
}
// /**
// * @return PluMetodoPago[] Returns an array of PluMetodoPago objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('p')
->andWhere('p.exampleField = :val')
->setParameter('val', $value)
->orderBy('p.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?PluMetodoPago
{
return $this->createQueryBuilder('p')
->andWhere('p.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}
<?php
namespace App\Utilities;
use App\Utilities\Utiles;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of Kushki
*
* @author Ing 04
*/
class Kushki {
public $token;
public $productName;
public $productPrice;
public $productDescription;
public $userIdentifier;
public $name;
public $lastName;
public $email;
public $periodicity;
public $subscriptionStartDate;
public $internalId;
public $productId;
public function callSuscripcionKushki($em) {
$log = Utiles::setLog("Kushki::callSuscripcionKushki", 'project/ws/kushki/pagos/suscripcion');
$url = Utiles::getParametroConfiguracion("urlBaseGatewayPagos", $em).Utiles::getParametroConfiguracion("suscripcionPagos", $em).Utiles::getParametroConfiguracion("publicKeyKushki", $em)."/".Utiles::getParametroConfiguracion("clientIdKushki", $em);
try {
$log->debug('suscribiendo kushki... url:' . $url);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->getPostFields());
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$output = curl_exec($ch);
$status_code_suscribir = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$log->debug('Retorno status a suscribir externo:' . $status_code_suscribir . ' | desc:' . $output);
$data = json_decode($output, true);
return $data;
} catch (\Exception $e) {
$log->err(' Error al suscribir. url:' . $url . ' .Exception: ' . $e);
$status_code = null;
$desc = null;
$logError = Utiles::setLog("Kushki::callSuscripcionKushki", 'error/wsKushkiSuscripcion');
$logError->err(' Error al suscribir. url:' . $url . ' .Exception: ' . $e);
return ['code' => 500, 'message' => "", "subscriptionId" => "", "internalId" => ""];
}
}
public function callCancelarSuscripcionKushki($em, $suscripcion) {
$log = Utiles::setLog("Kushki::callSuscripcionKushki", 'project/ws/kushki/pagos/suscripcion');
$url = Utiles::getParametroConfiguracion("urlBaseGatewayPagos", $em).Utiles::getParametroConfiguracion("cancelarSuscripcionPagos", $em).Utiles::getParametroConfiguracion("publicKeyKushki", $em)."/".Utiles::getParametroConfiguracion("clientIdKushki", $em)."/".$suscripcion->getSusSuscriptionIdKushki();
try {
$log->debug('suscribiendo kushki... url:' . $url);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "clientInternalId=".$suscripcion->getSusId()."&userIdentifier=".$suscripcion->getSusMsisdn()."&startDate=".$suscripcion->getSusStartDateKushki()."&periodicity=".Utiles::getParametroConfiguracion("periodoSuscripcion", $em));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$output = curl_exec($ch);
$status_code_suscribir = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$log->debug('Retorno status a suscribir externo:' . $status_code_suscribir . ' | desc:' . $output);
$data = json_decode($output, true);
return $data;
} catch (\Exception $e) {
$log->err(' Error al suscribir. url:' . $url . ' .Exception: ' . $e);
$status_code = null;
$desc = null;
$logError = Utiles::setLog("Kushki::callSuscripcionKushki", 'error/wsKushkiSuscripcion');
$logError->err(' Error al suscribir. url:' . $url . ' .Exception: ' . $e);
return ['code' => 500, 'message' => "", "subscriptionId" => "", "internalId" => ""];
}
}
public function getPostFields(){
return "token=".$this->getToken()
."&productName=".$this->getProductName()
."&productPrice=".$this->getProductPrice()
."&productDescription=".$this->getProductDescription()
."&userIdentifier=".$this->getUserIdentifier()
."&name=".$this->getName()
."&lastName=".$this->getLastName()
."&email=".$this->getEmail()
."&periodicity=".$this->getPeriodicity()
."&subscriptionStartDate=".$this->getSubscriptionStartDate()
."&internalId=".$this->getInternalId()
."&productId=".$this->getProductId();
}
public function getToken() {
return $this->token;
}
public function getProductName() {
return $this->productName;
}
public function getProductPrice() {
return $this->productPrice;
}
public function getProductDescription() {
return $this->productDescription;
}
public function getUserIdentifier() {
return $this->userIdentifier;
}
public function getName() {
return $this->name;
}
public function getLastName() {
return $this->lastName;
}
public function getEmail() {
return $this->email;
}
public function getPeriodicity() {
return $this->periodicity;
}
public function getSubscriptionStartDate() {
return $this->subscriptionStartDate;
}
public function getInternalId() {
return $this->internalId;
}
public function setToken($token) {
$this->token = $token;
}
public function setProductName($productName) {
$this->productName = $productName;
}
public function setProductPrice($productPrice) {
$this->productPrice = $productPrice;
}
public function setProductDescription($productDescription) {
$this->productDescription = $productDescription;
}
public function setUserIdentifier($userIdentifier) {
$this->userIdentifier = $userIdentifier;
}
public function setName($name) {
$this->name = $name;
}
public function setLastName($lastName) {
$this->lastName = $lastName;
}
public function setEmail($email) {
$this->email = $email;
}
public function setPeriodicity($periodicity) {
$this->periodicity = $periodicity;
}
public function setSubscriptionStartDate($subscriptionStartDate) {
$this->subscriptionStartDate = $subscriptionStartDate;
}
public function setInternalId($internalId) {
$this->internalId = $internalId;
}
public function getProductId() {
return $this->productId;
}
public function setProductId($productId) {
$this->productId = $productId;
}
}
......@@ -37,8 +37,8 @@ class Utiles {
$parametro = $em->getRepository(PluParametroConfiguracion::class)->getParametroConfiguracion($nombre);
print_r($parametro);
exit;
//print_r($parametro);
//exit;
if ($parametro)
$str_valor = $parametro->getPcoValor();
......
{% extends 'frontend/base.html.twig' %}
{% block title %}Confirmacion{% endblock %}
{% block body %}
<header class="masthead-sc text-white">
<div class="masthead-content">
<!-- header con mensaje -->
<form action="{{ path('front_index') }}">
<div class="container subheader-info col-10 offset-1 mt-4 mb-3">
<div class="row">
<div class="col-12">
<p class="numero-top text-left">
{{ lista.getLisNombre() }}
</p>
{% if error is defined and error == 1 %}
<div align="center">
<div class="alert alert-danger"> {{ message }} </div>
</div>
{% endif %}
{% if message is defined and error == 0 %}
<div align="center">
<div class="alert alert-success"> La suscripción se ha realizado con exito. Vuelva al inicio o acceda desde el menu superior a las listas contratadas.</div>
</div>
{% endif %}
<button type="submit" class="btn btn-codigo-suscripcion col-11 mt-4 mb-5">Volver</button>
</div>
</div>
</div>
</form>
<div class="container">
<div class="row">
<div class="col-11">
<ul>
<li class="item-suscripcion mb-2">Pago Fácil el monto se descontara automáticamente de tu prepago o se abonara a tu plan</li>
<li class="item-suscripcion mb-2">Te informaremos todas las semanas de tu pago mediante mensaje de texto</li>
</ul>
</div>
</div>
</div>
</div>
</header>
{% endblock %}
......@@ -70,9 +70,10 @@
{%for suscripcion in suscripciones %}
{% if suscripcion.getSusUltimoTipoXml() == 1 %}
{% if suscripcion.getSusVigente() == 1 and suscripcion.getSusUltimoTipoXml() == 1 %}
<input type="hidden" id="lisId" name="lisId" value="{{ suscripcion.getLisId().getLisId() }}">
<input type="hidden" id="msisdn" name="msisdn" value="{{ suscripcion.getSusMsisdn() }}">
<input type="hidden" id="tipo" name="tipo" value="{{suscripcion.getSusTipoSuscripcion()}}">
<!-- Bloque plan -->
<div class="card mt-4 mb-4">
<div class="card-body">
......@@ -90,7 +91,7 @@
<div class="card-body">
<div class="col-12 mt-3 mb-3">
<!-- <button type="button" class="btn-lg btn-suspender">Suspender</button> -->
<a href="{{path('front_canciones_descontratar',{ 'msisdn': suscripcion.getSusMsisdn(), 'lisId':suscripcion.getLisId().getLisId() })}}" class="btn-lg btn-desuscribir" onclick="return confirm('¿Esta seguro de desuscribirse a esta lista?')">Desuscribir</a> </td>
<a href="{{path('front_canciones_descontratar',{ 'msisdn': suscripcion.getSusMsisdn(), 'lisId':suscripcion.getLisId().getLisId(), 'tipo': suscripcion.getSusTipoSuscripcion() })}}" class="btn-lg btn-desuscribir" onclick="return confirm('¿Esta seguro de desuscribirse a esta lista?')">Desuscribir</a> </td>
</div>
<!-- <a href="#" class="card-link ti-link-editar text-center">Modificar Estado Plan</a> -->
</div>
......
......@@ -7,46 +7,52 @@
{% block body %}
<header class="masthead-sc text-white">
<div class="masthead-content">
<div class="masthead-content">
<!-- header con mensaje -->
<!-- header con mensaje -->
<form action="{{ path('front_confirmar_contratar') }}" method="post" }}>
<input type="hidden" id="lisId" name="lisId" value="{{ lista.lisId }}">
<input type="hidden" id="msisdn" name="msisdn" value="{{ msisdn }}">
<form action="{{ path('front_confirmar_contratar') }}" method="post">
<input type="hidden" id="lisId" name="lisId" value="{{ lista.lisId }}">
<input type="hidden" id="msisdn" name="msisdn" value="{{ msisdn }}">
<div class="container subheader-info col-10 offset-1 mt-4 mb-3">
<div class="row">
<div class="col-12">
<p class="numero-top text-left">
{{ lista.lisNombre }} <a href="{{ path('front_canciones_lista', { 'lisId': lista.lisId }) }}" target="_blank">(Ver canciones) </a>
</p>
<p>Suscribete a esta categoria por $500 semanales</p>
<button type="submit" class="btn btn-codigo-suscripcion col-11 mt-4 mb-5">Suscríbete aquí</button>
<div class="container subheader-info col-10 offset-1 mt-4 mb-3">
<div class="row">
<div class="col-12">
<p class="numero-top text-left">
{{ lista.lisNombre }} <a href="{{ path('front_canciones_lista', { 'lisId': lista.lisId }) }}" target="_blank">(Ver canciones) </a>
</p>
<p>Suscribete a esta categoria por $500 semanales</p>
<button type="submit" class="btn btn-codigo-suscripcion col-11 mt-4 mb-5">Suscríbete aquí</button>
{#prueba metodo de pago#}
<h4 class="ti-beneficios">Beneficios</h4>
</div>
</div>
</div>
</form>
<div class="container">
<div class="row">
{#prueba metodo de pago#}
<h4 class="ti-beneficios">Beneficios</h4>
</div>
</div>
</div>
</form>
<div class="col-11">
<ul>
{% if lista.lisNombre=='Rock' %}
<li class="item-suscripcion mb-2">50% descuento en el resto de las canciones de la categoría Rock</li>
{% endif %}
<li class="item-suscripcion mb-2">Pago Fácil el monto se descontara automáticamente de tu prepago o se abonara a tu plan</li>
<li class="item-suscripcion mb-2">Tenemos canciones nuevas toda la semanas!</li>
<li class="item-suscripcion mb-2">Participa por increíbles premios.</li>
</ul>
<div class="container">
<div class="row">
<div class="col-11">
<ul>
{% if lista.lisNombre=='Rock' %}
<li class="item-suscripcion mb-2">50% descuento en el resto de las canciones de la categoría Rock</li>
{% endif %}
<li class="item-suscripcion mb-2">Pago Fácil el monto se descontara automáticamente de tu prepago o se abonara a tu plan</li>
<li class="item-suscripcion mb-2">Tenemos canciones nuevas toda la semanas!</li>
<li class="item-suscripcion mb-2">Participa por increíbles premios.</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</header>
</header>
{% endblock %}
{% extends 'frontend/base.html.twig' %}
{% block title %}Reproductor{% endblock %}
{% block stylesheets %}
<link href="{{asset('frontend/css/styles-player.css')}}" rel="stylesheet">
{% endblock %}
{% block body %}
<header class="masthead-sc text-white">
<div class="masthead-content">
<!-- header con mensaje -->
<form action="{{ path('front_index') }}"}}>
<div class="container subheader-info col-10 offset-1 mt-4 mb-3">
<div class="row">
<div class="col-12">
<p class="numero-top text-left">
{{ lista.getLisNombre() }}
</p>
{% if error is defined %}
<div align="center">
<div class="alert alert-danger"> {{ error }} </div>
</div>
{% endif %}
{% if mensaje is defined %}
<div align="center">
<div class="alert alert-success"> {{ mensaje }} </div>
</div>
{% endif %}
<button type="submit" class="btn btn-codigo-suscripcion col-11 mt-4 mb-5">Volver</button>
</div>
</div>
</div>
</form>
</div>
</header>
{% endblock %}
{% extends 'frontend/base.html.twig' %}
{% block title %}Reproductor{% endblock %}
{% block stylesheets %}
<link href="{{asset('frontend/css/styles-player.css')}}" rel="stylesheet">
{% endblock %}
{% block body %}
<header class="masthead-sc text-white">
<div class="masthead-content">
<div class="container subheader-info col-10 offset-1 mt-4 mb-3">
<div class="row">
<div class="col-12">
<p class="numero-top text-left">
{{ lista.getLisNombre() }}
</p>
{% if error is defined %}
<div align="center">
<div class="alert alert-danger"> {{ error }} </div>
</div>
{% endif %}
{% if mensaje is defined %}
<div align="center">
<div class="alert alert-success"> {{ mensaje }} </div>
</div>
{% endif %}
<div align="center">
<div class="alert alert-success"> Puede utilizar el método de pago que se encuentra en la parte inferior, para poder completar la suscripción.</div>
</div>
</div>
{% if mostrarKushki == 1%}
<div class="col-12">
<form id="kushki-pay-form" action="confirm" method="post">
<input type="hidden" name="userIdentifier" value="{{ msisdn }}">
<input type="hidden" name="productId" value="{{ lista.getLisId() }}">
<input type="hidden" name="productPrice" value="{{ lista.getLisPrecio() }}">
<input type="hidden" name="productName" value="{{ lista.getLisNombre() }}">
</form>
</div>
{% endif %}
</div>
</div>
<!-- header con mensaje -->
<form action="{{ path('front_index') }}">
<div class="container subheader-info col-10 offset-1 mt-4 mb-3">
<div class="row">
<div class="col-12">
<button type="submit" class="btn btn-codigo-suscripcion col-11 mt-4 mb-5">Volver</button>
</div>
</div>
</div>
</form>
<div class="container">
<div class="row">
<div class="col-11">
<ul>
<li class="item-suscripcion mb-2">Pago Fácil el monto se descontara automáticamente de tu prepago o se abonara a tu plan</li>
<li class="item-suscripcion mb-2">Te informaremos todas las semanas de tu pago mediante mensaje de texto</li>
</ul>
</div>
</div>
</div>
</div>
</header>
{% endblock %}
{%block javascripts %}
{% if mostrarKushki == 1%}
<script src="https://cdn.kushkipagos.com/kushki-checkout.js"></script>
<script type="text/javascript">
var kushki = new KushkiCheckout({
form: "kushki-pay-form",
merchant_id: "{{publicMerchantId}}",
amount: "{{lista.getLisPrecio()}}.0",
currency: "CLP",
payment_methods: ["credit-card"], // Payments Methods enabled
is_subscription: true, // Optional
inTestEnvironment: {{isTest}},
regional: false // Optional
});
</script>
{%endif%}
</script>
{%endblock%}
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