轉,關於購物車

上次,曾經說到一個URL管理的問題,好比咱們不少頁面爲了性能考慮生成靜態頁面,咱們常常javascript

性剛開始的時候用動態頁面+ajax的方式加載,頁面靜態化的時候,若是是新聞內容頁,咱們能夠css

把靜態頁面的URL地址保存在數據庫中,可是,單個頁面,好比,首頁,會員空間的各個頁面,就不html

適合放在數據庫中,這時候更適合寫一個通用模塊相似MVC中的"控制器"來控制頁面的靜態化java

和URL重寫,這就省去了一個一個很繁瑣的過程.jquery

打個比方,咱們能夠寫一個通用模塊調用:web

image

這種方式相似asp.net 中MVC的控制器,ajax

函數大體的代碼思路:數據庫

   1:      /// <summary>
   2:      /// 得到路徑(暫時只作靜態頁面管理)(/*在這裏能夠擴展出URL重寫*/)
   3:      /// </summary>
   4:      /// <param name="PageUrl">頁面的URL(不包括擴展名)</param>
   5:      /// <param name="QueryString">頁面參數</param>
   6:      /// <returns></returns>
   7:      public static string GetURL(string PageUrl,string QueryString)
   8:      {
   9:          //頁面路徑
  10:          string PagePath = "";
  11:          
  12:          //若是當前的參數不爲空,則加上?
  13:          if (QueryString != "")
  14:              QueryString = "?" + QueryString;
  15:          //若是是靜態頁面(從配置文件中讀取靜態頁面狀態(是否))
  16:          if (ReadURLConfig(PageUrl) == true)
  17:          {
  18:              PagePath=PageUrl + ".htm" + QueryString;
  19:          }
  20:          //若是是動態頁面
  21:          else
  22:              PagePath = PageUrl + ".aspx" + QueryString;
  23:          //把相對路徑轉化爲絕對路徑
  24:          return System.Web.VirtualPathUtility.ToAbsolute(PagePath); ;
  25:      }
  26:      /// <summary>
  27:      /// 從配置文件中讀取是否生成靜態頁面
  28:      /// </summary>
  29:      /// <param name="PageName">頁面的名稱</param>
  30:      /// <returns></returns>
  31:      public static bool ReadURLConfig(string PageName)
  32:      {
  33:          //讀取配置文件
  34:          string path = HttpContext.Current.Server.MapPath(@"~/Admin/ConfigManage/URLConfig.xml");
  35:          //XmlHelper.Read(path, "/Node/Element[@Attribute='Name']", "Attribute")
  36:          //是否生成HTML
  37:          string IsHtml="false";
  38:          IsHtml=XMlHelper.Read(path, "/PageSettings/Page[@PageName='"+PageName+"']", "IsHtml");
  39:          if (IsHtml.ToLower() == "true")
  40:          {
  41:              return true;
  42:          }
  43:          else return false;
  44:         
  45:      }

配置文件屬性:(URL重寫部分,尚未實現)json

image

咱們能夠在後臺設置那些頁面要生成HTML和URL重寫規則的定製.......c#

不過貌似還有好多沒實現,正在思考中............

 

 

進入主題:

此次,主要是購物車的實現,購物車的實現,我是在數據庫創建了一個購物車的臨時表,原本打算用Cookies作,不過,先用數據庫作,比較穩妥,Cookies涉及安全性處理須要作不少處理.呃....這個之後可能會深刻實現.

首先是,當用戶點擊

image

呃.....就ajax加入購物車,而後彈出層,顯示

image

主要是ajax,先加入購物車(加入購物車以前,要檢查購物車是否存在此商品,若是存在,原本應該

把購物車中商品的數量+1,我這裏是直接提示用戶已加入購物車,這是個小BUG),而後回調計

算購物車中的寶貝數量和總金額.

代碼不過重要,這裏就不粘貼了.

主要是思路要清晰一些.接下來就是購物車結算.

image

這個用了一個框架(改改顏色就上了,不過感受加載了好多js,呃,....不過總比asp.net服務端控

件實現要好得多).

 

這個也就是增刪改查設計,不過值得一提的就是,咱們儘可能把大量的前臺js代碼單獨放在一個文

件中,這樣客戶端的緩存起來第二次訪問起來就只須要更少的請求.

前臺代碼很是簡潔:

   1:  <%@ Page Language="C#" MasterPageFile="~/Member.master" AutoEventWireup="true" CodeFile="ShopingCart.aspx.cs"
   2:      Inherits="Member_ShopingCart" Title="購物車" %>
   3:   
   4:  <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
   5:      <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
   6:      <link href="../css/buy.css" rel="stylesheet" type="text/css" />
   7:   
   8:      <script src="../Admin/scripts/jquery-1.6.2.min.js" type="text/javascript"></script>
   9:   
  10:      <script src="../Admin/scripts/miniui/miniui.js" type="text/javascript"></script>
  11:   
  12:      <link href="../Admin/scripts/miniui/themes/default/miniui2.css" rel="stylesheet"
  13:          type="text/css" />
  14:      <link href="../Admin/scripts/miniui/themes/icons.css" rel="stylesheet" type="text/css" />
  15:         <script src="../js/AjaxJsDeal/ShoppingCart.js" type="text/javascript"></script>
  16:      <style type="text/css">
  17:       
  18:          .New_Button, .Edit_Button, .Delete_Button, .Update_Button, .Cancel_Button
  19:          {
  20:              font-size:11px;color:#1B3F91;font-family:Verdana;  
  21:              margin-right:5px;
  22:          }
  23:         
  24:                       
  25:      </style>
  26:  </asp:Content>
  27:  <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
  28:      <div class="zz">
  29:          <div class="gouwuche">
  30:              <div class="flow-steps">
  31:                  <ul class="num5">
  32:                      <li class="current"><span class="first">1. 查看購物車</span></li>
  33:                      <li><span>2. 確認訂單信息</span></li>
  34:                      <li><span>3. 付款到支付寶</span></li>
  35:                      <li><span>4. 確認收貨</span></li>
  36:                      <li class="last"><span>5. 評價</span></li>
  37:                  </ul>
  38:              </div>
  39:              <div class="pay_for">
  40:                  <div>
  41:                      商品總價(不含運費):<span>
  42:                          <label id="lbCountNum1" text="" />
  43:                      </span>元</div>
  44:                  <div>
  45:                      <a href="MemberOrders.aspx">
  46:                          <img src="../images/js_small_03.jpg" /></a><a href="MemberOrders.aspx"></a></div>
  47:              </div>
  48:              <div id="datagrid1" class="mini-datagrid" style="width: 700px; height: 250px;" allowresize="true" multiSelect="true" 
  49:                  url="Data/GetMemberInfo.ashx?method=SearchShoppingCart" idfield="Id">
  50:                  <div property="columns" style="color: Black">
  51:                  
  52:                      <div type="checkcolumn" width="30">
  53:                      </div>
  54:                      <div field="ProductId" width="60" headeralign="center" allowsort="true" renderer="onRenderProduct">
  55:                          產品Id</div>
  56:                      <div field="Picturepath" width="100" align="center" headeralign="center" renderer="onReaderPic">
  57:                          圖片</div>
  58:                      <div field="ProductName" width="100" headeralign="center" allowsort="true" renderer="onRenderProductName">
  59:                          產品名稱</div>
  60:                      <div field="SupperlierName" renderer="RendererSupperlierName" width="120">
  61:                          供應商</div>
  62:                      <div field="Price" width="80" allowsort="true">
  63:                          商品售價</div>
  64:                      <div field="Quantity" width="80" headeralign="center" >
  65:                      <input property="editor" class="mini-spinner" minValue="1" renderer="onRenderQuantity" maxValue="9999" value="1" style="width:100%;"/>
  66:                          購買數量</div>
  67:                  <div name="action" width="80" headerAlign="center" align="center" renderer="onActionRenderer" cellStyle="padding:0;">操做</div>
  68:                  </div>
  69:              </div>
  70:              <table width="700" class="order-table" cellpadding="0" cellspacing="0">
  71:                  <tfoot>
  72:                      <tr>
  73:                          <td colspan="4" class="point-info">
  74:                          <%--    <input type="button" onclick="remove" value="批量刪除" />--%> <a class="mini-button" iconCls="icon-remove" onclick="remove">批量刪除</a>
  75:                          </td>
  76:                          <td colspan="4">
  77:                              <div class="charge-info">
  78:                                  商品總價(不含運費):<span>
  79:                                      <label id="lbCountNum">
  80:                                      </label>
  81:                                  </span>元</div>
  82:                          </td>
  83:                      </tr>
  84:                      <tr>
  85:                          <td colspan="4">
  86:                          </td>
  87:                          <td colspan="4">
  88:                              <div class="piliang">
  89:                                  <a href="MemberOrders.aspx">
  90:                                      <img src="../images/js_big.jpg" /></a></div>
  91:                          </td>
  92:                      </tr>
  93:                  </tfoot>
  94:              </table>
  95:          </div>
  96:      </div>
  97:   
  98:      <script type="text/javascript">
  99:          mini.parse();
 100:   
 101:          var grid = mini.get("datagrid1");
 102:          grid.load({
 103:              key: "",
 104:              pageIndex: 0,
 105:              pageSize: 10,
 106:              sortField: "Id",
 107:              sortOrder: "asc"
 108:              })
 109:              //初始化
 110:              $(function(){
 111:              GetCartInfo();
 112:              });
 113:           
 114:      </script>
 115:   
 116:  </asp:Content>

