Java后端接入微信小程序消息推送服務(wù)的注意事項

公司的小程序最近開始接入小程序的客服功能愤兵,主要實現(xiàn)能夠自動回復(fù)以及人工回復(fù)鹿霸。 查閱微信開放文檔后,也基本上完成了需求恐似,但是其中遇到了很多問題杜跷,現(xiàn)在總結(jié)一下。

接入方式的選擇

微信的文檔中說的是可以有3種實現(xiàn)方式:
1.開發(fā)者服務(wù)器接收消息推送
2.云函數(shù)接收消息推送
3.云托管服務(wù)接收消息推送
當(dāng)然我這里選擇的是第一種方式矫夷。

接入步驟

第一步:填寫服務(wù)器配置

登錄小程序后臺后葛闷,在「開發(fā)」-「開發(fā)設(shè)置」-「消息推送」中,管理員掃碼啟用消息服務(wù)双藕,填寫服務(wù)器地址(URL)淑趾、令牌(Token) 和 消息加密密鑰(EncodingAESKey)等信息。
\color{red}{這里要注意的是端口號一定是80或者443忧陪,也就是對應(yīng)http或者h(yuǎn)ttps扣泊,一旦確認(rèn)了URL后,就不要輕易改動了嘶摊,每個月只有3次修改URL的機會哦~}

第二步:驗證消息的確來自微信服務(wù)器

開發(fā)者提交信息后延蟹,微信服務(wù)器將發(fā)送GET請求到填寫的服務(wù)器地址URL上。
\color{red}{這里最好還是按照文檔中的要求叶堆,進(jìn)行字段的驗證阱飘,不要在接口中直接返回echostr,驗證的方法虱颗,在別的博客上能搜索到相應(yīng)的Java代碼沥匈。}

第三步:接收消息和事件

當(dāng)某些特定的用戶操作引發(fā)事件推送時(如用戶向小程序客服發(fā)送消息、或者進(jìn)入會話等情況)忘渔,微信服務(wù)器會將消息(或事件)的數(shù)據(jù)包以 POST 請求發(fā)送到開發(fā)者配置的 URL高帖,開發(fā)者可以依據(jù)自身業(yè)務(wù)邏輯進(jìn)行響應(yīng)。
\color{red}{這里需要注意的點有:}
\color{red}{1.消息類型以及事件類型}
\color{red}{2.接口參數(shù)接受}
\color{red}{3.怎么進(jìn)行消息回復(fù)}
\color{red}{4.怎么轉(zhuǎn)發(fā)消息到人工客服}
\color{red}{5.轉(zhuǎn)發(fā)消息到人工客服后服務(wù)端會收不到消息?}
\color{red}{6.Media_Id怎么獲取}
\color{red}{7.消息回復(fù)限制}
\color{red}{8.事件類型處理}
\color{red}{9.發(fā)送的小程序卡片,跳轉(zhuǎn)不到指定頁面?}
\color{red}{下面進(jìn)行一一解答!}

1.消息類型以及事件類型

目前發(fā)現(xiàn)的消息類型有:
1)text:普通文本消息
2)image:圖片消息
3)miniprogrampage:小程序卡片
4)link:鏈接
5)event:事件
目前發(fā)現(xiàn)的事件類型有:
1)user_enter_tempsession:用戶進(jìn)入客服會話
2)kf_create_session:人工客服進(jìn)入畦粮,客服助手小程序散址,注意這里不是指跟特定的用戶聊天而僅僅是進(jìn)入客服助手聊天列表
3)subscribe_msg_sent_event:小程序訂閱消息

2.接口參數(shù)接受

由于消息類型和事件類型以及是否加密等不確定性乖阵,所以推薦使用Map類型參數(shù)進(jìn)行參數(shù)的接收,其中參數(shù)基本包含如下字段:
1)MsgType:消息類型
2)Content:文本消息消息內(nèi)容
2)FromUserName:用戶openid
2)ToUserName:小程序的原始ID
2)CreateTime:消息創(chuàng)建時間
2)Event:當(dāng)MsgType為event的時候爪飘,會有指定的Event類型

