0

当我们结帐时,我必须与支付网关集成,我们需要在我们这边处理订单,然后我们需要发布到支付网关 url。我不能在控制器中使用重定向 b/c 需要在我们的服务器端处理订单后通过 post 向支付网关提供商发送数据,因此在 cshtml 中,默认帖子将发送到我们在控制器内部处理订单的操作之后我需要做一个帖子再次访问将更改 URL 和信用卡信息的支付网关,并且在提供商获取信用卡信息后,控制权再次返回到我们的网站。我希望我的问题很清楚

保存订单后,我需要将浏览器移动到 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");
        } 
    }
4

2 回答 2

0

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

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

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

此外,您可能需要考虑将这种处理从控制器移到某种服务中,因为它相当复杂。

于 2012-11-13T12:21:33.003 回答
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 是我需要传递给支付网关的名称值集合。

于 2012-11-14T06:35:46.923 回答