2015-04-30 14:41:43 fansongy 阅读数 23330
  • 微信公众平台开发4-消息管理-微信开发php

    微信公众平台开发之消息管理是子恒老师《微信公众平台开发》视频教程的第4部。详细讲解了用php开发微信,对微信公众平台中的消息管理开发。内容包含微信关键字回复,多图文消息回复开发,接收图片消息,视频,小视频消息等等。欢迎反馈,微信/QQ:68183131

    6328 人正在学习 去看看 秦子恒


文章作者:松阳

本文出自 阿修罗道,禁止用于商业用途,转载请注明出处。  

原文链接:http://blog.csdn.net/fansongy/article/details/45394641







定制的服务

对于微信服务号来说,最主要的功能是提供更好的服务。用户更方便的操作,以及更快的反馈响应。自动回复功能,能够大幅减少交互时间和客服工作量,在服务号推活动时尤其明显。另外就是在多客服功能,这个就强大了,简直就是一个企业qq服务号。目前还不要钱,不过我感觉未来可能会变成一个收费功能

使用场景

这两个东西走一套流程,所以这里放在一起说了。

自动回复功能大致的使用情景是,用户发送“流量”,服务号回复“亲,送流量活动是xxxxxx: 快点击【抢流量】 来参加。”

而多客服应该是自动回复的一个超集,如果自动回复处理不了,就要转接到客服那里。

技术实现

从技术上讲,这两个功能是也一套逻辑。服务回复用户消息,使用的是统一的格式,如果消息需要转到多客服,需要给微信服务器回复类似这样的消息体:

 <xml>
     <ToUserName><![CDATA[touser]]></ToUserName>
     <FromUserName><![CDATA[fromuser]]></FromUserName>
     <CreateTime>1399197672</CreateTime>
     <MsgType><![CDATA[transfer_customer_service]]></MsgType>
 </xml>

官方文档说明是这样的:

如果公众号处于开发模式,普通微信用户向公众号发消息时,微信服务器会先将消息POST到开发者填写的url上,如果希望将消息转发到多客服系统,则需要开发者在响应包中返回MsgTypetransfer_customer_service的消息,微信服务器收到响应后会把当次发送的消息转发至多客服系统。具体可以参照这里

因此我做了这样的设计,收到用户输入的消息后,首先在数据库的表中检查是否有匹配的应答,如果有则直接返回给用户,否则,就返回类型为transfer_customer_service的消息,将其转接到客服那边。

实现

protected String getRawText(String key) {
    // 如果对应的EVENT_KEY有个相同的配置信息,就直接载入
    String tmpRaw = getRawByStateDao(key);
    if (tmpRaw != null && tmpRaw.length() > 0) {
        raw = tmpRaw;
    } else {
        raw = "";
    }
    return raw;
}

String getRawByStateDao(String key) {
    //you should get data from db here
}

public String getContextText(String key) {
    // 回复文本消息
    TextMessage textMessage = new TextMessage();
    textMessage.setToUserName(fromUserName);
    textMessage.setFromUserName(toUserName);
    textMessage.setCreateTime(new Date().getTime());
    String contextText = getRawText(key);
    if(contentText.length()>0){
        textMessage.setContent(contentText);
        textMessage.setMsgType("text");
    } else {
        textMessage.setMsgType("transfer_customer_service");
    }
    
    // 将文本消息对象转换成xml
    String respXml = MessageUtil.messageToXml(textMessage);
    return respXml;
}

大致流程就是这样,使用时调用getContextText函数,就返回一个包装好的消息,走HTTP返还给鹅厂的服务器。

部署

在微信公众号的后台选择添加功能插件->多客服。添加好功能模块后,添加一个客服工号,下载安装客户端。这个部署比较简单,没啥大坑。上线后拉着客服人员,给做个简单的使用培训就成了。

如果你觉得这篇文章对你有帮助,可以顺手点个,不但不会喜当爹,还能让更多人能看到它... 

