【问题标题】:How to do a remote post from controller in ASP.NET Core如何在 ASP.NET Core 中从控制器进行远程发布
【发布时间】:2021-09-14 00:38:41
【问题描述】:

我有一个结帐页面,应该将用户重定向到支付网关支付处理页面。它期望发布表单数据(金额、Access_key、Order_id 等;)。

到目前为止我得到的是这个;

public class OrderController : Controller {
  private readonly IOrderService _service;

  public OrderController(IOrderService service) {
    _service = service;
  }

  [HttpGet]
  public async Task<IActionResult> Index () {
    // order processing form
    // order model binding code not included for brevity.
    return View();
  }

  [HttpPost]
  public async Task<IActionResult> ProcessOrder (OrderModel model) {
    var orderId = _service.CreateOrder(model);
    // order processing code not included for brevity. (basically create new order and reduce stock)

    var dataToPost = new PGData() {
      Amount = 10,
      Currency = USD,
      TxId = orderId,
      SuccessUrl = "https://test@domain.com/order/success",
      FailedUrl = "https://test@domain.com/order/fail"
      Access_Key = "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
      Field_Hash = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    };

    // need to redirect user to ("https://pg@pgdomain.com/paynow") with the post data above
  }

}

我发现了一个适用于 .Net Framework 但不适用于 .Net Core 的代码 sn-p:

private class RemotePost
{
  private NameValueCollection Content = new NameValueCollection();

  public string Url = "";
  public string Method = "post";
  public string FormName = "form1";

  public void Add(string name, string value)
  {
    Content.Add(name, value);
  }

  public void Post()
  {
    HttpContext.Response.Body.WriteAsync(bytes);
    System.Web.HttpContext.Current.Response.Clear();

    System.Web.HttpContext.Current.Response.Write("<html><head>");

    System.Web.HttpContext.Current.Response.Write(string.Format("</head><body onload=\"document.{0}.submit()\">", FormName));
    
    System.Web.HttpContext.Current.Response.Write(string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", FormName, Method, Url));
    
    for (int i = 0; i < Inputs.Keys.Count; i++)
    {
      System.Web.HttpContext.Current.Response.Write(string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", Inputs.Keys[i], Inputs[Inputs.Keys[i]]));
    }
    
    System.Web.HttpContext.Current.Response.Write("</form>");
    System.Web.HttpContext.Current.Response.Write("</body></html>");

    System.Web.HttpContext.Current.Response.End();
  }
}

如何以尽可能最安全的方式在 .Net Core (3.1) 中实现这一目标?

【问题讨论】:

    标签: asp.net asp.net-core payment-gateway


    【解决方案1】:

    ProcessOrder 方法为外部目标(您的dataToPost)创建远程对象并返回一个视图:

    return View(dataToPost);
    

    ProcessOrder.cshtml 视图接受 PGData 模型:

    @model PGData
    

    此视图包含一个表单,其中包含需要发送到外部目的地的每个属性的隐藏输入:

    <form name="my-form" method="POST" action="https://pg@pgdomain.com/paynow">
      <input type="hidden" asp-for="@Model.Amount"/>
      ...
    </form>
    

    一段 JavaScript 代码将在文档加载时提交此表单:

    window.onload = function(){
      document.forms['my-form'].submit();
    }
    

    通常支付网关会调用您网站中的回调端点,您可以检查支付状态以及数据是否被篡改。

    顺便说一句,您需要仔细阅读网关端点的文档,因为您在这里处理金钱。它们通常为流行的 Web 框架提供示例代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-26
      • 2021-01-19
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多