上次,曾經說到一個URL管理的問題,好比咱們不少頁面爲了性能考慮生成靜態頁面,咱們常常javascript
性剛開始的時候用動態頁面+ajax的方式加載,頁面靜態化的時候,若是是新聞內容頁,咱們能夠css
把靜態頁面的URL地址保存在數據庫中,可是,單個頁面,好比,首頁,會員空間的各個頁面,就不html
適合放在數據庫中,這時候更適合寫一個通用模塊相似MVC中的"控制器"來控制頁面的靜態化java
和URL重寫,這就省去了一個一個很繁瑣的過程.jquery
打個比方,咱們能夠寫一個通用模塊調用:web
這種方式相似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
咱們能夠在後臺設置那些頁面要生成HTML和URL重寫規則的定製.......c#
不過貌似還有好多沒實現,正在思考中............
進入主題:
此次,主要是購物車的實現,購物車的實現,我是在數據庫創建了一個購物車的臨時表,原本打算用Cookies作,不過,先用數據庫作,比較穩妥,Cookies涉及安全性處理須要作不少處理.呃....這個之後可能會深刻實現.
首先是,當用戶點擊
呃.....就ajax加入購物車,而後彈出層,顯示
主要是ajax,先加入購物車(加入購物車以前,要檢查購物車是否存在此商品,若是存在,原本應該
把購物車中商品的數量+1,我這裏是直接提示用戶已加入購物車,這是個小BUG),而後回調計
算購物車中的寶貝數量和總金額.
代碼不過重要,這裏就不粘貼了.
主要是思路要清晰一些.接下來就是購物車結算.
這個用了一個框架(改改顏色就上了,不過感受加載了好多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: }
接下來就是訂單結算,
呃...訂單很醜...沒作處理.....
其實,這裏面大部分信息都是之前作會員信息管理的數據加載,只須要調用會員管理的js,根本業務邏輯都不用寫....
相對來講難寫一點的就是提交訂單的處理,
首先咱們要提交訂單,個人數據庫,設計了訂單表和訂單商品表,訂單號是根據日期生成的,訂單號的生成就是相似流水號生成,
這個很重要,由於大多數狀況下,訂單是日期生成,並且要保證惟一性,之前曾經總看到(數據庫的id不設計成自增,而後varchar類型,程序生成id號),
這種設計方式就是嚴重沒考慮併發處理的狀況,若是同時n我的訂單號根本就不能保證惟一性...
到網上搜索流水號生成,就能看到如何解決這個問題,其實就是建一張表,寫存儲過程的方式計算id,要保證id的惟一性.
個人這個是從博客園一個高手的日誌上切下來的..
獲取訂單號的存儲過程
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
調用函數
這樣,咱們每次插入數據的時候,只要調用這個存儲過程就能保證每次生成的訂單號都不同,
接下來就是訂單處理了:
咱們須要處理哪些呢?
首先是提交用戶的收貨信息,再次檢驗庫存狀態,而後插入訂單信息表和訂單產品表,而且將商品表的產品數量更新,而且給用戶發送訂單郵件(我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: }
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> 賣家: <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請求參數,數字簽名,等信息,交易成功而後按照請求讀取參數檢驗數字簽名是否正確.
這部份內容,我是準備集成多種支付平臺設計,今天只展現支付寶部分.
在設計這部分,咱們須要去查看支付寶接口模擬,通常申請支付寶都會提供一個接口測試程序,等等,
咱們在作以前,爲了考慮多種支付平臺的配置,首先定義一些配置信息,
我是把支付寶接口配置成一個網站,而後,經過網關調用,進行模擬
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>
程序截圖:
效果圖就是這樣子