通过Controller MVC3发布表格

时间:2012-11-13 12:07:23

标签: c# ajax asp.net-mvc-3

当我们结账时,我必须与支付网关集成,我们需要处理订单,然后我们需要发送到支付网关网址。我不能在控制器b / c中使用重定向需要在我们的服务器端处理订单之后通过post发送数据到paymentgateway提供商所以在cshtml中默认的帖子将是我们处理的操作Order之后我需要做内部控制器再次到支付网关,将更改网址和信用卡信息,并在提供商提供信用卡信息后控制再次返回我们的网站。我希望我的问题清楚

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

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");
        } 
    }

2 个答案:

答案 0 :(得分:0)

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

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

简而言之,显然在细节方面还有更多。

此外,您可能需要考虑将此类处理从控制器移到某种服务中,因为它是相当明确的。

答案 1 :(得分:0)

直到现在我认为最好的解决方案是

 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();

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