Django-ninja Webhook Server - ошибка подписи/неправильный запрос
Я работаю над приложением Django, где мне нужно разработать сервер webhook с помощью Django-ninja. Приложение webhook получает уведомление о новом заказе, как описано здесь: https://developer.wolt.com/docs/marketplace-integrations/restaurant-advanced#webhook-server
Мой код ниже:
@api.post("/v1/wolt-new-order")
def wolt_new_order(request: HttpRequest):
received_signature = request.headers.get('wolt-signature')
if not received_signature:
print("Missing signature")
return HttpResponse('Missing signature', status=400)
payload = request.body
expected_signature = hmac.new(
CLIENT_SECRET.encode(),
payload,
hashlib.sha256
).hexdigest()
print(f"Received: {received_signature}")
print(f"Expected: {expected_signature}")
if not hmac.compare_digest(received_signature, expected_signature):
return HttpResponse('Invalid signature', status=400)
print(payload)
return HttpResponse('Webhook received', status=200)
По какой-то причине это всегда возвращает "код ошибки 400, плохой синтаксис запроса", и две подписи всегда разные.
Я правильно импортирую CLIENT_SECRET, и у меня правильно установлены все необходимые библиотеки.
Как ни странно, когда я делаю то же самое в тестовом приложении Flask, я получаю уведомление от webhook корректно и без проблем.
Ниже приведен код Flask:
import hmac
import hashlib
from flask import Flask, request, abort
app = Flask(__name__)
@app.route('/api/v1/wolt-new-order', methods=['POST'])
def webhook():
# Extract the wolt-signature header
received_signature = request.headers.get('wolt-signature')
print(received_signature)
# Extract the request payload
payload = request.get_data()
print(payload)
# Compute the expected signature
expected_signature = hmac.new(
CLIENT_SECRET.encode(),
payload,
hashlib.sha256
).hexdigest()
print(expected_signature)
# Compare signatures
if not hmac.compare_digest(received_signature, expected_signature):
abort(400, 'Invalid signature')
print(payload)
return 'Webhook received', 200
if __name__ == '__main__':
app.run(port=8000)
Мой сервер вебхуков находится за ngrok. Есть идеи?
Что я делаю не так? Есть предложения?