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

VBA调用OAuth2.0伙伴API获取Access Token时提示‘Missing grant type’错误求助

问题排查与解决方案

我帮你找到了问题的核心原因,这是VBA代码里的一个请求头配置错误导致的,修正后就能正常获取Token了。

核心错误分析

你的CURL命令是完全正确的——它会自动把-d参数以application/x-www-form-urlencoded格式发送给服务器,但你的VBA代码里写错了关键的请求头:

objHTTP.SetRequestHeader "application", "x-www-form-urlencoded"

这里的头名称应该是Content-Type,而不是application!服务器无法识别这个错误的头字段,自然就解析不了你通过Send方法传递的grant_type参数,这就是为什么始终返回Missing grant type的原因。

另外,你额外设置的client_id和client_secret请求头是多余的,因为你已经通过Authorization: Basic ...完成了客户端身份认证,这部分可以移除,避免潜在的冲突。

修改后的可用VBA代码

Public Function API_MyArrow_Artikel(artikelBez) As String
    Dim objHTTP As Object
    Dim strHead As String, strClientId As String, strClientSecret As String
    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
    
    strClientId = "xxx"
    strClientSecret = "xxx"
    strUrl1 = "https://my.arrow.com/api/security/oauth/token"
    strHead = strClientId & ":" & strClientSecret
    
    objHTTP.Open "POST", strUrl1, False
    ' 修正Content-Type请求头,这是让服务器识别表单数据的关键
    objHTTP.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    ' 仅保留Basic认证头即可,无需额外传递client_id和client_secret
    objHTTP.SetRequestHeader "Authorization", "Basic " + Base64Encode(strHead)
    objHTTP.SetTimeouts 10000, 10000, 10000, 10000
    objHTTP.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    ' 正确发送表单格式的grant_type参数
    objHTTP.Send "grant_type=client_credentials"
    
    API_MyArrow_Artikel = objHTTP.responseText
End Function

额外注意事项

  • 请确认你的Base64Encode函数能正确对client_id:client_secret字符串进行Base64编码,这是Basic认证生效的前提;
  • OAuth2的client_credentials模式明确要求grant_type参数必须放在请求体(表单数据)中,放在请求头里是不符合规范的;
  • 测试时可以先打印Base64Encode(strHead)的结果,和CURL里-u参数自动生成的Base64串对比,确保编码正确。

内容的提问来源于stack exchange,提问作者Thorsten C.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:08:11