【问题标题】:Integrate WooCommerce webhooks with Django Rest Framework将 WooCommerce webhook 与 Django Rest 框架集成
【发布时间】:2022-08-05 06:06:48
【问题描述】:

我有一个使用 WooCommerce 管理商店的 WordPress 网站。我创建了一个必须与 WooCommerce 通信的 Django 应用程序,以便了解以下操作:

  • 用户创建
  • 用户更新
  • 用户删除
  • 新订阅购买
  • 订阅续订
  • 订阅到期
  • 产品采购(我也卖实体产品)

每当在 WooCommerce 中创建新客户端时,我想在 Django 应用程序中创建一个新用户,并在 WooCommerce 中的状态发生变化时相应地更新/删除它。

每当在 WooCommerce 中购买产品时,都应该在 Django 应用程序中看到它。订阅也是如此。

  1. 在 Postman 的帮助下,我设法阅读了用户相关操作的 POST 请求 WooCommerce 问题,但格式与 Django 应用程序接受的格式不同,我真的不知道如何调整视图为了能够使用提供的信息

  2. 我在 Django 中配置了基于令牌的身份验证并生成了一个令牌,然后我在 WooCommerce 中进行了配置,但它似乎没有像在 WooCommerce 日志中那样使用它,响应是:

    [Body] => {\"detail\":\"Authentication credentials were not provided.\"}
    

    我对 Django Rest Framework 和 WooCommerce webhooks 都很陌生,所以我不知道这里要包含哪些其他信息。我将等待有关此的输入。

    请帮助我提供一些有关如何进行此集成的指导。先感谢您!

    标签: django wordpress woocommerce django-rest-framework webhooks


    【解决方案1】:

    本周我遇到了这个问题,发现围绕这些东西的模糊文档并没有太大帮助。

    WooCommerce WebHooks 使用 HMAC-SHA256 身份验证并使用密钥和消息正文创建散列。

    你可以用类似的东西检查它(密钥与你在 Secret 字段中的 Woo WebHook 中输入的密钥相同):

    import base64
    import hashlib
    import hmac
    
    request_sig = request.headers.get("x-wc-webhook-signature")
    signature = hmac.new(<your_secret_key>.encode(), request.payload, hashlib.sha256).digest()
    if hmac.compare_digest(
            request_sig.encode(), base64.b64encode(signature)
    ):
        return True
    return False
    

    您可以将 DRF 中的 BaseAuthentication 子类化并将其放入其中并在您的视图中将该类用作 authentication_classes

    【讨论】:

    • 谢谢你。这是非常有用的信息,因为我不想让 API 打开。
    【解决方案2】:

    你能解释一下如何阅读和比较这个网络钩子签名吗?

    我也在尝试实现从 Woocommerce 到 Django 的 webhook,但在文档中找不到任何信息。

    @csrf_exempt def web_hook(请求): 打印(请求。正文)

    email_subj = 'web Hook'
    email_msg = request.body
    email_from = 'erp@1inmind.bg'
    email_list = ['k.georgiev@1inmind.com']
    email = EmailMessage(email_subj, email_msg, email_from, email_list)
    email.send()
    

    【讨论】: