微信小程序之客服消息

客服消息

參考:官方文檔

創(chuàng)建客服消息事件

官方代碼:

第一種:

<contact-button 
  type="default-light" 
  size="20"
  session-from="weapp"
>
</contact-button>

第二種:
給button按鈕添加open-type="contact"

<button 
    class="weui-btn" 
    type="primary" 
    open-type="contact"
    >發(fā)送客服信息
</button>

然后打開微信web開發(fā)者工具的預(yù)覽,手機(jī)上訪問調(diào)試的小程序。
點(diǎn)擊剛才設(shè)置的發(fā)送客服消息(我只用過(guò)第二種,第一種沒試過(guò)),小程序會(huì)跳轉(zhuǎn)到會(huì)話界面,這個(gè)界面跟普通會(huì)話沒有什么區(qū)別,但是只能給小程序發(fā)送文本消息圖片消息

客服消息界面

以上這些就是客服消息的界面發(fā)送入口了

接收消息

準(zhǔn)備工作

在微信小程序網(wǎng)頁(yè)上面配置開發(fā)者服務(wù)器的地址
這里我的已經(jīng)設(shè)置好了

消息服務(wù)器配置

下面再就是對(duì)用戶發(fā)過(guò)來(lái)的消息進(jìn)行代碼編寫了

需要注意的地方

  1. 消息推送配置點(diǎn)提交的時(shí)候,微信發(fā)送的是GET請(qǐng)求。
  2. 當(dāng)用戶給小程序發(fā)送消息的時(shí)候,微信發(fā)送的POST請(qǐng)求。
  3. 這兩次的請(qǐng)求雖然不一樣,但是他們的請(qǐng)求的地址要是一樣的。

上代碼來(lái)說(shuō):

這里是在網(wǎng)頁(yè)上填寫完配置信息點(diǎn)提交的時(shí)候,微信請(qǐng)求開發(fā)者服務(wù)器,發(fā)送GET請(qǐng)求,Java層做的處理,校驗(yàn)通過(guò)則網(wǎng)頁(yè)上回提示提交成功。

import java.io.BufferedReader;
import java.io.InputStreamReader;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.core.util.wx.SignUtil;
import com.core.util.wx.WXMsgResponseUtil;
import com.udbac.entity.WXImageRequest;
import com.udbac.entity.WXTextRequest;
import com.udbac.util.WxApiClient;

import net.sf.json.JSONObject;


@Controller
@RequestMapping("/wxapi")
public class WxApiController {