3.怎么進(jìn)行消息回復(fù)

剛開始我以為微信是利用我們提供的POST接口進(jìn)行消息回復(fù)的义起,還是我太年輕啊,我們提供的POST接口目前是兩個作用师崎,一是告訴調(diào)用這個接口的服務(wù)我們處理成功了默终,根據(jù)文檔可以進(jìn)行如下回復(fù):
1)直接回復(fù)success(推薦方式)
2)直接回復(fù)空串(指字節(jié)長度為0的空字符串,而不是結(jié)構(gòu)體中content字段的內(nèi)容為空)
3)若接口文檔有指定返回內(nèi)容犁罩,應(yīng)按文檔說明返回
二是進(jìn)行消息轉(zhuǎn)發(fā)齐蔽,下面會說到,這里我直接回復(fù)success床估。 也就是說含滴,如果我們要自動回復(fù)用戶發(fā)送的消息,還需要采用其他的方式丐巫,腳指頭想一下谈况,可能是調(diào)用微信特定的接口,事實上就是這樣递胧,具體調(diào)用的是
https://api.weixin.qq.com/cgi-bin/message/custom/send
這個接口碑韵,但是我們可以自己不用去調(diào)用這個接口,這里重點來了缎脾,注意啦WN拧!遗菠!我們引入一個庫如下:

        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>${weixin-java.version}</version>
        </dependency>

這個庫封裝了大部分小程序開發(fā)過程中联喘,需要用到的微信調(diào)用,很方便的辙纬,而且我們自己不用去管那個access_token豁遭!那關(guān)于這個庫的配置什么的,這里我就不說了贺拣,你們自己去網(wǎng)上百度吧蓖谢,這里我們使用庫提供的WxMaMsgService中的sendKefuMsg方法進(jìn)行消息自動回復(fù),至于消息的類型以及怎么創(chuàng)建出消息纵柿,你們可以自己點到方法生命中去摸索蜈抓。

4.怎么轉(zhuǎn)發(fā)消息到人工客服

這時候你會發(fā)現(xiàn)启绰,自動回復(fù)的功能是實現(xiàn)了昂儒,但是人工客服那邊卻收不到消息,這可怎么辦啊委可,那么這個時候我們提供的POST接口就起作用了渊跋,對于需要轉(zhuǎn)發(fā)的消息腊嗡,可以通過進(jìn)行特定的回復(fù)來實現(xiàn),這里我貼下具體代碼:

        HashMap<String, Object> resultMap = new HashMap<>();
        resultMap.put("ToUserName", fromUserName);
        resultMap.put("FromUserName", toUserName);
        resultMap.put("CreateTime", Long.parseLong(createTime));
        resultMap.put("MsgType", "transfer_customer_service");
        String json = JSON.toJSONString(resultMap);
        com.alibaba.fastjson.JSONObject result = com.alibaba.fastjson.JSONObject.parseObject(json);
        return result.toString();

5.轉(zhuǎn)發(fā)消息到人工客服后服務(wù)端會收不到消息?

到目前為止好像自動回復(fù)和人工回復(fù)的功能都實現(xiàn)了拾酝,但是有沒有發(fā)現(xiàn)燕少,在人工客服介入之后,我們的服務(wù)卻收不到微信給我們轉(zhuǎn)的消息了蒿囤,這是為什么?查閱文檔發(fā)現(xiàn):
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/trans.html
用戶被客服接入以后客们,客服關(guān)閉會話以前,處于會話過程中時材诽,用戶發(fā)送的消息均會被直接轉(zhuǎn)發(fā)至客服系統(tǒng)底挫。當(dāng)會話超過 30 分鐘客服沒有關(guān)閉時,微信服務(wù)器會自動停止轉(zhuǎn)發(fā)至客服脸侥,而將消息恢復(fù)發(fā)送至開發(fā)者填寫的 URL 上建邓。
用戶在等待隊列中時,用戶發(fā)送的消息仍然會被推送至開發(fā)者填寫的 URL 上睁枕。

