C# 通过MVC3控制器形成post

C# 通过MVC3控制器形成post,c#,ajax,asp.net-mvc-3,C#,Ajax,Asp.net Mvc 3,我必须做一个支付网关集成,当我们做结帐,我们需要在我们这边处理订单,然后我们需要张贴到支付网关的网址。我无法在控制器b/c中使用重定向。在服务器端处理订单后,我需要通过post向paymentgateway提供商发送数据,因此在cshtml中,默认的post将是我们处理订单的操作。在控制器内部,我需要再次向paymentgateway发送post,该post将更改url和信用卡信息在提供商获取信用卡信息后,控制权将再次回到我们的网站。我希望我的问题清楚 保存订单后,我需要将浏览器移动到PAYU页

我必须做一个支付网关集成,当我们做结帐,我们需要在我们这边处理订单,然后我们需要张贴到支付网关的网址。我无法在控制器b/c中使用重定向。在服务器端处理订单后,我需要通过post向paymentgateway提供商发送数据,因此在cshtml中,默认的post将是我们处理订单的操作。在控制器内部,我需要再次向paymentgateway发送post,该post将更改url和信用卡信息在提供商获取信用卡信息后,控制权将再次回到我们的网站。我希望我的问题清楚

保存订单后,我需要将浏览器移动到PAYU页面,这不起作用b/c MerchantReferenceEnumber通过post发送,重定向被拒绝访问

private void PostFormToPayU()
    {
        string url = "https://secure.safeshop.co.za/SafePay/Lite/Index.asp";
        var webClient = new WebClient();

        try
        {
            NameValueCollection vals = new NameValueCollection();

            vals.Add("SafeKey", "{XXXX-XXX-XXX-XX-XXXXXX}");
            vals.Add("MerchantReferenceNumber", "Test2");
            vals.Add("TransactionAmount", "599");
            vals.Add("CurrencyCode", "ZAR");
            vals.Add("ReceiptURL", "http://localhost:47638/Home/About");
            vals.Add("FailURL", "http://localhost:47638/Home/New");
            vals.Add("TransactionType", "Auth");

            byte[] responseArray = webClient.UploadValues(url, vals);
            Stream s = new MemoryStream(responseArray);
            Redirect("https://secure.safeshop.co.za/SafePay/Lite/Index.asp");
            //return new System.Net.Response(responseArray, (int)HttpStatusCode.OK);
            Console.WriteLine("stop");
        }
        catch (WebException e)
        {
            var response = (HttpWebResponse)e.Response;
            //byte[] responseBytes = IOUtil.StreamToBytes(response.GetResponseStream());
            //return new Response(responseBytes, (int)response.StatusCode);
            Console.WriteLine("stop");
        } 
    }

我认为您只需要设置一个web请求(WebRequest.Create)来创建一个HttpWebRequest。这可以使用您试图发布到的系统的URL创建

您需要将来自web站点的数据打包成预期消息的格式,并将其写入请求流

简言之,这就是它,显然在细节方面还有更多


您也可以考虑将这种处理从控制器中移到某种服务中,因为它是相当无效的。

到目前为止,我认为最好的解决方案是

 var context = HttpContext.Current;
        context.Response.Clear();
        context.Response.Write("<html><head>");
        context.Response.Write(string.Format("</head><body onload=\"document.{0}.submit()\">", FormName));
        context.Response.Write(string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", FormName, Method, Url));
        for (int i = 0; i < inputValues.Keys.Count; i++)
            context.Response.Write(string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", HttpUtility.HtmlEncode(inputValues.Keys[i]), HttpUtility.HtmlEncode(inputValues[inputValues.Keys[i]])));
        context.Response.Write("</form>");
        context.Response.Write("</body></html>");
        context.Response.End();
var context=HttpContext.Current;
context.Response.Clear();
context.Response.Write(“”);
context.Response.Write(string.Format(“,FormName));
Write(string.Format(“,FormName,Method,Url));
对于(int i=0;i

在数据库中保存订单后,我可以呈现html页面并提交表单onload()。inputValues是我需要传递给支付网关的名称值集合。

不幸的是,您的问题不清楚;这里没有一个问题。你的问题是什么?你有什么问题吗?对不起,考虑一个场景MyWebStale:PayMealGuest-MyWeHSt铺,我需要采取信用卡信息,控制流程如我所示。现在在我的网店中,我有一个checkoutcontroller,在我获取信用卡信息之前,有一些订单参数需要保存在我的数据库中,所以表单提交将进入我的控制器操作我将其保存在数据库中我的paymentgateway接受表单post,但要保存数据html表单在保存数据后在网店中发布,我需要将其发布到支付网关这将把用户带到网关网站,在那里他输入信用卡。我需要从控制器内部发送表单帖子不能使用webclient b/c它不会更改urlwebrequest不会更改浏览器。用户需要在支付网关提供商urlYes中输入信用卡,因此一旦您发布了上述内容,您将获得一个返回URL。然后,您可以使用用户重定向(url)将用户浏览器导航到网关url。