You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA发送POST请求获取Access Token遇阻求助

问题分析与修正方案

你的VBA代码存在几个关键错误,导致无法正确发送请求获取Access Token:

  • 错误使用Data属性:MSXML2.XMLHTTP对象没有Data方法/属性,POST请求的表单数据需要拼接成完整字符串,作为参数传入send方法。
  • 参数名错误:你给参数加了data-前缀(比如data-client_id),这是curl命令中--data选项的语法,实际参数名应为client_id、client_secret等,不需要额外前缀。
  • 未替换占位符:URL中的{tenantId}需要替换为你实际的Azure AD租户ID。

修正后的完整代码

Sub GetAccessToken()
    Dim DvlaService As Object
    Dim postData As String
    Dim API_ID As String, API_Secret As String, tenantId As String
    Dim responseText As String
    
    ' 替换为你的实际参数
    API_ID = "你的CLIENT_ID"
    API_Secret = "你的CLIENT_SECRET"
    tenantId = "你的租户ID"
    
    Set DvlaService = CreateObject("MSXML2.XMLHTTP")
    
    ' 拼接符合application/x-www-form-urlencoded格式的POST数据
    postData = "grant_type=client_credentials" & _
               "&client_id=" & URLEncode(API_ID) & _
               "&client_secret=" & URLEncode(API_Secret) & _
               "&scope=https://tapi.dvsa.gov.uk/.default"
    
    DvlaService.Open "POST", "https://login.microsoftonline.com/" & tenantId & "/oauth2/v2.0/token", False
    DvlaService.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    ' 将拼接好的postData传入send方法
    DvlaService.send postData
    
    responseText = DvlaService.responseText
    ' 输出响应到调试窗口,也可写入单元格
    Debug.Print responseText
    ' Range("A1").Value = responseText
End Sub

' 辅助函数:对参数进行URL编码,避免特殊字符破坏请求格式
Function URLEncode(str As String) As String
    Dim bytes() As Byte
    bytes = StrConv(str, vbUnicode)
    Dim i As Integer
    Dim charCode As Integer
    Dim result As String
    result = ""
    For i = 0 To UBound(bytes) Step 2
        charCode = bytes(i)
        Select Case charCode
            Case 48 To 57, 65 To 90, 97 To 122, 45, 46, 95, 126
                result = result & Chr(charCode)
            Case 32
                result = result & "+"
            Case Else
                result = result & "%" & Hex(charCode)
        End Select
    Next i
    URLEncode = result
End Function

关键说明

  • URL编码:添加URLEncode辅助函数对敏感参数编码,避免特殊字符(如&、=、空格)破坏请求格式。
  • 请求格式:所有参数通过&连接成字符串,完全匹配application/x-www-form-urlencoded的要求,和curl命令的参数拼接逻辑一致。
  • 同步请求:代码使用同步请求(Open方法第三个参数为False),若需异步请求可改为True,但需额外处理onreadystatechange事件。

内容的提问来源于stack exchange,提问作者Mick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:02:43