Java開(kāi)發(fā)微信公眾號(hào)

首先你需要注冊(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ù)器了

接入配置
Screenshot from 2016-11-10 22-24-07.png

:如果還沒(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即為成功
...

框架的使用

wechat4j

GitHub地址
很不錯(cuò)記得去給star人家
推薦博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 這是我轉(zhuǎn)發(fā)別人的本文主要講的是如何通過(guò)后臺(tái)獲取到用戶的信息(openId)一、什么是OAuth2.0官方網(wǎng)站:ht...
    H_Man閱讀 1,136評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,908評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,236評(píng)論 25 708
  • 我可以一落千丈,也可以創(chuàng)造奇跡
    cuber阿興閱讀 175評(píng)論 0 0
  • 計(jì)劃: 1.早起+喝水 2.日常工作 3.運(yùn)動(dòng)+練字+記賬 實(shí)際: 1.完成 2.完成。今天的測(cè)試不順,桑心~ 3...
    lrb2017閱讀 187評(píng)論 0 0