【问题标题】:VAT validation from php to javascript从 php 到 javascript 的增值税验证
【发布时间】:2026-01-18 01:45:01
【问题描述】:

我在link 有这个有趣的功能 这适用于检查欧盟的增值税号。但我无法与我的注册表单集成。我想在 js 函数中转换它,在发送注册数据之前使用它,我正在尝试但我做不到,同一个可以帮助我吗?

链接中的代码是这个

function viesCheckVAT($countryCode, $vatNumber, $timeout = 30) {
    $response = array ();
    $pattern = '/<(%s).*?>([\s\S]*)<\/\1/';
    $keys = array (
        'countryCode',
        'vatNumber',
        'requestDate',
        'valid',
        'name',
        'address'
       );

    $content = "<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>
        <s11:Body>
         <tns1:checkVat xmlns:tns1='urn:ec.europa.eu:taxud:vies:services:checkVat:types'>                                        
         <tns1:countryCode>%s</tns1:countryCode>
         <tns1:vatNumber>%s</tns1:vatNumber>
         </tns1:checkVat>
        </s11:Body>
      </s11:Envelope>";

    $opts = array (
        'http' => array (
        'method' => 'POST',
        'header' => "Content-Type: text/xml; charset=utf-8; SOAPAction: checkVatService",
        'content' => sprintf ( $content, $countryCode, $vatNumber ),
        'timeout' => $timeout
        )
       );

    $ctx = stream_context_create ( $opts );
    $result = file_get_contents ( 'http://ec.europa.eu/taxation_customs/vies/services/checkVatService', false, $ctx );

    if (preg_match ( sprintf ( $pattern, 'checkVatResponse' ), $result, $matches )) {
      foreach ( $keys as $key )
      preg_match ( sprintf ( $pattern, $key ), $matches [2], $value ) && $response [$key] = $value [2];
    }
   return $response;
  }

   $arr = viesCheckVAT($countryCode, $vatNumber);

   if ($arr[valid] == fasle) {
    ...
    } else {
    ...
    }

现在我真的很喜欢使用这个 servis true J​​avaScript。这样我可以在通过 PHP 发送数据之前检查数字。

如何在 JS 中编写此函数? 对于数组没有问题,但我可以进行 SOAP 调用吗?

【问题讨论】:

  • 我建议您将其保留为 PHP 并在发送表单之前通过 ajax / fetch 从您的注册表单中调用它,而不是将上述内容转换为 javascript(这将是很多工作)?
  • 根据我的经验,此验证服务通常不起作用。不要使表单提交依赖于它。我总是事后检查。
  • 不,这是 权限。您必须使用它,但不要依赖它始终有效。它不是。我google了一下,确实找到了一个JS版本:jsvat.
  • 好吧,我只是用谷歌搜索了一下,看起来不错。我会按照 RamRaider 说的做:不要费心把它转换成 JS,如果你真的需要在 JS 中使用 AJAX。
  • 对增值税验证 PHP 脚本执行 AJAX 调用的最简单方法是使用 JQuery。请参阅:jQuery Ajax。有些人坚持不使用 JQuery,这绝对是可能的:Pure JavaScript ajax

标签: javascript php function soap


【解决方案1】:

已经提到也许您应该将上面的内容保留为 PHP 并通过 Ajax 调用来调用它,我很快将以下内容放在一起来展示如何做到这一点。 PHP 代码基于上述函数,但修改为使用 curl。

