回顧:前端
需求:在任意頁面上(固然前提是已經登陸了,沒登陸過濾了訪問不到)點擊個人訂單,將當前用戶的訂單(包含訂單項列表)分頁展現出來java
步驟分析:node
1.修改head.jsp上面訂單連接/store/order?method=findMyOrderByPage&pageNumber=1$獲取session肯定是哪一個用戶(頁面獲取和後臺獲取同樣,這裏放在後臺獲取)算法
2.在orderservlet中編寫findMyOrderByPagesql
獲取pagenumber 設置pagesize,獲取當前用戶的id數據庫
調用service完成分頁查詢操做:返回pagebean瀏覽器
將pagebean放入request域中,請求轉發order_list.jsp服務器
3.service中操做session
建立pagebean併發
設置總條數
設置當前頁數據
4.dao操做
獲取當前頁訂單數據 select * from orders where uid=? order by ordertimr desc limit ?,?(只能查詢訂單的基本信息,不能查詢訂單項)
執行完上面的sql返回的是一個list<order>集合,裏面是訂單項
遍歷orderlist集合,獲取到每個訂單,關聯查詢訂單項和商品表,將該訂單下的全部信息查詢出來, 封裝 成orderItem,將每個orderItem放入當前order的訂單項列表中
查詢訂單項 select * from orderitem oi,product p where oi.pid=p.pid AND oi.oid='afagagafdadf隨機uid';
上面的結果用什麼封裝???BeanHandler不合適,BeanListHandler不行,ArrayHandler只能封裝結果的第一條不行ArrayListHandler能夠,有角標,可是分析後很差。
最後將order_list返回
後臺的查詢操做已經完成,下面寫前臺將返回的list中的數據顯示到頁面中order_list.jsp
頁面顯示規律,有多個訂單一個訂單佔一個框,因此循環外框 一個訂單裏面有多個訂單項因此循環內框
需求:在order_list.jsp頁面上點擊去付款要展現出當前訂單的詳情
步驟:省略一次,看代碼
需求:在詳情頁面上 輸入收貨人信息,選擇支付的銀行,點擊確認訂單,保存收穫人信息,跳轉到銀行頁面,輸入用戶名(卡號),點擊支付 最後跳轉到商城,提示 訂單支付成功,(修改訂單的狀態)
技術分析:在線支付方式
對銀行:錢直接給銀行打過去
須要和每家銀行溝通,銀行須要什麼數據就要傳什麼數據,萬一銀行要求改動了,本地的代碼也要改動,開發工做量大,維護成本高。商城是本身的,用戶的錢直接打到本身的商城帳號上,資金週轉快
對第三方:錢先給第三方,在第三方中暫時保存
只須要和第三方溝通,用戶須要將錢打到本身的第三方帳戶上就好了,和銀行溝通的事交給第三方,某個銀行的接口變了不須要咱們管。第三方是收費的,用戶給了支付雖然沒收咱們用戶的,可是收了商家的。比如本身的錢存支付寶也收費此時本身就是商家(京東剛開始公司小,依賴支付寶,支持支付寶支付,後來有了本身的京東金融)。第三方小公司用的多,對於大公司都是直接對銀行(例如支付寶公司就直接對銀行),資金會籠慢(用戶先給錢給第三方,第三方通知收貨,只有用戶確認收貨了本身才能收到錢)
在線支付流程
淘寶買東西先看中本身心儀的商品---------選中點去付款(發現頁面由淘寶跳到了支付寶(淘寶、支付寶不是一家公司))----------不選餘額或餘額寶支付選銀行卡(發現頁面由支付寶跳到了銀行頁面)
支付進入支付公司 選銀行進入銀行系統(先登陸)。。。。。。。見下圖
用戶到支付公司須要參數(錢,)
在線支付注意問題: 其實就是讓數據由商城到第三方不能被篡改
一、給第三方支付哪些數據和第三方要返回哪些數據給用戶和商城(開發中有接口文檔)
二、如何保證數據的有效性(保證數據沒有被篡改過,電子簽名(單向加密(假如我有兩張紙,一張是用戶要給第三方的數據,第三方會給一個祕鑰---字符串,),原則不可逆解密)-------就是給數據貼一個 封條 ,若是數據沒有被改,封條就不會變,到達目的地看封條有沒有被修改)
商城將發給第三方的數據通過算法和密鑰進行加密(不可逆),生成一個字符串,將原始的數據和加密後生成的字符串一併發送給第三方.
第三方拿到數據以後,將原來的數據使用一樣的算法和密碼從新生成一個字符串,
將其和商城發送過來的加密後的字符串進行比對,若數據是同樣的,則證實數據沒有被篡改過.
商城開戶:商家在第三方中的帳號
用戶編碼
祕鑰(會在第三方和商城(用戶)都存一份)
算法
支付步驟分析:
1.在訂單詳情頁面上 填寫收貨人信息, 選擇支付銀行,點擊"確認訂單",向商城發送請求
表單提交
收貨人信息
支付銀行
訂單號
路徑: /store/order?method=pay
2.在orderservlet中 編寫pay方法
接受收貨人信息 訂單號
調用service獲取訂單,
設置收貨人信息
更新訂單
拼接重定向的字符串
//在線支付 public String pay(HttpServletRequest request, HttpServletResponse response) throws IOException { //1.獲取收貨人信息,獲取oid,獲取銀行 //2.調用service獲取訂單 修改收貨人信息,更新訂單 //3.拼接第三方的url(上面兩步都簡單,這個要一個一個拼接字符串,麻煩吃力不討好的事,而且不能犯錯) //4.重定向 //接受參數(四個參數都獲取到了,惟一沒有獲取到銀行) try { String address=request.getParameter("address"); String name=request.getParameter("name"); String telephone=request.getParameter("telephone"); String oid=request.getParameter("oid"); //經過id獲取order OrderService s=(OrderService) BeanFactory.getBean("OrderService"); Order order = s.getById(oid); //獲取訂單信息,這個方法作過 order.setAddress(address); //能夠在數據表中看到尚未地址 姓名 電話等信息 order.setName(name); order.setTelephone(telephone); //更新order s.updateOrder(order); //支付信息一個一個獲取 // 組織發送支付公司須要哪些數據 String pd_FrpId = request.getParameter("pd_FrpId"); //哪一個銀行,銀行通道 String p0_Cmd = "Buy"; //業務類型 //商戶編號 要想完成這個事情首先得開個戶 //今天有merchantInfo.properties這個文件,拿過來放到src目錄下 //獲取這個編號先new一個properties prop = new pro... //而後prop.getproperties() 而後 .node()獲取便可,這裏用了另一種東西叫ResourceBundle //這個是jdk提供好的 ctrl shift o 導入,直接.getBundle("文件名稱,不帶後綴名").getString("放key的值") String p1_MerId = ResourceBundle.getBundle("merchantInfo").getString("p1_MerId"); String p2_Order = oid; //商戶訂單號 String p3_Amt = "0.01"; //支付金額 按理說這裏order.getTotal知道要多少錢 String p4_Cur = "CNY"; //交易幣種 cny人民幣 String p5_Pid = ""; //商品名稱 String p6_Pcat = ""; //商品種類 String p7_Pdesc = ""; //商品描述 // 支付成功回調地址 ---- 第三方支付公司會訪問、用戶訪問 支付成功後由第三方通知商城的地址key=responseURL這個地址暫時沒有編寫 // 第三方支付能夠訪問網址,因爲咱們的地址是localhost是本地地址,而由支付公司在外網 //由外網告訴本地商家修改訂單狀態收不到,可是由支付公司讓咱們瀏覽器重定向能夠收到(告訴我本身請求我本身的商城) String p8_Url = ResourceBundle.getBundle("merchantInfo").getString("responseURL"); String p9_SAF = ""; //送貨地址 String pa_MP = ""; //商戶擴展信息 String pr_NeedResponse = "1"; //應答機制 // 加密hmac 須要密鑰 將PaymentUtil複製導入到util包中 String keyValue = ResourceBundle.getBundle("merchantInfo").getString("keyValue"); 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); //發送給第三方 StringBuffer sb = new StringBuffer("https://www.yeepay.com/app-merchant-proxy/node?"); sb.append("p0_Cmd=").append(p0_Cmd).append("&"); sb.append("p1_MerId=").append(p1_MerId).append("&"); sb.append("p2_Order=").append(p2_Order).append("&"); sb.append("p3_Amt=").append(p3_Amt).append("&"); sb.append("p4_Cur=").append(p4_Cur).append("&"); sb.append("p5_Pid=").append(p5_Pid).append("&"); sb.append("p6_Pcat=").append(p6_Pcat).append("&"); sb.append("p7_Pdesc=").append(p7_Pdesc).append("&"); sb.append("p8_Url=").append(p8_Url).append("&"); sb.append("p9_SAF=").append(p9_SAF).append("&"); sb.append("pa_MP=").append(pa_MP).append("&"); sb.append("pd_FrpId=").append(pd_FrpId).append("&"); sb.append("pr_NeedResponse=").append(pr_NeedResponse).append("&"); sb.append("hmac=").append(hmac); //將這些參數一個一個往上面sb追加造成一個地址,而後重定向 咱們要作更新訂單,收貨人信息,上面的s.updateOrder(order)方法要實現 response.sendRedirect(sb.toString()); } catch (Exception e) { e.printStackTrace(); request.setAttribute("msg","支付失敗"); return "/jsp/msg.jsp"; } return null; }
支付成功以後的步驟分析:
編寫callback方法(這個方法是支付成功了由第三方要跳轉到本商城的路徑的參數responseURL=http://localhost/store/order?method=callback)
獲取第三方發送過來的數據(order_id)
經過id獲取訂單
修改訂單的狀態 =1
更新訂單
下面在orderservlet中直接編寫callback方法實現上面操做
//支付成功的回調 public String callback(HttpServletRequest request, HttpServletResponse response) throws IOException { //1.獲取第三方發送過來的數據 //2.獲取訂單 修改訂單狀態 //3.更新訂單 try { String p1_MerId = request.getParameter("p1_MerId"); String r0_Cmd = request.getParameter("r0_Cmd"); String r1_Code = request.getParameter("r1_Code"); String r2_TrxId = request.getParameter("r2_TrxId"); String r3_Amt = request.getParameter("r3_Amt"); String r4_Cur = request.getParameter("r4_Cur"); String r5_Pid = request.getParameter("r5_Pid"); String r6_Order = request.getParameter("r6_Order"); String r7_Uid = request.getParameter("r7_Uid"); String r8_MP = request.getParameter("r8_MP"); String r9_BType = request.getParameter("r9_BType"); String rb_BankId = request.getParameter("rb_BankId"); String ro_BankOrderId = request.getParameter("ro_BankOrderId"); String rp_PayDate = request.getParameter("rp_PayDate"); String rq_CardNo = request.getParameter("rq_CardNo"); String ru_Trxtime = request.getParameter("ru_Trxtime"); // 身份校驗 --- 判斷是否是支付公司通知你 String hmac = request.getParameter("hmac"); //獲取hmac祕鑰 String keyValue = ResourceBundle.getBundle("merchantInfo").getString( "keyValue"); // 本身對上面數據進行加密 --- 比較支付公司發過來hamc verifyCallback進行兩個字符串的比較 boolean isValid = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd, r1_Code, r2_TrxId, r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid, r8_MP, r9_BType, keyValue); if (isValid) { //若是二者相等的話,裏面有兩個判斷,都會執行,用戶看到的瀏覽器會重定向顯示到支付成功頁面 // 響應數據有效 if (r9_BType.equals("1")) { // 瀏覽器重定向 System.out.println("111"); request.setAttribute("msg", "您的訂單號爲:"+r6_Order+",金額爲:"+r3_Amt+"已經支付成功,等待發貨~~"); } else if (r9_BType.equals("2")) { // 服務器點對點 --- 支付公司通知你 System.out.println("付款成功!222"); // 修改訂單狀態 爲已付款 // 回覆支付公司 response.getWriter().print("success"); } //因爲咱們這裏獲取不到外網,因此不管哪一種方式,咱們這裏都手動進入到數據庫中去修改狀態,默認就是支付成功 //修改訂單狀態 OrderService s=(OrderService) BeanFactory.getBean("OrderService"); Order order = s.getById(r6_Order); //獲取哪一個訂單的編號而後修改狀態 order.setState(Constant.ORDER_YIFUKUAN); s.update(order); } else { //祕鑰前前端傳遞與校驗的不相同,說明數據被修改了 System.out.println("數據被篡改!"); } } catch (Exception e) { e.printStackTrace(); request.setAttribute("msg", "支付失敗"); } return "/jsp/msg.jsp"; } }
訪問淘寶時,要想把商品加入購物車必須首先登錄;可是京東不一樣,沒有登陸能夠加,一旦登陸就會把購物車中的信息放入數據庫中,因此在手機上建立的購物車在電腦上也能夠訪問就是寫到了數據庫中
需求:模擬淘寶相似功能,訪問購物車的時候,須要判斷用戶是否登陸,若沒有登陸,則提示
技術分析:filter
過濾器編寫步驟:
1.編寫一個類 PrivilegeFilter (privileger----特權)
實現filter接口
重寫方法(主要doFilter)
2.編寫配置文件
filter
filter-mapping
步驟分析:
doFilter方法中的邏輯
從session中獲取用戶,
判斷用戶是否爲空
若爲空:提示"請先登陸",請求轉發到 /jsp/msg.jsp return 若登陸了不用管直接dofilter了,編寫filter分三步1.強轉2.寫邏輯3放行
查詢個人訂單
查詢訂單是要將訂單列表查詢出來
orders裏面只有基本信息 須要關聯oderitem和product表去查詢數據 用MapListHandler封裝 加入到order中
訂單詳情
在線支付
要明白流程,知道流程怎麼走(愛生活愛拉芳愛java愛代碼),支付方式有兩種,對銀行對第三方,優缺點
權限過濾