關鍵性js文件:

   1:     //購物車彙總信息
   2:              function GetCartInfo(){
   3:               $.ajax({
   4:             url:"/Member/Data/GetMemberInfo.ashx?method=GetCartInfo",
   5:             type:"post",
   6:             success:function(text){
   7:             var DataJson=$.parseJSON(text);
   8:              if(DataJson.Status!='False')//執行成功!
   9:              {
  10:                  //顯示當前購物車總數量和總價 
  11:                  $("#lbCountNum").text(DataJson.Data[0].CartSum); 
  12:                   $("#lbCountNum1").text(DataJson.Data[0].CartSum); 
  13:                   //$("#CartMsg").html('目前購物車中已有'+DataJson.Data[0].CartCount+'件寶貝,合計:<span>'+DataJson.Data[0].CartSum+'</span>元'); 
  14:              }
  15:              else
  16:              alert("加載購物車彙總信息出錯!");
  17:             }
  18:             });
  19:              }
  20:               //操做重繪
  21:               function onActionRenderer(e) {
  22:              var grid = e.sender;
  23:              var record = e.record;
  24:              var uid = record._uid;
  25:              var rowIndex = e.rowIndex;
  26:   
  27:              var s = ''
  28:                      + ' <a class="Edit_Button" href="javascript:editRow(\'' + uid + '\')">編輯</a>'
  29:                      + ' <a class="Delete_Button" href="javascript:delRow(\'' + uid + '\')">刪除</a>';
  30:   
  31:              if (grid.isEditingRow(record)) {
  32:                  s = '<a class="Update_Button" href="javascript:updateRow(\'' + uid + '\')">更新</a>'
  33:                      + '<a class="Cancel_Button" href="javascript:cancelRow(\'' + uid + '\')">取消</a>'
  34:              }
  35:              return s;
  36:          }
  37:            
  38:              
  39:              //產品名稱超連接重繪
  40:              function onRenderProductName(e){
  41:                 var record = e.record;
  42:              var uid = record._uid;
  43:              var rowIndex = e.rowIndex;
  44:               var row = grid.getRowByUID(uid);
  45:               var href='<a href="/Product/Product.aspx?ProductId='+row.ProductId+'" >'+ row.ProductName+'</a>';
  46:        return href;
  47:              }
  48:              //產品超連接重繪
  49:              function onRenderProduct(e){
  50:                 var record = e.record;
  51:              var uid = record._uid;
  52:              var rowIndex = e.rowIndex;
  53:               var row = grid.getRowByUID(uid);
  54:               var href='<a href="/Product/Product.aspx?ProductId='+row.ProductId+'" >'+ row.ProductId+'</a>';
  55:        return href;
  56:              
  57:              }
  58:         //圖片重繪
  59:          function onReaderPic(e){
  60:            var record = e.record;
  61:              var uid = record._uid;
  62:              var rowIndex = e.rowIndex;
  63:               var row = grid.getRowByUID(uid);
  64:                var src= '<img src="../Admin/FileManage/GetImg.ashx?method=GetMainProductPic&type=small&fileName='+e.value+'" style="width:60px;height:40px;"/>';
  65:               var href='<a href="/Product/Product.aspx?ProductId='+row.ProductId+'" >'+ src+'</a>';
  66:        return href;
  67:          
  68:          }
  69:          //賣家網址重繪
  70:            function RendererSupperlierName(e) {
  71:              var record = e.record;
  72:              var uid = record._uid;
  73:              var rowIndex = e.rowIndex;
  74:               var row = grid.getRowByUID(uid);
  75:              var SupperlierName=row.SupperlierName;
  76:              var SupperlierId=row.SupperlierId;
  77:              var BelongType=row.BelongType;
  78:              var BelongWebSize;
  79:              if(BelongType==0)
  80:              {
  81:              BelongWebSize="/Master/MasterInfo.aspx?MasterId="+SupperlierId;
  82:              }
  83:              else
  84:               BelongWebSize="/Company/CompanyInfo.aspx?CompanyId="+SupperlierId;
  85:              var s = '<a href="'+BelongWebSize+'" >'+SupperlierName+'</a>';
  86:             
  87:              return s;
  88:          }
  89:             function editRow(row_uid) {
  90:              var row = grid.getRowByUID(row_uid);
  91:              if (row) {
  92:                  grid.cancelEdit();
  93:                  grid.beginEditRow(row);
  94:              }
  95:          }
  96:          function cancelRow(row_uid) {            
  97:              grid.reload();
  98:          }
  99:          function delRow(row_uid) {
 100:              var row = grid.getRowByUID(row_uid);
 101:              if (row) {
 102:                  if (confirm("肯定刪除此記錄?")) {
 103:                      grid.loading("刪除中,請稍後......");
 104:                      $.ajax({
 105:                          url: "Data/GetMemberInfo.ashx?method=RemoveShoppingCart&Id=" + row.Id,
 106:                          success: function (text) {
 107:                              grid.reload();
 108:                              GetCartInfo();
 109:                          },
 110:                          error: function () {
 111:                          }
 112:                      });
 113:                  }
 114:              }
 115:          }
 116:   
 117:          function updateRow(row_uid) {
 118:              var row = grid.getRowByUID(row_uid);
 119:   
 120:              var rowData = grid.getEditRowData(row);
 121:           if(parseInt(row.Num-row.Soldnum)<parseInt(rowData.Quantity))
 122:              {
 123:              alert("當前庫存不足!");
 124:              rowData.Quantity=parseInt(row.Num-row.Soldnum);
 125:              return;
 126:              }
 127:              grid.loading("保存中,請稍後......");
 128:              var json = mini.encode([{Id: row.Id,Quantity:rowData.Quantity,ProductId:row.ProductId}]);
 129:              $.ajax({
 130:                  url: "Data/GetMemberInfo.ashx?method=SaveShoppingCart",
 131:                  data: {ShoppingCart:json},
 132:                  success: function (text) {
 133:                      grid.reload();
 134:                       GetCartInfo();
 135:                  },
 136:                  error: function (jqXHR, textStatus, errorThrown) {
 137:                      alert(jqXHR.responseText);
 138:                  }
 139:              });
 140:   
 141:          }
 142:          //批量刪除
 143:           function remove(e) {
 144:              var rows = grid.getSelecteds();
 145:              if (rows.length > 0) {
 146:                  if (confirm("肯定刪除選中商品?")) {
 147:                      var ids = [];
 148:                      for (var i = 0, l = rows.length; i < l; i++) {
 149:                          var r = rows[i];
 150:                          ids.push(r.Id);
 151:                      }
 152:                      var id = ids.join(',');
 153:                      grid.loading("操做中,請稍後......");
 154:                      $.ajax({
 155:                           url: "Data/GetMemberInfo.ashx?method=RemoveShoppingCart&Id=" + id,
 156:                          success: function (text) {
 157:                              grid.reload();
 158:                               GetCartInfo();
 159:                          },
 160:                          error: function () {
 161:                          }
 162:                      });
 163:                  }
 164:              } else {
 165:                  alert("請選中一條記錄");
 166:              }
 167:          }
 168:     //操做重繪
 169:               function onSumRenderer(e) {
 170:              var grid = e.sender;
 171:              var record = e.record;
 172:              var uid = record._uid;
 173:              var rowIndex = e.rowIndex;
 174:               var row = grid.getRowByUID(uid);
 175:              return row.Price*row.Quantity;
 176:          }

