By MBPDLPayday Loans

POST表单数据到第三方网页

Post表单到另外一个网页用于接收. .Net Framework里面对于实现了IButtonControl的控件都有一个postbackurl属性, 比如Button, ImageButton, LinkButton. 在目标页可以通过Page的PreviousPage属性访问源页面的信息:

TextBox txtName = (TextBox)Page.PreviousPage.FindControl("txtName");

这个东西挺好, 可惜银行的接口页面不一定会按照我想的来实现, 还是需要老老实实地把该传的字段给post过去. 嗯, 仅仅把内容构造出来post过去当然简单, 但这仅仅是server端的会话, post过去之后无法把用户导向到相应的网银页面上 — 如果用Response.Redirect, 那么实际上先前的会话已经结束了. 改用Html控件的话又有问题 — 我必须在用户点击按钮的时候完成这么几件事情:

1. 把订单保存起来, 存到数据库, 方便稍后用户付款完毕后与网银反向post回来的数据做核对;
2. 表单post到网银页面;
3. 平稳地重定向用户到网银页面 — 用户无需记录在我这里生成的订单重新输入到网银的表单里;

需求中,2和3看起来用html控件可以完成, 但是同时要完成1就必须使用服务器端控件.

放狗先搜一下吧, 也许.Net有设想过这种场景, 如果没有的话, 我在订单预览的前一步就把订单存到数据库里面也算一个workaround solution.

值得庆幸的是,Google帮我找到一个哥们也有类似的需求, 也是跟银行交互操作:Posting form data from ASP.NET page to another URL

作者给出了相应的class, 可惜由于c-sharpcorner.com网站过滤了内容中的html代码, 导致网页上看到的那个类文件残缺不全. 可笑的是, 国内很多小偷网站也全盘照抄, 比如这里这里. 这些极其不道德的骗广告流量的网站什么时候能关掉些呢?

好在作者提供了demo文件的下载. 我把class还原出来吧:

private System.Collections.Specialized.NameValueCollection Inputs = 
    new System.Collections.Specialized.NameValueCollection();

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

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

public void Post()
{
    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();
}

呵呵, 实际上关键的地方就在于被c-sharpcorner.com屏蔽掉的那几行html代码, 作用在于构造一个html网页, 把form post出去.

源页面这样做:

RemotePost myremotepost = new RemotePost();
myremotepost.Url = http://www.jigar.net/demo/HttpRequestDemoServer.aspx;
myremotepost.Add("field1","Huckleberry");
myremotepost.Add("field2","Finn");
myremotepost.Post() ;

接收页面Sample:

<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e){
if (Request.Form["field1"] != null ){
Response.Write("field1 : " + Request.Form["field1"] + "")}
if(Request.Form["field2"] != null ){
Response.Write("field2 : " +Request.Form["field2"] + "")}
}
</script>

BTW,文中的代码有可能在rss阅读器中被过滤. 感谢原作者:Jigar Desai.

Leave a Reply