The NoteBook of EricKong

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          關(guān)于注冊(cè)公眾賬號(hào)這塊不詳細(xì)介紹

          注冊(cè)完成,審核認(rèn)證完,就可以開(kāi)始玩了

          1.如何成為開(kāi)發(fā)者?

          \

          需要填寫(xiě)接口配置信息,需要自己的服務(wù)器資源,一般自己沒(méi)有服務(wù)器,所以可以采用云服務(wù)器,例如BAE,SAE,阿里云服務(wù)器。這里用BAE

          2.打開(kāi)百度開(kāi)放云平臺(tái)官網(wǎng),注冊(cè),登陸,點(diǎn)擊開(kāi)發(fā)者服務(wù)管理

          \

          \加載中...

          2.1.點(diǎn)擊“創(chuàng)建工程”

          \

          填寫(xiě)工程相關(guān)信息,應(yīng)用名稱(chēng)自定義,類(lèi)型選擇java-tomcat,域名唯一,代碼管理工具選擇svn 到這里,bae應(yīng)用創(chuàng)建完了.

          3.現(xiàn)在來(lái)實(shí)現(xiàn)TOKEN驗(yàn)證的代碼部分

          3.1.創(chuàng)建一個(gè)Java web工程,我用的是MyEclipse8.5,工程名稱(chēng)為voastudy,點(diǎn)擊Finish完成。

          \

          3.2.新建一個(gè)servlet,這里是CoreServlet,點(diǎn)擊Next.

          \

           

          3.3.勾選創(chuàng)建web.xml,以及配置servlet,這里的路徑很關(guān)鍵,這是去請(qǐng)求servlet里的方法

          \

           

          3.4.實(shí)現(xiàn)驗(yàn)證TOKEN方法,微信公眾平臺(tái)提供的是PHP的實(shí)例代碼.但其驗(yàn)證本質(zhì)是一樣的,都是要經(jīng)過(guò)排序,sha1加密進(jìn)行比較。請(qǐng)參考下面的代碼。這是CoreServlet.java類(lèi).

           

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          package wx.sunl.servlet;
            
          import java.io.IOException;
          import java.io.PrintWriter;
            
          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
            
          import wx.sunl.util.SignUtil;
            
          @SuppressWarnings("serial")
          public class CoreServlet extends HttpServlet 
          {
              public CoreServlet() {
                  super();
              }
              public void destroy() {
                  super.destroy(); 
              }
            
              /**
               * 驗(yàn)證url和token
               */
              public void doGet(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException {
            
                  // 微信加密簽名
                  String signature = request.getParameter("signature");
                  // 時(shí)間戮
                  String timestamp = request.getParameter("timestamp");
                  // 隨機(jī)數(shù)
                  String nonce = request.getParameter("nonce");
                  // 隨機(jī)字符串
                  String echostr = request.getParameter("echostr"); 
                    
                  PrintWriter out = response.getWriter();
                  // 通過(guò)檢驗(yàn) signature 對(duì)請(qǐng)求進(jìn)行校驗(yàn),若校驗(yàn)成功則原樣返回 echostr,表示接入成功,否則接入失敗
                 if(SignUtil.checkSignature(signature, timestamp, nonce)){
                     out.print(echostr);
                 }
            
                 out.close();
                 out = null
              }
            
              /**
               *用戶(hù)向公眾平臺(tái)發(fā)信息并自動(dòng)返回信息
               */
              public void doPost(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException {
            
                    
              }
            
              public void init() throws ServletException {
              }
            
          }
          其中調(diào)用到了SignUtil類(lèi)的checkSignature方法,下面是SignUtil.java類(lèi).注意:其中一個(gè)靜態(tài)屬性token的值,在最后一步需要用到來(lái)驗(yàn)證的.

           

           

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          61
          62
          63
          64
          65
          66
          67
          68
          69
          70
          71
          72
          73
          74
          75
          package wx.sunl.util;
            
          import java.security.MessageDigest;
          import java.security.NoSuchAlgorithmException;
          import java.util.Arrays;
            
          public class SignUtil {
              /**
               * 與接口配置信息中的 token 要一致,這里賦予什么值,在接口配置信息中的Token就要填寫(xiě)什么值,
               * 兩邊保持一致即可,建議用項(xiàng)目名稱(chēng)、公司名稱(chēng)縮寫(xiě)等,我在這里用的是項(xiàng)目名稱(chēng)weixinface
               */
              private static String token = "weixintest";
                
              /**
               * 驗(yàn)證簽名
               * @param signature
               * @param timestamp
               * @param nonce
               * @return
               */
              public static boolean checkSignature(String signature, String timestamp, String nonce){
                  String[] arr = new String[]{token, timestamp, nonce};
                  // 將 token, timestamp, nonce 三個(gè)參數(shù)進(jìn)行字典排序
                  Arrays.sort(arr);
                  StringBuilder content = new StringBuilder();
                  for(int i = 0; i < arr.length; i++){
                      content.append(arr[i]);
                  }
                  MessageDigest md = null;
                  String tmpStr = null;
                    
                  try {
                      md = MessageDigest.getInstance("SHA-1");
                      // 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行 shal 加密
                      byte[] digest = md.digest(content.toString().getBytes());
                      tmpStr = byteToStr(digest);
                  } catch (NoSuchAlgorithmException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
                  content = null;
                  // 將sha1加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信
                  return tmpStr != null ? tmpStr.equals(signature.toUpperCase()): false;
              }
                
              /**
               * 將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串
               * @param digest
               * @return
               */
              private static String byteToStr(byte[] digest) {
                  // TODO Auto-generated method stub
                  String strDigest = "";
                  for(int i = 0; i < digest.length; i++){
                      strDigest += byteToHexStr(digest[i]);
                  }
                  return strDigest;
              }
                
              /**
               * 將字節(jié)轉(zhuǎn)換為十六進(jìn)制字符串
               * @param b
               * @return
               */
              private static String byteToHexStr(byte b) {
                  // TODO Auto-generated method stub
                  char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
                  char[] tempArr = new char[2];
                  tempArr[0] = Digit[(b >>> 4) & 0X0F];
                  tempArr[1] = Digit[b & 0X0F];
                    
                  String s = new String(tempArr);
                  return s;
              }
          }

          4.代碼已經(jīng)寫(xiě)完了,現(xiàn)在來(lái)提交代碼到svn.如果沒(méi)有svn客戶(hù)端工具,那首先下載(svn版本工具)安裝。打開(kāi)svn

          \

          4.1.這里的url去百度開(kāi)放云平臺(tái)去這里復(fù)制

          \

          4.2.粘貼url,打開(kāi)svn,會(huì)看到服務(wù)器的2個(gè)文件

          \

           

          4.3.代碼提交到svn 首先刪掉root.war

          \

          4.4.java web工程打包成war包,取名ROOT.war,然后提交到svn

          \

           

          4.5.然后將這個(gè)war包提交到svn

          \


          4.6.如果提交成功了,百度開(kāi)放云平臺(tái)會(huì)檢測(cè)到有新版本產(chǎn)生,選中應(yīng)用,點(diǎn)擊“發(fā)布設(shè)置”

          \


          4.7.發(fā)布新版本

          \


          5.發(fā)布成功后,測(cè)試是否部署成功?


          5.1.如果看到這個(gè),離成功只差一步啦。<喎?"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140510/2014051009050433.jpg" alt="\">


          5.5.在域名后邊加上請(qǐng)求我們剛剛servlet的請(qǐng)求路徑,上邊的例子是/CoreServlet,如果報(bào)505錯(cuò)誤(why?因?yàn)槟菐讉€(gè)參數(shù)都是空的),說(shuō)明部署成功了

          \


          6.最后一步,填寫(xiě)Url 和 Token來(lái)驗(yàn)證 成為開(kāi)發(fā)者。Url:百度應(yīng)用的域名+請(qǐng)求servlet的路徑例如:http://weixintest11.duapp.com/CoreServlet.Token是在程序中自定義的值(在SignUtil.java中定義)



          歡迎吐槽!!!

          posted on 2014-09-30 11:52 Eric_jiang 閱讀(4416) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): 微信開(kāi)發(fā)

          Feedback

          # re: 微信公眾平臺(tái)接入Java實(shí)例,結(jié)合BAE 2015-03-04 14:00 keven
          為什么我按照你的步驟,微信配置失敗  回復(fù)  更多評(píng)論
            

          # re: 微信公眾平臺(tái)接入Java實(shí)例,結(jié)合BAE[未登錄](méi) 2015-05-18 18:19 xq
          為什么我照你這個(gè)寫(xiě) 最后還是驗(yàn)證失敗呢
            回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 巍山| 永城市| 丰顺县| 龙胜| 武山县| 隆化县| 邛崃市| 本溪市| 荥阳市| 茶陵县| 新津县| 南投县| 津南区| 缙云县| 自治县| 文昌市| 梓潼县| 蓬安县| 沙坪坝区| 班戈县| 师宗县| 凭祥市| 来安县| 扬中市| 邯郸县| 华坪县| 长沙市| 大石桥市| 永德县| 武汉市| 嘉定区| 阿拉尔市| 茌平县| 乌兰县| 连城县| 江川县| 邮箱| 宁武县| 枝江市| 桂平市| 江安县|