流程:/jsps/user/regist.jsp à UserServlet#regist() à msg.jsp html
頁面: java
Servlet: node
Service: mysql
Dao: web
流程:用戶的郵件中 à UserServlet#active() à msg.jsp ajax
流程:/jsps/user/login.jsp à UserServlet#login() à index.jsp 算法
流程:top.jsp à UserServlet#quit() à login.jsp sql
quit():把session銷燬! 數據庫
流程:main.jsp(<iframe>) à CategoryService#findAll() à left.jsp json
流程:left.jsp(所有分類) à BookServlet#findAll() à /jsps/book/list.jsp
流程:left.jsp à BookServlet#findByCategory() à list.jsp
流程:list.jsp(點擊某一本書) à BookServlet#load() à desc.jsp
購物車存儲:
修改登陸方法,在用戶登陸成功後,立刻在session中添加一輛車!!!
頁面:/jsps/cart/list.jsp
它只有一個任務,就是遍歷車!
車在session中,經過車能夠獲得全部的CartItem
${sessionScope.cart.cartItems}
top.jsp中存在一個連接:個人購物車
個人購物車直接訪問/jsps/cart/list.jsp,它會顯示session中車的全部條目
好處:
1 去銀行
https://www.yeepay.com/app-merchant-proxy/node?p0_Cmd=Buy&p1_MerId=10001126856&p2_Order=123456&p3_Amt=1234.56&p4_Cur=CNY&p5_Pid=&p6_Pcat=&p7_Pdesc=&p8_Url=http://localhost:8080/bookstore/OrderServlet?method=back&p9_SAF=&pa_MP=&pd_FrpId= ICBC-NET-B2C&pr_NeedResponse=1&hmac=dd17580a3ca176ba62d6d348583ba88b
後臺的內容,必需要設置權限!
用戶能夠訪問一個網站的哪些內容?
用戶能夠訪問的只有WEB層!
修改分爲兩步:一、加載分類, 二、修改分類
第一步:加載分類
第二步:修改分類
添加圖書分兩步:
book表與orderitem有關聯關係!
刪除圖書不是真的數據庫表中刪除記錄,而是給book表添加一個del字段,它是booleanod類型,表示是否已刪除!
沒有被刪除的圖書,該列的值爲false,不然爲true
處理問題:
刪除圖書:其實就是把表的del列修改成true!
什麼是在線支付呢?沒錯,就是在網上花錢!你們必定有過這樣的經歷。可是你可能不太瞭解在線支付的"內情",下面咱們來了解一下!
若是你如今開始經營一個電子商務網站,用戶買了東西必定要支付,你的網站必定要能夠鏈接各大銀行了,而後在各大銀行支付完成後,再返回到你的網站上顯示"支付成功"!
這就是今天咱們要作的事情,鏈接銀行的網銀系統完成支付。說專業一點,咱們稱之爲"開發在線支付的網關"。
在線支付一共有兩種方式:
電商直接與銀行對接,這也要銀行贊成才行,但惋惜的是,銀行很"牛",不是誰想與它對接均可以的。若是你的電商每日的資金流量夠大,那麼銀行會和你對接,由於客戶支付給電商的錢都存到了銀行的賬戶中!可是若是資金流量小,銀行不會理你的!
當小網站資金量不足時,不能與銀行對接,那麼它們會選擇與第三方支付公司合做。你們也都明白這是些什麼公司,例如:支付寶、易寶、財富通、快錢等公司是國內比較有名的。它們這些公司能夠與銀行對接(由於資金夠多),而後小電商與它們對接!可是第三方是要求收費的!第三方通常會收取電商1%的費用,不過不會收客戶的錢。
經過上圖你們能夠了解到,在銀行的頁面上會顯示出商城名稱、RMB訂單號、訂單時間。。。,這些東西銀行是怎麼知道的,固然是電商傳遞給銀行的。當電商與銀行對接後,電商要給銀行的頁面傳遞銀行頁面須要的參數,因此銀行的頁面才能顯示這些數據!
可是,咱們的商城不能只能夠對接一家銀行吧!怎麼也要對接BOC、CCB、ABC、ICBC四家吧!不一樣的銀行須要的對接參數是不相同的,這說明咱們在開發時要爲不一樣的銀行寫不一樣的對接代碼。這也是直接與銀行對接的缺點!固然與銀行直接對接也有好處,就是安全,沒有手續費!
上圖中已經說明,客戶在電商的網站上點擊確認支付後,會定向到第三方的網站,而後再由第三方與銀行對接。這說明電商要傳遞給第三方參數!再由第三方把參數傳遞給銀行。這種方式的好處是:只須要針對第三方開發便可,而不用再爲每家銀行提供參數。爲每家銀行提供參數的工做是第三方的任務了。可是,第三方不老可靠的,若是第三方倒閉了,人跑了,那你的錢就沒了。由於客戶支付的錢沒有到你的銀行賬戶中,而是支付到了第三方的銀行賬戶中,而你是在第三方有一個賬戶。並且第三方還要收手續費,通常是1%,這可不是小數字啊(真黑)。
電商想在第三方註冊商戶,須要向第三方提供ICP認證。ICP經營許可證是根據國家《互聯網管理辦法規定》,經營性網站必須辦理的網站經營許可證,沒有就屬於非法經營。
咱們不可能由於練習就去辦理ICP!因此咱們沒法在第三方註冊商戶。不過咱們已經有現成的在易寶註冊的商戶,因此這一步就能夠忽略了。
當你在易寶註冊成功後,易寶會給你以下幾樣東西:
在易寶接入規範中,咱們能夠查找到易寶的支付網關,其實就是一個URL,用來與易寶對接的一個網址:https://www.yeepay.com/app-merchant-proxy/node
在易寶接入規範中,還能夠查找到易寶要求的參數,在電商與易寶對接時須要給支付網關傳遞這些參數:
正式請求地址:https://www.yeepay.com/app-merchant-proxy/node |
|||||
參數名稱 |
參數含義 |
是否必填 |
參數長度 |
參數說明 |
簽名順序 |
p0_Cmd |
業務類型 |
是 |
Max(20) |
固定值"Buy" . |
1 |
p1_MerId |
是 |
Max(11) |
商戶在易寶支付系統的惟一身份標識.獲取方式見"如何得到商戶編號" |
2 |
|
p2_Order |
商戶訂單號 |
否 |
Max(50) |
若不爲"",提交的訂單號必須在自身帳戶交易中惟一;爲 "" |
3 |
p3_Amt |
支付金額 |
否 |
Max(20) |
單位:元,精確到分.此參數爲空則沒法直連(如直連會報錯:抱歉,交易金額過小。),必須到易寶網關讓消費者輸入金額 |
4 |
p4_Cur |
交易幣種 |
是 |
Max(10) |
固定值 "CNY". |
5 |
p5_Pid |
商品名稱 |
否 |
Max(20) |
用於支付時顯示在易寶支付網關左側的訂單產品信息.此參數如用到中文,請注意轉碼. |
6 |
p6_Pcat |
商品種類 |
否 |
Max(20) |
商品種類. |
7 |
p7_Pdesc |
商品描述 |
否 |
Max(20) |
商品描述. |
8 |
p8_Url |
商戶接收支付成功數據的地址 |
否 |
Max(200) |
支付成功後易寶支付會向該地址發送兩次成功通知,該地址能夠帶參數,如: |
9 |
p9_SAF |
送貨地址 |
否 |
Max(1) |
爲"1": 須要用戶將送貨地址留在易寶支付系統;爲"0": 不須要,默認爲 "0". |
10 |
pa_MP |
商戶擴展信息 |
否 |
Max(200) |
返回時原樣返回,此參數如用到中文,請注意轉碼. |
11 |
否 |
Max(50) |
默認爲 "" ,到易寶支付網關. |
12 |
||
否 |
Max(1) |
固定值爲"1": 須要應答機制; 收到易寶支付服務器點對點支付成功通知,必須回寫以"success"(無關大小寫)開頭的字符串,即便您收到成功通知時發現該訂單已經處理過,也要正確回寫"success",不然易寶支付將認爲您的系統沒有收到通知,啓動重發機制,直到收到"success"爲止。 |
13 |
||
|
Max(32) |
產生hmac須要兩個參數,並調用相關API. |
這些參數須要追加到URL後面。
可是要注意,這些參數的值須要加密。加密的密鑰和加密算法易寶都會提供!
其中p8_Url表示當支付成功後,返回到電商的哪一個頁面。這說明咱們須要寫一個顯示結果的頁面。第三方在支付成功後,會重定向到咱們指定的返回頁面,並且還會帶給咱們一些參數,咱們的頁面須要獲取這些參數,顯示在頁面中。下面是第三方返回的參數:
訂 單 查 詢 返 回 參 數 |
||||
參數名稱 |
參數含義 |
參數長度 |
參數說明 |
簽名順序 |
r0_Cmd |
業務類型 |
Max(20) |
訂單查詢請求,固定值 |
1 |
r1_Code |
查詢結果 |
爲"1": 查詢正常; |
2 |
|
r2_TrxId |
易寶支付交易流水號 |
Max(50) |
3 |
|
r3_Amt |
支付金額 |
Max(20) |
單位:元,精確到分. |
4 |
r4_Cur |
交易幣種 |
Max(10) |
固定值 "RMB". |
5 |
r5_Pid |
商品名稱 |
Max(20) |
易寶支付返回商戶設置的商品名稱. |
6 |
r6_Order |
商戶訂單號 |
Max(50) |
易寶支付返回商戶訂單號. |
7 |
r8_MP |
商戶擴展信息 |
Max(1000) |
商戶能夠任意填寫1K的字符串,支付成功時將原樣返回. |
8 |
rb_PayStatus |
支付狀態 |
"INIT" 未支付; |
9 |
|
rc_RefundCount |
已退款次數 |
10 |
||
rd_RefundAmt |
已退款金額 |
11 |
||
Max(32) |
產生hmac須要兩個參數,並調用相關API. |
步驟:
由於已經有了在易寶的註冊商號,因此咱們就不用本身去註冊商號了。因此這裏使用易寶作爲第三方支付平臺來測試。由於我本人沒有電商(必須經過ICP認證的電商),因此也不能在第三方註冊商號。
咱們如今使用的易寶商號是由傳智播客提供的,巴巴運動網在易寶註冊的商號。因此在測試時支付的錢都給了巴巴運動網在易寶註冊的商號了。
第一步:index.jsp
<form action="" method="post"> 訂單號:<input type="text" name="p2_Order"/><br/> 金 額:<input type="text" name="p3_Amt"/><br/> 選擇銀行:<br/> <input type="radio" name="pd_FrpId" value="ICBC-NET-B2C"/>工商銀行 <img src="bank_img/icbc.bmp" align="middle"/> <input type="radio" name="pd_FrpId" value="BOC-NET-B2C"/>中國銀行 <img src="bank_img/bc.bmp" align="middle"/><br/><br/> <input type="radio" name="pd_FrpId" value="ABC-NET-B2C"/>農業銀行 <img src="bank_img/abc.bmp" align="middle"/> <input type="radio" name="pd_FrpId" value="CCB-NET-B2C"/>建設銀行 <img src="bank_img/ccb.bmp" align="middle"/><br/><br/> <input type="radio" name="pd_FrpId" value="BOCO-NET-B2C"/>交通銀行 <img src="bank_img/bcc.bmp" align="middle"/><br/> <input type="submit" value="確認支付"/> </form> |
每一個銀行對應的值:
可直連銀行 |
||
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
public class BuyServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8");
String p0_Cmd = "Buy";// 業務類型,固定值爲buy,即"買" String p1_MerId = "10001126856";// 在易寶註冊的商號 String p2_Order = request.getParameter("p2_Order");// 訂單編號 String p3_Amt = request.getParameter("p3_Amt");// 支付的金額 String p4_Cur = "CNY";// 交易種幣,固定值爲CNY,表示人民幣 String p5_Pid = "";// 商品名稱 String p6_Pcat = "";// 商品各種 String p7_Pdesc = "";// 商品描述 String p8_Url = "http://localhost:8080/buy/BackServlet";// 電商的返回頁面,當支付成功後,易寶會重定向到這個頁面 String p9_SAF = "";// 送貨地址 String pa_MP = "";// 商品擴展信息 String pd_FrpId = request.getParameter("pd_FrpId");// 支付通道,即選擇銀行 String pr_NeedResponse = "1";// 應答機制,固定值爲1
// 密鑰,由易寶提供,只有商戶和易寶知道這個密鑰。 String keyValue = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
// 經過上面的參數、密鑰、加密算法,生成hmac值 // 參數的順序是必須的,若是沒有值也不能給出null,而應該給出空字符串。 String hmac = 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);
// 把全部參數鏈接到網關地址後面 String url = "https://www.yeepay.com/app-merchant-proxy/node"; 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
public class BackServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); /* * 易寶會提供一系列的結果參數,咱們獲取其中須要的便可 * 獲取支付結果:r1_Code,1表示支付成功。 * 獲取支付金額:r3_Amt * 獲取電商的訂單號:r6_Order * 獲取結果返回類型:r9_BType,1表示重定向返回,2表示點對點返回, * 但點對點咱們收不到,由於咱們的ip都是局域網ip。 */ String r1_Code = request.getParameter("r1_Code"); String r3_Amt = request.getParameter("r3_Amt"); String r6_Order = request.getParameter("r6_Order"); String r9_BType = request.getParameter("r9_BType");
if(r1_Code.equals("1")) { if(r9_BType.equals("1")) { response.getWriter().print("<h1>支付成功!</h1>");//其實支付不成功時根本易寶根本就不會返回到本Servlet response.getWriter().print("支付金額爲:" + r3_Amt + "<br/>"); response.getWriter().print("訂單號爲:" + r6_Order + "<br/>"); } } } } |