2017-03-01 16:26:00 weixin_34290000 阅读数 14
  • 微信公众平台开发4-消息管理-微信开发php

    微信公众平台开发之消息管理是子恒老师《微信公众平台开发》视频教程的第4部。详细讲解了用php开发微信,对微信公众平台中的消息管理开发。内容包含微信关键字回复,多图文消息回复开发,接收图片消息,视频,小视频消息等等。欢迎反馈,微信/QQ:68183131

    6328 人正在学习 去看看 秦子恒

在上一往篇文章《Nodejs微信开发》中,微信后台能够正常的接收到客户端的消息,并能够简单的回复一条消息至客户端。

但我的目录是将微信与Bot Framework进行关联,那么肯定就有一些情况是Bot Framework是有多条消息,或是会回复图片消息的,这个时候只回复一条消息就无法满足我现在的需求了

可以看到在以下代码中,我使用wechat进行微信消息的接收,使用wechat-api对用户进行多次的回复,我就可以解决wechat只能对消息回复一次的问题

简单来说,wechat只负责接收到消息的回复,从bot framework提取到的消息需要通过wechat-api来进行发送

var wechat = require('wechat');
var wechatAPI = require('wechat-api');

//wechat config
var config = {
  token: 'weixin',
  appid: 'wx1434eed5268660c4',
  encodingAESKey: 'ZEtViedarf49EUOCDeu45pqhkZhKPFBjSHI2DynP4vq',
  checkSignature: true // 可选,默认为true。由于微信公众平台接口调试工具在明文模式下不发送签名,所以如要使用该测试工具,请将其设置为false 
};

//创建wechat-api
var api = new wechatAPI(config.appid, '30a5f51682755652e6e02879757a0fb1');

var menu = {
  "button": [
    {
      "type": "click",
      "name": "WeChat Bot",
      "key": "V1001_TODAY_MUSIC"
    },
    {
      "name": "BotFramework",
      "sub_button": [
        {
          "type": "view",
          "name": "botframework",
          "url": "https://dev.botframework.com/"
        },
        {
          "type": "click",
          "name": "赞一下我们",
          "key": "V1001_GOOD"
        }, {
          "name": "发送位置",
          "type": "location_select",
          "key": "rselfmenu_2_0"
        },]
    }]
};
//删除菜单
api.removeMenu(function (err, result) {
  if (err) {
    logger.log('error', err);
  }
  logger.log('info', 'remove menu success');
});

//创建菜单
api.createMenu(menu, function (err, result) {
  if (err) {
    logger.log('error', err);
  }
  logger.log('info', 'create menu success');
});



app.use(express.query());
app.use('/wechat', wechat(config, wechat.text(function (message, req, res, next) {
  //------------------------------------------------------------------------
  var message = req.weixin;
  logger.log("info", message);

  res.reply('Message Send To Bot Completed , Wait Response.');
  
  api.sendText(message.FromUserName, 'this message from wechat-api', function (err, result) {
      if (err) {
        logger.log('error', err);
      }
      logger.log('info', 'reply message success');
    });
  
}).image(function (message, req, res, next) {
  var message = req.weixin;
  logger.log("info", message);

  res.reply('功能开发中');
}).voice(function (message, req, res, next) {
  var message = req.weixin;
  logger.log("info", message);

  res.reply('功能开发中');
}).video(function (message, req, res, next) {
  var message = req.weixin;
  logger.log("info", message);

  res.reply('功能开发中');
}).location(function (message, req, res, next) {
  var message = req.weixin;
  logger.log("info", message);

  res.reply('功能开发中');
}).link(function (message, req, res, next) {
  var message = req.weixin;
  logger.log("info", message);

  res.reply('功能开发中');
}).event(function (message, req, res, next) {
  var message = req.weixin;
  logger.log("info", message);

  res.reply('感谢你的关注,你也可以在nodejs npm中查看wechat和wechat-api');

}).device_text(function (message, req, res, next) {
  var message = req.weixin;
  logger.log("info", message);

  res.reply('功能开发中');
}).device_event(function (message, req, res, next) {
  if (message.Event === 'subscribe' || message.Event === 'unsubscribe') {
    var message = req.weixin;
    logger.log("info", message);

    res.reply("功能开发中");
  } else {
    var message = req.weixin;
    logger.log("info", message);

    res.reply('功能开发中');
  }
})));

 

