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

MTN SMS V3 API调用返回401未授权错误求助

MTN SMS V3 API 401未授权问题排查方案

针对调用MTN SMS V3 API时返回401未授权(错误码4000,错误信息keymanagement.service.InvalidAPICallAsNoApiProductMatchFound)的问题,可按以下步骤逐一排查:

1. 确认API环境一致性

检查获取令牌的端点与发送短信的端点是否属于同一环境:

  • 沙箱环境:令牌端点应为https://sandbox.api.mtn.com/v1/oauth/access_token,短信端点应为https://sandbox.api.mtn.com/v3/sms/messages/sms/outbound
  • 生产环境:需确认应用已完成生产准入审核,且端点地址与平台要求一致

当前你的代码中两个端点均使用https://api.mtn.com,需验证该地址是否与你申请的API环境匹配。

2. 验证应用与API产品的绑定关系

登录MTN开发者平台,检查应用bulkSMSSender的配置:

  • 进入应用详情页,确认API产品列表中已绑定SMS v3 API
  • 若未绑定,完成绑定操作后重新生成访问令牌

3. 修正请求参数的合法性

部分参数不符合平台要求也会触发权限类报错:

  • senderAddress:必须是在MTN平台注册并获批的短码或品牌名称,不可随意填写
  • serviceCode:替换为分配给你应用的有效服务码
  • keyword:无需关键字时可设为空字符串"",而非占位符"string"

4. 排查令牌有效性

尽管令牌返回结果显示status: approved,仍需确认:

  • 令牌是否在有效期内(当前expires_in为3599秒,约1小时,调用短信接口时需确保令牌未过期)
  • 尝试重新获取令牌后立即调用短信接口,排除令牌生成或缓存异常问题

调整后的测试脚本示例

#!/usr/bin/env python3

'''
This is a test script to send a message using the MTN API
AppName = bulkSMSSender
'''

import requests

# 获取MTN API访问令牌(以沙箱环境为例)
url = "https://sandbox.api.mtn.com/v1/oauth/access_token?grant_type=client_credentials"
payload = "client_id=OtYI2bLjnInCpyW1K6keohVZRKKIsz1f&client_secret=Hd3bmuAjAm44Ddmx"
headers = {
    'Content-Type': "application/x-www-form-urlencoded"
}

token_response = requests.post(url, data=payload, headers=headers)
token = token_response.json().get('access_token')

print("令牌响应:", token_response.text)
print('token: ', token)
print('---------------------------------')

# 使用访问令牌发送短信(沙箱环境)
url = "https://sandbox.api.mtn.com/v3/sms/messages/sms/outbound"

payload = {
    "senderAddress": "YOUR_APPROVED_SENDER",  # 替换为获批的发件人地址
    "receiverAddress": ["233548257283", "233202419977"],
    "message": "Test message from VALCO",
    "clientCorrelatorId": "test123",
    "keyword": "",
    "serviceCode": "YOUR_APPROVED_SERVICE_CODE",  # 替换为获批的服务码
    "requestDeliveryReceipt": False
}
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {token}"
}

print("请求头:", headers)
try:
    response = requests.post(url, json=payload, headers=headers)
    print("响应状态码:", response.status_code)
    print("响应内容:", response.text)
except Exception as e:
    print("发送失败:", str(e))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:33:18