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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:06:04