2018-12-21 19:11:24 panda_In5 阅读数 1403

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

基于此,需开发该功能。

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

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

-- 准备

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

   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.在微信公众平台开通客服账号

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

待续。。。

 

 

 

 

2015-04-30 14:41:43 fansongy 阅读数 23329


文章作者:松阳

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

原文链接: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返还给鹅厂的服务器。

部署

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

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

2014-03-18 16:09:56 tang05709 阅读数 701

微信开发模式下关注自动回复官方给出的说明是:

推送XML数据包示例:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>

参数说明:

参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 消息类型,event
Event 事件类型,subscribe(订阅)、unsubscribe(取消订阅)


所以我们可以先获取MsgType,判断是否为event消息类型,如果是则获取Event,关于关注与取消关注的Event分别对应subscribe和unsubscribe,所以接下来判断Event类型是否为subscribe;如果是则发送消息:

事例代码:


public function responseMsg()
    {
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
      //extract post data
if (!empty($postStr)){
              $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
$msgType = $postObj->MsgType;
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";     
switch($msgType)
{
case "event":
$msgEvent=$postObj->Event;
//订阅自动回复
if($msgEvent=="subscribe")
{
$msgType = "text";
$contentStr = "欢迎你!";
$resultStr = sprintf(
$textTpl, 
$fromUsername, 
$toUsername, 
$time, 
$msgType, 
$contentStr);
echo $resultStr;
}
break;
case "text":
$keyword = trim($postObj->Content);
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf(
$textTpl, 
$fromUsername, 
$toUsername, 
$time, 
$msgType, 
$contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
break;
}
        }else {
        echo "";
        exit;
        }
    }


2019-06-13 17:36:45 cainiao21555 阅读数 123

自从启用了微信开发者模式后,左边自动回复菜单功能就不能使用了。下面我将接着实验如何实现文本消息自动回复。在上一章中我们已经创建好了微信接口文件index.php,我们可以接着上边的代码写responseMsg()功能。

在写此功能前我们可以先前往微信公众平台技术文档,点击被动回复用户消息可以看到以下的参数。

public function responseMsg()
    {
        //获取提交的数据
        $postStr = file_get_contents('php://input');

        if (!empty($postStr)){
            libxml_disable_entity_loader(true);  //防止Xml外部注入
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $time = time();
            $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            <FuncFlag>0</FuncFlag>
                            </xml>";
            if(!empty( $keyword ))
            {
                $msgType = "text";
                $contentStr = "欢迎你的关注啊!喜欢我就帮忙多多推荐吧!";
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                echo $resultStr;
            }else{
                echo "";
            }
        }else {
            echo "";
            exit;
        }
    }

之后我们可以用自己的微信号向自己申请的公众号发送消息进行测试,实验成功,如下图。

Java微信开发入门

阅读数 1119

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