不過注意的是,涉及到電子商務,客戶端的數據都是不可靠的,因此咱們的數據都是從數據庫重

新讀取.

後臺c#處理代碼:

   1:    /// <summary>
   2:      /// 購物車檢索
   3:      /// </summary>
   4:      /// <param name="context"></param>
   5:      public void SearchShoppingCart(HttpContext context)
   6:      {
   7:          //用戶id
   8:          string UserId = SessionHelper.GetSession("UserId").ToString();
   9:         // string key = context.Request["key"];
  10:          //分頁
  11:          int pageIndex = Convert.ToInt32(context.Request["pageIndex"]);
  12:          int pageSize = Convert.ToInt32(context.Request["pageSize"]);
  13:          //字段排序
  14:          String sortField = context.Request["sortField"];
  15:          String sortOrder = context.Request["sortOrder"];
  16:          string strCondition = "";
  17:          VCartProductInfoBLL bll = new VCartProductInfoBLL();
  18:          if (Tools.IsNullOrEmpty(sortField))
  19:              sortField = "Id";
  20:          //查詢條件
  21:          strCondition = " MemberId=" + UserId;
  22:          //分頁數據讀取
  23:          IEnumerable<VCartProductInfo> list = bll.ListByPagination(sortField, pageSize, pageIndex + 1, sortOrder == "asc" ? "1" : "0", strCondition);
  24:   
  25:          //獲取總頁數
  26:          int totalPage = bll.GetCount(strCondition);
  27:          //JSON 序列化
  28:          string json = Common.FormatToJson.MiniUiListToJson<VCartProductInfo>((IList<VCartProductInfo>)list, totalPage, "");
  29:          context.Response.Write(json);
  30:      }
  31:      /// <summary>
  32:      /// 保存到購物車
  33:      /// </summary>
  34:      /// <param name="context"></param>
  35:      public void SaveShoppingCart(HttpContext context)
  36:      {
  37:          //數據讀取
  38:          String Cart = context.Request["ShoppingCart"];
  39:          string info = Cart.TrimStart('[');
  40:          info = info.TrimEnd(']');
  41:          JObject o = JObject.Parse(info);
  42:          Int64 Id = (Int64)o.SelectToken("Id");
  43:          int Quantity = (int)o.SelectToken("Quantity");
  44:          Int64 ProductId = (Int64)o.SelectToken("ProductId");
  45:          //庫存判斷(從數據庫讀取庫存檢驗)
  46:          product CartInfo = new productBLL().Get(ProductId);
  47:          if (Quantity > (int)(CartInfo.Num.Value - CartInfo.Soldnum.Value))
  48:          {
  49:              context.Response.Write(Tools.WriteJsonForReturn(false, "庫存數量不足!"));
  50:              return;
  51:          }
  52:          //更新購物車
  53:          ShoppingCart Shop=new ShoppingCart ();
  54:          Shop.Id=Id;
  55:          Shop.Quantity=Quantity;
  56:          bool Status=false;
  57:         Status=new ShoppingCartBLL().UpdateShoppingCart(Shop);
  58:         string Msg="";
  59:         if (Status)
  60:         {
  61:             Msg = "";
  62:         }
  63:         else
  64:             Msg = "庫存不足!";
  65:         context.Response.Write(Tools.WriteJsonForReturn(Status, Msg));
  66:         
  67:      }
  68:      
  69:      /// <summary>
  70:      /// 獲取購物車信息
  71:      /// </summary>
  72:      /// <param name="context"></param>
  73:      public void GetCartInfo(HttpContext context)
  74:      {
  75:          string UserId = (string)context.Session["UserId"];
  76:              
  77:          context.Response.Write(new ShoppingCartBLL().GetCartInfo(UserId));
  78:      }
  79:      /// <summary>
  80:      /// 刪除購物車內容
  81:      /// </summary>
  82:      /// <param name="context"></param>
  83:      public void RemoveShoppingCart(HttpContext context)
  84:      {
  85:          String idStr = context.Request["Id"];
  86:          if (String.IsNullOrEmpty(idStr)) return;
  87:          //檢驗客戶端字符串
  88:          if (Common.Tools.IsValidInput(ref idStr, true))
  89:          {
  90:              new ShoppingCartBLL().DeleteMoreID(idStr);
  91:          }
  92:      }

接下來就是訂單結算,

呃...訂單很醜...沒作處理.....

image

 

其實,這裏面大部分信息都是之前作會員信息管理的數據加載,只須要調用會員管理的js,根本業務邏輯都不用寫....

相對來講難寫一點的就是提交訂單的處理,

image

首先咱們要提交訂單,個人數據庫,設計了訂單表和訂單商品表,訂單號是根據日期生成的,訂單號的生成就是相似流水號生成,

