C# 前台和后台POST提交信息的實現方法


一、系統A(官網)與系統B(第三方支付平台)數據交換的方式

       1.1  頁面瀏覽器方式:系統A以構造Form表單的方式,通過系統A客戶的瀏覽器重定向到系統B(向系統B發送請求),B系統完成交易后,將交易結果送給A系統。eg:A系統用戶完成注冊后在B系統開戶

        1.2 后台數據流方式:后台數據流方式分為表單和Json格式返回兩種數據格式,開戶和交易接口都是使用表單,查詢類接口使用JSON;A系統服務器,構造Http協議報文,直接訪問B系統,將Http報文發送到B系統,並獲取返回的滿足Http報文協議的字符流。在數據流的方式下,A系統以表單的方式將數據發送到B系統,B系統收到后進行相應的處理。

 

現已第三方提供的Pos機自動代扣的接口為例,分別講解前台和回台數據交換:

          

        

        

二、頁面瀏覽器方式

      2.1 以Form表單的形式提交 

           A、 transfer.aspx頁面,body內容如下,其中注意body標簽的onload事件,form的Action在后台指定;transfer只是中轉頁面,以供在系統中其他頁面只需拋數據到transfer頁面,而不關注與第三方的交互,與第三方交互主要由transfer頁面完成

            <body onload="sub();">
    <form id="formMain" runat="server">
        <input type="hidden" name="Version" value="<%=Version%>" />
        <input type="hidden" name="CmdId" value="<%=CmdId%>" />
        <input type="hidden" name="MerCustId" value="<%=MerCustId%>" />
        <input type="hidden" name="UsrCustId" value="<%=UsrCustId%>" />
        <input type="hidden" name="OpenAcctId" value="<%=OpenAcctId%>" />
        <input type="hidden" name="TransAmt" value="<%=TransAmt%>" />
        <input type="hidden" name="OrdId" value="<%=OrdId%>" />
        <input type="hidden" name="OrdDate" value="<%=OrdDate%>" />
        <input type="hidden" name="CheckDate" value="<%=CheckDate%>" />
        <input type="hidden" name="RetUrl" value="<%=RetUrl%>" />
        <input type="hidden" name="BgRetUrl" value="<%=BgRetUrl%>" />
        <input type="hidden" name="MerPriv" value="<%=MerPriv%>" />
        <input type="hidden" name="ChkValue" value="<%=ChkValue%>" />
    </form>
    <script type="text/javascript">
        function sub() {
            document.getElementById("formMain").submit();
        }
    </script>
</body>

 

       B、 transfer.aspx.cs內容如下:

        

public partial class Interface_POSWithoutCard_Transfer
{
    public readonly string PnrUrl = ChinaPnrInterfaces.GetConfigValue("pnrurl");
    public readonly string Version = ChinaPnrInterfaces.GetConfigValue("pnrversion");
    public readonly string CmdId = "PosWhSave"; //函數名稱
    public string MerCustId = string.Empty; //商戶ID
    public string UsrCustId = string.Empty; //用戶ID(PNRID)
    public string OpenAcctId = string.Empty; //開戶銀行賬號 
    public string TransAmt = string.Empty; //交易金額
    public string OrdId = string.Empty; //訂單號
    public string OrdDate = string.Empty; //訂單日期
    public string CheckDate = string.Empty; //校驗日期
    public string RetUrl = string.Empty; //頁面返回
    public string BgRetUrl = string.Empty; //商戶后台應答地址
    public string MerPriv = string.Empty; //商戶私有域
    public string ChkValue = string.Empty;