6.Media_Id怎么獲取

在進(jìn)行image或者miniprogrampage類型消息發(fā)送的時候,是需要一個media_id的官边,那么這個media_id怎么獲取呢?通過調(diào)用
https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
這個接口進(jìn)行文件上傳外遇,這里同樣注意注簿,我們不需要自己調(diào)用,使用上面提到的庫中的WxMaMediaService的uploadMedia方法進(jìn)行文件上傳

7.消息回復(fù)限制

有時候發(fā)消息給用戶會報條數(shù)限制的錯誤,查閱文檔后發(fā)現(xiàn):
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/send.html
當(dāng)用戶和小程序客服產(chǎn)生特定動作的交互時(具體動作列表請見下方說明)臀规,微信將會把消息數(shù)據(jù)推送給開發(fā)者滩援,開發(fā)者可以在一段時間內(nèi)(目前為 48 小時)調(diào)用客服接口,通過調(diào)用 發(fā)送客服消息接口 來發(fā)送消息給普通用戶塔嬉。此接口主要用于客服等有人工消息處理環(huán)節(jié)的功能玩徊,方便開發(fā)者為用戶提供更加優(yōu)質(zhì)的服務(wù)。
這里需要注意的是不能直接發(fā)送消息給新用戶,超過48小時后不能發(fā)送,超過5條不能發(fā)送

8.事件類型處理

有時候不是所有轉(zhuǎn)發(fā)過來的消息我們都需要處理或者轉(zhuǎn)發(fā)到人工那邊,比如客服接入的事件,訂閱消息發(fā)送的事件,所以在代碼里有必要進(jìn)行處理,我這里處理了人工客服接入,進(jìn)行提示

        if (MSG_TYPE_EVENT.equals(msgType)
                && !EVENT_KF_CREATE_SESSION.equals(msgEvent)) {
            //對于事件一律不轉(zhuǎn)發(fā),除了人工客服接入
            return "success";
        }

9.發(fā)送的小程序卡片,跳轉(zhuǎn)不到指定頁面?

在小程序內(nèi)部打開客服界面,推給用戶的小程序卡片,用戶在點擊之后是不能直接跳轉(zhuǎn)到指定的頁面的,這個時候需要前端給button加上bindcontact屬性,然后獲取里面的路徑以及參數(shù)進(jìn)行手動跳轉(zhuǎn)就行了谨究。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恩袱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胶哲,更是在濱河造成了極大的恐慌畔塔,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸯屿,死亡現(xiàn)場離奇詭異澈吨,居然都是意外死亡,警方通過查閱死者的電腦和手機寄摆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門谅辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婶恼,你說我怎么就攤上這事桑阶“馗保” “怎么了钝尸?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵掷豺,是天一觀的道長验烧。 經(jīng)常有香客問我纺酸,道長犬第,這世上最難降的妖魔是什么随抠? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任红伦,我火速辦了婚禮尊流,結(jié)果婚禮上虐杯,老公的妹妹穿的比我還像新娘换可。我一直安慰自己,他們只是感情好厦幅,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布沾鳄。 她就那樣靜靜地躺著,像睡著了一般确憨。 火紅的嫁衣襯著肌膚如雪译荞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天休弃,我揣著相機與錄音吞歼,去河邊找鬼。 笑死塔猾,一個胖子當(dāng)著我的面吹牛篙骡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丈甸,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼糯俗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了睦擂?” 一聲冷哼從身側(cè)響起得湘,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顿仇,沒想到半個月后淘正,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡臼闻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年鸿吆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片述呐。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡惩淳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出市埋,到底是詐尸還是另有隱情黎泣,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布缤谎,位于F島的核電站抒倚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坷澡。R本人自食惡果不足惜托呕,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望频敛。 院中可真熱鬧项郊,春花似錦、人聲如沸斟赚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拗军。三九已至任洞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間发侵,已是汗流浹背交掏。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刃鳄,地道東北人盅弛。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像叔锐,于是被迫代替她去往敵國和親挪鹏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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