這個很重要,由於大多數狀況下,訂單是日期生成,並且要保證惟一性,之前曾經總看到(數據庫的id不設計成自增,而後varchar類型,程序生成id號),

這種設計方式就是嚴重沒考慮併發處理的狀況,若是同時n我的訂單號根本就不能保證惟一性...

到網上搜索流水號生成,就能看到如何解決這個問題,其實就是建一張表,寫存儲過程的方式計算id,要保證id的惟一性.

個人這個是從博客園一個高手的日誌上切下來的..

image

獲取訂單號的存儲過程

   1:  USE [czcraft]
   2:  GO
   3:  /****** 對象:  StoredProcedure [dbo].[dpPMT_SGetMaintainSeq]    腳本日期: 05/19/2012 00:18:39 ******/
   4:  SET ANSI_NULLS ON
   5:  GO
   6:  SET QUOTED_IDENTIFIER ON
   7:  GO
   8:   
   9:  CREATE PROC [dbo].[dpPMT_SGetMaintainSeq]
  10:  (
  11:  @MaintainCate VARCHAR(2)
  12:  )
  13:   AS 
  14:  --***********************累加編號************************************************* 
  15:  declare @MaintainNo VARCHAR(12) IF NOT EXISTS(SELECT * FROM NumSeq WHERE Cate=@MaintainCate AND DATEDIFF(DAY,CrTime,GETDATE())=0) BEGIN
  16:          INSERT INTO NumSeq(Cate,DateNo,Seq,CrTime) values(@MaintainCate,RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+ REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())),0,getdate()) END
  17:  ELSE
  18:      BEGIN
  19:          UPDATE NumSeq SET Seq=Seq+1 WHERE Cate=@MaintainCate AND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+ REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())) END 
  20:  --************************組合編號*************************************************************** 
  21:  SELECT @MaintainNo=Cate+DateNo+REPLICATE('0',6-LEN(Seq))+CONVERT(VARCHAR(6),Seq) FROM NumSeq WHERE Cate=@MaintainCate AND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+ REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())) SELECT @MaintainNo

調用函數

image

這樣,咱們每次插入數據的時候,只要調用這個存儲過程就能保證每次生成的訂單號都不同,

image

接下來就是訂單處理了:

咱們須要處理哪些呢?

首先是提交用戶的收貨信息,再次檢驗庫存狀態,而後插入訂單信息表和訂單產品表,而且將商品表的產品數量更新,而且給用戶發送訂單郵件(我copy的卓越網郵件的HTML佈局,哈哈),

這裏粘貼主要模塊代碼:

提交訂單:

   1:   /// <summary>
   2:      /// 訂單提交
   3:      /// </summary>
   4:      /// <param name="context"></param>
   5:      public void SubmitOrderData(HttpContext context)
   6:      {
   7:            string UserId = (string)context.Session["UserId"];
   8:          if(Tools.IsNullOrEmpty(UserId))
   9:          {
  10:              return;
  11:          }
  12:          string Name = context.Request["Name"];
  13:          string Email = context.Request["Email"];
  14:          string Province = context.Request["Province"];
  15:          string City = context.Request["City"];
  16:          string Country = context.Request["Country"];
  17:          string Address = context.Request["Address"];
  18:          string ZipCode = context.Request["ZipCode"];
  19:          string MobilePhone = context.Request["MobilePhone"];
  20:          string TelPhone = context.Request["TelPhone"];
  21:          //訂單信息保存
  22:          orders order = new orders();
  23:          order.ConsigneeName = Name;
  24:          order.ConsigneeRealName = Name;
  25:          order.ConsigneeEmail = Email;
  26:          order.ConsigneeProvince = Province;
  27:          order.ConsigneeZip = ZipCode;
  28:          order.UserId =Convert.ToInt32(UserId);
  29:          order.ConsigneeAddress = City + Country + Address;
  30:          order.OrderDate = DateTime.Now;
  31:          order.ConsigneePhone = MobilePhone;
  32:          order.ConsigneeTel = TelPhone;
  33:          order.OrderId = ordersBLL.GetOrderId();
  34:          ordersBLL bll = new ordersBLL();
  35:          string ReturnProductName = "";
  36:          //下單
  37:          bool Status = bll.SaveOrder(ref order, out ReturnProductName);
  38:          //去除最後的,
  39:          ReturnProductName = ReturnProductName.Remove(ReturnProductName.Length - 1, 1);
  40:          string Data = "";
  41:          //支付跳轉URL
  42:          string TurnURL = "";
  43:          if (Status)
  44:          {
  45:              Data = "恭喜您!下單成功!";
  46:              //支付平臺的跳轉URL生成
  47:              PayInfo info=new PayInfo ();
  48:              info.SaleEmail="tianzhuanghu@qq.com";
  49:              info.OrderId=order.OrderId;
  50:              info.ProductName = ReturnProductName;
  51:             
  52:              info.Remark=order.ConsigneeName+"在"+order.ShopDate.Value.ToShortDateString()+"購買商品,共計:"+order.TotalPrice.Value.ToString ();
  53:              info.TotalFre = order.FactPrice.Value.ToString ();
  54:              Pay pay = new Pay();
  55:             TurnURL=pay.BuildURL(info);
  56:          }
  57:          else
  58:              Data = "對不起!下單失敗!";
  59:          //返回的json數據
  60:          string ReturnJson = "{\"Status\":\"" + Status + "\",\"Data\":\"" + Data + "\",\"URL\":\""+TurnURL+"\"}"; ;
  61:           context.Response.Write(ReturnJson);
  62:      
  63:      }
 
訂單提交BLL:
   1:   #region 保存訂單
   2:          /// <summary>
   3:          /// 保存訂單
   4:          /// </summary>
   5:          /// <param name="order">訂單</param>
   6:          /// <param name="ReturnProductNames">返回產品名稱列表</param>
   7:          /// <returns></returns>
   8:          public bool SaveOrder(ref orders order,out string ReturnProductNames)
   9:          {
  10:              ReturnProductNames = "";
  11:              //查詢條件(購物車視圖中查詢)
  12:              string Condition = " MemberId=" + order.UserId;
  13:              //(須要讀取購物車,而後,插入訂單商品表和訂單表)
  14:              //訂單產品信息列表
  15:              List<orderproduct> listOrder = new List<orderproduct>();
  16:              IEnumerable<VCartProductInfo> CartProducts = new VCartProductInfoDAL().ListAll(Condition);
  17:              order.TotalPrice = 0.0;
  18:              order.FactPrice = 0.0;
  19:              foreach (VCartProductInfo CartProduct in CartProducts)
  20:              {
  21:                  orderproduct OrderProduct = new orderproduct();
  22:                  OrderProduct.AddTime = DateTime.Now;
  23:                  OrderProduct.OrderId = order.OrderId;
  24:                  OrderProduct.ProId = CartProduct.ProductId.Value.ToString();
  25:                  OrderProduct.ProImg = CartProduct.Picturepath;
  26:                  OrderProduct.ProName = CartProduct.ProductName;
  27:                  ReturnProductNames += OrderProduct.ProName + ",";
  28:                  OrderProduct.ProNum = CartProduct.Quantity;
  29:                  OrderProduct.ProPrice = CartProduct.Price;
  30:                  OrderProduct.ProOtherPara = "";
  31:                  OrderProduct.Remark = "";
  32:                  OrderProduct.Specification = "";
  33:                  //加入到產品訂單信息列表中
  34:                  listOrder.Add(OrderProduct);
  35:                  //總價計算
  36:                  order.TotalPrice += OrderProduct.ProPrice.Value * OrderProduct.ProNum.Value;
  37:                  //實際總價
  38:                  order.FactPrice += OrderProduct.ProPrice.Value * OrderProduct.ProNum.Value;
  39:              }
  40:              //支付狀態爲等待付款
  41:              order.PaymentStatus = orders.ePaymentStatus.WaitPay.GetHashCode().ToString();
  42:              //訂單狀態爲未支付
  43:              order.OrderStatus = orders.eOrderStatus.NotPay.GetHashCode().ToString();
  44:   
  45:              //訂單狀態
  46:              order.IsOrderNormal = 0;
  47:              order.Remark = "";
  48:              order.ShopDate = DateTime.Now;
  49:              order.OrderDate = DateTime.Now;
  50:              //返回訂單執行狀態
  51:              bool Status = new ordersDAL().AddOrders(order, listOrder);
  52:              if (Status)
  53:              {
  54:                  //給客戶發郵件
  55:                  SMTP smtp = new SMTP(order.ConsigneeEmail);
  56:                  smtp.SendMail("潮州工藝平臺", SendToCustomContentHtml(order, listOrder));
  57:   
  58:              }
  59:              return Status;
  60:   
  61:          }

