我在从aspx页面重定向到mvc操作时遇到问题。实际上aspx是支付网关的响应处理程序。然后根据响应代码将用户重定向到适当的操作。然而,我在重定向过程中遇到了一些问题。早些时候,我曾尝试接受MVC操作上的响应,但我遇到了一个错误,因此我决定使用aspx来处理响应并重定向到MVC操作。
下面是aspx页面中的代码:
<%@ Page Language="C#" %>
<script runat="server">
protected void Page_Load(Object sender, System.EventArgs e)
{
String result = System.Web.HttpContext.Current.Request["result"];
String paymentID = System.Web.HttpContext.Current.Request["paymentid"];
String respons = System.Web.HttpContext.Current.Request["responsecode"];
String err = System.Web.HttpContext.Current.Request["Error"];
String errmsg = System.Web.HttpContext.Current.Request["ErrorText"];
String tid = System.Web.HttpContext.Current.Request["Trackid"];
String query = String.Format("checkout/PaymentResult?result={0}&paymentid={1}&responsecode={2}&error={3}&errortext={4}&trackid={5}", result, paymentID, respons, err, errmsg, tid);
var _file = new System.IO.StreamWriter(Server.MapPath("~/Response.log"), true);
_file.WriteLine(query);
_file.Close();
//Below line is working fine in aspx pages
System.Web.HttpContext.Current.Response.Write("Redirect=" + ConfigurationManager.AppSettings["BaseURL"].ToString() + query);
//Tried below two, not working
//System.Web.HttpContext.Current.Response.Redirect(ConfigurationManager.AppSettings["BaseURL"].ToString() + query);
//Response.RedirectPermanent(ConfigurationManager.AppSettings["BaseURL"].ToString() + query);
}
</script>
mvc操作响应处理程序的支付网关响应:
如果我通过网站的URL和下面的"checkout/PaymentResult
"我得到下面的错误。
09:38:40,872 FATAL event.com.aciworldwide.commerce.gateway.payment.MerchantNotificationService [TP-Processor5] - Hack characer/length check failed on redirect URL:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="X-UA-Compatible" content="IE=9">
<title>XXXXXXXss.com - Free home Delivery</title>
此外,我注意到在ASPX中,由于某些原因,页面会被调用两次。第一次使用所有值来自支付网关,第二次使用空白值。请参阅下面的日志文件详细信息。
checkout/PaymentResult?result=CAPTURED&paymentid=582000001361270&responsecode=00&error=&errortext=&trackid=300009
checkout/PaymentResult?result=&paymentid=&responsecode=&error=&errortext=&trackid=
更新
控制器代码:
public ActionResult PaymentResult(string result, string paymentid, string responsecode, string error, string errortext, string trackid)
{
var cart = _workContext.CurrentCustomer.ShoppingCartItems.Where(sci => sci.ShoppingCartType == ShoppingCartType.ShoppingCart)
.LimitPerStore(_storeContext.CurrentStore.Id)
.ToList();
// transaction response code
String _result = (!string.IsNullOrEmpty(result)) ? result : "null";
String _paymentId = (!string.IsNullOrEmpty(paymentid)) ? paymentid : "null";
String _response = (!string.IsNullOrEmpty(responsecode)) ? responsecode : "null";
String _err = (!string.IsNullOrEmpty(error)) ? error : "null";
String _errMessage = (!string.IsNullOrEmpty(errortext)) ? errortext : "null";
String _trackID = (!string.IsNullOrEmpty(trackid)) ? trackid : "null";
// define message string for errors
String _message = getResponseDescription(_response);
Session["PaymentMessage"] = String.Format("Message: {0}, Code: {1}", _message, responsecode);
try
{
var order = _orderService.GetOrderById(Convert.ToInt32(_trackID));
if (_result.Equals("CAPTURED"))
{
try
{
try
{
order.OrderNotes.Add(new OrderNote
{
Note = String.Format("Bank Response= {0}, Code= {1}", _result, _response),
DisplayToCustomer = false,
CreatedOnUtc = DateTime.UtcNow
});
_orderService.UpdateOrder(order);
}
catch (Exception ex)
{
LogException(ex);
}
cart.ToList().ForEach(sci => _shoppingCartService.DeleteShoppingCartItem(sci, false));
order.CaptureTransactionResult = _message;
_orderService.UpdateOrder(order);
_orderProcessingService.MarkOrderAsPaid(order);
}
catch (Exception ex)
{
LogException(ex);
}
return RedirectToRoute("CheckoutCompleted", new { orderId = order.Id });
}
else
{
_orderService.UpdateOrder(order);
order.CaptureTransactionResult = _message;
_orderProcessingService.CancelOrder(order, true);
return Redirect(Url.Action("Cart", "ShoppingCart"));
}
}
catch (Exception ex)
{
LogException(ex);
return Redirect(Url.Action("Cart", "ShoppingCart"));
}
}
我添加了!IsPostBack
,但它仍然没有任何作用,空白行仍然不断出现。
更新2:
我认为问题是在我从网关重定向回应用程序后,会话丢失了。此外,我正在使用一个网络花园,所以我相信工人的流程会发生变化。但是,我使用的是ASP.NET进程外会话状态。
如何在网络花园中共享会话数据?
我们重定向的方式是从webform应用程序提供完整的url,而不仅仅是控制器/操作位。所以请尝试附加域部分,例如http://www.yoururl.com/checkout/paymentresult...
N.B我们的网站mvc和webforms都部署在不同端口号的独立iis网站上。两者共享会话信息。
希望能有所帮助。
更新:刚刚注意到你正在附加BaseUrl,所以肯定还有其他内容。:)
此外,我认为我们必须将if(!isPostBack())
用于页面加载方法。这可以解决双重过账的一个问题