微信公衆帳號環境搭建與開發接入(—)

1、 初始微信公衆平臺html

@font-face { font-family: '宋體'; }@font-face { font-family: 'Cambria Math'; }@font-face { font-family: '@宋體'; }@font-face { font-family: 'Calibri'; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 10.5pt; font-family: Calibri; }a:link, span.MsoHyperlink { color: rgb(5, 99, 193); text-decoration: underline; }a:visited, span.MsoHyperlinkFollowed { color: rgb(149, 79, 114); text-decoration: underline; }p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph { margin: 0cm 0cm 0.0001pt; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: Calibri; }.MsoChpDefault { font-size: 10.5pt; font-family: Calibri; }div.WordSection1 { }ol { margin-bottom: 0cm; }ul { margin-bottom: 0cm; }java

微信公衆平臺,即咱們平時所說的「公衆號」,曾用名「官方平臺」、「媒體平臺」,但最終命名爲「公衆平臺」。從微信的命名我能夠發現,公衆平臺不僅是官方、媒體使用的平臺,而是對全部公衆都開放的統一平臺。git

微信公衆平臺地址:https://mp.weixin.qq.com/小程序

微信公衆平臺公分4大板塊:訂閱號、服務號、小程序、企業號。按照微信2016年公開課規劃,企業號後續將與企業微信合併,所以咱們主要針對前三部分開始講解:微信小程序

 

 

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

一、  訂閱號和服務號均爲傳統意義的「公衆號」,具備消息羣發能力,詳細區別可在官方平臺查看:http://kf.qq.com/faq/140806zARbmm140826M36RJF.html 咱們將注重於服務能力開發,而在服務方面,二者開發模式徹底相同,只不過服務號可使用更多的服務接口,而訂閱號則是「閹割版」的服務號。所以,後續課程咱們將使用服務號爲案例進行操做。安全

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

 

2、 開發帳號準備微信

一、  帳號註冊app

進入微信公衆平臺https://mp.weixin.qq.com ,點擊右上角當即註冊,選擇「服務號」或「訂閱號」註冊(服務號僅限機構用戶註冊,我的用戶只能選擇訂閱號)

註冊時需填寫一系列信息,根據提示填寫便可,此處不作贅述。

二、  測試帳號申請

若是暫時不想註冊帳號,或者沒法註冊服務號,可選擇官方提供的測試帳號申請。申請地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 點擊後掃描二維碼,便可得到一個測試帳號,擁有服務號所有權限。

 

 

3、 開發環境準備

一、  外網映射工具

微信公衆平臺在訪問後臺時,必須提供可以正確訪問的外網地址,微信平臺對後臺URL的要求有兩點:

① 必須可以用公網訪問    ② 必須使用80端口

要實現以上兩點,咱們能夠選擇購買外網服務器,例如:阿里雲、百度雲、騰訊雲…都是不錯的選擇。若是沒有服務器,能夠選擇用外網映射工具,將咱們的內網連接映射爲公網,比較不錯的映射軟件有:花生殼、ngrok、nat123等…

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

①   Ngrock:

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

 

 

 

 

 

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



            

 

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

4、 微信公衆平臺數據交互原理

搭建好公網訪問地址後,咱們本身開發的後臺代碼就能夠放到公網地址了,那麼用戶是怎麼樣訪問到咱們的代碼呢?

下面咱們來看一下微信公衆平臺的數據交互原理:

 

 

           從上圖能夠看到,微信公衆平臺實際只是起到一個橋樑做用,實際處理業務、提供服務的代碼,依然是放在咱們本身的服務器或者公網映射上面。

           那麼,咱們就能夠在咱們本身的電腦(服務器)上面編寫後臺代碼,並經過映射工具提供公網可以訪問的URL,而後將此URL綁定到微信後臺便可。

 

5、 開發模式接入

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

一、  填寫服務器配置

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

 

 

其中:

URL:即咱們上述所說的後臺服務器公網訪問地址

Token:開發者自定的驗證口令

EncodingAESKey:隨機字符串,若是消息加解密方式採用安全模式才需驗證

 

二、  驗證消息是否有效

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

 

 

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

 

 

下面,咱們實現代碼操做。

 

6、 開發接入後臺代碼

一、  使用MyEclipse建立Web項目,並新建一個servlet:

 

二、  在servlet的doGet方法中,獲取上述四個校驗參數:

 

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

 

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

 

           使用sha1加密方法↓

 

四、  Servlet中調用校驗方法,並驗證結果,若是檢驗成功,將獲得的隨機字符串eahostr原路返回結果給微信平臺:

 

至此,Servlet及Check工具類,編寫完成。

五、  啓動Tomcat,將Servlet的本地地址(例如本機爲:localhost:8080/WeiXin/servlet/WeiXinServlet )進行公網映射,參照上述第三大部份內容,進行公網映射,肯定公網地址可以正確訪問。

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

7、 配置公衆平臺後臺

進入微信後臺配置相關信息:

 

點擊提交,微信將發送Get指令到Servlet,並調用doGet方法,進行咱們編寫的驗證操做,最後若是順利返回隨機字符串,則綁定成功。

 

8、 源碼共享

一、  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);

                     }        

           }

 

 

二、  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.定義數組存放tooken,timestamp,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;

        }

    }

}

相關文章
相關標籤/搜索