發送郵件:

   1:    #region 生成給客戶發的HTML內容(亞馬遜佈局)
   2:          /// <summary>
   3:          /// 生成給客戶發的HTML內容(亞馬遜)
   4:          /// </summary>
   5:          /// <param name="order"></param>
   6:          /// <param name="ProductsList"></param>
   7:          /// <returns></returns>
   8:          public string SendToCustomContentHtml(orders order, IEnumerable<orderproduct> ProductsList)
   9:          {
  10:              //獲取當前http上下文
  11:              System.Web.HttpContext context = System.Web.HttpContext.Current;
  12:              //主頁
  13:              string Default = context.Request.Url.Scheme + "://" + context.Request.Url.Authority + System.Web.VirtualPathUtility.ToAbsolute("~/Default.aspx");
  14:              //會員訂單網址
  15:              string webpath = context.Request.Url.Scheme + "://" + context.Request.Url.Authority + System.Web.VirtualPathUtility.ToAbsolute("~/Member/MemberOrders.aspx");
  16:              //文件流讀取
  17:              StringBuilder sb=new StringBuilder ();
  18:              sb.Append(File.ReadAllText (context.Server.MapPath("~/Other/SendToCustomContent.html"),Encoding.UTF8));
  19:              sb.Replace("$ConsigneeRealName", order.ConsigneeRealName);
  20:              sb.Replace("$ConsigneeEmail", order.ConsigneeEmail);
  21:              sb.Replace("$ConsigneeRealName", order.ConsigneeRealName);
  22:              sb.Replace("$ConsigneeAddress", order.ConsigneeAddress);
  23:              sb.Replace("$ConsigneeProvince", order.ConsigneeProvince);
  24:              sb.Replace("$ConsigneeZip", order.ConsigneeZip);
  25:              sb.Replace("$TotalPrice", order.TotalPrice.Value.ToString ());
  26:              sb.Replace("$webpath", webpath);
  27:              sb.Replace("$OrderId", order.OrderId);
  28:              sb.Replace("$TotalPrice", order.TotalPrice.Value.ToString ());
  29:              sb.Replace("$Carriage", order.Carriage.ToString ());//
  30:              sb.Replace("$TotalPrice", order.TotalPrice.Value.ToString ());
  31:              sb.Replace("$FactPrice", order.FactPrice.Value.ToString ());
  32:              sb.Replace("$DateTime", DateTime.Now.AddDays(3).ToShortDateString());
  33:   
  34:              //商品內容生成
  35:              int num = 0;
  36:              StringBuilder TempData = new StringBuilder();
  37:              foreach (orderproduct Product in ProductsList)
  38:              {
  39:                  string temp3 = @"<table><tbody>
  40:  <tr valign='top'><td></td><td><font size='-1' face='verdana,arial,helvetica'><b>" + (++num) + @"</b></font></td><td><font size='-1' face='verdana,arial,helvetica'><b>" + Product.ProName + @"</b><br>
  41:  <span class='price'>¥ " + Product.ProPrice + @"</span><br>如今有貨<br>&nbsp; 賣家: <a href='" + Default + @"' target='_blank'>潮州工藝品集團</a> </font></td></tr></tbody></table>";
  42:                  TempData.Append(temp3);
  43:                  
  44:   
  45:              }
  46:              //商品主體信息替換
  47:              sb.Replace("$Body", TempData.ToString ());
  48:              //sb.Replace("$Carriage", order.Carriage);
  49:   
  50:   
  51:             
  52:              return sb.ToString();
  53:   
  54:          }

DAL中保存訂單處理:

   1:   #region 下單
   2:          /// <summary>
   3:          /// 下單
   4:          /// </summary>
   5:          /// <param name="Info">訂單信息</param>
   6:          /// <param name="OrderProductsList">訂單產品信息</param>
   7:          /// <returns></returns>
   8:          public bool AddOrders(orders order, IEnumerable<orderproduct> OrderProductsList)
   9:          {
  10:              //執行事務狀態
  11:              bool Status = false;
  12:              StringBuilder sb = new StringBuilder();
  13:              SqlHelper.Open();
  14:              //開始事務
  15:              SqlHelper.BeginTrans();
  16:              foreach (orderproduct product in OrderProductsList)
  17:              {
  18:                  //插入訂單產品表信息
  19:                  sb.AppendFormat("insert into orderproduct(OrderId,ProId,ProClass,ProName,ProImg,ProPrice,ProNum,AddTime,ProOtherPara,Specification,Remark) output inserted.Id values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}');", product.OrderId, product.ProId, product.ProClass, product.ProName, product.ProImg, product.ProPrice, product.ProNum, product.AddTime, product.ProOtherPara, product.Specification, product.Remark);
  20:                  //產品數量修改
  21:                  sb.AppendFormat("update product set Num=Num-{0},Soldnum=Soldnum+{0} where Id={1};", product.ProNum, product.ProId);
  22:                  //刪除購物車中的產品
  23:                  sb.AppendFormat("delete from ShoppingCart where ProductId={0} and MemberId={1};", product.ProId, order.UserId);
  24:   
  25:              }
  26:              //訂單信息添加
  27:              sb.AppendFormat("insert into orders(OrderId,UserId,ShopDate,OrderDate,ConsigneeRealName,ConsigneeName,ConsigneePhone,ConsigneeProvince,ConsigneeAddress,ConsigneeZip,ConsigneeTel,ConsigneeEmail,TotalPrice,FactPrice,Remark,OrderStatus,PaymentStatus,IsOrderNormal) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}');", order.OrderId, order.UserId, order.ShopDate, order.OrderDate, order.ConsigneeRealName, order.ConsigneeName, order.ConsigneePhone, order.ConsigneeProvince, order.ConsigneeAddress, order.ConsigneeZip, order.ConsigneeTel, order.ConsigneeEmail, order.TotalPrice, order.FactPrice, order.Remark, order.OrderStatus, order.PaymentStatus, order.IsOrderNormal);
  28:              Status = SqlHelper.ExecuteNonQuery(sb.ToString());
  29:              if (Status)
  30:              {
  31:                  SqlHelper.CommitTrans();
  32:                  return true;
  33:              }
  34:              else
  35:              {
  36:                  SqlHelper.RollbackTrans();
  37:                  return false;
  38:              }
  39:   
  40:   
  41:          }

在這裏,爲了更節省性能,我用StringBuilder拼接字符串,也沒有用參數化查詢的方式.(注意這裏採用事務處理)

而後就是支付平臺的實現,其實支付平臺說簡單點是很是容易的,只須要按照支付的接口提供http請求參數,數字簽名,等信息,交易成功而後按照請求讀取參數檢驗數字簽名是否正確.

這部份內容,我是準備集成多種支付平臺設計,今天只展現支付寶部分.

在設計這部分,咱們須要去查看支付寶接口模擬,通常申請支付寶都會提供一個接口測試程序,等等,

咱們在作以前,爲了考慮多種支付平臺的配置,首先定義一些配置信息,

image

我是把支付寶接口配置成一個網站,而後,經過網關調用,進行模擬

   1:  using System;
   2:  using System.Data;
   3:  using System.Configuration;
   4:  using System.Linq;
   5:  using System.Web;
   6:  using System.Web.Security;
   7:  using System.Web.UI;
   8:  using System.Web.UI.HtmlControls;
   9:  using System.Web.UI.WebControls;
  10:  using System.Web.UI.WebControls.WebParts;
  11:  using System.Xml.Linq;
  12:   
  13:  /// <summary>
  14:  ///PayInfo 的摘要說明
  15:  /// </summary>
  16:  public class PayInfo
  17:  {
  18:      public PayInfo()
  19:      {
  20:          //
  21:          //TODO: 在此處添加構造函數邏輯
  22:          //
  23:      }
  24:      /// <summary>
  25:      /// 商戶
  26:      /// </summary>
  27:      public string SaleManId { get; set; }
  28:      /// <summary>
  29:      /// 回調地址
  30:      /// </summary>
  31:      public string CallBackUrl { get; set; }
  32:      /// <summary>
  33:      /// 產品名稱
  34:      /// </summary>
  35:      public string ProductName { get; set; }
  36:   
  37:      /// <summary>
  38:      /// 訂單號
  39:      /// </summary>
  40:      public string OrderId { get; set; }
  41:      /// <summary>
  42:      /// 總金額
  43:      /// </summary>
  44:      public string TotalFre { get; set; }
  45:      /// <summary>
  46:      /// 賣家郵箱
  47:      /// </summary>
  48:      public string SaleEmail { get; set; }
  49:      /// <summary>
  50:      /// 數字簽名
  51:      /// </summary>
  52:      public string Sign { get; set; }
  53:      /// <summary>
  54:      /// 備註信息
  55:      /// </summary>
  56:      public string Remark { get; set; }
  57:   
  58:  }
  59:  /// <summary>
  60:  /// 支付回調信息
  61:  /// </summary>
  62:  public class PayCallBackInfo
  63:  {
  64:      /// <summary>
  65:      /// 支付類型
  66:      /// </summary>
  67:      public Pay.PayType PayType { get; set; }
  68:      /// <summary>
  69:      /// 訂單號
  70:      /// </summary>
  71:      public string OrderId { get; set; }
  72:      /// <summary>
  73:      /// 支付機構
  74:      /// </summary>
  75:      public string PayMode { get; set; }
  76:      /// <summary>
  77:      /// 支付金額
  78:      /// </summary>
  79:      public string PayFre { get; set; }
  80:      /// <summary>
  81:      /// 金額幣種
  82:      /// </summary>
  83:      public string MoneyType { get; set; }
  84:      /// <summary>
  85:      /// 備註1
  86:      /// </summary>
  87:      public string Remark1 { get; set; }
  88:      /// <summary>
  89:      /// 備註2
  90:      /// </summary>
  91:      public string Remark2 { get; set; }
  92:      /// <summary>
  93:      /// 數字簽名
  94:      /// </summary>
  95:      public string Sign { get; set; }
  96:      /// <summary>
  97:      /// 狀態碼
  98:      /// </summary>
  99:      public Pay.ReturnCode ReturnCode { get; set; }
 100:      /// <summary>
 101:      /// 回發的消息
 102:      /// </summary>
 103:      public string Msg { get; set; }
 104:  }
 105:  /// <summary>
 106:  /// 支付配置信息
 107:  /// </summary>
 108:  public class PayConfig
 109:  {
 110:      /// <summary>
 111:      /// 支付類型
 112:      /// </summary>
 113:      public Pay.PayType PayType { get; set; }
 114:      /// <summary>
 115:      /// 商戶賬號
 116:      /// </summary>
 117:      public string v_mid { get; set; }
 118:      /// <summary>
 119:      /// 商戶密碼
 120:      /// </summary>
 121:      public string v_pwd { get; set; }
 122:      /// <summary>
 123:      /// 網關地址
 124:      /// </summary>
 125:      public string PayUrl { get; set; }
 126:  }
   1:  using System;
   2:  using System.Data;
   3:  using System.Configuration;
   4:  using System.Linq;
   5:  using System.Web;
   6:  using System.Web.Security;
   7:  using System.Web.UI;
   8:  using System.Web.UI.HtmlControls;
   9:  using System.Web.UI.WebControls;
  10:  using System.Web.UI.WebControls.WebParts;
  11:  using System.Xml.Linq;
  12:  using Common;
  13:  using czcraft.BLL;
  14:   
  15:  /// <summary>
  16:  ///Pay 的摘要說明
  17:  /// </summary>
  18:  public class Pay
  19:  {
  20:      //支付平臺的配置信息
  21:      public readonly PayConfig config;
  22:      public Pay()
  23:      {
  24:          //獲取支付平臺的配置信息
  25:          config = GetPayConfig();
  26:          //
  27:          //TODO: 在此處添加構造函數邏輯
  28:          //
  29:      }
  30:      /// <summary>
  31:      /// 支付類型
  32:      /// </summary>
  33:      public enum PayType
  34:      {
  35:          /// <summary>
  36:          /// 支付寶
  37:          /// </summary>
  38:          Alipay = 0,
  39:          /// <summary>
  40:          /// 網銀在線
  41:          /// </summary>
  42:          ChinaBank = 1
  43:      }
  44:      /// <summary>
  45:      /// 回調狀態碼(支付寶纔有)
  46:      /// </summary>
  47:      public enum ReturnCode
  48:      {
  49:          /// <summary>
  50:          /// 支付成功!
  51:          /// </summary>
  52:          ok = 0,
  53:          /// <summary>
  54:          /// 支付失敗!
  55:          /// </summary>
  56:          error = 1
  57:      }
  58:   
  59:      #region 構造支付的URL
  60:      /// <summary>
  61:      /// 構造支付的URL(從配置文件中讀取出支付平臺配置信息而後構造支付的網關信息(支付平臺由配置文件決定)(初步只提供網銀在線和支付寶兩種模式中的一種)
  62:      /// </summary>
  63:      /// <param name="Info">支付信息(支付寶支付須要輸入總金額,產品名稱,訂單號,賣家郵箱)</param>
  64:      /// <returns></returns>
  65:      public string BuildURL(PayInfo Info)
  66:      {
  67:          //獲取支付平臺的配置信息
  68:          //PayConfig config = GetPayConfig();
  69:          //支付的地址
  70:          string PayUrl = "";
  71:          switch (config.PayType)
  72:          {
  73:              //支付寶支付
  74:              case PayType.Alipay:
  75:                  PayUrl = BuildAlipayURL(Info, config);
  76:                  break;
  77:              //網銀在線支付
  78:              case PayType.ChinaBank:
  79:                  PayUrl = BuildChinaBackUrl(Info, config);
  80:                  break;
  81:              default:
  82:                 PayUrl= "#";
  83:                 break;
  84:          }
  85:          return PayUrl;
  86:      }
  87:      #endregion
  88:   
  89:      #region 支付完成回調處理
  90:      /// <summary>
  91:      /// 支付完成回調處理
  92:      /// </summary>
  93:      /// <param name="Msg">回調信息</param>
  94:      /// <returns></returns>
  95:      public PayCallBackInfo CallBackPayInfo()
  96:      {
  97:         string Msg = "";
  98:          PayCallBackInfo CallBackInfo = new PayCallBackInfo();
  99:          switch (config.PayType)
 100:          {
 101:              //支付寶支付
 102:              case PayType.Alipay:
 103:                  CallBackInfo = CallBackAlipayInfo();
 104:                  break;
 105:              //網銀在線支付
 106:              case PayType.ChinaBank:
 107:                  CallBackInfo = CallBackChinaBankInfo();
 108:                  break;
 109:              default:
 110:                  CallBackInfo = null;
 111:                  break;
 112:          }
 113:          return CallBackInfo;
 114:      }
 115:      #region 支付寶支付完成回調處理
 116:      /// <summary>
 117:      /// 支付寶支付完成回調處理
 118:      /// </summary>
 119:      /// <param name="Msg">回調信息</param>
 120:      /// <returns></returns>
 121:      private PayCallBackInfo CallBackAlipayInfo()
 122:      {
 123:          //回調信息
 124:         string Msg = "";
 125:          System.Web.HttpContext context = System.Web.HttpContext.Current;
 126:          //訂單號
 127:          string OrderId = context.Request["out_trade_no"];
 128:          //回調狀態碼
 129:          string ReturnCode = context.Request["returncode"];
 130:          //總金額
 131:          string TotalFre = context.Request["total_fee"];
 132:          //數字簽名
 133:          string Sign = context.Request["sign"];
 134:          //數字簽名(本地計算的)
 135:          string Md5Sign = CommonHelper.GetMD5(OrderId + ReturnCode + TotalFre + config.v_pwd);
 136:          //回調信息
 137:          PayCallBackInfo CallBackInfo = new PayCallBackInfo();
 138:          if (Md5Sign.Equals(Sign))
 139:          {
 140:              //支付成功!
 141:              if (ReturnCode.Equals(Pay.ReturnCode.ok.ToString()))
 142:              {
 143:                  Msg = "支付成功!";
 144:                  CallBackInfo.Msg = Msg;
 145:                  CallBackInfo.OrderId = OrderId;
 146:                  CallBackInfo.PayFre = TotalFre;
 147:                  CallBackInfo.ReturnCode = Pay.ReturnCode.ok;
 148:              }
 149:              else
 150:              {
 151:                  Msg = "支付失敗!";
 152:               
 153:                  CallBackInfo.Msg = Msg;
 154:                  CallBackInfo.ReturnCode = Pay.ReturnCode.error;
 155:              }
 156:   
 157:          }
 158:          else
 159:          {
 160:              Msg = "數據被篡改!";
 161:              CallBackInfo.Msg = Msg;
 162:              CallBackInfo.ReturnCode = Pay.ReturnCode.error;
 163:          }
 164:          return CallBackInfo;
 165:      } 
 166:      #endregion
 167:      #region 網銀在線支付完成回調處理
 168:      /// <summary>
 169:      /// 網銀在線支付完成回調處理(未實現)
 170:      /// </summary>
 171:      /// <param name="Msg">回調信息</param>
 172:      /// <returns></returns>
 173:      private PayCallBackInfo CallBackChinaBankInfo()
 174:      {
 175:          //回調信息
 176:        string Msg = "";
 177:          PayCallBackInfo CallBackInfo = new PayCallBackInfo();
 178:          return CallBackInfo;
 179:      } 
 180:      #endregion
 181:      #endregion
 182:      #region 支付寶平臺的網關URL
 183:      /// <summary>
 184:      /// 支付寶平臺的網關URL
 185:      /// </summary>
 186:      /// <param name="info">支付信息</param>
 187:      /// <param name="config">系統支付配置</param>
 188:      /// <returns></returns>
 189:      private string BuildAlipayURL(PayInfo info, PayConfig config)
 190:      {
 191:          System.Web.HttpContext context = System.Web.HttpContext.Current;
 192:          //爲按順序鏈接 總金額、 商戶編號、訂單號、商品名稱、商戶密鑰的MD5值。
 193:          //支付寶數字簽名
 194:          string SignMd5 = CommonHelper.GetMD5(info.TotalFre + config.v_mid + info.OrderId + info.ProductName + config.v_pwd);
 195:          //回調網址
 196:          string webpath = context.Server.UrlEncode(context.Request.Url.Scheme + "://" + context.Request.Url.Authority + System.Web.VirtualPathUtility.ToAbsolute("~/Member/Data/DealAlipayCallBack.ashx"));
 197:          //商品名稱
 198:          string ProductName = System.Web.HttpContext.Current.Server.UrlEncode(info.ProductName);
 199:          //備註
 200:          string Remark = System.Web.HttpContext.Current.Server.UrlEncode(info.Remark);
 201:          //支付的URL地址
 202:          string PayURL = config.PayUrl + "?partner=" + config.v_mid + "&return_url=" + webpath + "&subject=" + ProductName + "&body=" + Remark + "&out_trade_no=" + info.OrderId + "&total_fee=" + info.TotalFre + "&seller_email=" + info.SaleEmail + "&sign=" + SignMd5;
 203:          return PayURL;
 204:   
 205:      }
 206:      #endregion
 207:   
 208:      #region 網銀在線平臺的網關URL
 209:      /// <summary>
 210:      /// 網銀在線平臺的網關URL(等待實現)
 211:      /// </summary>
 212:      /// <param name="info">支付信息</param>
 213:      /// <param name="config">系統支付配置</param>
 214:      /// <returns></returns>
 215:      private string BuildChinaBackUrl(PayInfo info, PayConfig config)
 216:      {
 217:          return "";
 218:   
 219:      }
 220:      #endregion
 221:   
 222:      #region 獲取系統配置信息(支付相關)
 223:      /// <summary>
 224:      /// 獲取系統配置信息(支付相關)
 225:      /// </summary>
 226:      /// <returns></returns>
 227:      public PayConfig GetPayConfig()
 228:      {
 229:          PayConfig info = new PayConfig();
 230:          //讀取配置文件信息
 231:          string path = System.Web.HttpContext.Current.Server.MapPath(@"~/Admin/ConfigManage/config.xml");
 232:          //系統配置中的支付類型
 233:          string ConfigPayType = XMlHelper.Read(path, "/Root/Pay", "PayType");
 234:          //商戶賬號
 235:          string v_mid = XMlHelper.Read(path, "/Root/Pay/" + ConfigPayType, "v_mid");
 236:          //商戶密碼
 237:          string v_pwd = XMlHelper.Read(path, "/Root/Pay/" + ConfigPayType, "v_pwd");
 238:          //支付網關
 239:          string PayUrl = XMlHelper.Read(path, "/Root/Pay/" + ConfigPayType + "/PayUrl", "");
 240:   
 241:   
 242:          info.PayType = ConfigPayType == PayType.Alipay.ToString() ? PayType.Alipay : PayType.ChinaBank;
 243:          info.v_mid = v_mid;
 244:          info.v_pwd = v_pwd;
 245:          info.PayUrl = PayUrl;
 246:   
 247:          return info;
 248:   
 249:      }
 250:      #endregion
 251:   
 252:  }