    /**
     * GET請(qǐng)求:進(jìn)行URL、Tocken 認(rèn)證; 
     * 1.將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序 
     * 2.將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密 
     * 3.開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信
     */
    @RequestMapping(value = "/message/token", method = RequestMethod.GET)
    public @ResponseBody String doGet(HttpServletRequest request) {

            String token = "mytoken";// 獲取token,進(jìn)行驗(yàn)證;
            String signature = request.getParameter("signature");// 微信加密簽名
            String timestamp = request.getParameter("timestamp");// 時(shí)間戳
            String nonce = request.getParameter("nonce");// 隨機(jī)數(shù)
            String echostr = request.getParameter("echostr");// 隨機(jī)字符串

            // 校驗(yàn)成功返回 echostr,成功成為開發(fā)者;否則返回error,接入失敗
            if (SignUtil.validSign(signature, token, timestamp, nonce)) {
                return echostr;
            }
        return "error";
    }

好了,到這一步完了,就可以讓用戶發(fā)送消息了,但是我們要處理用戶發(fā)送過(guò)來(lái)的消息是什么?
繼續(xù)上代碼:

/**
     * POST請(qǐng)求:
     * 接收客服消息; 
     * 此處的value值也就是往微信公眾平臺(tái)要配置的請(qǐng)求的地址
     */
    @ResponseBody
    @RequestMapping(value = "/message/token",method=RequestMethod.POST)
    public JSONObject doMessagePost(HttpServletRequest request,HttpServletResponse response) {
        try {
            ServletInputStream stream = request.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
             StringBuffer buffer = new StringBuffer();
             String line = new String("");  
             while((line = reader.readLine()) != null){
                 buffer.append(line);
             }
            JSONObject jsonObject = JSONObject.fromObject(buffer.toString());
            System.out.println(jsonObject);
            if (jsonObject.getString("MsgType").equals("text")) { //收到的是文本消息
                WXTextRequest wxRequest = new WXTextRequest();
                wxRequest.setToUserName(jsonObject.getString("ToUserName"));
                wxRequest.setFromUserName(jsonObject.getString("FromUserName"));
                wxRequest.setCreateTime(jsonObject.getString("CreateTime"));
                wxRequest.setMsgType(jsonObject.getString("MsgType"));
                wxRequest.setContent(jsonObject.getString("Content"));
                wxRequest.setMsgId(jsonObject.getString("MsgId"));
                
                //也回復(fù)一個(gè)文本消息
                return WXMsgResponseUtil.sendCustomerMessage(WxApiClient.touser);  
            }else{ //那就是圖片的消息了
                WXImageRequest imageRequest = new WXImageRequest();
                imageRequest.setToUserName(jsonObject.getString("ToUserName"));
                imageRequest.setFromUserName(jsonObject.getString("FromUserName"));
                imageRequest.setCreateTime(jsonObject.getString("CreateTime"));
                imageRequest.setMsgType(jsonObject.getString("MsgType"));
                imageRequest.setPicUrl(jsonObject.getString("PicUrl"));
                imageRequest.setMediaId(jsonObject.getString("MediaId"));
                imageRequest.setMsgId(jsonObject.getString("MsgId"));
                
                //也回復(fù)一個(gè)圖片消息
                return WXMsgResponseUtil.sendCustomerImageMessage(WxApiClient.touser,imageRequest.getMediaId());
            }
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

此處可以看到處理用戶消息的controller跟配置消息請(qǐng)求的controller請(qǐng)求地址是一樣的,就是訪問的請(qǐng)求方式不一樣,這是尤其注意的地方。

這里有一個(gè)消息回復(fù)處理工具類:
微信小程序就兩種消息處理,文本和圖片,所以也就相對(duì)簡(jiǎn)單多了

import java.util.Date;

import com.udbac.util.HttpUtil;
import com.udbac.util.WxApiClient;

import net.sf.json.JSONObject;

/**
 * 測(cè)試客服消息發(fā)送 Title:TemplateTest Description:
 * 
 * @author root
 * @date 2017年6月7日 上午11:30:49
 */

public class WXMsgResponseUtil {

    /***
     * 文檔地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/custommsg/conversation.html
     * 發(fā)送的文本消息
     */
    public static JSONObject sendCustomerMessage(String touser){
        JSONObject obj = new JSONObject();

        obj.put("touser", touser);
        obj.put("msgtype", "text");

        JSONObject text = new JSONObject();
        text.put("content", "現(xiàn)在時(shí)刻:\n" + new Date());

        obj.put("text", text);

        System.out.println("回復(fù)的文本:\n"+obj.toString());
        JSONObject jsonObject = HttpUtil.httpsRequest(WxApiClient.getCustomerMessageUrl(), "POST", obj.toString());
        System.out.println(jsonObject);
        return jsonObject;
    }
    

    /***
     * 文檔地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/custommsg/conversation.html
     * 發(fā)送的圖片消息
     */
    public static JSONObject sendCustomerImageMessage(String touser,String mediaId){
        JSONObject obj = new JSONObject();

        obj.put("touser", touser);
        obj.put("msgtype", "image");

        JSONObject media = new JSONObject();
        media.put("media_id",mediaId);

        obj.put("image", media);

        System.out.println("回復(fù)的圖片:\n"+obj.toString());
        JSONObject jsonObject = HttpUtil.httpsRequest(WxApiClient.getCustomerMessageUrl(), "POST", obj.toString());
        System.out.println(jsonObject);
        return jsonObject;
    }
}

最后看實(shí)際效果吧!

客服消息測(cè)試發(fā)送

測(cè)試發(fā)送文本消息和圖片消息都沒有問題。

我的博客地址:http://www.hanyz.cn/2017/06/07/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%B9%8B%E5%AE%A2%E6%9C%8D%E6%B6%88%E6%81%AF/

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

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

  • 1、客服消息功能概述 在頁(yè)面中使用 <contact-button/> 可以顯示進(jìn)入客服會(huì)話按鈕。 當(dāng)用戶在客服會(huì)...
    碼農(nóng)隨想錄閱讀 68,507評(píng)論 13 26
  • @synthesize和@dynamic分別有什么作用?@property有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是 @synthes...
    筆筆請(qǐng)求閱讀 532評(píng)論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,973評(píng)論 19 139
  • 《深海里的星星》是獨(dú)木舟所著青春文學(xué)作品。文章背景定點(diǎn)在因娛樂節(jié)目火遍全國(guó)的長(zhǎng)沙,故事里的這群孩子在這里生,在這里...
    張大婷123閱讀 671評(píng)論 0 3
  • 一個(gè)個(gè)看似平凡的小故事,卻設(shè)計(jì)的如此獨(dú)特,看似獨(dú)立的情節(jié),那些人物竟都有某種關(guān)聯(lián)。《解憂雜貨店》讀書筆記。時(shí)空跨越...
    渣渣兔閱讀 185評(píng)論 0 0