【问题标题】:VAT Number Validation Function Not Working增值税号验证功能不起作用
【发布时间】:2015-06-06 21:16:16
【问题描述】:

我正在尝试编写一个增值税号验证函数来检查增值税号是否有效。

目前我有这个

function tep_check_vatnum($countries_id, $vatnum) {
$country = tep_get_countries_with_iso_codes($countries_id);

$iso = $country['countries_iso_code_2'];

if($iso == "GB"){
    return false;
} else {

    $url = "http://isvat.appspot.com/$iso/$vatnum";

      $session = curl_init();

      curl_setopt($session, CURLOPT_URL, $url);
      // curl_setopt($session, CURLOPT_HTTPGET, 1); 
      // curl_setopt($session, CURLOPT_HEADER, false);
      // curl_setopt($session, CURLOPT_HTTPHEADER, array('Accept: application/xml', 'Content-Type: application/xml'));
      curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

      $response = curl_exec($session);
      //echo "<!-- NOTE:" . $response . "-->";
      curl_close($session);
      if($response == "true"){
        return true;
      } else {
        return false;
      }
   }
}

我正在使用http://isvat.appspot.com 的服务正在运行,但它不起作用。

编辑

嗯,不走运。由于不工作,它一直给我一个错误,说增值税号无效。在创建帐户表单上,我有此代码。

<?php echo tep_draw_input_field('vatnum', '', 'class="input"') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?>


if (is_numeric($country) == false) {
  $error = true;

  $messageStack->add('create_account', ENTRY_COUNTRY_ERROR);
} else {
    if(strlen($vatnum) != 0){
        if(is_numeric($vatnum) == false || tep_check_vatnum($country, $vatnum) == false){
            $error = true;

            $messageStack->add('create_account', "VAT Number is not a valid EU, non-UK VAT no.");
        }
    }

【问题讨论】:

  • 定义“不工作”。 $response 有什么价值?

标签: php oscommerce


【解决方案1】:

我想调用 cURL 可能有问题。好消息是,您可能不需要这样做。 ;) 试试看:

function tep_check_vatnum($countries_id, $vatnum) {
    $country = tep_get_countries_with_iso_codes($countries_id);
    $iso = $country['countries_iso_code_2'];

    if($iso == "GB"){
        return false;
    } else {
        $url = "http://isvat.appspot.com/$iso/$vatnum";

        $context = stream_context_create(array(
            'http' => array(
                'proxy' => 'http://PROXY_IP:PROXY_PORT'
            ),
        ));

        $fp = fopen($url,'r',$context);
        $response = fgets($fp);
        fclose($fp);

        //echo "<!-- NOTE:" . $response . "-->";

        if($response == "true"){
            return true;
        } else {
            return false;
        }
    }
}

即使您没有启用 cURL 扩展,它也应该可以工作。

编辑:正如 Michas 所说,如果不知道“不工作”是什么意思,就很难找到原始代码的问题。您可以尝试通过声明error_reporting(E_ALL)curl_error($session) 来获取有关该问题的更多信息。 可能的原因:未正确安装或配置 cURL,或者代理或防火墙阻止了您的请求。虽然我建议的代码会消除第一个代码,但第二个代码可能也适用于它,具体取决于您的设置。

编辑 2:添加了简单的代理配置

【讨论】:

  • 嗯,对我来说,它可以使用代码。尝试使用$iso=DE$vatnum=129274202 以及站点上提供的示例(暂时注释掉if($iso == "GB")check。问题可能隐藏在其他地方吗?您可以检查传入的参数$countries_id, $vatnum 吗?@ 987654331@ 包含一些有意义的东西吗?
  • $iso 包含两个字母的县代码,我猜是从函数 tep_get_countries_with_iso_codes($countries_id) { return tep_get_countries($countries_id, true); }
  • 经过进一步调查,我认为这可能与防火墙等有关。我已经用硬编码的有效isvat.appspot.com/GB/802311782 替换了 url,但它仍然拒绝它
  • 好的,如果您在防火墙后面,您可能无能为力,只能要求您的管理员允许您的请求。但通常这种行为也是由强制代理服务器引起的。然后您可以尝试找出您的代理设置并按上述方式配置它们(我编辑了我的代码)。如果您需要一些更复杂的设置(例如代理身份验证,...),您可以查看 here 或返回使用启用代理的 cURL,例如 here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多