Nopcommerce - 自定义支付方式的 PostProcessPayment 不重定向到支付网关 URL

Nopcommerce - Custom Payment Method's PostProcessPayment not redirecting to Payment Gateway URL

我正在为 Nopcommerce 网站开发自定义支付方式插件。这是支付处理器 class 代码:

public class CODBookingPaymentProcessor : BasePlugin, IPaymentMethod
{
    private IShoppingCartService _shoppingCartService;
    private IOrderService _orderService;
    private IHttpContextAccessor _httpContextAccessor;

    #region Ctor
    public CODBookingPaymentProcessor(IShoppingCartService shoppingCartService,
        IOrderService orderService, IHttpContextAccessor httpContextAccessor)
    {
        this._shoppingCartService = shoppingCartService;
        this._orderService = orderService;
        this._httpContextAccessor = httpContextAccessor;
    }
    #endregion

    ~~~~~~~~~~~~~~~~ SOME CODE ~~~~~~~~~~~~~~~~~~~~~
public void PostProcessPayment(PostProcessPaymentRequest postProcessPaymentRequest)
    {
          // some code
          string url = protocol + host + "/" + "PaymentCODBooking/ProcessInternetPayment";

        _httpContextAccessor.HttpContext.Response.Redirect(url);
    }

断点在最后一行并且 url 正在正确形成。但是当在结帐页面上单击 CONFIRM 按钮时,页面不会重定向到 url。它只是停留在页面上或有时会清空购物车。这意味着正在创建订单而无需转到支付网关。

更新

重定向在 CheckoutControllerConfirmOrder 操作中也不起作用。

if (_webHelper.IsRequestBeingRedirected || _webHelper.IsPostBeingDone)
{
    //redirection or POST has been done in PostProcessPayment
    //return Content("Redirected");

    return Redirect("http://localhost:15536/PaymentCODBooking/ProcessInternetPayment");
}

重定向必须是操作结果。例如在控制器的动作中我们这样写:

return Redirect("http://www.google.com");

没有 return 关键字,它不会重定向。

要从插件控制器重定向,请查看 \Plugins\Nop.Plugin.Payments.PayPalStandard\Controllers\PaymentPayPalStandardController.cs class 开箱即用的 PayPalStandard 插件

如果您正在尝试开发插件,最好不要更改 nopCommerce 源代码。您可以在插件本身中执行重定向,不要更改 CheckoutControllerConfirmOrder 操作。将您的代码更改为:

public void PostProcessPayment(PostProcessPaymentRequest postProcessPaymentRequest)
{
      // some code
      string url = protocol + host + "/" + "PaymentCODBooking/ProcessInternetPayment";

    _httpContextAccessor.HttpContext.Response.Redirect(url);
    return;
}

您可以在 ConfirmOrder 操作中找到这些行。 PostProcessPayment后应用会丰富到这里。重定向在这里执行:

if (_webHelper.IsRequestBeingRedirected || _webHelper.IsPostBeingDone)
{
    //redirection or POST has been done in PostProcessPayment
    return Content("Redirected");
}

谢谢大家的帮助。您的回答给了我一些提示并找到了问题所在。问题是我忘记设置 public PaymentMethodType PaymentMethodType => PaymentMethodType.Redirection;。它被设置为 Standard 导致了问题。

将 PaymentMethodType 更改为 PaymentMethodType.Redirection 它会起作用