Lexik paybox 安装:警告:DOMDocument::loadHTML():作为输入提供的空字符串

Lexik paybox installation: Warning: DOMDocument::loadHTML(): Empty string supplied as input

Context:我尝试设置 LexikPaybox 包。我遵循了自述文件中的安装指南。

问题$paybox->getUrl()方法引发

Warning: DOMDocument::loadHTML(): Empty string supplied as input

返回地址:

dump($this->getWebPage(sprintf(
    '%s://%s%s',
    $server['protocol'],
    $server['host'],
    $server['test_path']
)));
>>> "https://preprod-tpeweb.paybox.com/load.html"

然后,getWebPage()(第 163 行)returns 一个在 $doc->loadHTML().

中引发错误的空字符串

我的研究:

配置:

Config.yml:

# Lexik Paybox Bundle
lexik_paybox:
    parameters:
        production: false        # Switches between Paybox test and production servers (preprod-tpe <> tpe)
        # Site number provided by the bank
        site:  '1999888'
        # Rank number provided by the bank
        rank:  '32'
        rang: '32'
        # Customer's login provided by Paybox
        login: '2'
        hmac:
            # Key used to compute the hmac hash, provided by Paybox
            key: '0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF'
            algorithm:      sha512 # signature algorithm
            signature_name: Sign   # customize the signature parameter name

        currencies:                # Optionnal parameters, this is the default value
            - '978'                # EUR

routing.yml:

# Lexik Paybox Bundle
lexik_paybox:
    resource: '@LexikPayboxBundle/Resources/config/routing.yml'


lexik_paybox_sample_return:
    path:     /payment/return/{status}
    defaults: { _controller: LexikPayboxBundle:Sample:return, status: error }
    requirements:
        status: success|canceled|denied

PaymentController.php:

<?php

namespace Modules\ReservationBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class PaymentController extends Controller {
    /**
     * Sample action to call a payment.
     * It create the form to submit with all parameters.
     * @Route("/paiemant", name="paiemant")
     */
    public function callAction()
    {
        $paybox = $this->get('lexik_paybox.request_handler');
        $paybox->setParameters(array(
            'PBX_CMD'          => 'CMD'.time(),
            'PBX_DEVISE'       => '978',
            'PBX_SITE'          => '1999888',
            'PBX_IDENTIFIANT'   => '107904482',
            'PBX_RANG'          => '32',
            'PBX_PORTEUR'      => 'test@paybox.com',
            'PBX_RETOUR'       => 'Mt:M;Ref:R;Auto:A;Erreur:E',
            'PBX_TOTAL'        => '1000',
            'PBX_TYPEPAIEMENT' => 'CARTE',
            'PBX_TYPECARTE'    => 'CB',
            'PBX_EFFECTUE'     => $this->generateUrl('lexik_paybox_sample_return', array('status' => 'success'), UrlGeneratorInterface::ABSOLUTE_URL),
            'PBX_REFUSE'       => $this->generateUrl('lexik_paybox_sample_return', array('status' => 'denied'), UrlGeneratorInterface::ABSOLUTE_URL),
            'PBX_ANNULE'       => $this->generateUrl('lexik_paybox_sample_return', array('status' => 'canceled'), UrlGeneratorInterface::ABSOLUTE_URL),
            'PBX_RUF1'         => 'POST',
            'PBX_REPONDRE_A'   => $this->generateUrl('lexik_paybox_ipn', array('time' => time()), UrlGeneratorInterface::ABSOLUTE_URL),

//            'PBX_TOTAL'         => '1000',
//            'PBX_DEVISE'        => '978',
//            'PBX_CMD'           => 'CMD'.time(),
//            'PBX_PORTEUR'       => 'test@paybox.com',
//            'PBX_RETOUR'        => 'Mt:M;Ref:R;Auto:A;Erreur:E',
        ));

        return $this->render(
            'LexikPayboxBundle:Sample:index.html.twig',
            array(
                'url'  => $paybox->getUrl(),
                'form' => $paybox->getForm()->createView(),
            )
        );
    }

    /**
     * Sample action of a confirmation payment page on witch the user is sent
     * after he seizes his payment informations on the Paybox's platform.
     * This action must only containts presentation logic.
     */
    public function responseAction($status)
    {
        return $this->render(
            'LexikPayboxBundle:Sample:return.html.twig',
            array(
                'status'     => $status,
                'parameters' => $this->getRequest()->query,
            )
        );
    }
}

下面解决了我的问题,分享一下。这不是真正的答案,但可能会帮助其他人..

问题是在请求中找不到服务器。结果,loadHTML 对空字符串失败。

由于在查看服务器并检查它们是否正确时出现此错误,我只是取消检查并直接通过 URL。

所以控制器变成:

public function callAction(){

        // Server URL
        $PAYBOX_DOMAIN_SERVER = "preprod-tpeweb.paybox.com";
        $paybox_url = "https://".$PAYBOX_DOMAIN_SERVER."/cgi/MYchoix_pagepaiement.cgi";

        $paybox = $this->get('lexik_paybox.request_handler');
        $paybox->setParameters(array(
            'PBX_SITE'          => "1999888",
            'PBX_RANG'          => "32",
            'PBX_IDENTIFIANT'   => "110647233",
            'PBX_TOTAL'         => "999",
            'PBX_DEVISE'        => "978",
            'PBX_CMD'           => "TEST Paybox".mktime(),
            'PBX_PORTEUR'       => "test@paybox.com",
            'PBX_RETOUR'        => "Mt:M;Ref:R;Auto:A;Erreur:E",
            'PBX_HASH'          => "SHA512",

//            'PBX_TYPEPAIEMENT' => 'CARTE',
//            'PBX_TYPECARTE'    => 'CB',

            'PBX_EFFECTUE'     => $this->generateUrl('lexik_paybox_sample_return', array('status' => 'success'), UrlGeneratorInterface::ABSOLUTE_URL),
            'PBX_REFUSE'       => $this->generateUrl('lexik_paybox_sample_return', array('status' => 'denied'), UrlGeneratorInterface::ABSOLUTE_URL),
            'PBX_ANNULE'       => $this->generateUrl('lexik_paybox_sample_return', array('status' => 'canceled'), UrlGeneratorInterface::ABSOLUTE_URL),
            'PBX_RUF1'         => 'POST',
            'PBX_REPONDRE_A'   => $this->generateUrl('lexik_paybox_ipn', array('time' => time()), UrlGeneratorInterface::ABSOLUTE_URL),
        ));

        return $this->render(
            'LexikPayboxBundle:Sample:index.html.twig',
            array(
                'url'  => $paybox_url, //$paybox->getUrl(),
                'form' => $paybox->getForm()->createView(),
            )
        );
}

您仍然可以通过以下方式检查服务器 url 是否有效:

public function checkServer($url){
    $doc = new \DOMDocument();
    $doc->loadHTML($url);
    $element = $doc->getElementById('server_status');

    if (!$element || 'OK' != $element->textContent) {
        throw new RuntimeException('No server available.');
    }
}