接入微信公衆平臺開發
1.開發好的程序在自己電腦通過瀏覽器是可以直接訪問的;
另外一臺電腦是沒有辦法訪問的,我們可以讓這些電腦連接
到同一個局域網中,然後通過ip訪問;
2.在互聯網上其他的人是看不到我們開發的程序的,出發把程序發到到雲服務器上;
在開發的過程中我們需要程序需要和微信服務器做對接,
如果微信服務器不能找到我們程序就沒有辦法對接,所以在開發時,
我們首先需要做內網穿透;
3.內網穿透目的時爲了讓我們的項目可以被互聯網上的其他電腦訪問;
內網穿透軟件:花生殼,nat123,ngrok(免費,不是很穩定)
內網穿透原理:
4.ngrok:http://www.ngrok.cc/
1.下載,註冊賬號;
2.開通隧道
協議:http
名稱:隨便寫;
前置域名:隨便寫;
本地端口: localhost:80(本地項目訪問端口)
其他不需要填寫;
3.複製隧道id,啓動ngrok客戶端;
c.開發接入
1.開發接入準備
a.登錄微信公衆號平臺(需要修改開發》基本配置);
b.個人賬號下很多的功能都無法使用,微信提供了測試賬號申請
(微信公衆號平臺–>服務號–》開發文檔–》開始開發—》接口測試號申請);
c. 接入微信公衆平臺開發,開發者需要按照如下步驟完成:
1、填寫服務器配置
2、驗證服務器地址的有效性
3、依據接口文檔實現業務邏輯
2.url 內網穿透的url+項目名+方法名
token:需要和代碼中的一致;
@RequestMapping("/index")
public String index(HttpServletRequest request) {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
System.out.println(signature+"\n"+timestamp+"\n"+nonce+"\n"+echostr);
if(check(timestamp,nonce,signature,TOKEN)) {
System.out.println("接入成功");
PrintWriter writer = response.getWriter();
writer.write(echostr);
writer.flush();
writer.close();
}else {
System.out.println("接入失敗");
}
return "index";
}
/**
* 校驗參數
* @param timestamp
* @param nonce
* @param signature
* @param token
* @return
*/
private boolean check(String timestamp, String nonce, String signature,String token) {
//1.將token、timestamp、nonce三個參數進行字典序排序
String [] str = {token,timestamp,nonce};
Arrays.sort(str);
//2)將三個參數字符串拼接成一個字符串進行sha1加密
String strs = str[0]+str[1]+str[2];
String mysig= sha1(strs);
System.out.println("mysig:---->"+mysig);
//3)開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信
return mysig.equals(signature);
}
private String sha1(String strs) {
// TODO Auto-generated method stub
try {
//獲取加密對象
MessageDigest md = MessageDigest.getInstance("sha1");
//加密處理
byte[] digest = md.digest(strs.getBytes());
//處理加密結果
char [] chars = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append((chars)[(b>>4)&15]);
sb.append(chars[b&15]);
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}