Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- // 1) Adószám (HU) formális + ellenőrzőszám ellenőrzés
- function hu_taxnum_is_well_formed($input) {
- $digits = preg_replace('/\D+/', '', $input);
- if (strlen($digits) !== 11) return false;
- $w = [9,7,3,1,9,7,3];
- $sum = 0;
- for ($i=0;$i<7;$i++) $sum += $w[$i] * intval($digits[$i],10);
- $check = (10 - ($sum % 10)) % 10;
- if (intval($digits[7],10) !== $check) return false;
- // 9. pozíció (ÁFA-kód) 1–6 között szokott lenni – opcionális szigorítás:
- if (!preg_match('/^[1-6]$/', $digits[8])) return false;
- return $digits;
- }
- // 2) NAV v3 queryTaxpayer hívás (cache-eléssel)
- function nav_query_taxpayer_v3($eightDigits) {
- $cache_key = 'nav_qt_v3_' . $eightDigits;
- $cached = get_transient($cache_key);
- if ($cached !== false) return $cached;
- // --- TÖLTSD KI SAJÁT ADATAIDDAL ---
- $is_production = true;
- $endpoint = $is_production
- ? 'https://api.onlineszamla.nav.gov.hu/invoiceService/v3/queryTaxpayer'
- : 'https://api-test.onlineszamla.nav.gov.hu/invoiceService/v3/queryTaxpayer';
- $login = 'TECH_LOGIN';
- $passwordHash = 'SHA512_HEX_OF_TECH_PASSWORD'; // passwordHash@cryptoType="SHA-512"
- $signingKey = 'YOUR_SIGNING_KEY_LITERAL';
- $supplierTaxNo = '12345678'; // a SAJÁT (szállító) törzsszámod első 8 jegye
- $softwareId = 'SOFT_ID';
- $softwareName = 'Your App';
- $softwareVer = '1.0.0';
- $softwareDev = 'Your Company';
- // BasicHeader
- $requestId = bin2hex(random_bytes(8));
- $timestampUtc = (new DateTime('now', new DateTimeZone('UTC')))->format('YmdHis');
- // requestSignature v3 (nem manageInvoice): SHA3-512, upper
- $sig_raw = $requestId . $timestampUtc . $signingKey;
- $requestSignature = strtoupper(hash('sha3-512', $sig_raw));
- // XML body (minimális, v3)
- $xml = new DOMDocument('1.0', 'UTF-8');
- $root = $xml->createElementNS('http://schemas.nav.gov.hu/OSA/3.0/api', 'QueryTaxpayerRequest');
- $basicHeader = $xml->createElement('basicHeader');
- $basicHeader->appendChild($xml->createElement('requestId', $requestId));
- $basicHeader->appendChild($xml->createElement('timestamp', (new DateTime('now', new DateTimeZone('UTC')))->format('c')));
- $basicHeader->appendChild($xml->createElement('requestVersion', '3.0'));
- $root->appendChild($basicHeader);
- $userHeader = $xml->createElement('user');
- $userHeader->appendChild($xml->createElement('login', $login));
- // passwordHash with attribute cryptoType="SHA-512"
- $ph = $xml->createElement('passwordHash', $passwordHash);
- $ph->setAttribute('cryptoType', 'SHA-512');
- $userHeader->appendChild($ph);
- $userHeader->appendChild($xml->createElement('taxNumber', $supplierTaxNo));
- $rs = $xml->createElement('requestSignature', $requestSignature);
- $rs->setAttribute('cryptoType', 'SHA3-512');
- $userHeader->appendChild($rs);
- $root->appendChild($userHeader);
- $software = $xml->createElement('software');
- $software->appendChild($xml->createElement('softwareId', $softwareId));
- $software->appendChild($xml->createElement('softwareName', $softwareName));
- $software->appendChild($xml->createElement('softwareOperation', 'ONLINE_SERVICE'));
- $software->appendChild($xml->createElement('softwareMainVersion', $softwareVer));
- $software->appendChild($xml->createElement('softwareDevName', $softwareDev));
- $software->appendChild($xml->createElement('softwareDevCountryCode', 'HU'));
- $software->appendChild($xml->createElement('softwareDevTaxNumber', $supplierTaxNo));
- $root->appendChild($software);
- // A lekérdezett adószám: csak az első 8 jegy!
- $root->appendChild($xml->createElement('taxNumber', $eightDigits));
- $xml->appendChild($root);
- $body = $xml->saveXML();
- $args = [
- 'headers' => [
- 'Content-Type' => 'application/xml',
- 'Accept' => 'application/xml',
- ],
- 'body' => $body,
- 'timeout' => 10,
- ];
- $res = wp_remote_post($endpoint, $args);
- if (is_wp_error($res)) return ['ok' => false, 'err' => $res->get_error_message()];
- $code = wp_remote_retrieve_response_code($res);
- $resp = wp_remote_retrieve_body($res);
- if ($code !== 200 || !$resp) return ['ok' => false, 'err' => 'HTTP '.$code];
- // Parsoljuk az XML választ és keressük taxpayerValidity-t
- $sx = @simplexml_load_string($resp);
- if (!$sx) return ['ok' => false, 'err' => 'Bad XML'];
- $sx->registerXPathNamespace('api', 'http://schemas.nav.gov.hu/OSA/3.0/api');
- $valid = $sx->xpath('//api:taxpayerValidity');
- $validity = isset($valid[0]) ? ((string)$valid[0] === 'true') : false;
- // tedd el cache-be 1 napra
- $out = ['ok' => true, 'valid' => $validity, 'raw' => $resp];
- set_transient($cache_key, $out, DAY_IN_SECONDS);
- return $out;
- }
- // 3) Checkout validáció (mező: billing_company_tax_number)
- add_action('woocommerce_after_checkout_validation', function($data, $errors){
- if (empty($data['billing_company'])) return; // csak cég esetén ellenőrzünk
- $raw = isset($data['billing_company_tax_number']) ? $data['billing_company_tax_number'] : '';
- $digits = hu_taxnum_is_well_formed($raw);
- if (!$digits) {
- $errors->add('taxnum', __('Érvénytelen magyar adószám formátum.', 'textdomain'));
- return;
- }
- // NAV validáció (első 8 jegy)
- $qt = nav_query_taxpayer_v3(substr($digits, 0, 8));
- if (!$qt['ok']) {
- // hibatűrés: ne blokkoljuk a vásárlást, de jelezzük
- 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');
- return;
- }
- if (empty($qt['valid'])) {
- $errors->add('taxnum_nav', __('A megadott adószám nem érvényes a NAV nyilvántartás szerint.', 'textdomain'));
- }
- }, 10, 2);
- // 4) Mező hozzáadása a pénztárhoz
- add_filter('woocommerce_checkout_fields', function($fields){
- $fields['billing']['billing_company_tax_number'] = [
- 'type' => 'text',
- 'label' => __('Adószám', 'textdomain'),
- 'required' => true,
- 'priority' => 120,
- 'placeholder' => '12345678-1-12',
- 'class' => ['form-row-wide'],
- ];
- return $fields;
- });
Advertisement
Add Comment
Please, Sign In to add comment