Django获取Mpesa认证token触发JSONDecodeError报错如何解决
问题原因
这个JSONDecodeError报错说明你调用接口返回的内容不是合法JSON格式,大概率是请求本身出错,返回了空内容、错误页面或者非JSON响应,具体原因和解决方法如下:
1. 首要问题:请求URL格式错误
你的api_URL字符串被错误拆分为两行,中间带了多余的换行、缩进空格,导致实际请求的URL不符合规范,接口无法正常响应:
# 错误写法:字符串换行带多余空白 api_URL = 'https://sandbox.safaricom.co.ke/oauth/v1/generate? grant_type=client_credentials'
修正为单行无多余空白的正确URL:
api_URL = 'https://sandbox.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials'
2. 缺失依赖导入
你代码中使用了HTTPBasicAuth做鉴权,但没有导入对应的模块,会导致请求抛出未定义异常,接口调用失败:
在views.py头部增加导入:
from requests.auth import HTTPBasicAuth
3. 鉴权参数为空
你代码中的consumer_key和consumer_secret都是空字符串,需要填入你在Safaricom沙箱开发者后台申请的对应密钥,否则鉴权会被拒绝,返回非JSON的错误响应。
4. 增加错误排查逻辑
建议在解析响应前先判断请求状态码、打印响应内容,方便定位问题,修正后的完整views.py代码如下:
import requests import json from requests.auth import HTTPBasicAuth from django.http import HttpResponse def getAccessToken(request): # 替换为自己申请的沙箱密钥 consumer_key = '你的沙箱consumer_key' consumer_secret = '你的沙箱consumer_secret' api_URL = 'https://sandbox.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials' r = requests.get(api_URL, auth=HTTPBasicAuth(consumer_key, consumer_secret)) # 先判断请求是否成功 if r.status_code == 200: try: mpesa_access_token = r.json() validated_mpesa_access_token = mpesa_access_token['access_token'] return HttpResponse(validated_mpesa_access_token) except json.decoder.JSONDecodeError: # 打印实际返回内容方便排查 return HttpResponse(f"响应非JSON格式,返回内容:{r.text}") else: return HttpResponse(f"请求失败,状态码:{r.status_code},返回内容:{r.text}")
内容的提问来源于stack exchange,提问作者victor muia
相关产品推荐
相关产品推荐