而後支付回調處理:

   1:  <%@ WebHandler Language="C#" Class="DealAlipayCallBack" %>
   2:   
   3:  using System;
   4:  using System.Web;
   5:  //處理關於支付寶回調
   6:  public class DealAlipayCallBack : IHttpHandler {
   7:      
   8:      public void ProcessRequest (HttpContext context) {
   9:          //支付回調
  10:          Pay pay = new Pay();
  11:          PayCallBackInfo CallBackInfo = pay.CallBackPayInfo();
  12:          if (CallBackInfo.ReturnCode == Pay.ReturnCode.ok)
  13:          {
  14:              CallBackInfo.Msg = "恭喜您,支付成功!咱們會盡快發貨!若是您收貨就能夠繼續確認收貨!";
  15:          }
  16:          else
  17:              CallBackInfo.Msg = "對不起,支付失敗!!失敗信息 :" + CallBackInfo.Msg + "請聯繫支付寶有關人員!";
  18:          //回調信息
  19:          string Msg = System.Web.HttpContext.Current.Server.UrlEncode(CallBackInfo.Msg);
  20:          Common.JScript.JavaScriptLocationHref("../PayCallBack.aspx?ReturnCode=" + CallBackInfo.ReturnCode.ToString() + "&Msg=" + Msg + "&OrderId=" + CallBackInfo.OrderId + "&PayFre=" + CallBackInfo.PayFre);
  21:      }
  22:   
  23:      public bool IsReusable {
  24:          get {
  25:              return false;
  26:          }
  27:      }
  28:   
  29:  }

