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()
.
中引发错误的空字符串
我的研究:
存在完全相同的问题here。然而,并没有明确的答案。
如果我 运行 curl https://tpeweb.paybox.com/load.html
,我得到预期的 html 输出。
类似的post处理上面的错误还有很多。但是,我认为这不是模块的代码错误,而是我缺少的更多内容。
配置:
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.');
}
}
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()
.
我的研究:
存在完全相同的问题here。然而,并没有明确的答案。
如果我 运行
curl https://tpeweb.paybox.com/load.html
,我得到预期的 html 输出。类似的post处理上面的错误还有很多。但是,我认为这不是模块的代码错误,而是我缺少的更多内容。
配置:
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.');
}
}