使用JAVA開發微信公眾平台(一)——環境搭建與開發接入


一、 初始微信公眾平台

微信公眾平台即我們平時所說的“公眾號”,曾用名“官方平台”、“媒體平台”,但最終命名為“公眾平台”。從微信的命名我可以發現,公眾平台不只是官方、媒體使用的平台,而是對所有公眾都開放的統一平台。

微信公眾平台地址https://mp.weixin.qq.com/

微信公眾平台公分4大板塊:訂閱號、服務號、小程序、企業號。按照微信2016年公開課規划企業號后續將與企業微信合並因此我們主要針對前三部分開始講解

 

簡單的對比一下前三者的區別以及本次課程即后續課程的講解重點:

1、 訂閱號和服務號均為傳統意義的“公眾號”,具有消息群發能力,詳細區別可在官方平台查看:http://kf.qq.com/faq/140806zARbmm140826M36RJF.html 我們將注重於服務能力開發而在服務方面兩者開發模式完全相同只不過服務號可以使用更多的服務接口,而訂閱號則是“閹割版”的服務號。因此,后續課程我們將使用服務號為案例進行操作。

2、 微信小程序原本為“微信應用號”,即一個根植在微信生態系統內的APP。因蘋果和谷歌的限制,“應用號”未上線便已夭折,取而代之的是適度閹割功能的“微信小程序”,而其堪比原生APP的操作體驗,也使得小程序成為時下大火的開發方向。而傑瑞教育 全新的H5開發課程也將加入時下火爆的微信小程序開發

 

二、 開發賬號准備

1、 賬號注冊

進入微信公眾平台https://mp.weixin.qq.com 點擊右上角立即注冊選擇“服務號”或“訂閱號”注冊(服務號僅限機構用戶注冊,個人用戶只能選擇訂閱號)

注冊時需填寫一系列信息根據提示填寫即可此處不做贅述

2、 測試賬號申請

如果暫時不想注冊賬號或者無法注冊服務號可選擇官方提供的測試賬號申請申請地址http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 點擊后掃描二維碼即可獲得一個測試賬號擁有服務號全部權限

 

三、 開發環境准備

1、 外網映射工具

微信公眾平台在訪問后台時必須提供能夠正確訪問的外網地址,微信平台對后台URL的要求有兩點:

① 必須能夠用公網訪問    ② 必須使用80端口

要實現以上兩點,我們可以選擇購買外網服務器,例如:阿里雲、百度雲、騰訊雲…都是不錯的選擇。如果沒有服務器,可以選擇用外網映射工具,將我們的內網鏈接映射為公網,比較不錯的映射軟件有:花生殼、ngroknat123

這幾款軟件都可以百度很容易搜索到並下載,下面簡單講解一下用法:

① Ngrock

進入dos環境,切換到ngrock所在盤符,輸入ngrock 8080 回車

 

回車后等待一會,即可得到公網鏈接,下圖所示陰影區域給出的鏈接,即可直接訪問本機127.0.0.1:8080下的鏈接內容,分別是http協議和https協議對應的地址:

 

② 花生殼、nat123均可安裝軟件后在軟件中操作詳情可查看百度經驗http://jingyan.baidu.com/article/363872ec361d3f6e4ba16ff9.html 此處不做贅述

四、 微信公眾平台數據交互原理

搭建好公網訪問地址后我們自己開發的后台代碼就可以放到公網地址了那么用戶是怎么樣訪問到我們的代碼呢

下面我們來看一下微信公眾平台的數據交互原理

 

 

從上圖可以看到,微信公眾平台實際只是起到一個橋梁作用,實際處理業務、提供服務的代碼,依然是放在我們自己的服務器或者公網映射上面。

那么我們就可以在我們自己的電腦(服務器)上面編寫后台代碼,並通過映射工具提供公網能夠訪問的URL,然后將此URL綁定到微信后台即可

 

五、 開發模式接入

下面將進入實際開發過程我們可以參考官方提供的開發文檔https://mp.weixin.qq.com/wiki 

1、 填寫服務器配置

進入微信公眾平台點擊左側【開發——基本配置】,選擇【服務器配置】。即可進入配置頁面:

 

其中

URL即我們上述所說的后台服務器公網訪問地址

Token開發者自定的驗證口令

EncodingAESKey隨機字符串如果消息加解密方式采用安全模式才需驗證

 

2、 驗證消息是否有效

當我們點擊提交時微信服務器將會發送一個Get請求到我們上述地址同時傳遞四個參數

 

我們通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗。加密/校驗流程如下:

 

下面我們實現代碼操作

 

六、 開發接入后台代碼

1、 使用MyEclipse創建Web項目,並新建一個servlet

 

2、 servletdoGet方法中,獲取上述四個校驗參數:

 

3、 編寫工具類,進行校驗方法的操作:

 

校驗步驟參考上述【五-2三大步操作流程

 

使用sha1加密方法

 

4、 Servlet中調用校驗方法,並驗證結果,如果檢驗成功,將得到的隨機字符串eahostr原路返回結果給微信平台:

 

至此ServletCheck工具類編寫完成

5、 啟動TomcatServlet的本地地址(例如本機為:localhost:8080/WeiXin/servlet/WeiXinServlet )進行公網映射,參照上述第三大部分內容,進行公網映射,確定公網地址能夠正確訪問。

我將直接將將代碼放到傑瑞教育 公網服務器進行訪問。獲得如下地址:http://www.jredu100.com/WeiXin/servlet/WeiXinServlet 

七、 配置公眾平台后台

進入微信后台配置相關信息:

 

點擊提交微信將發送Get指令到Servlet並調用doGet方法進行我們編寫的驗證操作最后如果順利返回隨機字符串則綁定成功

 

八、 源碼共享

1、 Servlet源碼(只保留doGet部分):

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();

if(CheckUtil.checkSignature(signature, timestamp, nonce)){

//如果校驗成功,將得到的隨機字符串原路返回

out.print(echostr);

}

}

 

 

2、 CheckUtil源碼(可直接Copy其中的getSha1加密方法):

 

package com.jredu.util;

 

import java.security.MessageDigest;

import java.util.Arrays;

 

public class CheckUtil {

public static final String  tooken = "jredu100"; //開發者自行定義Tooken

public static boolean checkSignature(String signature,String timestamp,String nonce){

//1.定義數組存放tookentimestamp,nonce

String[] arr = {tooken,timestamp,nonce};

//2.對數組進行排序

Arrays.sort(arr);

//3.生成字符串

StringBuffer sb = new StringBuffer();

for(String s : arr){

sb.append(s);

}

//4.sha1加密,網上均有現成代碼

String temp = getSha1(sb.toString());

//5.將加密后的字符串,與微信傳來的加密簽名比較,返回結果

return temp.equals(signature);

}

 

public static String getSha1(String str){

        if(str==null||str.length()==0){

            return null;

        }

        char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9',

                'a','b','c','d','e','f'};

        try {

            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");

            mdTemp.update(str.getBytes("UTF-8"));

 

            byte[] md = mdTemp.digest();

            int j = md.length;

            char buf[] = new char[j*2];

            int k = 0;

            for (int i = 0; i < j; i++) {

                byte byte0 = md[i];

                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];

                buf[k++] = hexDigits[byte0 & 0xf];      

            }

            return new String(buf);

        } catch (Exception e) {

            // TODO: handle exception

            return null;

        }

    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM