一旦手把手教你開發微信公衆平臺
目錄
1: 初步認識微信公衆平臺
微信公衆平臺,簡稱weChat。曾命名爲“官號平臺”和“媒體平臺”,最終定位爲“公衆平臺”,無疑讓我們看到一個微信對後續更大的期望。和新浪微博早期從明星戰略着手不同,微信此時已經有了億級的用戶,挖掘自己用戶的價值,爲這個新的平臺增加更優質的內容,創造更好的粘性,形成一個不一樣的生態循環,是平臺發展初期更重要的方向。利用公衆賬號平臺進行自媒體活動,簡單來說就是進行一對多的媒體性行爲活動,如商家通過申請公衆微信服務號通過二次開發展示商家微官網、微會員、微推送、微支付、微活動,微報名、微分享、微名片等,已經形成了一種主流的線上線下微信互動營銷方式。
2: 如何申請微信公衆平臺測試號
- 首先微信公衆平臺提供了接口文檔,地址爲:http://mp.weixin.qq.com/wiki/home/index.html
- 打開接口頁面之後,點擊左側菜單”測試號申請/在線調試”,點擊子菜單”接口測試號申請”即可跳轉到申請頁面,開發者使用自己的微信賬號掃描二維碼之後系統會自動分配一個測試號給你。
- 然後我們需要在測試號頁面填寫相關信息之後即可開始開發。主要是完成接口配置信息修改,即填寫一個URL作爲響應微信服務器請求的地址。(1:不明白可以忽略,看完明白了再照着做。2:具體配置見下一步驟)
3: 接口配置信息
- 配置界面如圖所示:
- 注意不明白的也不要太糾結爲什麼要配置這個,以後明白了也沒什麼。反正就是配置一個地址,這個地址即爲你的一個後臺訪問路徑,這個路徑必須是能夠訪問到的,並且還必須是公網地址。
- 關於公網地址的問題,有的碼農朋友可能捨不得花錢,那就搞個ngrok映射一下,這個我就不提供教程了。
4: 環境搭建以及驗證消息真實性
- 環境介紹:本人採用spring+springMVC+hibernate搭建了一個後臺。注意也可自己搭個其他環境,無所謂。(本教程用不到數據庫)
- 解釋:當一個關注了你的公衆號的用戶向你發消息或者圖片等等之類的時候,微信服務器會向你的公衆號配置的那個地址發送一個請求來通知你,並且你要給微信服務器返回你對這個事件的反應是什麼。下面的這個步驟就是要教你如何判斷這個請求是微信服務器發來的,而不是有人冒充微信服務器向你發送通知以達到不法目的。
- 首先提供一個controller,其中accept方法即爲我上面配置的地址。
@Controller
@RequestMapping(value = "/hello")
public class HelloController {
private static final String url = "http://f5b3cbc2.ngrok.io" + "/weixin/";
/**
* 微信接入驗證
*
* @desc 1. 將token、timestamp、nonce三個參數進行字典序排序
* @desc 2. 將三個參數字符串拼接成一個字符串進行sha1加密
* @desc 3. 開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信
* */
@RequestMapping(value = "/accept.do", method = RequestMethod.GET)
@ResponseBody
public String accept(String signature, String timestamp, String nonce, String echostr) {
if (WeChatUtils.checkSignature(signature, timestamp, nonce)) {
return echostr;
}
return null;
}
}
- 本人寫的一個工具類
public class WeChatUtils {
private static final String token = "hello";
public static Boolean checkSignature(String signature, String timestamp, String nonce) {
//sort
String[] arr = new String[] { token, timestamp, nonce };
Arrays.sort(arr);
StringBuffer sf = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
sf.append(arr[i]);
}
//sha1加密
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA");
// 執行摘要方法
byte[] digest = md.digest(sf.toString().getBytes());
String encriptStr = new HexBinaryAdapter().marshal(digest);
if (encriptStr.equalsIgnoreCase(signature)) {
return true;
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return false;
}
}