Ошибка декодирования JSON-токена доступа для Daraja API при хостинге веб-сервиса на Render

я пытаюсь развернуть свой api на render как веб-сервис... у меня есть тот же код на моей локальной машине, что и в моем git repo, из которого я собираю сервис для развертывания. на развернутом сайте, размещенном на render, когда я отправляю пост запрос на daraja api (мобильный платеж mpesa родной из Кении) я получаю внутреннюю ошибку сервера с этим как сообщение JSONDecodeError at / Expecting value: line 1 column 1 (char 0) Request Method: POST Request URL: http://rycha-pay.onrender.com/ Django Version: 5.0.6 Exception Type: JSONDecodeError Exception Value: Expecting value: line 1 column 1 (char 0) Exception Location: /opt/render/project/src/.venv/lib/python3.11/site-packages/requests/models.py, line 978, in json Raised during: mpesa_client.views.pay Python Executable: /opt/render/project/src/.venv/bin/python Python Version: 3.11.9 Python Path: ['/opt/render/project/src/django_mpesa_payments', '/usr/local/lib/python311.zip', '/usr/local/lib/python3.11', '/usr/local/lib/python3.11/lib-dynload', '/opt/render/project/src/.venv/lib/python3.11/site-packages'] Server time: Tue, 25 Jun 2024 10:18:40 +0000 . ... с другой стороны, api прекрасно работает в автономном режиме, и я могу отправлять запросы к daraja api с моей локальной машины и получать корректный ответ, как показано в этом теле ответа ...*{"MerchantRequestID": "f1e2-4b95-a71d-b30d3cdbb7a7541949", "CheckoutRequestID": "ws_CO_25062024132114897799004096", "ResponseCode": "0", "ResponseDescription": "Success. Request accepted for processing", "CustomerMessage": "Success. Request accepted for processing"}.... *Вот участок кода, на который наложен флаг `# Настройте ведение журнала logger = logging.getLogger(name)

def get_mpesa_token(): url = os.getenv("SAFARICOM_GET_ACCES_TOKEN_URL")

try:
    response = requests.get(url, auth=HTTPBasicAuth(settings.MPESA_CONSUMER_KEY, settings.MPESA_CONSUMER_SECRET))

    # Log status code and headers
    logger.debug(f"Response status code: {response.status_code}")
    logger.debug(f"Response headers: {response.headers}")

    # Log response content
    logger.debug(f"Response content: {response.text}")

    # Check if the response contains valid JSON
    try:
        token = response.json().get('access_token')
        if token:
            return token
        else:
            logger.error("Access token not found in the response.")
            raise ValueError("Access token not found in the response.")
    except ValueError as e:
        logger.error(f"JSON decoding error: {e}")
        raise

except requests.RequestException as e:
    logger.error(f"Request failed: {e}")
    raise

except Exception as e:
    logger.error(f"An unexpected error occurred: {e}")
    raise`

.... может ли кто-нибудь подсказать мне, как решить эту проблему. вышеуказанная проблема является частью большей проблемы, с которой я сталкиваюсь, которая заключается в реализации платежного шлюза lipa na mpesa. первоначально я не мог получить обратный вызов от их конечной точки daraja api, когда я попытался выставить мою локальную машину с помощью ngrok, проблема в том, что ngrok больше не поддерживается. Затем я попробовал использовать python anywhere для размещения конечной точки, но все равно столкнулся с проблемой получения обратного вызова после первого ответа, когда мой запрос успешно достиг daraja api, чтобы начать обработку платежа. Я перешел на render в надежде найти более надежный способ тестирования моего платежного api, который я разрабатываю. Любые лучшие и работоспособные решения будут очень признательны .

я проверил вопросы на стеке, но все они случайны и не дают решения моей проблемы .Также я пытался добавить некоторые логи, чтобы я мог просмотреть их, но у меня нет терминального доступа на render. я не уверен, как отладить это, поскольку проблема возникает на моей онлайн платформе, но работает правильно на моей локальной машине. ...я ожидал, что добавление логирования и отладки непосредственно в мой код поможет выявить возможные причины ошибки jsondecode в окне журнала вывода, предоставляемого render для их бесплатной версии, но все же это не очень помогло

Ваш response.json() выдает ошибку, поскольку возвращаемый ответ не является корректным JSON.

Если вы не можете получить доступ к журналам терминала, вы можете просто вернуть текст ответа:

from rest_framework.response import Response
try:
    response = requests.get(url, auth=HTTPBasicAuth(settings.MPESA_CONSUMER_KEY, settings.MPESA_CONSUMER_SECRET))
    try:
        token = response.json().get('access_token')
    except :
        return Response(response.text)
except Exception as e:
        logger.error(f"An unexpected error occurred: {e}")
        raise`

Теперь вы можете просмотреть текст ответа и определить все проблемы, связанные с вашим запросом.

Кроме того, если у вас возникли проблемы с ngrok, вы можете протестировать Pinggy.

Вернуться на верх