参考:https://www.npmjs.com/package/wechat-api

https://www.npmjs.com/package/wechat

http://mp.weixin.qq.com/wiki/16/52e198333f5c127ddd5c45e875191b14.html

转载于:https://www.cnblogs.com/weschen/p/6484810.html

2018-12-21 19:11:24 panda_In5 阅读数 1417
  • 微信公众平台开发4-消息管理-微信开发php

    微信公众平台开发之消息管理是子恒老师《微信公众平台开发》视频教程的第4部。详细讲解了用php开发微信,对微信公众平台中的消息管理开发。内容包含微信关键字回复,多图文消息回复开发,接收图片消息,视频,小视频消息等等。欢迎反馈,微信/QQ:68183131

    6328 人正在学习 去看看 秦子恒

在微信公众号开发者模式下,自动回复功能不能使用。

基于此,需开发该功能。

我这里使用的是客服功能,并没有选择自动回复的原因是因为需求中有一条消息请求可能匹配多个答案的情况。

这里自动回复功能中的 虽然能支持多个图文组装为一条消息,但对其他四种消息类型不支持,所以确定用了客服。

-- 准备

一.在微信公众平台-开发-基本配置中配置自己服务器资源响应链接

   1.需要把ip加入到白名单,局域网的话可以使用 ngrok工具 进行解决

    工具链接:https://github.com/zhouminpz/tool

    使用方法:https://blog.csdn.net/befroe_you/article/details/78611965

    域名查IP:http://www.ip138.com/

   2.服务器需要提供GET方法,用于微信请求配置链接进行验证。

    

 @RequestMapping(value = "/main", method = {RequestMethod.GET}, produces = "text/plain;charset=UTF-8")
    public void doGet( HttpServletRequest request, HttpServletResponse response,
                       @RequestParam(value = "signature", required = true) String signature,
                       @RequestParam(value = "timestamp", required = true) String timestamp,
                       @RequestParam(value = "nonce", required = true) String nonce,
                       @RequestParam(value = "echostr", required = true) String echostr,
                       @RequestParam(value = "cid", required = true) String cid) {

        String token ="zhihuiyouke";
        try {
            logger.info("参数:signature="+signature+",timestamp="+timestamp+",nonce="+nonce+",echostr="+echostr+",cid="+cid);
            if (SignUtil.checkSignature(token,signature, timestamp, nonce)) {
                ajax(echostr,response);
            } else {
                logger.info("这里存在非法请求!");
            }
        } catch (Exception e) {
            logger.error("doGet", e);
        }
    }

我这里用到了cid,没用到可以去掉!

这里能接通,成功一大半!

3.准备在微信公众平台配置的资源POST方法进行实际操作!

这里先不多说,过程很坎坷。

坑:返回news 类型消息的时候,articles 需要带上中括号!!!!痛啊!

坑:

String openid=map.get("FromUserName"); //用户 openid
String mpid=map.get("ToUserName");   //公众号原始 ID
返回的时候,需要将ToUserName 的值指定为openid。

坑:编码问题

// 获取URLConnection对象对应的输出流
//out = new PrintWriter(conn.getOutputStream());
out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));

坑:在文本中加入链接的拼接方式

欢迎关注壳牌中国加油站!

如果您是壳牌智享汇会员,请<a href="http://w.url.cn/s/AYdKr5K">点击此处登录</a>,即可在微信上体验会员之旅

如果您还没有壳牌智享汇会员账号,请<a href="http://w.url.cn/s/A8tV0Yo">点击此处注册</a>

<a href="http://w.url.cn/s/AiydIC6">点击此处了解更多关于壳牌智享汇!</a>

坑:token 需要根据appid和appsecret获得token,每天token请求次数是有限制的,每个token有效期为2小时,所以需要缓存。

坑:公众号返回的错误代码:https://bbs.csdn.net/topics/390765535

4.在微信公众平台开通客服账号

需要在公众号中开通客服功能!

待续。。。

 

 

 

 

