流程:/jsps/user/regist.jspàUserServlet#regist()àmsg.jsp
页面:
Servlet:
Service:
Dao:
流程:用户的邮件中àUserServlet#active()àmsg.jsp
流程:/jsps/user/login.jspàUserServlet#login()àindex.jsp
流程:top.jspàUserServlet#quit()àlogin.jsp
quit():把session销毁!
流程:main.jsp(
流程:left.jsp(全部分类)àBookServlet#findAll()à/jsps/book/list.jsp
流程:left.jspàBookServlet#findByCategory()àlist.jsp
流程:list.jsp(点击某一本书)àBookServlet#load()àdesc.jsp
购物车存储:
页面:/jsps/cart/list.jsp
它只有一个任务,就是遍历车!
车在session中,通过车可以得到所有的CartItem
${sessionScope.cart.cartItems}
top.jsp中存在一个链接:我的购物车
我的购物车直接访问/jsps/cart/list.jsp,它会显示session中车的所有条目
好处:
1去银行
后台的内容,必须要设置权限!
用户可以访问一个网站的哪些内容?
用户可以访问的只有WEB层!
修改分为两步:1、加载分类,2、修改分类
第一步:加载分类
第二步:修改分类
添加图书分两步:
book表与orderitem有关联关系!
删除图书不是真的数据库表中删除记录,而是给book表添加一个del字段,它是booleanod类型,表示是否已删除!
没有被删除的图书,该列的值为false,否则为true
处理问题:
删除图书:其实就是把表的del列修改为true!
什么是在线支付呢?没错,就是在网上花钱!大家一定有过这样的经历。但是你可能不太了解在线支付的"内情",下面我们来了解一下!
如果你现在开始经营一个电子商务网站,用户买了东西一定要支付,你的网站一定要可以连接各大银行了,然后在各大银行支付完成后,再返回到你的网站上显示"支付成功"!
这就是今天我们要做的事情,连接银行的网银系统完成支付。说专业一点,我们称之为"开发在线支付的网关"。
在线支付一共有两种方式:
电商直接与银行对接,这也要银行同意才行,但可惜的是,银行很"牛",不是谁想与它对接都可以的。如果你的电商每日的资金流量够大,那么银行会和你对接,因为客户支付给电商的钱都存到了银行的帐户中!但是如果资金流量小,银行不会理你的!
当小网站资金量不足时,不能与银行对接,那么它们会选择与第三方支付公司合作。大家也都明白这是些什么公司,例如:支付宝、易宝、财富通、快钱等公司是国内比较有名的。它们这些公司可以与银行对接(因为资金够多),然后小电商与它们对接!但是第三方是要求收费的!第三方一般会收取电商1%的费用,不过不会收客户的钱。
但是,我们的商城不能只可以对接一家银行吧!怎么也要对接BOC、CCB、ABC、ICBC四家吧!不同的银行需要的对接参数是不相同的,这说明我们在开发时要为不同的银行写不同的对接代码。这也是直接与银行对接的缺点!当然与银行直接对接也有好处,就是安全,没有手续费!
上图中已经说明,客户在电商的网站上点击确认支付后,会定向到第三方的网站,然后再由第三方与银行对接。这说明电商要传递给第三方参数!再由第三方把参数传递给银行。这种方式的好处是:只需要针对第三方开发即可,而不用再为每家银行提供参数。为每家银行提供参数的工作是第三方的任务了。但是,第三方不老可靠的,如果第三方倒闭了,人跑了,那你的钱就没了。因为客户支付的钱没有到你的银行帐户中,而是支付到了第三方的银行帐户中,而你是在第三方有一个帐户。而且第三方还要收手续费,一般是1%,这可不是小数字啊(真黑)。
电商想在第三方注册商户,需要向第三方提供ICP认证。ICP经营许可证是根据国家《互联网管理办法规定》,经营性网站必须办理的网站经营许可证,没有就属于非法经营。
我们不可能因为练习就去办理ICP!所以我们无法在第三方注册商户。不过我们已经有现成的在易宝注册的商户,所以这一步就可以忽略了。
当你在易宝注册成功后,易宝会给你如下几样东西:
在易宝接入规范中,还可以查找到易宝要求的参数,在电商与易宝对接时需要给支付网关传递这些参数:
参数名称
参数含义
是否必填
参数长度
参数说明
签名顺序
p0_Cmd
业务类型
是
Max(20)
固定值"Buy".
1
p1_MerId
商户编号
Max(11)
商户在易宝支付系统的唯一身份标识.获取方式见"如何获得商户编号"
2
p2_Order
商户订单号
否
Max(50)
若不为"",提交的订单号必须在自身账户交易中唯一;为""时,易宝支付会自动生成随机的商户订单号.易宝支付系统中对于已付或者撤销的订单,商户端不能重复提交。
3
p3_Amt
支付金额
单位:元,精确到分.此参数为空则无法直连(如直连会报错:抱歉,交易金额太小。),必须到易宝网关让消费者输入金额
4
p4_Cur
交易币种
Max(10)
固定值"CNY".
5
p5_Pid
商品名称
用于支付时显示在易宝支付网关左侧的订单产品信息.此参数如用到中文,请注意转码.
6
p6_Pcat
商品种类
商品种类.此参数如用到中文,请注意转码.
7
p7_Pdesc
商品描述
商品描述.此参数如用到中文,请注意转码.
8
p8_Url
商户接收支付成功数据的地址
Max(200)
支付成功后易宝支付会向该地址发送两次成功通知,该地址可以带参数,如:"www.yeepay.com/callback.actiontest=test".注意:如不填p8_Url的参数值支付成功后您将得不到支付成功的通知。
9
p9_SAF
送货地址
Max(1)
为"1":需要用户将送货地址留在易宝支付系统;为"0":不需要,默认为"0".
10
pa_MP
商户扩展信息
返回时原样返回,此参数如用到中文,请注意转码.
11
pd_FrpId
支付通道编码
默认为"",到易宝支付网关.若不需显示易宝支付的页面,直接跳转到各银行、神州行支付、骏网一卡通等支付页面,该字段可依照附录:支付通道编码列表设置参数值.如果此值设置错误则会报"error.noAvaliableFrp"错误
12
pr_NeedResponse
应答机制
固定值为"1":需要应答机制;收到易宝支付服务器点对点支付成功通知,必须回写以"success"(无关大小写)开头的字符串,即使您收到成功通知时发现该订单已经处理过,也要正确回写"success",否则易宝支付将认为您的系统没有收到通知,启动重发机制,直到收到"success"为止。
13
hmac
签名数据
Max(32)
这些参数需要追加到URL后面。
但是要注意,这些参数的值需要加密。加密的密钥和加密算法易宝都会提供!
其中p8_Url表示当支付成功后,返回到电商的哪个页面。这说明我们需要写一个显示结果的页面。第三方在支付成功后,会重定向到我们指定的返回页面,而且还会带给我们一些参数,我们的页面需要获取这些参数,显示在页面中。下面是第三方返回的参数:
订单查询返回参数
r0_Cmd
订单查询请求,固定值"QueryOrdDetail"
r1_Code
查询结果
为"1":查询正常;为"50":订单不存在.
r2_TrxId
易宝支付交易流水号
r3_Amt
单位:元,精确到分.
r4_Cur
固定值"RMB".
r5_Pid
易宝支付返回商户设置的商品名称.此参数如用到中文,请注意转码.
r6_Order
易宝支付返回商户订单号.
r8_MP
Max(1000)
商户可以任意填写1K的字符串,支付成功时将原样返回.此参数如用到中文,请注意转码.
rb_PayStatus
支付状态
"INIT"未支付;"CANCELED"已取消;"SUCCESS"已支付.
rc_RefundCount
已退款次数
rd_RefundAmt
已退款金额
步骤:
因为已经有了在易宝的注册商号,所以我们就不用自己去注册商号了。所以这里使用易宝做为第三方支付平台来测试。因为我本人没有电商(必须通过ICP认证的电商),所以也不能在第三方注册商号。
我们现在使用的易宝商号是由传智播客提供的,巴巴运动网在易宝注册的商号。所以在测试时支付的钱都给了巴巴运动网在易宝注册的商号了。
第一步:index.jsp
订单号:
金额:
选择银行:
每个银行对应的值:
可直连银行
pd_FrpId参数值
对应支付通道名称
LOGO图片
1000000-NET
易宝会员支付
ICBC-NET-B2C
工商银行
CMBCHINA-NET-B2C
招商银行
ABC-NET-B2C
中国农业银行
CCB-NET-B2C
建设银行
BCCB-NET-B2C
北京银行
BOCO-NET-B2C
交通银行
CIB-NET-B2C
兴业银行
NJCB-NET-B2C
南京银行
CMBC-NET-B2C
中国民生银行
CEB-NET-B2C
光大银行
BOC-NET-B2C
中国银行
PINGANBANK-NET
平安银行
CBHB-NET-B2C
渤海银行
HKBEA-NET-B2C
东亚银行
NBCB-NET-B2C
宁波银行
ECITIC-NET-B2C
中信银行(需要证书才能连接到银行)
SDB-NET-B2C
深圳发展银行
GDB-NET-B2C
广东发展银行
SHB-NET-B2C
上海银行
SPDB-NET-B2C
上海浦东发展银行
POST-NET-B2C
中国邮政
BJRCB-NET-B2C
北京农村商业银行
HXB-NET-B2C
华夏银行(此功能默认不开通,如需开通请与易宝支付销售人员联系)
CZ-NET-B2C
浙商银行
第二步:BuyServlet.java
publicclassBuyServletextendsHttpServlet{
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
Stringp0_Cmd="Buy";//业务类型,固定值为buy,即"买"
Stringp1_MerId="10001126856";//在易宝注册的商号
Stringp2_Order=request.getParameter("p2_Order");//订单编号
Stringp3_Amt=request.getParameter("p3_Amt");//支付的金额
Stringp4_Cur="CNY";//交易种币,固定值为CNY,表示人民币
Stringp5_Pid="";//商品名称
Stringp6_Pcat="";//商品各类
Stringp7_Pdesc="";//商品描述
Stringp9_SAF="";//送货地址
Stringpa_MP="";//商品扩展信息
Stringpd_FrpId=request.getParameter("pd_FrpId");//支付通道,即选择银行
Stringpr_NeedResponse="1";//应答机制,固定值为1
//密钥,由易宝提供,只有商户和易宝知道这个密钥。
StringkeyValue="69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
//通过上面的参数、密钥、加密算法,生成hmac值
//参数的顺序是必须的,如果没有值也不能给出null,而应该给出空字符串。
Stringhmac=PaymentUtil.buildHmac(p0_Cmd,p1_MerId,p2_Order,p3_Amt,
p4_Cur,p5_Pid,p6_Pcat,p7_Pdesc,p8_Url,p9_SAF,pa_MP,
pd_FrpId,pr_NeedResponse,keyValue);
//把所有参数连接到网关地址后面
url+="p0_Cmd="+p0_Cmd+
"&p1_MerId="+p1_MerId+
"&p2_Order="+p2_Order+
"&p3_Amt="+p3_Amt+
"&p4_Cur="+p4_Cur+
"&p5_Pid="+p5_Pid+
"&p6_Pcat="+p6_Pcat+
"&p7_Pdesc="+p7_Pdesc+
"&p8_Url="+p8_Url+
"&p9_SAF="+p9_SAF+
"&pa_MP="+pa_MP+
"&pd_FrpId="+pd_FrpId+
"&pr_NeedResponse="+pr_NeedResponse+
"&hmac="+hmac;
System.out.println(url);
//重定向到网关
response.sendRedirect(url);
}
第三步:BackServlet
publicclassBackServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
/*
*易宝会提供一系列的结果参数,我们获取其中需要的即可
*获取支付结果:r1_Code,1表示支付成功。
*获取支付金额:r3_Amt
*获取电商的订单号:r6_Order
*获取结果返回类型:r9_BType,1表示重定向返回,2表示点对点返回,
*但点对点我们收不到,因为我们的ip都是局域网ip。
*/
Stringr1_Code=request.getParameter("r1_Code");
Stringr3_Amt=request.getParameter("r3_Amt");
Stringr6_Order=request.getParameter("r6_Order");
Stringr9_BType=request.getParameter("r9_BType");
if(r1_Code.equals("1")){
if(r9_BType.equals("1")){
response.getWriter().print("
支付成功!
");//其实支付不成功时根本易宝根本就不会返回到本Servletresponse.getWriter().print("支付金额为:"+r3_Amt+"
");
response.getWriter().print("订单号为:"+r6_Order+"
");