Есть другая проблема, ответ от liqpay не проверяется на success - статус транзакции. Проверяется только на корректность возвращаемой подписи. В результате, если у клиента не хватило на карточке денег, то магазин считает платеж проведенным, потому что liqpay вернул корректно подписанный, но отрицательный ответ.
Предлагается такая функция:
public function callback() { $xml = base64_decode($this->request->post['operation_xml']); $signature = base64_encode(sha1($this->config->get('liqpay_signature') . $xml . $this->config->get('liqpay_signature'), TRUE)); $posleft = strpos($xml, 'order_id'); $posright = strpos($xml, '/order_id'); $order_id = substr($xml, $posleft + 9, $posright - $posleft - 10); $posleft = strpos($xml, 'status'); $posright = strpos($xml, '/status'); $is_success = substr($xml, $posleft + 7, $posright - $posleft - 8 ); if ($signature == $this->request->post['signature'] and $is_success == "success") { $this->load->model('checkout/order'); $this->model_checkout_order->confirm($order_id, $this->config->get('config_order_status_id')); } }