Public Class CHMRC Shared Sub hmrcTEST() Debug.WriteLine("HMRC Start") Dim oauth2 As Chilkat.OAuth2 = New Chilkat.OAuth2() Dim success As Boolean oauth2.ListenPort = 3017 oauth2.AuthorizationEndpoint = "https://test-api.service.hmrc.gov.uk/oauth/authorize" oauth2.TokenEndpoint = "https://test-api.service.hmrc.gov.uk/oauth/token" oauth2.ClientId = "xybTOMaQWcuifeW5xnGggojlACWC" oauth2.ClientSecret = "bf1cfb6e-1bcb-4282-b7a0-3d3ccb2b1dc1" oauth2.Scope = "read:vat write:vat" Dim url As String = oauth2.StartAuth() If oauth2.LastMethodSuccess <> True Then Debug.WriteLine(oauth2.LastErrorText) Exit Sub End If Dim http As Chilkat.Http = New Chilkat.Http() System.Diagnostics.Process.Start(url) Dim numMsWaited As Integer = 0 While (numMsWaited < 120000) AndAlso (oauth2.AuthFlowState < 3) oauth2.SleepMs(100) numMsWaited = numMsWaited + 100 End While ' If there was no response from the browser within 30 seconds, then ' the AuthFlowState will be equal to 1 Or 2. ' 1: Waiting for Redirect. The OAuth2 background thread Is waiting to receive the redirect HTTP request from the browser. ' 2: Waiting for Final Response. The OAuth2 background thread Is waiting for the final access token response. ' In that case, cancel the background task started in the call to StartAuth. If oauth2.AuthFlowState < 3 Then oauth2.Cancel() Debug.WriteLine("No response from the browser!") Exit Sub End If Debug.WriteLine("HMRC here") ' Check the AuthFlowState to see if authorization was granted, denied, Or if some error occurred ' The possible AuthFlowState values are: ' 3 Completed with Success. The OAuth2 flow has completed, the background thread exited, And the successful JSON response Is available in AccessTokenResponse property. ' 4: Completed with Access Denied. The OAuth2 flow has completed, the background thread exited, And the error JSON Is available in AccessTokenResponse property. ' 5: Failed Prior To Completion. The OAuth2 flow failed To complete, the background thread exited, And the error information Is available in the FailureInfo property. If oauth2.AuthFlowState = 5 Then Debug.WriteLine("OAuth2 failed to complete.") Debug.WriteLine(oauth2.FailureInfo) Exit Sub End If If oauth2.AuthFlowState = 4 Then Debug.WriteLine("OAuth2 authorization was denied.") Debug.WriteLine(oauth2.AccessTokenResponse) Exit Sub End If If oauth2.AuthFlowState <> 3 Then Debug.WriteLine("Unexpected AuthFlowState:" & Convert.ToString(oauth2.AuthFlowState)) Exit Sub End If Debug.WriteLine("OAuth2 authorization granted!") Debug.WriteLine("Access Token = " & oauth2.AccessToken) Dim json As Chilkat.JsonObject = New Chilkat.JsonObject() json.Load(oauth2.AccessTokenResponse) json.EmitCompact = False Debug.WriteLine(json.Emit()) ' The JSON response looks Like this ' { ' "token_type": "Bearer", ' "scope": "user_impersonation", ' "expires_in": "3599", ' "ext_expires_in": "0", ' "expires_on": "1524783438", ' "not_before": "1524779538", ' "resource": "https://mydomain.api.crm.dynamics.com", ' "access_token": "...", ' "refresh_token": "...", ' "id_token": "..." ' } ' If an "expires_on" member does Not exist, then add the JSON member by ' getting the current system date/time And adding the "expires_in" seconds. ' This way we'll know when the token expires. If json.HasMember("expires_on") <> True Then Dim dtExpire As Chilkat.CkDateTime = New Chilkat.CkDateTime() dtExpire.SetFromCurrentSystemTime() dtExpire.AddSeconds(json.IntOf("expires_in")) json.AppendString("expires_on", dtExpire.GetAsUnixTimeStr(False)) End If Debug.WriteLine(json.Emit()) Dim fac As Chilkat.FileAccess = New Chilkat.FileAccess() fac.WriteEntireTextFile("qa_data/tokens/hmrc.json", json.Emit(), "utf-8", False) End Sub Shared Sub VATTEST(hmrc_app_server_token) Dim rest As New Chilkat.Rest Dim success As Boolean ' URL: https://test-api.service.hmrc.gov.uk/organisations/vat/123456789/returns Dim bTls As Boolean = True Dim port As Integer = 443 Dim bAutoReconnect As Boolean = True success = rest.Connect("test-api.service.hmrc.gov.uk", port, bTls, bAutoReconnect) If (success <> True) Then Debug.WriteLine("ConnectFailReason: " & rest.ConnectFailReason) Debug.WriteLine(rest.LastErrorText) Exit Sub End If ' See the Online Tool for Generating JSON Creation Code Dim json As New Chilkat.JsonObject json.UpdateString("periodKey", "#001") json.UpdateNumber("vatDueSales", "100.00") json.UpdateNumber("vatDueAcquisitions", "100.00") json.UpdateNumber("totalVatDue", "200") json.UpdateNumber("vatReclaimedCurrPeriod", "100.00") json.UpdateNumber("netVatDue", "100") json.UpdateNumber("totalValueSalesExVAT", "500") json.UpdateNumber("totalValuePurchasesExVAT", "500") json.UpdateNumber("totalValueGoodsSuppliedExVAT", "500") json.UpdateNumber("totalAcquisitionsExVAT", "500") json.UpdateBool("finalised", True) rest.AddHeader("Content-Type", "application/json") rest.AddHeader("Authorization", "Bearer " & hmrc_app_server_token) rest.AddHeader("Accept", "application/vnd.hmrc.1.0+json") Dim sbRequestBody As New Chilkat.StringBuilder json.EmitSb(sbRequestBody) Dim sbResponseBody As New Chilkat.StringBuilder success = rest.FullRequestSb("POST", "/organisations/vat/123456789/returns", sbRequestBody, sbResponseBody) If (success <> True) Then Debug.WriteLine(rest.LastErrorText) Exit Sub End If Dim respStatusCode As Integer = rest.ResponseStatusCode If (respStatusCode >= 400) Then Debug.WriteLine("Response Status Code = " & respStatusCode) Debug.WriteLine("Response Header:") Debug.WriteLine(rest.ResponseHeader) Debug.WriteLine("Response Body:") Debug.WriteLine(sbResponseBody.GetAsString()) Exit Sub End If End Sub End Class