微信小程序之客服消息

客服消息

参考:官方文档

创建客服消息事件

官方代码:

第一种:

<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"
    >发送客服信息
</button>

然后打开微信web开发者工具的预览,手机上访问调试的小程序。
点击刚才设置的发送客服消息(我只用过第二种,第一种没试过),小程序会跳转到会话界面,这个界面跟普通会话没有什么区别,但是只能给小程序发送文本消息图片消息

客服消息界面

以上这些就是客服消息的界面发送入口了

接收消息

准备工作

在微信小程序网页上面配置开发者服务器的地址
这里我的已经设置好了

消息服务器配置

下面再就是对用户发过来的消息进行代码编写了

需要注意的地方

  1. 消息推送配置点提交的时候,微信发送的是GET请求。
  2. 当用户给小程序发送消息的时候,微信发送的POST请求。
  3. 这两次的请求虽然不一样,但是他们的请求的地址要是一样的。

上代码来说:

这里是在网页上填写完配置信息点提交的时候,微信请求开发者服务器,发送GET请求,Java层做的处理,校验通过则网页上回提示提交成功。

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请求:进行URL、Tocken 认证; 
     * 1.将token、timestamp、nonce三个参数进行字典序排序 
     * 2.将三个参数字符串拼接成一个字符串进行sha1加密 
     * 3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
     */
    @RequestMapping(value = "/message/token", method = RequestMethod.GET)
    public @ResponseBody String doGet(HttpServletRequest request) {

            String token = "mytoken";// 获取token,进行验证;
            String signature = request.getParameter("signature");// 微信加密签名
            String timestamp = request.getParameter("timestamp");// 时间戳
            String nonce = request.getParameter("nonce");// 随机数
            String echostr = request.getParameter("echostr");// 随机字符串

            // 校验成功返回 echostr,成功成为开发者;否则返回error,接入失败
            if (SignUtil.validSign(signature, token, timestamp, nonce)) {
                return echostr;
            }
        return "error";
    }

好了,到这一步完了,就可以让用户发送消息了,但是我们要处理用户发送过来的消息是什么?
继续上代码:

/**
     * POST请求:
     * 接收客服消息; 
     * 此处的value值也就是往微信公众平台要配置的请求的地址
     */
    @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"));
                
                //也回复一个文本消息
                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"));
                
                //也回复一个图片消息
                return WXMsgResponseUtil.sendCustomerImageMessage(WxApiClient.touser,imageRequest.getMediaId());
            }
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

此处可以看到处理用户消息的controller跟配置消息请求的controller请求地址是一样的,就是访问的请求方式不一样,这是尤其注意的地方。

这里有一个消息回复处理工具类:
微信小程序就两种消息处理,文本和图片,所以也就相对简单多了

import java.util.Date;

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

import net.sf.json.JSONObject;

/**
 * 测试客服消息发送 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
     * 发送的文本消息
     */
    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", "现在时刻:\n" + new Date());

        obj.put("text", text);

        System.out.println("回复的文本:\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
     * 发送的图片消息
     */
    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("回复的图片:\n"+obj.toString());
        JSONObject jsonObject = HttpUtil.httpsRequest(WxApiClient.getCustomerMessageUrl(), "POST", obj.toString());
        System.out.println(jsonObject);
        return jsonObject;
    }
}

最后看实际效果吧!

客服消息测试发送

测试发送文本消息和图片消息都没有问题。

我的博客地址: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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容

  • 1、客服消息功能概述 在页面中使用 <contact-button/> 可以显示进入客服会话按钮。 当用户在客服会...
    码农随想录阅读 67,920评论 13 26
  • @synthesize和@dynamic分别有什么作用?@property有两个对应的词,一个是 @synthes...
    笔笔请求阅读 505评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,510评论 18 139
  • 《深海里的星星》是独木舟所著青春文学作品。文章背景定点在因娱乐节目火遍全国的长沙,故事里的这群孩子在这里生,在这里...
    张大婷123阅读 608评论 0 3
  • 一个个看似平凡的小故事,却设计的如此独特,看似独立的情节,那些人物竟都有某种关联。《解忧杂货店》读书笔记。时空跨越...
    渣渣兔阅读 173评论 0 0