Xero API 使用 Python 和 Azure 函数的 Webhook 服务器
Xero API Webhook Server using Python and Azure functions
我正在使用 Azure Function Apps 从 Xero 接收 webhooks 进行处理。但是,我无法正确计算我的 HASH。
我认为这与 Python 处理 Body 请求的方式有关。
代码如下:
#import Logging module to log errors to console
import logging
#import Azure Functions
import azure.functions as func
#import Cryptopackages
import hmac
import hashlib
import base64
#import JSON
import json
XERO_KEY = 'key here'
#function to generate key
def create_sha256_signature(key, message):
messagecoded = bytes(message, 'UTF-8')
return base64.b64encode(hmac.new(key.encode(), messagecoded, digestmod=hashlib.sha256).digest()).decode()
#Define Main function - Recieve a HTTP reponse
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Recieved a Request from Xero')
#Parse HASH Key from Header
xerosign = req.headers.get('x-xero-signature')
logging.info(xerosign)
#Get JSON body
Data = req.get_body()
Body = Data
#Body = json.dumps(payload, separators=(",", ":")).strip()
logging.info(Body)
#Get Signature from defined function
signature = create_sha256_signature(XERO_KEY, str(Body))
logging.info(signature)
logging.info(xerosign)
if hmac.compare_digest(xerosign, signature):
return func.HttpResponse(
status_code=200)
else:
return func.HttpResponse(
status_code=401
)
Body请求是
{
"events": [],
"lastEventSequence": 0,
"firstEventSequence": 0,
"entropy": "TXHKKDMKUHWFBYTVJSQU"
}
Header x-xero-signature = C7G5M2SVxs/fAJM8fFLahzex32Rr7jwMHixX/OgvkFQ=
我已经发布了 implementing webhooks using node 的示例。虽然语言不同,但概念保持不变。重要的是不要修改传入的原始请求正文,否则签名验证将失败。当使用 node 和 express 时,这意味着将 body-parser 中间件配置为使用专门用于 webhooks 端点的原始请求主体。链接文章中包含一个示例。
此外,另一位 Xero Developer Evangelist 在 implementing webhooks in aws lambda using python 上写了这个 post。虽然本文中的内容超出您的需要,但它确实包含一个代码片段,可以帮助您通过“意图接收”签名验证。
在回顾了 Rett Behrens 所做的工作并深入研究了 Azure Function App 处理数据的方式之后。我有一个利用 Node.js 的有效解决方案,它规定了 Microsoft 处理 API 响应的方式,如果您不输入“正文”:“”,它会自动从初始 post请求。因此导致 Xero 除了空体之外的问题。
https://github.com/mast3rbow/Xero-Functionapp
github 存储库包括我的工作示例,将使企业能够将 Xero 事件直接发送到 Microsoft Power Automate 以在那里进行一些逻辑处理。
我正在使用 Azure Function Apps 从 Xero 接收 webhooks 进行处理。但是,我无法正确计算我的 HASH。
我认为这与 Python 处理 Body 请求的方式有关。
代码如下:
#import Logging module to log errors to console
import logging
#import Azure Functions
import azure.functions as func
#import Cryptopackages
import hmac
import hashlib
import base64
#import JSON
import json
XERO_KEY = 'key here'
#function to generate key
def create_sha256_signature(key, message):
messagecoded = bytes(message, 'UTF-8')
return base64.b64encode(hmac.new(key.encode(), messagecoded, digestmod=hashlib.sha256).digest()).decode()
#Define Main function - Recieve a HTTP reponse
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Recieved a Request from Xero')
#Parse HASH Key from Header
xerosign = req.headers.get('x-xero-signature')
logging.info(xerosign)
#Get JSON body
Data = req.get_body()
Body = Data
#Body = json.dumps(payload, separators=(",", ":")).strip()
logging.info(Body)
#Get Signature from defined function
signature = create_sha256_signature(XERO_KEY, str(Body))
logging.info(signature)
logging.info(xerosign)
if hmac.compare_digest(xerosign, signature):
return func.HttpResponse(
status_code=200)
else:
return func.HttpResponse(
status_code=401
)
Body请求是
{
"events": [],
"lastEventSequence": 0,
"firstEventSequence": 0,
"entropy": "TXHKKDMKUHWFBYTVJSQU"
}
Header x-xero-signature = C7G5M2SVxs/fAJM8fFLahzex32Rr7jwMHixX/OgvkFQ=
我已经发布了 implementing webhooks using node 的示例。虽然语言不同,但概念保持不变。重要的是不要修改传入的原始请求正文,否则签名验证将失败。当使用 node 和 express 时,这意味着将 body-parser 中间件配置为使用专门用于 webhooks 端点的原始请求主体。链接文章中包含一个示例。
此外,另一位 Xero Developer Evangelist 在 implementing webhooks in aws lambda using python 上写了这个 post。虽然本文中的内容超出您的需要,但它确实包含一个代码片段,可以帮助您通过“意图接收”签名验证。
在回顾了 Rett Behrens 所做的工作并深入研究了 Azure Function App 处理数据的方式之后。我有一个利用 Node.js 的有效解决方案,它规定了 Microsoft 处理 API 响应的方式,如果您不输入“正文”:“”,它会自动从初始 post请求。因此导致 Xero 除了空体之外的问题。
https://github.com/mast3rbow/Xero-Functionapp
github 存储库包括我的工作示例,将使企业能够将 Xero 事件直接发送到 Microsoft Power Automate 以在那里进行一些逻辑处理。