Hola @paula94 y a todos,
@enriqueonline70 y @joaquines están en lo correcto. El método setAction en PaymentOption está diseñado principalmente para flujos de pago directos o validaciones simples dentro del entorno de PrestaShop. Para pasarelas de pago externas como Perfect Money, que requieren una redirección a un dominio externo con un formulario POST con parámetros específicos, el enfoque más adecuado y robusto en PrestaShop 9 (y en versiones recientes en general) es utilizar el método setForm.
Esto te permite construir un formulario HTML personalizado (generalmente oculto y con auto-envío) en una plantilla Smarty, que luego PrestaShop renderiza en el checkout. Cuando el cliente selecciona la opción de pago, este formulario se envía directamente a la URL de Perfect Money con todos los datos necesarios.
Aquí te muestro cómo podrías adaptar tu código en el método hookPaymentOptions para usar setForm:
// modules/mipreciousmoney/mipreciousmoney.php
public function hookPaymentOptions($params)
{
if (!$this->active) {
return [];
}
$paymentOption = new PrestaShop\PrestaShop\Core\Payment\PaymentOption();
$paymentOption->setModuleName($this->name)
->setCallToActionText('Pagar con Perfect Money')
->setForm($this->generatePerfectMoneyForm()); // Usa un formulario dedicado
Necesitarías crear el archivo views/templates/hook/perfectmoney_form.tpl dentro de tu módulo. Este archivo contendría el formulario HTML con los campos ocultos que se envían a Perfect Money. Por ejemplo:
<form action="{$perfect_money_action_url}" method="post" id="perfectmoney_form" style="display:none;">
<input type="hidden" name="PAYEE_ACCOUNT" value="{$merchant_id}">
<input type="hidden" name="PAYMENT_AMOUNT" value="{$payment_amount|string_format:'%.2f'}">
<input type="hidden" name="PAYMENT_UNITS" value="{$payment_currency}">
<input type="hidden" name="PAYMENT_ID" value="{$order_id}">
<input type="hidden" name="STATUS_URL" value="{$status_url}">
<input type="hidden" name="PAYEE_NAME" value="{$item_name}">
<input type="hidden" name="NOPAYMENT_URL" value="{$cancel_url}">
<input type="hidden" name="BAGGAGE_FIELDS" value="ORDER_ID">
<button type="submit" class="btn btn-primary">Pagar con Perfect Money</button>
Este enfoque es más robusto y menos propenso a errores de redirección. Sin embargo, desarrollar y mantener módulos de pago personalizados puede ser complejo, especialmente con los cambios en las versiones de PrestaShop y PHP. Para una solución más mantenible y con soporte, te recomiendo considerar un módulo dedicado como Perfect Money de MyPresta.eu. Te ahorrará tiempo y te asegurará compatibilidad.