前往支付宝显示javascript get请求请求开始怎么办

最近这几天很忙,一边忙着准备一堆课程设计(8门专业课.....伤不起...时间都是靠挤),一边还要党校培训....呃......顺便做了一下购物车,订单和支付宝简单的流程.上次,曾经说到一个URL管理的问题,比如我们很多页面为了性能考虑生成静态页面,我们经常性刚开始的时候用动态页面+ajax的方式加载,页面静态化的时候,如果是新闻内容页,我们可以把静态页面的URL地址保存在数据库中,但是,单个页面,比如,首页,会员空间的各个页面,就不适合放在数据库中,这时候更适合写一个通用模块类似MVC中的"控制器"来控制页面的静态化和URL重写,这就省去了一个一个很繁琐的过程.打个比方,我们可以写一个通用模块调用:这种方式类似asp.net 中MVC的控制器,函数大致的代码思路:
/// &summary&
/// 获得路径(暂时只做静态页面管理)(/*在这里可以扩展出URL重写*/)
/// &/summary&
/// &param name="PageUrl"&页面的URL(不包括扩展名)&/param&
/// &param name="QueryString"&页面参数&/param&
/// &returns&&/returns&
public static string GetURL(string PageUrl,string QueryString)
//页面路径
string PagePath = "";
//如果当前的参数不为空,则加上?
if (QueryString != "")
QueryString = "?" + QueryS
//如果是静态页面(从配置文件中读取静态页面状态(是否))
if (ReadURLConfig(PageUrl) == true)
PagePath=PageUrl + ".htm" + QueryS
//如果是动态页面
PagePath = PageUrl + ".aspx" + QueryS
//把相对路径转化为绝对路径
System.Web.VirtualPathUtility.ToAbsolute(PagePath); ;
/// &summary&
/// 从配置文件中读取是否生成静态页面
/// &/summary&
/// &param name="PageName"&页面的名称&/param&
/// &returns&&/returns&
public static bool ReadURLConfig(string PageName)
//读取配置文件
string path = HttpContext.Current.Server.MapPath(@"~/Admin/ConfigManage/URLConfig.);
//是否生成HTML
string IsHtml="false";
IsHtml="/PageSettings/Page[@PageName='"+PageName+"']", "IsHtml");
if (IsHtml.ToLower() == "true")
}配置文件属性:(URL重写部分,还没有实现)我们可以在后台设置那些页面要生成HTML和URL重写规则的定制.......不过貌似还有好多没实现,正在思考中............&&进入主题:这次,主要是购物车的实现,购物车的实现,我是在数据库建立了一个购物车的临时表,本来打算用Cookies做,不过,先用数据库做,比较稳妥,Cookies涉及安全性处理需要做很多处理.呃....这个以后可能会深入实现.首先是,当用户点击呃.....就ajax加入购物车,然后弹出层,显示主要是ajax,先加入购物车(加入购物车之前,要检查购物车是否存在此商品,如果存在,本来应该把购物车中商品的数量+1,我这里是直接提示用户已加入购物车,这是个小BUG),然后回调计算购物车中的宝贝数量和总金额.代码不太重要,这里就不粘贴了.主要是思路要清晰一些.接下来就是购物车结算.这个用了一个框架(改改颜色就上了,不过感觉加载了好多js,呃,....不过总比asp.net服务端控件实现要好得多).&这个也就是增删改查设计,不过值得一提的就是,我们尽量把大量的前台js代码单独放在一个文件中,这样客户端的缓存起来第二次访问起来就只需要更少的请求.前台代码非常简洁:
&%@ Page Language="C#" MasterPageFile="~/Member.master" AutoEventWireup="true" CodeFile="ShopingCart.aspx.cs"
Inherits="Member_ShopingCart" Title="购物车" %&
&asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"&
&meta http-equiv="content-type" content="text/ charset=UTF-8" /&
&link href="../css/buy.css" rel="stylesheet" type="text/css" /&
&script src="../Admin/scripts/jquery-1.6.2.min.js" type="text/javascript"&&/script&
&script src="../Admin/scripts/miniui/miniui.js" type="text/javascript"&&/script&
&link href="../Admin/scripts/miniui/themes/default/miniui2.css" rel="stylesheet"
type="text/css" /&
&link href="../Admin/scripts/miniui/themes/icons.css" rel="stylesheet" type="text/css" /&
&script src="../js/AjaxJsDeal/ShoppingCart.js" type="text/javascript"&&/script&
&style type="text/css"&
.New_Button, .Edit_Button, .Delete_Button, .Update_Button, .Cancel_Button
font-size:11color:#1B3F91;font-family:V
margin-right:5
&/asp:Content&
&asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"&
&li &&span &1. 查看购物车&/span&&/li&
&li&&span&2. 确认订单信息&/span&&/li&
&li&&span&3. 付款到支付宝&/span&&/li&
&li&&span&4. 确认收货&/span&&/li&
&li &&span&5. 评价&/span&&/li&
商品总价(不含运费):&span&
&label id="lbCountNum1" text="" /&
&/span&元&/div&
&a href="MemberOrders.aspx"&
&img src="../images/js_small_03.jpg" /&&/a&&a href="MemberOrders.aspx"&&/a&&/div&
&div id="datagrid1"
allowresize="true" multiSelect="true"
url="Data/GetMemberInfo.ashx?method=SearchShoppingCart" idfield="Id"&
&div property="columns" &
&div type="checkcolumn" width="30"&
&div field="ProductId" width="60" headeralign="center" allowsort="true" renderer="onRenderProduct"&
产品Id&/div&
&div field="Picturepath" width="100" align="center" headeralign="center" renderer="onReaderPic"&
图片&/div&
&div field="ProductName" width="100" headeralign="center" allowsort="true" renderer="onRenderProductName"&
产品名称&/div&
&div field="SupperlierName" renderer="RendererSupperlierName" width="120"&
供应商&/div&
&div field="Price" width="80" allowsort="true"&
商品售价&/div&
&div field="Quantity" width="80" headeralign="center" &
&input property="editor"
minValue="1"
renderer="onRenderQuantity" maxValue="9999"
value="1" /&
购买数量&/div&
&div name="action" width="80" headerAlign="center" align="center" renderer="onActionRenderer" cell&操作&/div&
&table width="700"
cellpadding="0" cellspacing="0"&
&td colspan="4" &
&input type="button" onclick="remove" value="批量删除" /&--%& &a
iconCls="icon-remove" onclick="remove"&批量删除&/a&
&td colspan="4"&
商品总价(不含运费):&span&
&label id="lbCountNum"&
&/span&元&/div&
&td colspan="4"&
&td colspan="4"&
&a href="MemberOrders.aspx"&
&img src="../images/js_big.jpg" /&&/a&&/div&
&script type="text/javascript"&
mini.parse(); 100:
var grid = mini.get("datagrid1"); 102:
grid.load({ 103:
key: "", 104:
pageIndex: 0, 105:
pageSize: 10, 106:
sortField: "Id", 107:
sortOrder: "asc" 108:
//初始化 110:
$(function(){ 111:
GetCartInfo(); 112:
&/script& 115:
&/asp:Content&关键性js文件:
//购物车汇总信息
function GetCartInfo(){
url:"/Member/Data/GetMemberInfo.ashx?method=GetCartInfo",
type:"post",
success:function(text){
var DataJson=$.parseJSON(text);
if(DataJson.Status!='False')//执行成功!
//显示当前购物车总数量和总价
$("#lbCountNum").text(DataJson.Data[0].CartSum);
$("#lbCountNum1").text(DataJson.Data[0].CartSum);
//$("#CartMsg").html('目前购物车中已有'+DataJson.Data[0].CartCount+'件宝贝,合计:&span&'+DataJson.Data[0].CartSum+'&/span&元');
alert("加载购物车汇总信息出错!");
//操作重绘
function onActionRenderer(e) {
var grid = e.
var record = e.
var uid = record._
var rowIndex = e.rowI
var s = ''
href="javascript:editRow(\'' + uid + '\')"&编辑&/a&'
href="javascript:delRow(\'' + uid + '\')"&删除&/a&';
if (grid.isEditingRow(record)) {
href="javascript:updateRow(\'' + uid + '\')"&更新&/a&'
href="javascript:cancelRow(\'' + uid + '\')"&取消&/a&'
//产品名称超链接重绘
function onRenderProductName(e){
var record = e.
var uid = record._
var rowIndex = e.rowI
var row = grid.getRowByUID(uid);
var href='&a href="//Product/Product.aspx?ProductId='+row.ProductId+'" &'+ row.ProductName+'&/a&';
//产品超链接重绘
function onRenderProduct(e){
var record = e.
var uid = record._
var rowIndex = e.rowI
var row = grid.getRowByUID(uid);
var href='&a href="//Product/Product.aspx?ProductId='+row.ProductId+'" &'+ row.ProductId+'&/a&';
//图片重绘
function onReaderPic(e){
var record = e.
var uid = record._
var rowIndex = e.rowI
var row = grid.getRowByUID(uid);
var src= '&img src="../Admin/FileManage/GetImg.ashx?method=GetMainProductPic&type=small&fileName='+e.value+'" /&';
var href='&a href="//Product/Product.aspx?ProductId='+row.ProductId+'" &'+ src+'&/a&';
//卖家网址重绘
function RendererSupperlierName(e) {
var record = e.
var uid = record._
var rowIndex = e.rowI
var row = grid.getRowByUID(uid);
var SupperlierName=row.SupperlierN
var SupperlierId=row.SupperlierId;
var BelongType=row.BelongT
var BelongWebS
if(BelongType==0)
BelongWebSize="/Master/MasterInfo.aspx?MasterId="+SupperlierId;
BelongWebSize="/Company/CompanyInfo.aspx?CompanyId="+SupperlierId;
var s = '&a href="'+BelongWebSize+'" &'+SupperlierName+'&/a&';
function editRow(row_uid) {
var row = grid.getRowByUID(row_uid);
if (row) {
grid.cancelEdit();
grid.beginEditRow(row);
function cancelRow(row_uid) {
grid.reload();
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:
error: function () { 111:
function updateRow(row_uid) { 118:
var row = grid.getRowByUID(row_uid); 119:
var rowData = grid.getEditRowData(row); 121:
if(parseInt(row.Num-row.Soldnum)&parseInt(rowData.Quantity)) 122:
alert("当前库存不足!"); 124:
rowData.Quantity=parseInt(row.Num-row.Soldnum); 125: 126:
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:
error: function (jqXHR, textStatus, errorThrown) { 137:
alert(jqXHR.responseText); 138:
//批量删除 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. i & i++) { 149:
var r = rows[i]; 150:
ids.push(r.Id); 151:
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:
error: function () { 161:
} else { 165:
alert("请选中一条记录"); 166:
//操作重绘 169:
function onSumRenderer(e) { 170:
var grid = e. 171:
var record = e. 172:
var uid = record._ 173:
var rowIndex = e.rowI 174:
var row = grid.getRowByUID(uid); 175:
return row.Price*row.Q 176:
}不过注意的是,涉及到电子商务,客户端的数据都是不可靠的,所以我们的数据都是从数据库重新读取.后台c#处理代码:
/// &summary&
/// 购物车检索
/// &/summary&
/// &param name="context"&&/param&
public void SearchShoppingCart(HttpContext context)
string UserId = SessionHelper.GetSession("UserId").ToString();
// string key = context.Request["key"];
int pageIndex = Convert.ToInt32(context.Request["pageIndex"]);
int pageSize = Convert.ToInt32(context.Request["pageSize"]);
//字段排序
String sortField = context.Request["sortField"];
String sortOrder = context.Request["sortOrder"];
string strCondition = "";
VCartProductInfoBLL bll = new VCartProductInfoBLL();
if (Tools.IsNullOrEmpty(sortField))
sortField = "Id";
//查询条件
strCondition = " MemberId=" + UserId;
//分页数据读取
IEnumerable&VCartProductInfo& list = bll.ListByPagination(sortField, pageSize, pageIndex + 1, sortOrder == "asc" ? "1" : "0", strCondition);
//获取总页数
int totalPage = bll.GetCount(strCondition);
//JSON 序列化
string json = Common.FormatToJson.MiniUiListToJson&VCartProductInfo&((IList&VCartProductInfo&)list, totalPage, "");
context.Response.Write(json);
/// &summary&
/// 保存到购物车
/// &/summary&
/// &param name="context"&&/param&
public void SaveShoppingCart(HttpContext context)
//数据读取
String Cart = context.Request["ShoppingCart"];
string info = Cart.TrimStart('[');
info = info.TrimEnd(']');
JObject o = JObject.Parse(info);
Int64 Id = (Int64)o.SelectToken("Id");
int Quantity = (int)o.SelectToken("Quantity");
Int64 ProductId = (Int64)o.SelectToken("ProductId");
//库存判断(从数据库读取库存检验)
product CartInfo = new productBLL().Get(ProductId);
if (Quantity & (int)(CartInfo.Num.Value - CartInfo.Soldnum.Value))
context.Response.Write(Tools.WriteJsonForReturn(false, "库存数量不足!"));
//更新购物车
ShoppingCart Shop=new ShoppingCart ();
Shop.Id=Id;
Shop.Quantity=Q
bool Status=
Status=new ShoppingCartBLL().UpdateShoppingCart(Shop);
string Msg="";
if (Status)
Msg = "库存不足!";
context.Response.Write(Tools.WriteJsonForReturn(Status, Msg));
/// &summary&
/// 获取购物车信息
/// &/summary&
/// &param name="context"&&/param&
public void GetCartInfo(HttpContext context)
string UserId = (string)context.Session["UserId"];
context.Response.Write(new ShoppingCartBLL().GetCartInfo(UserId));
/// &summary&
/// 删除购物车内容
/// &/summary&
/// &param name="context"&&/param&
public void RemoveShoppingCart(HttpContext context)
String idStr = context.Request["Id"];
if (String.IsNullOrEmpty(idStr))
//检验客户端字符串
if (Common.Tools.IsValidInput(ref idStr, true))
new ShoppingCartBLL().DeleteMoreID(idStr);
}接下来就是订单结算,呃...订单很丑...没做处理.....&其实,这里面大部分信息都是以前做会员信息管理的数据加载,只需要调用会员管理的js,根本业务逻辑都不用写....相对来说难写一点的就是提交订单的处理,首先我们要提交订单,我的数据库,设计了订单表和订单商品表,订单号是根据日期生成的,订单号的生成就是类似流水号生成,这个很重要,因为大多数情况下,订单是日期生成,而且要保证唯一性,以前曾经总看到(数据库的id不设计成自增,然后varchar类型,程序生成id号),这种设计方式就是严重没考虑并发处理的情况,如果同时n个人订单号根本就不能保证唯一性...到网上搜索流水号生成,就能看到如何解决这个问题,其实就是建一张表,写存储过程的方式计算id,要保证id的唯一性.我的这个是从博客园一个高手的日志上切下来的..获取订单号的存储过程
USE [czcraft]
/****** 对象:
StoredProcedure [dbo].[dpPMT_SGetMaintainSeq]
脚本日期: 05/19/:39 ******/
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
PROC [dbo].[dpPMT_SGetMaintainSeq]
@MaintainCate VARCHAR(2)
--***********************累加编号*************************************************
declare @MaintainNo VARCHAR(12) IF NOT EXISTS(SELECT * FROM NumSeq WHERE Cate=@MaintainCate AND DATEDIFF(DAY,CrTime,GETDATE())=0) BEGIN
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
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
--************************组合编号***************************************************************
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布局,哈哈),这里粘贴主要模块代码:提交订单:
/// &summary&
/// 订单提交
/// &/summary&
/// &param name="context"&&/param&
public void SubmitOrderData(HttpContext context)
string UserId = (string)context.Session["UserId"];
if(Tools.IsNullOrEmpty(UserId))
string Name = context.Request["Name"];
string Email = context.Request["Email"];
string Province = context.Request["Province"];
string City = context.Request["City"];
string Country = context.Request["Country"];
string Address = context.Request["Address"];
string ZipCode = context.Request["ZipCode"];
string MobilePhone = context.Request["MobilePhone"];
string TelPhone = context.Request["TelPhone"];
//订单信息保存
orders order = new orders();
order.ConsigneeName = N
order.ConsigneeRealName = N
order.ConsigneeEmail = E
order.ConsigneeProvince = P
order.ConsigneeZip = ZipC
order.UserId =Convert.ToInt32(UserId);
order.ConsigneeAddress = City + Country + A
order.OrderDate = DateTime.N
order.ConsigneePhone = MobileP
order.ConsigneeTel = TelP
order.OrderId = ordersBLL.GetOrderId();
ordersBLL bll = new ordersBLL();
string ReturnProductName = "";
bool Status = bll.SaveOrder(ref order, out ReturnProductName);
//去除最后的,
ReturnProductName = ReturnProductName.Remove(ReturnProductName.Length - 1, 1);
string Data = "";
//支付跳转URL
string TurnURL = "";
if (Status)
Data = "恭喜您!下单成功!";
//支付平台的跳转URL生成
PayInfo info=new PayInfo ();
info.SaleEmail="";
info.OrderId=order.OrderId;
info.ProductName = ReturnProductN
info.Remark=order.ConsigneeName+"在"+order.ShopDate.Value.ToShortDateString()+"购买商品,共计:"+order.TotalPrice.Value.ToString ();
info.TotalFre = order.FactPrice.Value.ToString ();
Pay pay = new Pay();
TurnURL=pay.BuildURL(info);
Data = "对不起!下单失败!";
//返回的json数据
string ReturnJson = "{\"Status\":\"" + Status + "\",\"Data\":\"" + Data + "\",\"URL\":\""+TurnURL+"\"}"; ;
context.Response.Write(ReturnJson);
}&订单提交BLL:
#region 保存订单
/// &summary&
/// 保存订单
/// &/summary&
/// &param name="order"&订单&/param&
/// &param name="ReturnProductNames"&返回产品名称列表&/param&
/// &returns&&/returns&
public bool SaveOrder(ref orders order,out string ReturnProductNames)
ReturnProductNames = "";
//查询条件(购物车视图中查询)
string Condition = " MemberId=" + order.UserId;
//(需要读取购物车,然后,插入订单商品表和订单表)
//订单产品信息列表
List&orderproduct& listOrder = new List&orderproduct&();
IEnumerable&VCartProductInfo& CartProducts = new VCartProductInfoDAL().ListAll(Condition);
order.TotalPrice = 0.0;
order.FactPrice = 0.0;
foreach (VCartProductInfo CartProduct in CartProducts)
orderproduct OrderProduct = new orderproduct();
OrderProduct.AddTime = DateTime.N
OrderProduct.OrderId = order.OrderId;
OrderProduct.ProId = CartProduct.ProductId.Value.ToString();
OrderProduct.ProImg = CartProduct.P
OrderProduct.ProName = CartProduct.ProductN
ReturnProductNames += OrderProduct.ProName + ",";
OrderProduct.ProNum = CartProduct.Q
OrderProduct.ProPrice = CartProduct.P
OrderProduct.ProOtherPara = "";
OrderProduct.Remark = "";
OrderProduct.Specification = "";
//加入到产品订单信息列表中
listOrder.Add(OrderProduct);
//总价计算
order.TotalPrice += OrderProduct.ProPrice.Value * OrderProduct.ProNum.V
//实际总价
order.FactPrice += OrderProduct.ProPrice.Value * OrderProduct.ProNum.V
//支付状态为等待付款
order.PaymentStatus = orders.ePaymentStatus.WaitPay.GetHashCode().ToString();
//订单状态为未支付
order.OrderStatus = orders.eOrderStatus.NotPay.GetHashCode().ToString();
//订单状态
order.IsOrderNormal = 0;
order.Remark = "";
order.ShopDate = DateTime.N
order.OrderDate = DateTime.N
//返回订单执行状态
bool Status = new ordersDAL().AddOrders(order, listOrder);
if (Status)
//给客户发邮件
SMTP smtp = new SMTP(order.ConsigneeEmail);
smtp.SendMail("潮州工艺平台", SendToCustomContentHtml(order, listOrder));
}发送邮件:
#region 生成给客户发的HTML内容(亚马逊布局)
/// &summary&
/// 生成给客户发的HTML内容(亚马逊)
/// &/summary&
/// &param name="order"&&/param&
/// &param name="ProductsList"&&/param&
/// &returns&&/returns&
public string SendToCustomContentHtml(orders order, IEnumerable&orderproduct& ProductsList)
//获取当前http上下文
System.Web.HttpContext context = System.Web.HttpContext.C
string Default = context.Request.Url.Scheme + "://" + context.Request.Url.Authority + System.Web.VirtualPathUtility.ToAbsolute("~/Default.aspx");
//会员订单网址
string webpath = context.Request.Url.Scheme + "://" + context.Request.Url.Authority + System.Web.VirtualPathUtility.ToAbsolute("~/Member/MemberOrders.aspx");
//文件流读取
StringBuilder sb=new StringBuilder ();
sb.Append(File.ReadAllText (context.Server.MapPath("~/Other/SendToCustomContent.html"),Encoding.UTF8));
sb.Replace("$ConsigneeRealName", order.ConsigneeRealName);
sb.Replace("$ConsigneeEmail", order.ConsigneeEmail);
sb.Replace("$ConsigneeRealName", order.ConsigneeRealName);
sb.Replace("$ConsigneeAddress", order.ConsigneeAddress);
sb.Replace("$ConsigneeProvince", order.ConsigneeProvince);
sb.Replace("$ConsigneeZip", order.ConsigneeZip);
sb.Replace("$TotalPrice", order.TotalPrice.Value.ToString ());
sb.Replace("$webpath", webpath);
sb.Replace("$OrderId", order.OrderId);
sb.Replace("$TotalPrice", order.TotalPrice.Value.ToString ());
sb.Replace("$Carriage", order.Carriage.ToString ());//
sb.Replace("$TotalPrice", order.TotalPrice.Value.ToString ());
sb.Replace("$FactPrice", order.FactPrice.Value.ToString ());
sb.Replace("$DateTime", DateTime.Now.AddDays(3).ToShortDateString());
//商品内容生成
int num = 0;
StringBuilder TempData = new StringBuilder();
foreach (orderproduct Product in ProductsList)
string temp3 = @"&table&&tbody&
&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&
&span class='price'&¥ " + Product.ProPrice + @"&/span&&br&现在有货&br&& 卖家: &a href='" + Default + @"' target='_blank'&潮州工艺品集团&/a& &/font&&/td&&/tr&&/tbody&&/table&";
TempData.Append(temp3);
//商品主体信息替换
sb.Replace("$Body", TempData.ToString ());
//sb.Replace("$Carriage", order.Carriage);
return sb.ToString();
}DAL中保存订单处理:
#region 下单
/// &summary&
/// &/summary&
/// &param name="Info"&订单信息&/param&
/// &param name="OrderProductsList"&订单产品信息&/param&
/// &returns&&/returns&
public bool AddOrders(orders order, IEnumerable&orderproduct& OrderProductsList)
//执行事务状态
bool Status =
StringBuilder sb = new StringBuilder();
SqlHelper.Open();
//开始事务
SqlHelper.BeginTrans();
foreach (orderproduct product in OrderProductsList)
//插入订单产品表信息
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);
//产品数量修改
sb.AppendFormat("update product set Num=Num-{0},Soldnum=Soldnum+{0} where Id={1};", product.ProNum, product.ProId);
//删除购物车中的产品
sb.AppendFormat("delete from ShoppingCart where ProductId={0} and MemberId={1};", product.ProId, order.UserId);
//订单信息添加
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);
Status = SqlHelper.ExecuteNonQuery(sb.ToString());
if (Status)
mitTrans();
SqlHelper.RollbackTrans();
}在这里,为了更节省性能,我用StringBuilder拼接字符串,也没有用参数化查询的方式.(注意这里采用事务处理)然后就是支付平台的实现,其实支付平台说简单点是非常容易的,只需要按照支付的接口提供http请求参数,数字签名,等信息,交易成功然后按照请求读取参数检验数字签名是否正确.这部分内容,我是准备集成多种支付平台设计,今天只展示支付宝部分.在设计这部分,我们需要去查看支付宝接口模拟,一般申请支付宝都会提供一个接口测试程序,等等,我们在做之前,为了考虑多种支付平台的配置,首先定义一些配置信息,我是把支付宝接口配置成一个网站,然后,通过网关调用,进行模拟
using System.D
using System.C
using System.L
using System.W
using System.Web.S
using System.Web.UI;
using System.Web.UI.HtmlC
using System.Web.UI.WebC
using System.Web.UI.WebControls.WebP
using System.
/// &summary&
///PayInfo 的摘要说明
/// &/summary&
public class PayInfo
public PayInfo()
//TODO: 在此处添加构造函数逻辑
/// &summary&
/// &/summary&
public string SaleManId { }
/// &summary&
/// 回调地址
/// &/summary&
public string CallBackUrl { }
/// &summary&
/// 产品名称
/// &/summary&
public string ProductName { }
/// &summary&
/// 订单号
/// &/summary&
public string OrderId { }
/// &summary&
/// 总金额
/// &/summary&
public string TotalFre { }
/// &summary&
/// 卖家邮箱
/// &/summary&
public string SaleEmail { }
/// &summary&
/// 数字签名
/// &/summary&
public string Sign { }
/// &summary&
/// 备注信息
/// &/summary&
public string Remark { }
/// &summary&
/// 支付回调信息
/// &/summary&
public class PayCallBackInfo
/// &summary&
/// 支付类型
/// &/summary&
public Pay.PayType PayType { }
/// &summary&
/// 订单号
/// &/summary&
public string OrderId { }
/// &summary&
/// 支付机构
/// &/summary&
public string PayMode { }
/// &summary&
/// 支付金额
/// &/summary&
public string PayFre { }
/// &summary&
/// 金额币种
/// &/summary&
public string MoneyType { }
/// &summary&
/// &/summary&
public string Remark1 { }
/// &summary&
/// &/summary&
public string Remark2 { }
/// &summary&
/// 数字签名
/// &/summary&
public string Sign { }
/// &summary&
/// 状态码
/// &/summary&
public Pay.ReturnCode ReturnCode { } 100:
/// &summary& 101:
/// 回发的消息 102:
/// &/summary& 103:
public string Msg { } 104:
/// &summary& 106:
/// 支付配置信息 107:
/// &/summary& 108:
public class PayConfig 109:
/// &summary& 111:
/// 支付类型 112:
/// &/summary& 113:
public Pay.PayType PayType { } 114:
/// &summary& 115:
/// 商户帐号 116:
/// &/summary& 117:
public string v_mid { } 118:
/// &summary& 119:
/// 商户密码 120:
/// &/summary& 121:
public string v_pwd { } 122:
/// &summary& 123:
/// 网关地址 124:
/// &/summary& 125:
public string PayUrl { } 126:
using System.D
using System.C
using System.L
using System.W
using System.Web.S
using System.Web.UI;
using System.Web.UI.HtmlC
using System.Web.UI.WebC
using System.Web.UI.WebControls.WebP
using System.
using czcraft.BLL;
/// &summary&
///Pay 的摘要说明
/// &/summary&
public class Pay
//支付平台的配置信息
public readonly
public Pay()
//获取支付平台的配置信息
config = GetPayConfig();
//TODO: 在此处添加构造函数逻辑
/// &summary&
/// 支付类型
/// &/summary&
public enum PayType
/// &summary&
/// 支付宝
/// &/summary&
Alipay = 0,
/// &summary&
/// 网银在线
/// &/summary&
ChinaBank = 1
/// &summary&
/// 回调状态码(支付宝才有)
/// &/summary&
public enum ReturnCode
/// &summary&
/// 支付成功!
/// &/summary&
/// &summary&
/// 支付失败!
/// &/summary&
#region 构造支付的URL
/// &summary&
/// 构造支付的URL(从配置文件中读取出支付平台配置信息然后构造支付的网关信息(支付平台由配置文件决定)(初步只提供网银在线和支付宝两种模式中的一种)
/// &/summary&
/// &param name="Info"&支付信息(支付宝支付需要输入总金额,产品名称,订单号,卖家邮箱)&/param&
/// &returns&&/returns&
public string BuildURL(PayInfo Info)
//获取支付平台的配置信息
//PayConfig config = GetPayConfig();
//支付的地址
string PayUrl = "";
switch (config.PayType)
//支付宝支付
case PayType.Alipay:
PayUrl = BuildAlipayURL(Info, config);
//网银在线支付
case PayType.ChinaBank:
PayUrl = BuildChinaBackUrl(Info, config);
PayUrl= "#";
return PayU
#endregion
#region 支付完成回调处理
/// &summary&
/// 支付完成回调处理
/// &/summary&
/// &param name="Msg"&回调信息&/param&
/// &returns&&/returns&
public PayCallBackInfo CallBackPayInfo()
string Msg = "";
PayCallBackInfo CallBackInfo = new PayCallBackInfo();
switch (config.PayType) 100:
//支付宝支付 102:
case PayType.Alipay: 103:
CallBackInfo = CallBackAlipayInfo(); 104:
//网银在线支付 106:
case PayType.ChinaBank: 107:
CallBackInfo = CallBackChinaBankInfo(); 108:
default: 110:
CallBackInfo = 111:
return CallBackI 114:
#region 支付宝支付完成回调处理 116:
/// &summary& 117:
/// 支付宝支付完成回调处理 118:
/// &/summary& 119:
/// &param name="Msg"&回调信息&/param& 120:
/// &returns&&/returns& 121:
private PayCallBackInfo CallBackAlipayInfo() 122:
//回调信息 124:
string Msg = ""; 125:
System.Web.HttpContext context = System.Web.HttpContext.C 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:
//支付成功! 141:
if (ReturnCode.Equals(Pay.ReturnCode.ok.ToString())) 142:
Msg = "支付成功!"; 144:
CallBackInfo.Msg = M 145:
CallBackInfo.OrderId = OrderId; 146:
CallBackInfo.PayFre = TotalF 147:
CallBackInfo.ReturnCode = Pay.ReturnCode. 148:
Msg = "支付失败!"; 152:
CallBackInfo.Msg = M 154:
CallBackInfo.ReturnCode = Pay.ReturnCode. 155:
Msg = "数据被篡改!"; 161:
CallBackInfo.Msg = M 162:
CallBackInfo.ReturnCode = Pay.ReturnCode. 163:
return CallBackI 165:
#endregion 167:
#region 网银在线支付完成回调处理 168:
/// &summary& 169:
/// 网银在线支付完成回调处理(未实现) 170:
/// &/summary& 171:
/// &param name="Msg"&回调信息&/param& 172:
/// &returns&&/returns& 173:
private PayCallBackInfo CallBackChinaBankInfo() 174:
//回调信息 176:
Msg = ""; 177:
PayCallBackInfo CallBackInfo = new PayCallBackInfo(); 178:
return CallBackI 179:
#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:
System.Web.HttpContext context = System.Web.HttpContext.C 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:
#endregion 207:
#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:
return ""; 218:
#endregion 221:
#region 获取系统配置信息(支付相关) 223:
/// &summary& 224:
/// 获取系统配置信息(支付相关) 225:
/// &/summary& 226:
/// &returns&&/returns& 227:
public PayConfig GetPayConfig() 228:
PayConfig info = new PayConfig(); 230:
//读取配置文件信息 231:
string path = System.Web.HttpContext.Current.Server.MapPath(@"~/Admin/ConfigManage/config.); 232:
//系统配置中的支付类型 233:
string ConfigPayType = "/Root/Pay", "PayType"); 234:
//商户帐号 235:
string v_mid = "/Root/Pay/" + ConfigPayType, "v_mid"); 236:
//商户密码 237:
string v_pwd = "/Root/Pay/" + ConfigPayType, "v_pwd"); 238:
//支付网关 239:
string PayUrl = "/Root/Pay/" + ConfigPayType + "/PayUrl", ""); 240:
info.PayType = ConfigPayType == PayType.Alipay.ToString() ? PayType.Alipay : PayType.ChinaB 243:
info.v_mid = v_ 244:
info.v_pwd = v_ 245:
info.PayUrl = PayU 246:
#endregion 251:
}然后支付回调处理:
&%@ WebHandler Language="C#"
using System.W
//处理关于支付宝回调
public class DealAlipayCallBack : IHttpHandler {
public void ProcessRequest (HttpContext context) {
//支付回调
Pay pay = new Pay();
PayCallBackInfo CallBackInfo = pay.CallBackPayInfo();
if (CallBackInfo.ReturnCode == Pay.ReturnCode.ok)
CallBackInfo.Msg = "恭喜您,支付成功!我们会尽快发货!如果您收货就可以继续确认收货!";
CallBackInfo.Msg = "对不起,支付失败!!失败信息 :" + CallBackInfo.Msg + "请联系支付宝有关人员!";
//回调信息
string Msg = System.Web.HttpContext.Current.Server.UrlEncode(CallBackInfo.Msg);
Common.JScript.JavaScriptLocationHref("../PayCallBack.aspx?ReturnCode=" + CallBackInfo.ReturnCode.ToString() + "&Msg=" + Msg + "&OrderId=" + CallBackInfo.OrderId + "&PayFre=" + CallBackInfo.PayFre);
public bool IsReusable {
}回调前台页面:
&%@ Page Language="C#" MasterPageFile="~/Member.master" AutoEventWireup="true" CodeFile="PayCallBack.aspx.cs"
Inherits="Member_PayCallBack" Title="支付回调" %&
&asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"&
&meta http-equiv="content-type" content="text/ charset=UTF-8" /&
&link href="../css/buy.css" rel="stylesheet" type="text/css" /&
&link href="../css/AliPay.css" rel="stylesheet" type="text/css" /&
&script src="../js/queryUrlParams.js" type="text/javascript"&&/script&
&style type="text/css"&
.MoneyFont
font-family:Verdana, Geneva, sans-
font-size:18
font-weight:
color:#F60;
&/asp:Content&
&asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"&
&li &&span &1. 查看购物车&/span&&/li&
&li &&span&2. 确认订单信息&/span&&/li&
&li &&span&3. 付款到支付宝&/span&&/li&
&li&&span&4. 确认收货&/span&&/li&
&li &&span&5. 评价&/span&&/li&
&div id="main"&
&div id="head"&
&div id="logo"&
&a target="_blank" href="/"&&span&支付宝首页&/span&&/a&| &a target="_blank"
href="/home.htm"&&span&商家服务&/span&&/a&| &a target="_blank" href="/support/index_sh.htm"&
&span&帮助中心&/span&&/a&
&span &支付宝纯担保交易付款快速通道&/span&
&!--&div id="title" &支付宝纯担保交易付款快速通道&/div&--&
&li&1、确认付款信息 &&/li&
&li&2、付款 &&/li&
&li &3、付款完成&/li&
&div id="body" &
&dt&订单号:&/dt&
&span id="OrderId"&&/span&
&dt&付款金额:&/dt&
id="PayFre"&&/span&
&dt&支付状态:&/dt&
id="Msg"&&/span&
&input type="button" id="BtnAlipay" name="BtnAlipay"
value="确认收货"
&div id="foot1"&
&li&支付宝版权所有 2011- &/li&
&script type="text/javascript"&
//获得回调过来的信息
$(function(){
var ReturnCode=$.query.get("ReturnCode");
var Msg=$.query.get("Msg");
var OrderId=$.query.get("OrderId");
var PayFre=$.query.get("PayFre");
if(ReturnCode=="ok")
$("#Msg").text("恭喜您,支付成功!我们会尽快发货!如果您收货就可以继续确认收货!");
$("#Msg").text("对不起,支付失败!!失败信息 :"+Msg+"请联系支付宝有关人员!");
$("#OrderId").text(OrderId);
$("#PayFre").text(PayFre);
&/script& 103:
&/asp:Content&&&程序截图:效果图就是这样子

我要回帖

更多关于 javascript post请求 的文章

 

随机推荐