這兩天作了一下支付寶服務窗,記一下吧,作一個積累,防止之後再次須要開發時忘記。
項目的要求是能夠使用支付寶的服務窗就能夠了,相關交互也很簡單,只須要獲取到使用用戶的支付寶的惟一標識符(之前是openId,不過openId將會在2016年9月廢棄,如今使用userId。若是仍是使用的openId,也就是遺留的項目,支付寶提供了相關的接口,能夠使用openId換取userId<alipay.platform.userid.get>)就能夠了。其實感受支付寶提供的相關的文檔仍是蠻全的。設計模式
已申請支付寶服務窗的帳號app
外網能夠訪問的url。本機上能夠使用端口映射,主要開發時使用(直接使用ip+端口映射不知道可不能夠,沒有試過)。
3.openssl軟件,這個其實在支付寶提供的包裏已經提供了(支付寶的手機網站支付的demo中有<demo網址。框架
激活開發者模式(必須驗籤和回覆相關消息,偷懶的話能夠不驗籤,直接將相關的消息響應給支付寶就行了,猜的,沒試過,應該)。網站
這裏相關的文檔仍是蠻詳細的。生成公鑰和私鑰就很少說了,已近夠詳細了,簡單的說下它提供的demo吧(放到結尾說,排版好看點)。this
設置服務窗的菜單及相關的功能。其實這若是不須要支付寶提供的userId,那樣上面寫的和下面寫的全部東西均可以忽略,只要在管理中心的幾個菜單上點點就行了。
一樣相關的文檔支付寶也已經提供。(文檔)。我使用的是隻要獲取用戶的userId,不須要其餘的用戶信息,因此只要scope=auth_base就行了。這裏的代碼支付寶的demo中已經提供了,只要稍微改一下就能夠使用:編碼
try { String authCode = this.getReqParam("auth_code"); String userId = null; AlipaySystemOauthTokenRequest req = new AlipaySystemOauthTokenRequest(); req.setGrantType("authorization_code"); req.setCode(authCode); AlipayClient alipayClient = AlipayUtil.getAlipayClient(); AlipaySystemOauthTokenResponse res = alipayClient.execute(req); XMap map = new XMap(); if (null != res && res.isSuccess()) { userId = res.getAlipayUserId(); map.put("appid", userId); System.out.println(userId); } else { System.out.println("authCode換取userId失敗"); } this.outPut(map); } catch (AlipayApiException e) { e.printStackTrace(); }
若是獲取用戶的信息,支付寶的demo也有,直接刪刪改改就能夠了。
這裏須要注意一下的是須要導入支付寶的相關jar包,固然若是隻是這裏使用的話能夠不使用支付寶的jar包,換成使用HttpClient來實現,可是相比較而言麻煩一下,直接使用支付寶的直接傳幾個參數而已,何樂而不爲呢。若是還要使用其餘信息,就要修改相關的scope,文檔裏直接找就是了。url
支付寶的demo只要知道服務窗的基本功能就能夠:spa
純文本類型 MsgType:text設計
事件類型 MsgType:eventcode
激活驗證開發者模式 (service:alipay.service.check)(EventType:verifygw)
其餘消息通知 (service:alipay.mobile.public.message.notify)
服務窗關注事件 (EventType:follow)
服務窗取消關注事件 (EventType:unfollow)
服務窗進入事件 (EventType:enter)
自定義場景進入事件
普通進入服務窗事件
根據actionParam進行轉發(服務窗點擊事件)(EventType:click)
authentication 申請開發者會員綁定事件: actionParam支付寶服務窗固定值(ActionParam:authentication )
delete 刪除開發者會員綁定事件:actionParam支付寶服務窗固定值(ActionParam:delete)
xxx 開發者自定義 (ActionParam:xxx)
更多
更多
對照這看demo很容易就知道了。
從servlet開始:這方面主要在GatewayServlet裏面。
驗籤沒什麼,直接調相關方法就行了,注意req的編碼和本項目的編碼。
宏觀上來講demo主要是接收相關的req,而後取得該req的參數,進入(Dispatcher)獲取業務的分發器,而後在分發器中獲取業務的執行器。簡單點說,就是從上面的純文本類型開始驗證,逐漸細化到最裏面的一層,將該層的功能返回對應的執行器(執行器也就是ActionExecutor接口,不一樣的功能就是該接口的不一樣的實現,之後添加功能直接添加該接口的實現就行了)。
開發的時候能夠直接使用相關的代碼,而後在裏面刪減對應的功能就行了。不過話說若是像我如今的項目只要驗證,因此只要一個激活驗證開發者模式的驗證就行了,兩層驗證返回就行了,固然要求更低的能夠直接返回相關的res就好,均可以不驗證。能夠是能夠,可是若是之後加功能的話。。。
在LoginAuthServlet裏面也就是取得用戶的userId和用戶的詳細信息等相關內容。
其餘的一些類都是一些例子,對於我這樣的新手+菜鳥來講簡直是福音。
怎麼說呢,一開始看見那麼多類,都不想去看這個demo,後來沒辦法纔去看的。清晰,第一感受就是這個,不想本身寫的代碼,業務一複雜時本身都不想去看,不過因爲源碼讀的少的緣由,自從看完設計模式的書後,雖然大概也知道如今的比較出名的開源框架大概用了哪些,可是都是別人說的,歷來沒有本身去體會過。或者說知道使用了相關的模式以後,再去讀源碼的時候自動去找相關的模式的使用狀況,雖然知道他們很好,可是因爲本身沒有去寫,歷來不知道這玩意兒多好。可是看了這個demo後真心很。。。震撼,應該是,比比本身的代碼,就是去堆邏輯,當然有不少地方是用不上模式的,更多的緣由是不熟。雖然知道這玩意用多了也很差,可是用了以後能夠取捨,而這和不會用徹底是兩回事,慢慢積累吧,會有一天脫離菜鳥的行列的。任重而道遠啊。