swte

NAV adószám Woo

Sep 4th, 2025
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.15 KB | None | 0 0
  1. <?php
  2. // 1) Adószám (HU) formális + ellenőrzőszám ellenőrzés
  3. function hu_taxnum_is_well_formed($input) {
  4.   $digits = preg_replace('/\D+/', '', $input);
  5.   if (strlen($digits) !== 11) return false;
  6.   $w = [9,7,3,1,9,7,3];
  7.   $sum = 0;
  8.   for ($i=0;$i<7;$i++) $sum += $w[$i] * intval($digits[$i],10);
  9.   $check = (10 - ($sum % 10)) % 10;
  10.   if (intval($digits[7],10) !== $check) return false;
  11.   // 9. pozíció (ÁFA-kód) 1–6 között szokott lenni – opcionális szigorítás:
  12.   if (!preg_match('/^[1-6]$/', $digits[8])) return false;
  13.   return $digits;
  14. }
  15.  
  16. // 2) NAV v3 queryTaxpayer hívás (cache-eléssel)
  17. function nav_query_taxpayer_v3($eightDigits) {
  18.   $cache_key = 'nav_qt_v3_' . $eightDigits;
  19.   $cached = get_transient($cache_key);
  20.   if ($cached !== false) return $cached;
  21.  
  22.   // --- TÖLTSD KI SAJÁT ADATAIDDAL ---
  23.   $is_production = true;
  24.   $endpoint = $is_production
  25.     ? 'https://api.onlineszamla.nav.gov.hu/invoiceService/v3/queryTaxpayer'
  26.     : 'https://api-test.onlineszamla.nav.gov.hu/invoiceService/v3/queryTaxpayer';
  27.  
  28.   $login         = 'TECH_LOGIN';
  29.   $passwordHash  = 'SHA512_HEX_OF_TECH_PASSWORD'; // passwordHash@cryptoType="SHA-512"
  30.   $signingKey    = 'YOUR_SIGNING_KEY_LITERAL';
  31.   $supplierTaxNo = '12345678'; // a SAJÁT (szállító) törzsszámod első 8 jegye
  32.   $softwareId    = 'SOFT_ID';
  33.   $softwareName  = 'Your App';
  34.   $softwareVer   = '1.0.0';
  35.   $softwareDev   = 'Your Company';
  36.  
  37.   // BasicHeader
  38.   $requestId = bin2hex(random_bytes(8));
  39.   $timestampUtc = (new DateTime('now', new DateTimeZone('UTC')))->format('YmdHis');
  40.  
  41.   // requestSignature v3 (nem manageInvoice): SHA3-512, upper
  42.   $sig_raw = $requestId . $timestampUtc . $signingKey;
  43.   $requestSignature = strtoupper(hash('sha3-512', $sig_raw));
  44.  
  45.   // XML body (minimális, v3)
  46.   $xml = new DOMDocument('1.0', 'UTF-8');
  47.   $root = $xml->createElementNS('http://schemas.nav.gov.hu/OSA/3.0/api', 'QueryTaxpayerRequest');
  48.  
  49.   $basicHeader = $xml->createElement('basicHeader');
  50.   $basicHeader->appendChild($xml->createElement('requestId', $requestId));
  51.   $basicHeader->appendChild($xml->createElement('timestamp', (new DateTime('now', new DateTimeZone('UTC')))->format('c')));
  52.   $basicHeader->appendChild($xml->createElement('requestVersion', '3.0'));
  53.   $root->appendChild($basicHeader);
  54.  
  55.   $userHeader = $xml->createElement('user');
  56.   $userHeader->appendChild($xml->createElement('login', $login));
  57.   // passwordHash with attribute cryptoType="SHA-512"
  58.   $ph = $xml->createElement('passwordHash', $passwordHash);
  59.   $ph->setAttribute('cryptoType', 'SHA-512');
  60.   $userHeader->appendChild($ph);
  61.   $userHeader->appendChild($xml->createElement('taxNumber', $supplierTaxNo));
  62.   $rs = $xml->createElement('requestSignature', $requestSignature);
  63.   $rs->setAttribute('cryptoType', 'SHA3-512');
  64.   $userHeader->appendChild($rs);
  65.   $root->appendChild($userHeader);
  66.  
  67.   $software = $xml->createElement('software');
  68.   $software->appendChild($xml->createElement('softwareId', $softwareId));
  69.   $software->appendChild($xml->createElement('softwareName', $softwareName));
  70.   $software->appendChild($xml->createElement('softwareOperation', 'ONLINE_SERVICE'));
  71.   $software->appendChild($xml->createElement('softwareMainVersion', $softwareVer));
  72.   $software->appendChild($xml->createElement('softwareDevName', $softwareDev));
  73.   $software->appendChild($xml->createElement('softwareDevContact', '[email protected]'));
  74.   $software->appendChild($xml->createElement('softwareDevCountryCode', 'HU'));
  75.   $software->appendChild($xml->createElement('softwareDevTaxNumber', $supplierTaxNo));
  76.   $root->appendChild($software);
  77.  
  78.   // A lekérdezett adószám: csak az első 8 jegy!
  79.   $root->appendChild($xml->createElement('taxNumber', $eightDigits));
  80.  
  81.   $xml->appendChild($root);
  82.   $body = $xml->saveXML();
  83.  
  84.   $args = [
  85.     'headers' => [
  86.       'Content-Type' => 'application/xml',
  87.       'Accept'       => 'application/xml',
  88.     ],
  89.     'body'    => $body,
  90.     'timeout' => 10,
  91.   ];
  92.  
  93.   $res = wp_remote_post($endpoint, $args);
  94.   if (is_wp_error($res)) return ['ok' => false, 'err' => $res->get_error_message()];
  95.  
  96.   $code = wp_remote_retrieve_response_code($res);
  97.   $resp = wp_remote_retrieve_body($res);
  98.  
  99.   if ($code !== 200 || !$resp) return ['ok' => false, 'err' => 'HTTP '.$code];
  100.  
  101.   // Parsoljuk az XML választ és keressük taxpayerValidity-t
  102.   $sx = @simplexml_load_string($resp);
  103.   if (!$sx) return ['ok' => false, 'err' => 'Bad XML'];
  104.   $sx->registerXPathNamespace('api', 'http://schemas.nav.gov.hu/OSA/3.0/api');
  105.  
  106.   $valid = $sx->xpath('//api:taxpayerValidity');
  107.   $validity = isset($valid[0]) ? ((string)$valid[0] === 'true') : false;
  108.  
  109.   // tedd el cache-be 1 napra
  110.   $out = ['ok' => true, 'valid' => $validity, 'raw' => $resp];
  111.   set_transient($cache_key, $out, DAY_IN_SECONDS);
  112.   return $out;
  113. }
  114.  
  115. // 3) Checkout validáció (mező: billing_company_tax_number)
  116. add_action('woocommerce_after_checkout_validation', function($data, $errors){
  117.   if (empty($data['billing_company'])) return; // csak cég esetén ellenőrzünk
  118.   $raw = isset($data['billing_company_tax_number']) ? $data['billing_company_tax_number'] : '';
  119.   $digits = hu_taxnum_is_well_formed($raw);
  120.   if (!$digits) {
  121.     $errors->add('taxnum', __('Érvénytelen magyar adószám formátum.', 'textdomain'));
  122.     return;
  123.   }
  124.   // NAV validáció (első 8 jegy)
  125.   $qt = nav_query_taxpayer_v3(substr($digits, 0, 8));
  126.   if (!$qt['ok']) {
  127.     // hibatűrés: ne blokkoljuk a vásárlást, de jelezzük
  128.     wc_add_notice(__('Figyelem: nem sikerült ellenőrizni az adószámot a NAV-nál. Kérjük, ellenőrizze a megadott számot.', 'textdomain'), 'notice');
  129.     return;
  130.   }
  131.   if (empty($qt['valid'])) {
  132.     $errors->add('taxnum_nav', __('A megadott adószám nem érvényes a NAV nyilvántartás szerint.', 'textdomain'));
  133.   }
  134. }, 10, 2);
  135.  
  136. // 4) Mező hozzáadása a pénztárhoz
  137. add_filter('woocommerce_checkout_fields', function($fields){
  138.   $fields['billing']['billing_company_tax_number'] = [
  139.     'type'        => 'text',
  140.     'label'       => __('Adószám', 'textdomain'),
  141.     'required'    => true,
  142.     'priority'    => 120,
  143.     'placeholder' => '12345678-1-12',
  144.     'class'       => ['form-row-wide'],
  145.   ];
  146.   return $fields;
  147. });
Advertisement
Add Comment
Please, Sign In to add comment