    protected void Page_Load(object sender, EventArgs e)
    {
        MerCustId = CurMerCustId;
        UsrCustId = DESEncrypt.Decrypt(Request["UsrCustId"]);
        OpenAcctId = DESEncrypt.Decrypt(Request["OpenAcctId"]);
        TransAmt = DESEncrypt.Decrypt(Request["TransAmt"]);
        CheckDate = DESEncrypt.Decrypt(Request["CheckDate"]);

        OrdId = bll.GetNextOrdId();
        OrdDate = DateTime.Now.ToString("yyyyMMdd");//CurWebUrl
        RetUrl = string.Format("{0}/Interface/POSWithoutCard_Return.aspx?action=frontend&ordid={1}&transamt={2}", CurWebUrl, DESEncrypt.Encrypt(OrdId), DESEncrypt.Encrypt(TransAmt));//第三方支付平台根據此字段獲取前后回應地址,注意,由第三方處理完后回傳的這部分數據其他內容需要通過Request.Form["Name"]獲取,但對於地址后面的action,ordid和transamt需要使用get方式獲取;   公路養護車,雙排座自卸車,散裝飼料運輸車廠家價格(http://www.glyhche.com/ 
         BgRetUrl = string.Format("{0}/Interface/POSWithoutCard_Return.aspx?action=backend&ordid={1}&transamt={2}", CurWebUrl, DESEncrypt.Encrypt(OrdId), DESEncrypt.Encrypt(TransAmt));//后台預防返回地址
        formMain.Action = PnrUrl;//地址為第三方提供的接收頁面

        if (bll.CreateLog(new dw_poswksave_log_model()
        {
            OrdId = OrdId,
            PnrId = UsrCustId,
            BankId = OpenAcctId,
            TransAmt = float.Parse(TransAmt),
            OrdDate = OrdDate,
            CheckDate = CheckDate
        }))
        {
            ChkValue = ChinaPnrInterfaces.SignChkValue(Version + CmdId + MerCustId + UsrCustId
                + OpenAcctId + TransAmt + OrdId + OrdDate + CheckDate + RetUrl + BgRetUrl + MerPriv);
        }

        Response.ContentEncoding = Encoding.GetEncoding("gb2312");
    }

    protected string DateToString(string strDate)
    {
        DateTime date;
        if (!DateTime.TryParse(strDate, out date))
            date = DateTime.Now;

        return date.ToString("yyyyMMdd");
    }

    protected string MoneyToString(string strMoney)
    {
        if (string.IsNullOrEmpty(strMoney))
            strMoney = "0";

        return float.Parse(strMoney).ToString("F2");
    }
}

C、Return.aspx 頁面用於接收第三方支付平台回傳的結果

        <body>
    <% if (ShowUserTip) { %>
    <div class="err">
        <div class="info">
            <div>
                響應信息
            </div>
            <div>
                <div>代碼:<%=RespHFCode%></div>
                <div>描述:<%=RespHFDesc%></div>
            </div>
            <div><%=RespHFCode.Equals(HFOK) ? "" : "請重新提交!"%></div>
        </div>
        <div class="bot">
            <input type="button" value="關閉此窗口" onclick="window.close();" />
        </div>
    </div>
    <% } %>
</body>

 

D、Return.aspx.cs文件如下:

  public readonly string HFOK = "000";
    public string RespHFString = string.Empty;
    public string RespHFCode = string.Empty;
    public string RespHFDesc = string.Empty;
    public string OrdId = string.Empty;
    public string TransAmt = string.Empty;
    public bool ShowUserTip = false;

    protected void Page_Load(object sender, EventArgs e)
    {
        string action = Request["action"];//對應transfer傳遞參數時放在地址后的參數
        if (!string.IsNullOrEmpty(action))
        {
            RespHFString = "RECV_ORD_ID_" + Request.Form["TrxId"];//在頁面顯示
            RespHFCode = Request.Form["RespCode"];
            RespHFDesc = Request.Form["RespDesc"];
            OrdId = DESEncrypt.Decrypt(Request["ordid"]);
            TransAmt = DESEncrypt.Decrypt(Request["transamt"]);

            switch (action)
            {
                case "frontend":
                    ShowUserTip = true;//前台回復,將結果顯示在頁面上
                    UpdatePosLog();
                    break;
                case "backend"://后台響應直接存儲就可以了,但需要判斷前台是否已經處理,否則會造成數據重復處理
                    string checkValue = Request.Form["CmdId"].Trim()
                                      + Request.Form["RespCode"].Trim()
                                      + Request.Form["MerCustId"].Trim()
                                      + Request.Form["UsrCustId"].Trim()
                                      + Request.Form["OpenAcctId"].Trim()
                                      + Request.Form["TransAmt"].Trim()
                                      + Request.Form["OrdId"].Trim()
                                      + Request.Form["OrdDate"].Trim()
                                      + Request.Form["CheckDate"].Trim()
                                      + Request.Form["TrxId"].Trim()
                                      + Request.Form["RetUrl"].Trim()
                                      + Request.Form["BgRetUrl"].Trim()
                                      + Request.Form["MerPriv"].Trim();

                    if (ChinaPnrInterfaces.DecChkValue(checkValue, Request.Form["ChkValue"]).Equals("0"))
                    {
                        UpdatePosLog();
                    }
                    break;
            }
        }
    }