<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_POST['task'] ) && $_POST['task']=='check' ){
        ob_clean();

        $result=null;

        function curl( $url=NULL, $options=NULL, $headers=false ){
            /* Initialise curl request object */
            $curl=curl_init();

            /* Define standard options */
            curl_setopt( $curl, CURLOPT_URL,trim( $url ) );
            curl_setopt( $curl, CURLOPT_AUTOREFERER, true );
            curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
            curl_setopt( $curl, CURLOPT_FAILONERROR, true );
            curl_setopt( $curl, CURLOPT_HEADER, false );
            curl_setopt( $curl, CURLINFO_HEADER_OUT, false );
            curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
            curl_setopt( $curl, CURLOPT_BINARYTRANSFER, true );
            curl_setopt( $curl, CURLOPT_CONNECTTIMEOUT, 20 );
            curl_setopt( $curl, CURLOPT_TIMEOUT, 60 );
            curl_setopt( $curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' );
            curl_setopt( $curl, CURLOPT_MAXREDIRS, 10 );
            curl_setopt( $curl, CURLOPT_ENCODING, '' );

            /* Assign runtime parameters as options */
            if( isset( $options ) && is_array( $options ) ){
                foreach( $options as $param => $value ) curl_setopt( $curl, $param, $value );
            }

            if( $headers && is_array( $headers ) ){
                curl_setopt( $curl, CURLOPT_HTTPHEADER, $headers );
            }

            /* Execute the request and store responses */
            $res=(object)array(
                'response'  =>  curl_exec( $curl ),
                'info'      =>  (object)curl_getinfo( $curl ),
                'errors'    =>  curl_error( $curl )
            );
            curl_close( $curl );
            return $res;
        }






        function checkvat( $code, $vatnumber, $timeout=30 ){
            $url='http://ec.europa.eu/taxation_customs/vies/services/checkVatService';

            $content = "<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>
                <s11:Body>
                    <tns1:checkVat xmlns:tns1='urn:ec.europa.eu:taxud:vies:services:checkVat:types'>                                        
                        <tns1:countryCode>%s</tns1:countryCode>
                        <tns1:vatNumber>%s</tns1:vatNumber>
                    </tns1:checkVat>
                </s11:Body>
            </s11:Envelope>";

            $headers=array(
                'Content-Type'  =>  'text/xml; charset=utf-8',
                'SOAPAction'    =>  'checkVatService'
            );
            $options=array(
                CURLOPT_POST        =>  true,
                CURLOPT_POSTFIELDS  =>  sprintf ( $content, $code, $vatnumber )
            );
            return curl( $url, $options, $headers );
        }








        $code=$_POST['code'];
        $vatnumber=$_POST['vat'];

        /* check the VAT number etc */
        $obj=checkvat( $code, $vatnumber );

        /* if we received a valid response, process it */
        if( $obj->info->http_code==200 ){

            $dom=new DOMDocument;
            $dom->loadXML( $obj->response );

            $reqdate=$dom->getElementsByTagName('requestDate')->item(0)->nodeValue;
            $valid=$dom->getElementsByTagName('valid')->item(0)->nodeValue;
            $address=$dom->getElementsByTagName('address')->item(0)->nodeValue;

            $result=sprintf( 'VAT Number "%s" in Country-Code "%s" - Date: %s, Valid: %s, Address: %s', $vatnumber, $code, $reqdate, $valid, $address ); 
        }

        exit( $result );
    }
?>
<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title>VAT checker</title>
        <script>

            const ajax=function( url, params, callback ){
                let xhr=new XMLHttpRequest();
                xhr.onload=function(){
                    if( this.status==200 && this.readyState==4 )callback( this.response )
                };
                xhr.open( 'POST', url, true );
                xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
                xhr.send( buildparams( params ) );
            };

            const buildparams=function(p){/* construct payload/querystring from object */
                if( p && typeof( p )==='object' ){
                    p=Object.keys( p ).map(function( k ){
                        return typeof( p[ k ] )=='object' ? buildparams( p[ k ] ) : [ encodeURIComponent( k ), encodeURIComponent( p[ k ] ) ].join('=')
                    }).join('&');
                }
                return p;
            };




            document.addEventListener('DOMContentLoaded', ()=>{
                let form=document.forms.registration;
                    form.bttn.addEventListener('click', e=>{
                        let url=location.href;
                        let params={
                            'task':'check',
                            'vat':form.vat.value,
                            'code':form.code.value
                        };
                        let callback=function(r){
                            document.querySelector('pre').innerHTML=r
                        }
                        ajax.call( this, url, params, callback );
                    })
            });
        </script>
    </head>
    <body>
        <form method='post' name='registration'>
            <!-- lots of other form elements -->


            <!--
                The details in the form (vat-number) is bogus
                and will not return live data...
            -->
            <label for='vat'><input type='text' name='vat' value='10758820' /></label>
            <label for='code'><input type='text' name='code' value='GB' /></label>
            <input type='button' value='Check VAT' name='bttn' />


        </form>
        <pre></pre>
    </body>
</html>

【讨论】:

  • 哇。好的。我刚刚尝试在页面中使用它并且有效!谢谢!现在我尝试在我的网站上使用,看看是否可以在注册前检查增值税。不过谢谢!!
  • 没有问题 - 虽然正如@KikoSoftware 指出的那样,如果它容易出现故障(?我不知道),那么任何依赖于增值税检查结果的代码都需要仔细考虑。祝你好运
  • 我尝试使用来自不同国家/地区的一些真实增值税,并且目前有效。不知道是连接问题还是数据库问题。但我的随机测试是阳性的。你能给我一个提示吗?而不是使用点击功能,当我可以使用该字段时检查增值税。输入更改?
  • 好的,我正在尝试使用 keyup
  • 工作得很好!!我只是使用keyup + 在callback=function 中添加更多的js,我可以做任何事情!非常感谢!