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
相关产品推荐
相关产品推荐

