首先你需要注冊(cè)一個(gè)公眾號(hào)
https://mp.weixin.qq.com/
1.編輯者模式
- 群發(fā)
- 自定義菜單
- 自動(dòng)回復(fù)
- 素材管理
2.開(kāi)發(fā)者模式
- 部署項(xiàng)目
- 填寫(xiě)服務(wù)器配置
- token驗(yàn)證
3.框架的使用
- wechat4j
編輯者模式
群發(fā)
一天只能發(fā)一條
但是模式開(kāi)發(fā)者模式可以繞開(kāi)這個(gè)限制,具體就不介紹了。
<h6>自定義菜單</h6>
1.自定義菜單最多包括3個(gè)一級(jí)菜單,每個(gè)一級(jí)菜單最多包含5個(gè)二級(jí)菜單。
2.一級(jí)菜單最多4個(gè)漢字,二級(jí)菜單最多7個(gè)漢字,多出來(lái)的部分將會(huì)以“...”代替。
3.創(chuàng)建自定義菜單后,菜單的刷新策略是,在用戶進(jìn)入公眾號(hào)會(huì)話頁(yè)或公眾號(hào)profile頁(yè)時(shí),如果發(fā)現(xiàn)上一次拉取菜單的請(qǐng)求在5分鐘以前,就會(huì)拉取一下菜單,如果菜單有更新,就會(huì)刷新客戶端的菜單。測(cè)試時(shí)可以嘗試取消關(guān)注公眾賬號(hào)后再次關(guān)注,則可以看到創(chuàng)建后的效果。
菜單類型
1、click:點(diǎn)擊推事件用戶點(diǎn)擊click類型按鈕后,微信服務(wù)器會(huì)通過(guò)消息接口推送消息類型為event的結(jié)構(gòu)給開(kāi)發(fā)者(參考消息接口指南),并且?guī)习粹o中開(kāi)發(fā)者填寫(xiě)的key值,開(kāi)發(fā)者可以通過(guò)自定義的key值與用戶進(jìn)行交互;
2、view:跳轉(zhuǎn)URL用戶點(diǎn)擊view類型按鈕后,微信客戶端將會(huì)打開(kāi)開(kāi)發(fā)者在按鈕中填寫(xiě)的網(wǎng)頁(yè)URL,可與網(wǎng)頁(yè)授權(quán)獲取用戶基本信息接口結(jié)合,獲得用戶基本信息。
3、scancode_push:掃碼推事件用戶點(diǎn)擊按鈕后,微信客戶端將調(diào)起掃一掃工具,完成掃碼操作后顯示掃描結(jié)果(如果是URL,將進(jìn)入U(xiǎn)RL),且會(huì)將掃碼的結(jié)果傳給開(kāi)發(fā)者,開(kāi)發(fā)者可以下發(fā)消息。
4、scancode_waitmsg:掃碼推事件且彈出“消息接收中”提示框用戶點(diǎn)擊按鈕后,微信客戶端將調(diào)起掃一掃工具,完成掃碼操作后,將掃碼的結(jié)果傳給開(kāi)發(fā)者,同時(shí)收起掃一掃工具,然后彈出“消息接收中”提示框,隨后可能會(huì)收到開(kāi)發(fā)者下發(fā)的消息。
5、pic_sysphoto:彈出系統(tǒng)拍照發(fā)圖用戶點(diǎn)擊按鈕后,微信客戶端將調(diào)起系統(tǒng)相機(jī),完成拍照操作后,會(huì)將拍攝的相片發(fā)送給開(kāi)發(fā)者,并推送事件給開(kāi)發(fā)者,同時(shí)收起系統(tǒng)相機(jī),隨后可能會(huì)收到開(kāi)發(fā)者下發(fā)的消息。
6、pic_photo_or_album:彈出拍照或者相冊(cè)發(fā)圖用戶點(diǎn)擊按鈕后,微信客戶端將彈出選擇器供用戶選擇“拍照”或者“從手機(jī)相冊(cè)選擇”。用戶選擇后即走其他兩種流程。
7、pic_weixin:彈出微信相冊(cè)發(fā)圖器用戶點(diǎn)擊按鈕后,微信客戶端將調(diào)起微信相冊(cè),完成選擇操作后,將選擇的相片發(fā)送給開(kāi)發(fā)者的服務(wù)器,并推送事件給開(kāi)發(fā)者,同時(shí)收起相冊(cè),隨后可能會(huì)收到開(kāi)發(fā)者下發(fā)的消息。
8、location_select:彈出地理位置選擇器用戶點(diǎn)擊按鈕后,微信客戶端將調(diào)起地理位置選擇工具,完成選擇操作后,將選擇的地理位置發(fā)送給開(kāi)發(fā)者的服務(wù)器,同時(shí)收起位置選擇工具,隨后可能會(huì)收到開(kāi)發(fā)者下發(fā)的消息。
9、media_id:下發(fā)消息(除文本消息)用戶點(diǎn)擊media_id類型按鈕后,微信服務(wù)器會(huì)將開(kāi)發(fā)者填寫(xiě)的永久素材id對(duì)應(yīng)的素材下發(fā)給用戶,永久素材類型可以是圖片、音頻、視頻、圖文消息。請(qǐng)注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。
10、view_limited:跳轉(zhuǎn)圖文消息URL用戶點(diǎn)擊view_limited類型按鈕后,微信客戶端將打開(kāi)開(kāi)發(fā)者在按鈕中填寫(xiě)的永久素材id對(duì)應(yīng)的圖文消息URL,永久素材類型只支持圖文消息。請(qǐng)注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。
** 注意:**請(qǐng)注意,3到8的所有事件,僅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用戶,舊版本微信用戶點(diǎn)擊后將沒(méi)有回應(yīng),開(kāi)發(fā)者也不能正常接收到事件推送。9和10,是專門給第三方平臺(tái)旗下未微信認(rèn)證(具體而言,是資質(zhì)認(rèn)證未通過(guò))的訂閱號(hào)準(zhǔn)備的事件類型,它們是沒(méi)有事件推送的,能力相對(duì)受限,其他類型的公眾號(hào)不必使用。
自動(dòng)回復(fù)
自動(dòng)回復(fù)機(jī)制就是根據(jù)用戶發(fā)送的消息文本關(guān)鍵字來(lái)返回特定的數(shù)據(jù),這個(gè)也很簡(jiǎn)單,就不多做介紹了。
素材管理
這里的編輯的素材直接上傳到微信服務(wù)器且都是永久素材(后面會(huì)談到和臨時(shí)素材的區(qū)別),且每一個(gè)素材都有一個(gè)media_id,需要調(diào)用獲取永久素材接口獲取素材列表
開(kāi)發(fā)者模式
啟動(dòng)開(kāi)發(fā)者模式,進(jìn)行token認(rèn)證,注意:開(kāi)發(fā)者模式和編輯者模式是沖突的,所以一旦啟用開(kāi)發(fā)者模式編輯者模式就會(huì)被關(guān)閉
搭建項(xiàng)目
示例代碼下載
/**
* MyServlet.java:獲取Get方法參數(shù)驗(yàn)證消息的確來(lái)自微信服務(wù)器
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//服務(wù)器配置
String signature = req.getParameter("signature"); //微信加密簽名,signature結(jié)合了開(kāi)發(fā)者填寫(xiě)的token參數(shù)和請(qǐng)求中的timestamp參數(shù)、nonce參數(shù)。
String timestamp = req.getParameter("timestamp"); //時(shí)間戳
String nonce = req.getParameter("nonce"); //隨機(jī)數(shù)
String echostr = req.getParameter("echostr"); //隨機(jī)字符串
PrintWriter out = resp.getWriter();
if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
public class CheckUtil {
private static final String token = "storm";
/**
* 檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn).
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce){
String[] arr = new String[]{token, timestamp, nonce};
Arrays.sort(arr);
StringBuffer content = new StringBuffer();
for (int i = 0; i < arr.length; i++){
content.append(arr[i]);
}
String temp = getSha1(content.toString());
return temp.equals(signature);
}
/**
* sha1加密.
* @param str : 傳入字符串
* @return
*/
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;
}
}
這樣你的微信公眾號(hào)就可以接入服務(wù)器了
接入配置
注:如果還沒(méi)有服務(wù)器可以使用使用映射工具講本地網(wǎng)絡(luò)映射到公網(wǎng),詳情參照我的另一篇文章ngrok外網(wǎng)映射
URL:就是你項(xiàng)目部署的服務(wù)器地址
Token:就是令牌,自己填寫(xiě),后面很多地方都需要用到,所以一定要填好
EncodingAESKey:隨機(jī)生成,不解釋
消息加密模式:測(cè)試階段建議用明文模式
若果提示驗(yàn)證失敗,有很多可能
1.你項(xiàng)目沒(méi)有部署成功
2.token 和你代碼里寫(xiě)的token不一致
3.公網(wǎng)映射的時(shí)候應(yīng)該選用http協(xié)議而不是https協(xié)議,因?yàn)檫@個(gè)會(huì)提示錯(cuò)誤,我就是應(yīng)為這個(gè)問(wèn)題糾結(jié)了很久
4.部署時(shí)響應(yīng)500即為成功
...