什么是Webhook?

下面的图表展示了轮询和Webhook之间的比较。

77252f44deabec6738e1bc38c0edf1af.png

假设我们经营一个电子商务网站。客户通过API网关将订单发送到订单服务,该服务再进行支付交易。支付服务随后与外部支付服务提供商(PSP)通信以完成交易。

处理与外部PSP的通信有两种方式:

1.短轮询在向PSP发送支付请求后,支付服务会不断询问PSP支付状态。经过几轮后,PSP最终返回状态。短轮询有两个缺点:1.不断轮询状态会占用支付服务的资源。2.外部服务直接与支付服务通信,存在安全漏洞。2.Webhook我们可以向外部服务注册一个Webhook。这意味着:当请求有更新时,请调用指定的URL来通知我。当PSP完成处理后,它将调用HTTP请求来更新支付状态。这种方式改变了编程范式,支付服务不再需要浪费资源轮询支付状态。

如果PSP没有回调怎么办?我们可以设置一个每小时检查支付状态的定时任务。

Webhook通常被称为反向API或推送API,因为服务器向客户端发送HTTP请求。在使用Webhook时,我们需要注意以下三个方面:

1.我们需要为外部服务设计一个适当的API,以供其调用。2.出于安全原因,我们需要在API网关中设置适当的规则。3.我们需要在外部服务中注册正确的URL。

当然!以下是一个示例代码,演示了如何使用Python和Flask创建一个处理支付状态更新的Webhook服务器:

import json
from flask import Flask, request, abort


app = Flask(__name__)


@app.route('/webhook/payment', methods=['POST'])
def payment_webhook():
    data = request.get_json()
    if not data:
        abort(400, 'Invalid request payload.')


    # 验证请求来源
    if not verify_request_origin(request):
        abort(401, 'Unauthorized request.')


    # 处理支付状态更新
    payment_id = data['payment_id']
    status = data['status']
    update_payment_status(payment_id, status)


    return json.dumps({'message': 'Payment webhook received'}), 200, {'Content-Type': 'application/json'}


def verify_request_origin(request):
    # 进行请求来源验证的逻辑
    # 如果请求不是来自预期的外部服务,返回False


    # 示例中简单地验证请求的来源IP是否在允许的IP列表中
    allowed_ips = ['123.456.789.0', '987.654.321.0']
    request_ip = request.remote_addr
    if request_ip not in allowed_ips:
        return False


    return True


def update_payment_status(payment_id, status):
    # 执行更新支付状态的逻辑
    # 根据payment_id和status更新数据库或调用其他服务等
    # ...


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

在上述示例中,我们首先定义了一个/webhook/payment端点,用于接收支付状态更新的Webhook请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小技术君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值