2019-07-09 11:06:30 syr1136877833 阅读数 175
  • 微信公众平台开发4-消息管理-微信开发php

    微信公众平台开发之消息管理是子恒老师《微信公众平台开发》视频教程的第4部。详细讲解了用php开发微信,对微信公众平台中的消息管理开发。内容包含微信关键字回复,多图文消息回复开发,接收图片消息,视频,小视频消息等等。欢迎反馈,微信/QQ:68183131

    6328 人正在学习 去看看 秦子恒

微信的公众平台有一个服务器的配置,如果启用了这个就会关闭微信公众平台的菜单设置与自动回复设置,想要实现这些就需要用户自己手写代码来完成这些操作。

微信公众平台的服务器设置需要配一个url链接,那个就是微信与服务器链接的一个验证,当你填好准备保存之后,微信就会向你配好的这个链接上发送一个get请求,去验证能跟你的服务器ping通。所以你需要在你服务器配置一个请求,参数主要是以下四个
微信请求参数
才这个接口里面只需要验证以下这四个参数是否有一个为空,如果有一个人为空则错误,再根据timestamp, nonce这两个生成一个signature,然后与微信的signature比较,如果相等则证明正确,返回echostr则表示成功,其实主要是为了防止有人攻击,所以需要判断一下是否相等,是否是微信传过来的请求。

成功后,所有的微信公众号的事务请求,都会发到你配置的url的post接口里面去,你只需要接受

在这里插入图片描述
这几个请求参数,然后requestBody里面就是请求事件的xml数据,在使用xml数据前同样需要校验一下signature。接口的自动返回其实只能返回一条文本数据。如果想自动回复多条数据,只能在该接口里面return一条xml数据,然后其他的使用微信的客服消息发送(注意,这里的数据格式是JSON格式的,而且最好是异步形式,我之前是用的是线程池,结果上线之后,由于老是堵塞,我就换成了使用MQ发送消息的形式了)。还有需要注意的是客服发送素材消息的时候,素材大小最大不能超过2M。

2018-08-21 19:10:34 zhangxiaoyang0 阅读数 779
  • 微信公众平台开发4-消息管理-微信开发php

    微信公众平台开发之消息管理是子恒老师《微信公众平台开发》视频教程的第4部。详细讲解了用php开发微信,对微信公众平台中的消息管理开发。内容包含微信关键字回复,多图文消息回复开发,接收图片消息,视频,小视频消息等等。欢迎反馈,微信/QQ:68183131

    6328 人正在学习 去看看 秦子恒

这两天开发微信公众号自动回复功能,遇到的问题:
1. 回复多条消息
微信的被动回复用户消息 功能一次只能回复一条消息,给微信技术人员发了邮件问回复多条消息如何组织参数格式,回答让人不明就里,跟没说一样。网上看到有人建议用客服消息 接口,成功了。

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
body.setMsgType("XX");//根据需要设置具体消息类型,比如text,image
body.setXX("XX");//根据消息类型设置对应内容,比如text,image
body.setTouser(map.get("FromUserName"));
HttpEntity<String> httpEntity = new HttpEntity<>(JSON.toJSONString(body), headers);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(
                        "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={access_token}", httpEntity, String.class, accessToken);

循环执行就可以实现回复多条消息。
2. 微信公众平台的开发文档估计好久没更新了,文档中的接口返回参数和实际返回的有差别,使用时要多注意,比如获取素材列表接口,返回参数有个thumb_media_id 自动,字段描述是图文消息的封面图片素材id(必须是永久mediaID) ,但是要获取这个封面图片素材,根据这个字段调用获取永久素材 接口,会返回乱码,而且实际是一个文件下载。列表返回参数中有个thumb_url 字段就是表示的封面图片素材,不需要再次去调接口获取了。
3. 就是标题中的问题
微信文档中写的日调用次数限制为500000次,实际手动调用了没多久就提示标题中的错误信息,以为是调用次数达到限制,所以调用了调用次数清零 接口,但还是报标题中的错误。上网搜了下,说是微信限制公众号给用户发消息连续20条就会报标题中的错误,解决方案换一个openId,或者等一段时间(我等了十几个小时都不行),或者用户给公众号随意回复一条消息(我使用的这种方案,解决了这个问题)

没有更多推荐了,返回首页