Files
SDL/VERAG_PROG_ALLGEMEIN/Schnittstellen/BZST/cBZST_UID.vb
2025-07-20 21:16:01 +02:00

108 lines
4.4 KiB
VB.net

Imports System.IO
Imports System.Net
Imports System.Security.Cryptography
Imports System.Text
Imports Newtonsoft.Json
Public Class cBZST_UID_REST
Shared ReadOnly ApiHost As String = "api.evatr.vies.bzst.de"
Shared ReadOnly ApiPort As Integer = 443
Shared ReadOnly ApiBasePath As String = "/v1"
' === 1. MAC Authentication Header Builder ===
Shared Function BuildMacHeader(httpMethod As String, path As String, body As String, id As String, base64Key As String) As String
Dim ts As String = CLng((DateTime.UtcNow - #1/1/1970#).TotalSeconds).ToString()
Dim nonce As String = Guid.NewGuid().ToString("N").Substring(0, 12)
Dim bodyHashPart As String = ""
If httpMethod = "POST" AndAlso body IsNot Nothing Then
Using sha = SHA256.Create()
bodyHashPart = Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(body)))
End Using
End If
Dim macInput As String = $"{ts}{vbLf}{nonce}{vbLf}{httpMethod}{vbLf}{path}{vbLf}{ApiHost}{vbLf}{ApiPort}{vbLf}{bodyHashPart}{vbLf}"
Dim keyBytes As Byte() = Convert.FromBase64String(base64Key)
Dim hmac As New HMACSHA256(keyBytes)
Dim macSig As String = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(macInput)))
Return $"MAC id=""{id}"", ts=""{ts}"", nonce=""{nonce}"", mac=""{macSig}"""
End Function
' === 2. HTTP Call Helper ===
Shared Function DoRequest(httpMethod As String, path As String, body As String, authHeader As String) As String
Dim url As String = $"https://{ApiHost}{path}"
Dim req = CType(WebRequest.Create(url), HttpWebRequest)
req.Method = httpMethod
req.Headers.Add("Authorization", authHeader)
If httpMethod = "POST" Then
req.ContentType = "application/json"
Dim bodyBytes = Encoding.UTF8.GetBytes(body)
req.ContentLength = bodyBytes.Length
Using s = req.GetRequestStream()
s.Write(bodyBytes, 0, bodyBytes.Length)
End Using
Else
req.Accept = "application/json"
End If
Using resp = CType(req.GetResponse(), HttpWebResponse)
Using sr = New StreamReader(resp.GetResponseStream())
Return sr.ReadToEnd()
End Using
End Using
End Function
' === 3. CheckVat (einfach) ===
Public Shared Function CheckVat(countryCode As String, vatNumber As String, apiId As String, apiKeyBase64 As String) As String
Dim path = $"{ApiBasePath}/euvat/{countryCode}{vatNumber}"
Dim auth = BuildMacHeader("GET", path, Nothing, apiId, apiKeyBase64)
Return DoRequest("GET", path, Nothing, auth)
End Function
' === 4. CheckVatQualified (mit Zusatzdaten) ===
Public Shared Function CheckVatQualified(countryCode As String, vatNumber As String,
street As String, postalCode As String, city As String,
apiId As String, apiKeyBase64 As String) As String
Dim path = $"{ApiBasePath}/euvat/qualified"
Dim payload = New With {
.countryCode = countryCode,
.vatNumber = vatNumber,
.street = street,
.postalCode = postalCode,
.city = city
}
Dim jsonBody As String = JsonConvert.SerializeObject(payload)
Dim auth = BuildMacHeader("POST", path, jsonBody, apiId, apiKeyBase64)
Return DoRequest("POST", path, jsonBody, auth)
End Function
' === 5. Statusmeldungen abrufen ===
Public Function GetStatusMessages(apiId As String, apiKeyBase64 As String) As String
Dim path = $"{ApiBasePath}/info/statusmeldungen"
Dim auth = BuildMacHeader("GET", path, Nothing, apiId, apiKeyBase64)
Return DoRequest("GET", path, Nothing, auth)
End Function
Sub EXAMPLE()
Dim apiId As String = "DEINE_ID"
Dim apiKey As String = "DEIN_BASE64_KEY"
' 1) Einfache Prüfung
Dim simple = CheckVat("AT", "U18522105", apiId, apiKey)
Console.WriteLine("Simple VAT Response: " & simple)
' 2) Qualifizierte Prüfung
Dim qual = CheckVatQualified("DE", "123456789", "Musterstr. 1", "12345", "Musterstadt", apiId, apiKey)
Console.WriteLine("Qualified VAT Response: " & qual)
' 3) Statusmeldungen
Dim status = GetStatusMessages(apiId, apiKey)
Console.WriteLine("Status Messages: " & status)
End Sub
End Class