You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Hotcakes自定义支付提供商后续配置步骤的技术问询

Handling Payment Provider Webhooks & Return URLs in Hotcakes Commerce

Let me break this down for you based on Hotcakes Commerce's structure and real-world payment integration best practices:

1. Where to Handle Server-to-Server (Webhook) Responses

Hotcakes doesn’t include a dedicated out-of-the-box endpoint for payment provider webhooks, but you can easily build one yourself:

  • Add a custom controller action or create a dedicated API controller: Since Hotcakes runs on ASP.NET, you can either extend the existing CheckoutController or make a new controller (like PaymentWebhookController) with an HttpPost action that listens for the provider's server-side calls.
  • Critical steps for the webhook action:
    • First, validate the request’s authenticity (most providers send a signature or secret key you can cross-check to block spoofed requests).
    • Extract key data from the payload: order ID, payment status, transaction ID, and any error details.
    • Use Hotcakes' OrderService to update the order’s payment status (e.g., mark as Paid, Pending, or Failed) and attach transaction records.
    • Send a 200 OK response back to the provider to confirm you’ve received and processed the webhook (many providers will retry if they don’t get this).

Example code snippet for the webhook action:

[HttpPost]
public ActionResult ProcessPaymentWebhook()
{
    // 1. Validate request signature (adjust logic to match your provider's requirements)
    var incomingSignature = Request.Headers["X-Payment-Signature"];
    if (!ValidateWebhookSignature(incomingSignature, Request.InputStream))
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    // 2. Parse the provider's payload
    var payload = new StreamReader(Request.InputStream).ReadToEnd();
    var paymentResponse = JsonConvert.DeserializeObject<PaymentProviderWebhookResponse>(payload);
    
    // 3. Update the order in Hotcakes
    var orderService = new OrderService(HccApp);
    var targetOrder = orderService.FindByBvin(paymentResponse.OrderId);
    
    if (targetOrder != null)
    {
        targetOrder.PaymentStatus = paymentResponse.IsSuccess ? PaymentStatus.Paid : PaymentStatus.Failed;
        targetOrder.Transactions.Add(new OrderTransaction { 
            TransactionId = paymentResponse.TransactionId, 
            Amount = targetOrder.TotalAmount,
            TransactionDate = DateTime.UtcNow
        });
        orderService.Update(targetOrder);
    }

    // 4. Confirm receipt to the payment provider
    return new HttpStatusCodeResult(HttpStatusCode.OK);
}

2. Constructing a Proper Return URL

The return URL is what the provider uses to redirect users back to your store after they complete the payment flow. Here’s how to build it correctly:

  • Generate an absolute URL: Payment providers require full, absolute URLs (not relative paths). Combine your store’s base domain with the target action using ASP.NET’s URL helpers.
  • Include unique identifiers: Add parameters like the order ID or session ID to the URL so you can retrieve the exact order when the user returns.
  • Build it dynamically in ProcessCheckout: Generate the URL right before sending the user to the payment provider, so you can pass the current order’s details.

Example of generating a return URL in ProcessCheckout:

public ActionResult ProcessCheckout()
{
    // Get the current order from the user's shopping cart
    var currentOrder = HccApp.OrderServices.CurrentShoppingCart.Order();
    
    // Generate relative URL first, then convert to absolute
    var relativeReturnUrl = Url.Action("PaymentReturn", "Checkout", new { orderId = currentOrder.bvin });
    var absoluteReturnUrl = new Uri(Request.Url.GetLeftPart(UriPartial.Authority), relativeReturnUrl).ToString();
    
    // Pass this URL to your payment provider's API request
    var paymentRequest = new PaymentProviderInitiationRequest
    {
        ReturnUrl = absoluteReturnUrl,
        OrderId = currentOrder.bvin,
        TotalAmount = currentOrder.TotalAmount,
        // Add other required fields (customer info, billing address, etc.)
    };
    
    // Redirect the user to the payment provider's portal
    var paymentRedirectUrl = YourPaymentProviderClient.GetPaymentPageUrl(paymentRequest);
    return Redirect(paymentRedirectUrl);
}

Then, in your CheckoutController's PaymentReturn action, you can use the orderId parameter to fetch the order, verify its status (either by checking the webhook-updated record or calling the payment provider’s API), and show the user a success/failure page.


内容的提问来源于stack exchange,提问作者MBouwman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:11:52