我以前从未实现过 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';
});
});