回調前臺頁面:

   1:  <%@ Page Language="C#" MasterPageFile="~/Member.master" AutoEventWireup="true" CodeFile="PayCallBack.aspx.cs"
   2:      Inherits="Member_PayCallBack" Title="支付回調" %>
   3:   
   4:  <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
   5:      <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
   6:      <link href="../css/buy.css" rel="stylesheet" type="text/css" />
   7:        <link href="../css/AliPay.css" rel="stylesheet" type="text/css" />
   8:         <script src="../js/queryUrlParams.js" type="text/javascript"></script>
   9:   
  10:  <style type="text/css">
  11:    .MoneyFont
  12:    {
  13:        font-family:Verdana, Geneva, sans-serif;
  14:      font-size:18px;
  15:      font-weight:bold;
  16:      color:#F60;
  17:    }
  18:        
  19:  </style>
  20:  </asp:Content>
  21:  <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
  22:     <div class="zz">
  23:          <div class="gouwuche">
  24:              <div class="flow-steps">
  25:                  <ul class="num5">
  26:                      <li class="done"><span class="first">1. 查看購物車</span></li>
  27:                      <li class="done current-prev"><span>2. 確認訂單信息</span></li>
  28:                      <li class="current"><span>3. 付款到支付寶</span></li>
  29:                      <li><span>4. 確認收貨</span></li>
  30:                      <li class="last"><span>5. 評價</span></li>
  31:                  </ul>
  32:              </div>
  33:              <div id="main">
  34:                  <div id="head">
  35:                      <div id="logo">
  36:                      </div>
  37:                      <dl class="alipay_link">
  38:                          <a target="_blank" href="http://www.alipay.com/"><span>支付寶首頁</span></a>| <a target="_blank"
  39:                              href="https://b.alipay.com/home.htm"><span>商家服務</span></a>| <a target="_blank" href="http://help.alipay.com/support/index_sh.htm">
  40:                                  <span>幫助中心</span></a>
  41:                      </dl>
  42:                      <span class="title">支付寶純擔保交易付款快速通道</span>
  43:                      <!--<div id="title" class="title">支付寶純擔保交易付款快速通道</div>-->
  44:                  </div>
  45:                  <div class="cashier-nav">
  46:                      <ol>
  47:                          <li>一、確認付款信息 →</li>
  48:                          <li>二、付款 →</li>
  49:                          <li class="last current">三、付款完成</li>
  50:                      </ol>
  51:                  </div>
  52:                  <div id="body" style="clear: left">
  53:                      <dl class="content1">
  54:                          <dt>訂單號:</dt>
  55:                          <dd>
  56:                             
  57:                              <span id="OrderId"></span>
  58:                          </dd>
  59:                          <dt>付款金額:</dt>
  60:                          <dd>
  61:                         
  62:                              ¥:<span  class="MoneyFont" id="PayFre"></span>
  63:                          </dd>
  64:                          <dt>支付狀態:</dt>
  65:                          <dd>
  66:                            
  67:                    <span style="color:Red" id="Msg"></span>
  68:                          </dd>
  69:                          <dt></dt>
  70:                          <dd>
  71:                              <span class="new-btn-login-sp">
  72:                                  <input type="button" id="BtnAlipay" name="BtnAlipay" class="new-btn-login" value="確認收貨"
  73:                                      style="text-align: center" />
  74:                              </span>
  75:                          </dd>
  76:                      </dl>
  77:                  </div>
  78:                  <div id="foot1">
  79:                      <ul class="foot-ul">
  80:                          <li>支付寶版權全部 2011-2015 ALIPAY.COM </li>
  81:                      </ul>
  82:                  </div>
  83:              </div>
  84:          </div>
  85:      </div>
  86:      <script type="text/javascript">
  87:           //得到回調過來的信息
  88:           $(function(){
  89:       var ReturnCode=$.query.get("ReturnCode"); 
  90:       var Msg=$.query.get("Msg");
  91:       var OrderId=$.query.get("OrderId");
  92:       var PayFre=$.query.get("PayFre");
  93:           if(ReturnCode=="ok")
  94:           $("#Msg").text("恭喜您,支付成功!咱們會盡快發貨!若是您收貨就能夠繼續確認收貨!");
  95:           else
  96:           $("#Msg").text("對不起,支付失敗!!失敗信息 :"+Msg+"請聯繫支付寶有關人員!");
  97:          $("#OrderId").text(OrderId);
  98:           $("#PayFre").text(PayFre);
  99:           });
 100:      
 101:       
 102:      </script>
 103:  </asp:Content>

 

 

程序截圖:

image

image

image

效果圖就是這樣子

相關文章
相關標籤/搜索