The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          關于注冊公眾賬號這塊不詳細介紹

          注冊完成,審核認證完,就可以開始玩了

          1.如何成為開發者?

          \

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

          2.打開百度開放云平臺官網,注冊,登陸,點擊開發者服務管理

          \

          \加載中...

          2.1.點擊“創建工程”

          \

          填寫工程相關信息,應用名稱自定義,類型選擇java-tomcat,域名唯一,代碼管理工具選擇svn 到這里,bae應用創建完了.

          3.現在來實現TOKEN驗證的代碼部分

          3.1.創建一個Java web工程,我用的是MyEclipse8.5,工程名稱為voastudy,點擊Finish完成。

          \

          3.2.新建一個servlet,這里是CoreServlet,點擊Next.

          \

           

          3.3.勾選創建web.xml,以及配置servlet,這里的路徑很關鍵,這是去請求servlet里的方法

          \

           

          3.4.實現驗證TOKEN方法,微信公眾平臺提供的是PHP的實例代碼.但其驗證本質是一樣的,都是要經過排序,sha1加密進行比較。請參考下面的代碼。這是CoreServlet.java類.

           

          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(); 
              }
            
              /**
               * 驗證url和token
               */
              public void doGet(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException {
            
                  // 微信加密簽名
                  String signature = request.getParameter("signature");
                  // 時間戮
                  String timestamp = request.getParameter("timestamp");
                  // 隨機數
                  String nonce = request.getParameter("nonce");
                  // 隨機字符串
                  String echostr = request.getParameter("echostr"); 
                    
                  PrintWriter out = response.getWriter();
                  // 通過檢驗 signature 對請求進行校驗,若校驗成功則原樣返回 echostr,表示接入成功,否則接入失敗
                 if(SignUtil.checkSignature(signature, timestamp, nonce)){
                     out.print(echostr);
                 }
            
                 out.close();
                 out = null
              }
            
              /**
               *用戶向公眾平臺發信息并自動返回信息
               */
              public void doPost(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException {
            
                    
              }
            
              public void init() throws ServletException {
              }
            
          }
          其中調用到了SignUtil類的checkSignature方法,下面是SignUtil.java類.注意:其中一個靜態屬性token的值,在最后一步需要用到來驗證的.

           

           

          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就要填寫什么值,
               * 兩邊保持一致即可,建議用項目名稱、公司名稱縮寫等,我在這里用的是項目名稱weixinface
               */
              private static String token = "weixintest";
                
              /**
               * 驗證簽名
               * @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 三個參數進行字典排序
                  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");
                      // 將三個參數字符串拼接成一個字符串進行 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對比,標識該請求來源于微信
                  return tmpStr != null ? tmpStr.equals(signature.toUpperCase()): false;
              }
                
              /**
               * 將字節數組轉換為十六進制字符串
               * @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;
              }
                
              /**
               * 將字節轉換為十六進制字符串
               * @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.代碼已經寫完了,現在來提交代碼到svn.如果沒有svn客戶端工具,那首先下載(svn版本工具)安裝。打開svn

          \

          4.1.這里的url去百度開放云平臺去這里復制

          \

          4.2.粘貼url,打開svn,會看到服務器的2個文件

          \

           

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

          \

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

          \

           

          4.5.然后將這個war包提交到svn

          \


          4.6.如果提交成功了,百度開放云平臺會檢測到有新版本產生,選中應用,點擊“發布設置”

          \


          4.7.發布新版本

          \


          5.發布成功后,測試是否部署成功?


          5.1.如果看到這個,離成功只差一步啦。<喎?"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.在域名后邊加上請求我們剛剛servlet的請求路徑,上邊的例子是/CoreServlet,如果報505錯誤(why?因為那幾個參數都是空的),說明部署成功了

          \


          6.最后一步,填寫Url 和 Token來驗證 成為開發者。Url:百度應用的域名+請求servlet的路徑例如:http://weixintest11.duapp.com/CoreServlet.Token是在程序中自定義的值(在SignUtil.java中定義)



          歡迎吐槽!!!

          posted on 2014-09-30 11:52 Eric_jiang 閱讀(4415) 評論(2)  編輯  收藏 所屬分類: 微信開發

          Feedback

          # re: 微信公眾平臺接入Java實例,結合BAE 2015-03-04 14:00 keven
          為什么我按照你的步驟,微信配置失敗  回復  更多評論
            

          # re: 微信公眾平臺接入Java實例,結合BAE[未登錄] 2015-05-18 18:19 xq
          為什么我照你這個寫 最后還是驗證失敗呢
            回復  更多評論
            

          主站蜘蛛池模板: 大兴区| 汪清县| 广宁县| 榆中县| 博兴县| 邮箱| 闽清县| 新巴尔虎左旗| 资阳市| 黑山县| 武宣县| 雅江县| 黔西| 来凤县| 乐都县| 铁岭市| 靖宇县| 高碑店市| 阜南县| 麻城市| 万宁市| 新密市| 九台市| 尖扎县| 赤水市| 克东县| 玛沁县| 济南市| 汉川市| 双桥区| 东台市| 从江县| 南京市| 仁化县| 库伦旗| 龙门县| 淳化县| 凤山市| 根河市| 富阳市| 松溪县|