首頁  >  文章  >  微信小程式  >  以JAVA開發微信公眾平台(一)-環境建構與開發接入

以JAVA開發微信公眾平台(一)-環境建構與開發接入

PHPz
PHPz原創
2017-04-04 10:32:401703瀏覽

一、初始微信公眾平台

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

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

微信公眾平台公分4大板塊:訂閱號碼、服務號碼、小程式、企業號。依照微信2016年公開課規劃,企業號後續將與企業微信合併,因此我們主要針對前三部分開始講解:

以JAVA開發微信公眾平台(一)-環境建構與開發接入

微信平台四大板塊

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

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點擊後掃描二維碼,即可取得一個測試帳號,擁有服務號全部權限。

以JAVA開發微信公眾平台(一)-環境建構與開發接入

測試帳號介面

三、開發環境準備

1、外網對映工具

微信公眾平台在存取後台時,必須提供能夠正確存取的外網位址,微信平台對後台URL的要求有兩點:

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

要實現以上兩點,我們可以選擇購買外網伺服器,例如:阿里雲、百度雲、騰訊雲…都是不錯的選擇。如果沒有伺服器,可以選擇用外網映射工具,將我們的內部網路連結對應為公網,比較不錯的映射軟體有:花生殼、ngrok、nat123等…

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

#① Ngrock:

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

以JAVA開發微信公眾平台(一)-環境建構與開發接入

ngrock操作

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

以JAVA開發微信公眾平台(一)-環境建構與開發接入

ngrock操作成功介面

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

四、微信公眾平台資料互動原理

搭建好公網存取位址後,我們自己開發的後台程式碼就可以放到公網位址了,那麼使用者是怎麼樣存取到我們的程式碼呢?

下面我們來看微信公眾平台的資料互動原理:

以JAVA開發微信公眾平台(一)-環境建構與開發接入


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

那麼,我們就可以在我們自己的電腦(伺服器)上面編寫後台程式碼,並透過映射工具提供公網能夠存取的URL,然後將此URL綁定到微信後台即可。

五、開發模式接入

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

#1、填寫伺服器設定

進入微信公眾平台,點選左側【開發-基本設定】,選擇【伺服器設定】。即可進入設定頁面:

以JAVA開發微信公眾平台(一)-環境建構與開發接入

微信平台伺服器設定

其中:

##URL:即我們上述所說的後台伺服器公網存取位址

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

EncodingAES

Key:隨機字串,如果訊息加解密方式採用安全模式才需驗證

2、驗證訊息是否有效

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

以JAVA開發微信公眾平台(一)-環境建構與開發接入

微信伺服器Get

請求參數

#我們透過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此GET請求來自微信伺服器,請原樣回傳

echostr參數內容,則存取生效,成為開發者成功,否則存取失敗。加密/校驗流程如下:

下面,我們實作程式碼操作。

六、開發存取後台程式碼

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

以JAVA開發微信公眾平台(一)-環境建構與開發接入

新建一個servlet

#2、在servlet的doGet方法中,取得上述四個校驗參數:

以JAVA開發微信公眾平台(一)-環境建構與開發接入

取得上述四個校驗參數

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

以JAVA開發微信公眾平台(一)-環境建構與開發接入

編寫工具類別

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

以JAVA開發微信公眾平台(一)-環境建構與開發接入

#校驗步驟

使用

sha1加密方法↓

以JAVA開發微信公眾平台(一)-環境建構與開發接入

sha1加密方法

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

以JAVA開發微信公眾平台(一)-環境建構與開發接入

Servlet中呼叫校驗方法

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

5、啟動Tomcat,將Servlet的本機位址(例如本機為:localhost:8080/WeiXin/servlet/WeiXinServlet)進行公網映射,參考上述第三大部分內容,進行公網映射,確定公網位址能正確存取。

我將直接將程式碼放到公網伺服器進行存取。獲得以下地址

七、設定公眾平台後台

進入微信後台設定相關資訊:

以JAVA開發微信公眾平台(一)-環境建構與開發接入

微信後台設定相關資訊

點擊提交,微信將發送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.定义数组存放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];}
char hexDigits[] = {&#39;0&#39;,&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;,&#39;6&#39;,&#39;7&#39;,&#39;8&#39;,&#39;9&#39;,
&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;,&#39;f&#39;};
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;
}
}
}

以上是以JAVA開發微信公眾平台(一)-環境建構與開發接入的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn