• 看下微信开发文档上怎么说就明白了: 当用户主动发消息给公众号的时候(包括发送信息、点击自定义菜单、订阅事件、扫描二维码事件、支付成功事件、用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内...

    之前的消息发送与接收都是用户给微信发一条,之后微信回复给用户,也就是API上面所说的被动回复消息,那么微信是否支持主动给关注用户发消息吗,答案是肯定的,但是却有一些限制。看下微信开发文档上怎么说就明白了:

    当用户主动发消息给公众号的时候(包括发送信息、点击自定义菜单、订阅事件、扫描二维码事件、支付成功事件、用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息给普通用户,在48小时内不限制发送次数。此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务


    这次就针对客服消息分享下我的心得和体会


    1  客服接口-发消息接口使用说明

    接口调用请求说明

    http请求方式: POST
    https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
    

    各消息类型所需的JSON数据包如下:

    发送文本消息

    {
        "touser":"OPENID",
        "msgtype":"text",
        "text":
        {
             "content":"Hello World"
        }
    }
    

    发送图片消息

    {
        "touser":"OPENID",
        "msgtype":"image",
        "image":
        {
          "media_id":"MEDIA_ID"
        }
    }
    

    发送语音消息

    {
        "touser":"OPENID",
        "msgtype":"voice",
        "voice":
        {
          "media_id":"MEDIA_ID"
        }
    }
    

    ......,基本上来说常用的消息类型,客服接口都是支持的


    2  封装客服消息接口

           public static String makeTextCustomMessage(String openId,String content){
    		content.replace("\"", "\\\"");
    		String jsonMsg="{\"touser\":\"%s\",\"msgtype\":\"text\",\"text\":{\"content\":\"%s\"}}";
    		return String.format(jsonMsg, openId,content);
    		
    	}
    	
    	/**
    	 * 组装图片客服消息
    	 * 
    	 * @param openId 消息发送对象
    	 * @param mediaId 媒体文件id
    	 * @return
    	 */
    	public static String makeImageCustomMessage(String openId, String mediaId) {
    		String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"%s\"}}";
    		return String.format(jsonMsg, openId, mediaId);
    	}
    
    	/**
    	 * 组装语音客服消息
    	 * 
    	 * @param openId 消息发送对象
    	 * @param mediaId 媒体文件id
    	 * @return
    	 */
    	public static String makeVoiceCustomMessage(String openId, String mediaId) {
    		String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"%s\"}}";
    		return String.format(jsonMsg, openId, mediaId);
    	}
    
    	/**
    	 * 组装视频客服消息
    	 * 
    	 * @param openId 消息发送对象
    	 * @param mediaId 媒体文件id
    	 * @param thumbMediaId 视频消息缩略图的媒体id
    	 * @return
    	 */
    	public static String makeVideoCustomMessage(String openId, String mediaId, String thumbMediaId) {
    		String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"%s\",\"thumb_media_id\":\"%s\"}}";
    		return String.format(jsonMsg, openId, mediaId, thumbMediaId);
    	}
    
    	/**
    	 * 组装音乐客服消息
    	 * 
    	 * @param openId 消息发送对象
    	 * @param music 音乐对象
    	 * @return
    	 */
    	public static String makeMusicCustomMessage(String openId, Music music) {
    		String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"music\",\"music\":%s}";
    		jsonMsg = String.format(jsonMsg, openId, JSONObject.fromObject(music).toString());
    		// 参数名称替换 @20140125
    		jsonMsg = jsonMsg.replace("musicUrl", "musicurl");
    		jsonMsg = jsonMsg.replace("HQMusicUrl", "hqmusicurl");
    		jsonMsg = jsonMsg.replace("thumbMediaId", "thumb_media_id");
    		return jsonMsg;
    	}
    
    	/**
    	 * 组装图文客服消息
    	 * 
    	 * @param openId 消息发送对象
    	 * @param articleList 图文消息列表
    	 * @return
    	 */
    	public static String makeNewsCustomMessage(String openId, List<Article> articleList) {
    		String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"news\",\"news\":{\"articles\":%s}}";
    		jsonMsg = String.format(jsonMsg, openId, JSONArray.fromObject(articleList).toString().replaceAll("\"", "\\\""));
    		// 将jsonMsg中的picUrl替换为picurl
    		jsonMsg = jsonMsg.replace("picUrl", "picurl");
    		return jsonMsg;
    	}
    
    	public static boolean sendCustomMessage(String token,String jsonMsg){
    		boolean flag=false;
    		//String accessToken=getAccessToken("xxxx","xxxx").getToken();
    		String requestUrl="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN";
    		requestUrl=requestUrl.replace("ACCESS_TOKEN", token);
    		JSONObject jsonResult=CommonUtil.httpsRequest(requestUrl, "POST", jsonMsg);
    		if(jsonResult!=null){
    			int errorCode=jsonResult.getInt("errcode");
    			String errorMessage=jsonResult.getString("errmsg");
    			if(errorCode==0){
    				flag=true;
    			}else{
    				System.out.println("客服消息发送失败:"+errorCode+","+errorMessage);
    				flag=false;
    			}
    		}
    		return flag;
    	}

    3 调用客服消息发送接口给指定用户发送客服消息

    List<Article> all=new ArrayList<Article>();
    		
    	
    		
    		Article a2=new Article();
    		a2.setDescription("最崇拜的明星Justin Timberlake");
    		a2.setPicUrl("http://img3.douban.com/view/photo/photo/public/p1408738004.jpg");
    		a2.setTitle("贾斯汀·汀布莱克(Justin Timberlake),1981年1月31日出生于美国田纳西州孟菲斯市,美国男歌手、演员、音乐制作人、主持人,前男子演唱组合超级男孩成员。");
    		a2.setUrl("http://baike.haosou.com/doc/3382630-3560934.html?from=1358&sid=3560934&redirect=search");
    		
    		all.add(a2);
    		
    		
    		String articleMsg=makeNewsCustomMessage("xxx", all);
    		boolean res=sendCustomMessage(token,articleMsg);
    		if(res){
    			System.out.println("客服消息发送成功");
    		}else{
    			System.out.println("客服消息发送失败");
    		}

    到这里程序就写好了,来看下运行效果:



    4  多客服的使用

    多客服功能主要用于处理需人工操作、耗时较长的场景,我们都知道如果微信服务器在5秒钟没给用户返回消息则会出现“公众号暂时无法提供服务”。这样用户体验会很差,有这种情况不妨考虑下多客服。

    下面是API:http://mp.weixin.qq.com/wiki/5/ae230189c9bd07a6b221f48619aeef35.html

    个人建议是可以把多客服看成是一种比较特别的消息类型,这样的话只需修改一下MessageUtil就OK了,加入如下代码:

     /** 
         * 客服消息对象转换成xml 
         *  
         * @return xml 
         */  
        public static String customMessageToXml(CustomServiceMessage customServiceMessage) {  
        	
            xstream.alias("xml", customServiceMessage.getClass());  
            return xstream.toXML(customServiceMessage);  
        }  

    并且加一种消息类型:

        /** 
         * 多客服消息
         */  
        public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";  


    5  修改微信消息处理核心工具类

     // 文本消息  
     if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { 
           String content=requestMap.get("Content");
           if(content.startsWith("人工客服")){
                	CustomServiceMessage cus=new CustomServiceMessage();
                	cus.setToUserName(fromUserName);  
                	cus.setFromUserName(toUserName);  
                	cus.setCreateTime(new Date().getTime());  
                	cus.setMsgType(MessageUtil.TRANSFER_CUSTOMER_SERVICE);  
                	TransInfo t=new TransInfo();
                	t.setKfAccount("你的客服账号");
                	cus.setTransInfo(t);	
                	respMessage=MessageUtil.customMessageToXml(cus);
                		
            }else{
                respContent = "您发送的是文本消息!"; 
            }
                    
    }  


    顺带贴上CustomServiceMessage和TransInfo的代码:

    package com.debug.weixin.message.res;
    
    import com.debug.weixin.pojo.TransInfo;
    
    public class CustomServiceMessage extends BaseMessage {
    	private TransInfo TransInfo;
    
    	public TransInfo getTransInfo() {
    		return TransInfo;
    	}
    
    	public void setTransInfo(TransInfo transInfo) {
    		TransInfo = transInfo;
    	}
    
    }	
    

    package com.debug.weixin.pojo;
    
    public class TransInfo {
    	private String KfAccount;
    
    	public String getKfAccount() {
    		return KfAccount;
    	}
    
    	public void setKfAccount(String kfAccount) {
    		KfAccount = kfAccount;
    	}
    }
    

    上面的代码如需测试需使用微信关注“多客服助手”或下载安装“windows多客服”,具体参照如下链接:

    http://dkf.qq.com/


    这里在贴2个我的运行截图:


    下面是windows的客户端,就类似QQ的界面



    差不多就这样子了

    展开全文
  • angular框架非常好用,但是国内确实资料不多,关于微信公众号开发,我只找到了17年的比较老的教程,这里对相关教程做了一个更新。感谢古尘师姐的教程。 本文档只进行到微信公众号授权登录部分,其他众多接口使用...
  • 微信公众号网页开发测试 2018-03-21 03:59:08
    请问你们平时在微信公众号开发中都是怎么测试的?除了用微信开发者工具测试。还会用到哪些测试工具用来测试哪些问题呀?
  • 微信开发总结开始 一.开发所需准备工作(请仔细阅读微信公众平台开发文档) a:下载微信开发者工具(此工具也可用于小程序开发)。下载链接:...
  • 微信小程序前端开发者工具-小程序切片-小程序定制开发神器 你是否还在辛辛苦苦地码代码,特别是前端页面的编写,很多都是非常简单的,但界面多了还是要花费大量的时间,缩短了 你陪男/女朋友的时间,家人的时间,...
  • 微信公众号前端支付实现 2019-10-17 12:36:57
    公众号支付需要获取公众号的appId 下面是公众号的文档说明如何获取token ...id=mp1421140842 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token ...3 第三步:刷新access_token(如果需要...
  • 前端-微信支付 2017-11-15 10:15:58
    前端来说,要做的事情不多,在demo中也有示例,微信支付前端这边没坑,可能是我还没有碰到=。=
  • 苏格团队 作者:Dee 交流QQ群:855833773 背景 最近,由于公司业务需要,接入了微信web端分享接口。虽然微信的接口文档已经很详细了,但是缺少实战代码。小编搜了一下掘金网站...此为微信公众平台接口测试帐号申...
  • 微信h5支付前端源码是子恒老师微信h5支付开发系列视频中的,关于h5支付的前端页面,为后端php实现h5支付提供便利。视频观看学习地址https://edu.csdn.net/course/play/6899/138877
  • 1.首页在微信公众号设置,微信到网页授权目录,此目录作用是,在这网页授权目录下调微信官方接口,获取用户到code 网页授权目录 为 域名 例如 www.xxxx.com document.location.href = `...
  • 摘要:本文说明了微信前端页面开发的基本架构,说明了组成文件各自的详细结构,通过这几个文件的协同工作,微信小程序开发框架可以实现页面Page中视图层和逻辑层的统一。0. 简介根据之前开发者工具和开发框架简介的...
  • 微信小程序测试 2019-05-26 22:26:08
    [微信小程序测试] 微信小程序测试 微信小程序以其便捷的操作方式逐渐活跃于大众的工作、生活当中,一个小程序是否实用、流畅关乎着企业、商家的利润,所以小程序的测试工作是不可或缺且精细复杂的。 什么是小程序? ...
  • 目录微信公众号开发--第一章 本地启动前后端一、本地开发环境二、项目简介前端微信后端后台三、配置本地域名授权回调页面域名前端网页授权微信后端测试号信息四、启动大致流程具体细节本地启动nginx、redis。...
  • 微信网页授权(前端 2018-12-04 17:43:45
    前段时间,项目对旧版的微信公众号进行改版,需要对部分页面进行微信授权,我们的网页授权通过前后端进行,前端负责发起请求和调用后台接口,后台负责获取微信端的回调以及提供前端所需的接口。整个微信授权完成了,...
  • 微信公众号开发基本流程 2019-04-26 09:40:21
    过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。。 微信公众平台官网:https://mp.weixin.qq.com 文章目录一、注册公众号二、了解公众号管理页面三、必备...
  • 前端基于vue企业微信JS-SDK语音识别功能开发(同公众号)微信JS-SDK1.前期准备前端代码撰写 微信JS-SDK 前端需要实现一个功能,如录音,拍照,分享,地理位置等,前端想要实现这些功能的调用,必须要通过调用JS-SDK...
  • 微信公众号开发教程(一)验证接入本篇文章主要介绍了微信公众号开发接入详细流程,希望对刚接触公众号开发的同学有所帮助,有兴趣的同学可多多关注叩丁狼公众号,后续会更新不同的公众号小案例。公众号的分类我们平常...
  • 微信公众平台开发微信编辑器开发是子恒老师《微信公众平台开发》视频教程的第11部。...内容包含微信公众号编辑器开发思路,编辑器前端页面,功能实现,添加新样式等等。欢迎反馈,微信号:QQ68183131
  • 一个大客户
  • 适用于微信公众号客服管理本地开发,新建客服账号上传头像。
1 2 3 4 5 ... 20
收藏数 41,062
精华内容 16,424