在 Django 中实现 webhook

时间:2021-08-01 21:45:36

标签: django notifications webhooks

我以前从未实现过 webhook。我正在处理付款确认,我需要知道付款是否成功,如果成功,客户应该被重定向到付款完成站点。下面是结帐页面的视图。

请注意,该视图是 GET 而不是 POST,因为在付款过程中,客户端将使用第三方付款应用程序来处理付款,一旦付款处理完毕,第三方应用程序将以某种方式再次调用 Payment 视图.使用帖子视图时遇到错误

<块引用>

此网页需要您之前输入的数据,以便 正确显示。您可以再次发送此数据,但这样做您 将重复此页面之前执行的任何操作。按下 重新加载按钮重新提交加载页面所需的数据 ERR_CACHE_MISS

class Payment(View):
    def __init__(self):
        #Get model webshopRestaurant data for hd2900 restaurant for location id for this restaurant
        self.hd2900RestaurantObject = RestaurantUtils(restaurantName = restaurantName)

    def get(self, request, *args, **kwargs):
        #Check if session is still valid 
        sessionValid = webshopUtils.checkSessionIdValidity(request = request, session_id_key = session_id_key, validPeriodInDays = self.hd2900RestaurantObject.restaurantModelData.session_valid_time)
        
        #In this case the session has expired and the user will be redirected
        if sessionValid is False:
            return redirect('hd2900_takeaway_webshop')
        
        if 'pickupForm' in request.GET:
            deliveryType ='pickup'
        elif 'deliveryForm' in request.GET:
            deliveryType = 'delivery'
        elif ('deliveryForm' not in request.GET) and ('pickupForm' not in request.GET):
            #Here is where I need to implement the webhook
            pass

        #Write the customer info into the data base
        webshopUtils.create_or_update_Order(session_id_key=session_id_key, request=request, deliveryType = deliveryType)

        #Calculate the total price followed by creation of paymentID from NETS
        if 'pickupForm' in request.GET:
            totalPrice = webshopUtils.get_BasketTotalPrice(request.session[session_id_key]) + self.hd2900RestaurantObject.restaurantModelData.bagFee
        elif 'deliveryForm' in request.GET:
            totalPrice = webshopUtils.get_BasketTotalPrice(request.session[session_id_key]) + self.hd2900RestaurantObject.restaurantModelData.delivery_fee + self.hd2900RestaurantObject.restaurantModelData.bagFee

        #Create an order reference and link that to NETS reference
        reference = webshopUtils.get_order_reference(request = request, session_id_key=session_id_key)

        #Get the payment id from NETS 
        payment = NETS()
        paymentId = payment.get_paymentId(platform = platform,
        reference = reference, 
        name = 'Hidden Dimsum 2900 Takeaway',
        paymentReference = session_id_key,
        unitPrice = int(totalPrice) *100)

        if paymentId.status_code == 201:
            paymentId = paymentId.json()['paymentId']

        #Put the checkout key and the payment id into the page that javascript is going to read from during payment
        checkoutKey = payment.getCheckoutKey(platform = platform)

        context = dict()
        context['paymentId'] = paymentId
        context['checkoutKey'] = checkoutKey

        return render(request, template_name="takeawayWebshop/webshopPayment.html", context = context)

上面代码中的elif语句中是我需要监听webhook的地方,看支付是否成功。在创建付款部分下的这个 documentation 中,可以在请求付款 ID 时添加网络钩子(在通知键中),但我不知道如何在 Django 中实现这一点。文档片段说

<块引用>

通知 - 用于获取交易状态(可选) webhooks - 商家想要注册的 webhooks 列表 支付。 webhook 的最大数量为 32。 eventName - 输入事件 你想监听 url - 回调被发送到这个 url 商家网站。必须是 https。最大长度为 256 个字符。 授权 - 发送到商家站点的回调标题将 设置为该值。长度必须在 8 到 32 个字符之间,并且 字母数字。

这个帖子和这个post的问题非常相似,但是在研究了这个问题之后我仍然不确定如何实现它。尤其是我真的不知道 webhook 是如何工作的。它就像一个我经常需要调用它的 get 请求吗?我应该如何在 webhook 中形成 url 以便我知道这个 url 是针对这个特定的支付会话?

最后对我来说重要的是添加我首先需要收听 webhook 的原因。在获得付款 ID 后的付款集成中,我使用下面的 javascript 来呈现嵌入在我的页面中的付款表格。付款完成后,它将重定向到“/paymentComplete”网址。这里的问题是在支付过程中,如果用户重新加载页面,那么 get 方法将再次被调用,在这种情况下,下面的 javascript 将不再起作用。

$(document).ready(function() {
    //Get payment id from server
    var paymentId = document.getElementById("paymentId").innerHTML.trim();
    var checkoutKey = document.getElementById("checkoutKey").innerHTML.trim();

    const checkoutOptions = {
        checkoutKey: checkoutKey,
        paymentId: paymentId,
        containerId: "checkout-container-div",
        };
        
        const checkout = new Dibs.Checkout(checkoutOptions)
        checkout.on('payment-completed', function (response) {
            window.location = '/paymentComplete';
        });
});

0 个答案:

没有答案