Safaricom Daraja: обнаружен дубликат json-ключа

Я внедряю Lipa na M-Pesa online от Safaricom. Однако, когда я делаю запрос, я получаю ошибку, говорящую, что обнаружены дубликаты json-ключей.

Полезная нагрузка:

payload = {
    "BusinessShortCode": 174379, 
    "Password": "the password", 
    "Timestamp": "20220817050503", 
    "TransactionType": "CustomerPayBillOnline", 
    "Amount": 5, 
    "PartyA": 254714895622, 
    "PartyB": 174379, 
    "PhoneNumber": 254714895622, 
    "CallBackURL": "https://58fa-102-68-78-50.in.ngrok.io/api/v1/payments/callback/", 
    "AccountReference": "Payment", 
    "TransactionDesc": "Payment for K"
}

Заголовки:

headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer access_token",
}

Запрос:

response = requests.request("POST", 'https://sandbox.safaricom.co.ke/mpesa/stkpush/v1/processrequest', headers=headers, data=payload)

Ответ, который я получаю:

{
   'responseId': '82699-21939686', 
   'responseCode': '400', 
   'responseDesc': 'Duplicate json key detected'
}

Что может быть причиной этой ошибки и как я могу ее решить?

Проблема в заголовке, запрос передает Content-Type по умолчанию, избавление от него устраняет проблему.

Хотя это предусмотрено в примере кода M-pesa Daraja от Safaricom для python, попробуйте изменить эту часть так, чтобы она была; переименуйте body=payload в json=payload

response = requests.request("POST",your-url, headers=headers, json=payload)

вместо

response = requests.request("POST", url , headers=headers, data=payload) 

Удаление Content-Type из заголовка, как было предложено, дало мне другую ошибку;

{'requestId': '12345-12345-1',
'errorCode': '400.002.02',
'errorMessage': 'Bad Request - Invalid BusinessShortCode'}

сработало для меня, надеюсь сработает и для вас

Следующие работы

import requests

headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer DWbh63zkq7ZLagmNCSwnyvjA2kBQ'
}

payload = {
    "BusinessShortCode": 174379,
    "Password": "MTc0Mzc5YmZiMjc5ZjlhYTliZGJjZjE1OGU5N2RkNzFhNDY3Y2QyZTBjODkzMDU5YjEwZjc4ZTZiNzJhZGExZWQyYzkxOTIwMjIxMjIyMDUyOTQ5",
    "Timestamp": "20221222052949",
    "TransactionType": "CustomerPayBillOnline",
    "Amount": 1,
    "PartyA": 254712345678,
    "PartyB": 174379,
    "PhoneNumber": 254712345678,
    "CallBackURL": "example.com/path",
    "AccountReference": "CompanyXLTD",
    "TransactionDesc": "Payment of X" 
  }

response = requests.request("POST", 'example.com/mpesa/stkpush/v1/processrequest', headers = headers, json = payload)
print(response.text.encode('utf8'))
Вернуться на верх