三、后台數據流方式

        3.1、使用HttpWebRequest對象,Post數據:

                string TransferUrl = string.Empty;
                string postData = string.Empty;
                string userPnrID = dr["pnrid"].ToString();
                string bankID = dr["BankId"].ToString();
                string checkDate = dr["CheckDate"].ToString();
                string repayment_account = Decimal.Round(Convert.ToDecimal(TransNullOrEmpty(dr["repayment_account"].ToString())), 2).ToString();

                TransferUrl = string.Format("{0}/Interface/POSWithoutCard_Transfer.aspx", strWebSiteUrl);//需要請求的頁面

                postData = string.Format("UsrCustId={0}&OpenAcctId={1}&TransAmt={2}&CheckDate={3}",
                DESEncrypt.Encrypt(userPnrID), DESEncrypt.Encrypt(bankID), DESEncrypt.Encrypt(repayment_account), DESEncrypt.Encrypt(checkDate));//傳遞的參數


                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(TransferUrl);//后台請求頁面

                string s = postData;
                Encoding encoding = Encoding.GetEncoding("GB2312");//GB2312,注意頁面的編碼,否則會出現亂碼
                byte[] requestBytes = encoding.GetBytes(postData);

                req.Method = "POST";
                req.ContentType = "application/x-www-form-urlencoded";
                req.ContentLength = requestBytes.Length;
                Stream requestStream = req.GetRequestStream();
                requestStream.Write(requestBytes, 0, requestBytes.Length);
                requestStream.Close();

                HttpWebResponse res = (HttpWebResponse)req.GetResponse();
                StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.GetEncoding("GB2312"));
                string backstr = sr.ReadToEnd();//可以讀取到從頁面返回的結果,以數據流的形式。
                // Response.Write(backstr);       
                sr.Close();
                res.Close();

 

       3.2、使用WebClient對象:

string postData = string.Format("UsrCustId={0}&OpenAcctId={1}&TransAmt={2}&CheckDate={3}",
                DESEncrypt.Encrypt(userPnrID), DESEncrypt.Encrypt(bankID), DESEncrypt.Encrypt(repayment_account), DESEncrypt.Encrypt(checkDate));//這里即為傳遞的參數,可以用工具抓包分析,也可以自己分析,主要是form里面每一個name都要加進來  

byte[] postData = Encoding.UTF8.GetBytes(postString);//編碼,尤其是漢字,事先要看下抓取網頁的編碼方式  

string  TransferUrl= string.Format("{0}/Interface/POSWithoutCard_Transfer.aspx", strWebSiteUrl);//需要請求的頁面

WebClient webClient = new WebClient();  

webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");//采取POST方式必須加的header,如果改為GET方式的話就去掉這句話即可  

byte[] responseData = webClient.UploadData(TransferUrlurl, "POST", postData);//得到返回字符流  

string srcString = Encoding.UTF8.GetString(responseData);//解碼  

 

3.3、WebBrowser對象(沒用過,暫時不討論,具體可參考http://www.cnblogs.com/peterzb/archive/2009/07/12/1521787.html

轉自:http://blog.itpub.net/28699126/viewspace-1127499/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM