Django: байтовые индексы должны быть целыми числами или фрагментами, а не строками ошибка

Я пытаюсь получить некоторые данные из полезной нагрузки с помощью webhook, в ответ, который я послал на стороне я добавил мета данные, которые должны вернуться с полезной нагрузкой и вот как я это сделал ( код ниже), если вы внимательно посмотрите на ключи, там есть один под названием meta, теперь я пытаюсь получить некоторые данные, которые находятся в мета из моего представления webhook следующим образом

views.py webhook

@csrf_exempt
@require_http_methods(['POST', 'GET'])
def webhook(request):
    payload = request.body
    order_id = payload['meta']['order_id']
    print(order_id)
    return HttpResponse("testing...")

Отправка ответа платежному шлюзу

@csrf_exempt
def process_payment(request, name, email, amount, order_id):
    auth_token = "FLWSECK_TEST-9efb9ee17d8afe40c6c890294a1163de-X"
    hed = {'Authorization': 'Bearer ' + auth_token}
    data = {
            "tx_ref":''+str(math.floor(1000000 + random.random()*9000000)),
            "amount":amount,
            "currency":"USD",
            "order_id":order_id,
            "redirect_url":f"http://localhost:3000/service-detail/booking/confirmation/{order_id}",
            "payment_options":"card",
            "meta":{
                "order_id":order_id,
                "consumer_id":23,
                "consumer_mac":"92a3-912ba-1192a"
            },
            "customer":{
                "email":email,
                "name":name,
                "order_id":order_id
            },
            "customizations":{
                "title":"ForecastFaceoff",
                "description":"Leading Political Betting Platform",
                "logo":"https://i.im.ge/2022/08/03m/FELzix.stridearn-high-quality-logo-circle.jpg"
                }
            }
    url = ' https://api.flutterwave.com/v3/payments'
    response = requests.post(url, json=data, headers=hed)
    response=response.json()
    link=response['data']['link']
    return redirect(link)

payload

{
  "event": "charge.completed",
  "data": {
    "id": 4136234873,
    "tx_ref": "6473247093",
    "flw_ref": "FLW-MOCK-b33e86ab2342316fec664110e8eb842a3c2f956",
    "device_fingerprint": "df38c8854324598c54e16feacc65348a5e446",
    "amount": 152,
    "currency": "USD",
    "charged_amount": 152,
    "app_fee": 5.78,
    "merchant_fee": 0,
    "processor_response": "Approved. Successful",
    "auth_model": "VBVSECUREertrCODE",
    "ip": "52.209.154.143",
    "narration": "CARD Transaction ",
    "status": "successful",
    "payment_type": "card",
    "created_at": "2023-02-06T11:19:45.000Z",
    "account_id": 685622,
    "customer": {
      "id": 1970338,
      "name": "destiny ",
      "phone_number": null,
      "email": "******@gmail.com",
      "created_at": "2023-02-06T11:19:45.000Z"
    },
    "card": {
      "first_6digits": "653188",
      "last_4digits": "2340",
      "issuer": "MASTERCARD  CREDIT",
      "country": "NG",
      "type": "MASTERCARD",
      "expiry": "49/32"
    }
  },
  "event.type": "CARD_TRANSACTION"
}

Метаданные даже не отображаются в полезной нагрузке, должны ли они отображаться в полезной нагрузке, прежде чем я смогу получить данные, отправленные вместе с ней?

request.body является байтом, а не диктой, поэтому вам нужно загрузить строку как JSON.

payload = json.loads(request.body)

Мета-данные отсутствуют в словаре payload. Сначала попробуйте извлечь ключ данных из полезной нагрузки следующим образом:

@csrf_exempt
@require_http_methods(['POST', 'GET'])
def webhook(request):
    payload = json.loads(request.body.decode("utf-8"))
    data = payload.get("data")
    if data:
        order_id = data.get("meta", {}).get("order_id")
        print(order_id)
    return HttpResponse("just testing")

Редактирование:

Сообщение об ошибке как вы описали выше в комментарии JSONDecodeError: Expecting value: line 1 column 1 (char 0) indicates that json.loads(), ожидает строку JSON в качестве входных данных.

Возможно, тело запроса пустое. Вы можете проверить это, напечатав request.body перед этим в представлении перед вызовом json.loads().

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