精华内容
下载资源
问答
  • 2019-01-18 21:22:25

    微信小程序添加客服接口

    场景:

    电商应用中充当客服角色,针对某一款商品咨询服务

    看了眼文档

    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/receive.html

    添加了一个客服按钮

    方法一:

    <contact-button class="button-image" size="22" >
    联系客服
    </contact-button>

    方法二:

    <button class='contact-btn' open-type='contact'>a</button> 

    wxml

    <view class='weui-cells weui_cells-after-title'>
          <view class='weui-cell'>
            <view class="weui-cell__bd">联系我们</view>
            <view class="weui-cell__ft weui-cel
    更多相关内容
  • 接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务。 目前允许的动作列表如下(公众平台会根据运营情况更新该列表,不同动作触发后,允许的客服接口下发消息条数不同,下发条数...
  • 主要为大家详细介绍了.NET微信公众号客服接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要介绍了微信公众号开发客服接口的相关资料,并附简单实例,需要的朋友可以参考下
  • 主要介绍了微信公众号 客服接口的开发实例详解的相关资料,需要的朋友可以参考下
  • 后台服务器可以调用微信的接口与微信用户进行讯息的通信,这样的行为就是在调用微信的接口,这些接口是基础接口,你不需要任何付费行为或者身份认证行为就可以调用。但是有一些高级接口,你的微信公众号必须达到一定...
  • 包括:分组接口,消息群发接口客服接口,资源接口,二维码接口,短网址接口,标签接口,用户接口,以及微信支付接口和JS API等。这个工程是升讯威微信营销系统中关于微信API接口的封装,版本稍新,我会进行一定的...
  • 主要为大家详细介绍了Java微信公众平台开发第九步,关键字回复以及客服接口实现,以及遇到该公众号暂时无法提供服务的解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了ASP.NET微信公众号客服接口的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 微信小程序调用客服接口

    千次阅读 2021-01-02 10:58:02
    实现思路 由于小程序接口开发比较完善,所以我们直接调用微信小程序客服接口就可以。但必须阅读下面的接口文档 (1)客服功能使用指南 ...(2)客服消息使用指南 ...

    实现思路
    由于小程序接口开发比较完善,所以我们直接调用微信小程序客服接口就可以。但必须阅读下面的接口文档
    (1)客服功能使用指南
    https://developers.weixin.qq.com/miniprogram/introduction/custom.html#%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D
    (2)客服消息使用指南
    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/customer-message.html
    实现效果
    由于自己没有服务器,所以客服消息统一使用微信第三方工具。小程序发起联系客服,消息就会推送到你自己的微信(服务推送),客服就可以回复客户发过来的消息。
    微信小程序发送消息(客户)->微信的第三方工具(客服)->回复客户消息
    具体实现的思路
    (1)在页面使用客服消息
    需要将 button 组件 open-type 的值设置为 contact,当用户点击后就会进入客服会话,如果用户在会话中点击了小程序消息,则会返回到小程序,开发者可以通过 bindcontact 事件回调获取到用户所点消息的页面路径 path 和对应的参数 query。
    示例代码
    wxxml

    <button open-type="contact" bindcontact="handleContact"></button>
    

    js

    Page({
        handleContact (e) {
            console.log(e.detail.path)
            console.log(e.detail.query)
        }
    })
    

    (2)进入微信公众平台绑定客服微信号
    按照下面的操作实现微信号的绑定
    在这里插入图片描述
    (3)绑定的微信号扫描下面的二维码(微信客服小程序)
    在这里插入图片描述

    (4)测试
    1)微信小程序客户发消息 客户
    在这里插入图片描述
    2:微信收到消息 客服
    在这里插入图片描述
    3:点击服务通知进行消息回复 客服
    在这里插入图片描述
    4:客户收到客服的回复 客户
    查看回复
    更多的示例代码及学习资料请搜索微信公众号:小白XBIT
    在这里插入图片描述

    展开全文
  • 微信客服接口

    2013-12-16 15:46:39
    微信客服接口,用了几天了,分享给大家,少走弯路
  • 主要介绍了Python调用微信公众平台接口操作,结合具体实例形式分析了Python针对微信接口数据传输的相关操作技巧,需要的朋友可以参考下
  • 微信公众平台 客服接口-发消息

    万次阅读 2017-08-16 18:03:05
    微信公众平台技术文档:客服消息一、接口说明当...此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务。目前允许的动作列表如下(公众平台会根据运营情况更新该列表,不同动作触发后

    微信公众平台技术文档:客服消息

    一、接口说明

    当用户和公众号产生特定动作的交互时(具体动作列表请见下方说明),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过POST一个JSON数据包来发送消息给普通用户。此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务。

    目前允许的动作列表如下(公众平台会根据运营情况更新该列表,不同动作触发后,允许的客服接口下发消息条数不同,下发条数达到上限后,会遇到错误返回码,具体请见返回码说明页):

    1、用户发送信息
    2、点击自定义菜单(仅有点击推事件、扫码推事件、扫码推事件且弹出“消息接收中”提示框这3种菜单类型是会触发客服接口的)
    3、关注公众号
    4、扫描二维码
    5、支付成功
    6、用户维权

    二、客服接口-发消息

    1 接口调用请求说明

    http请求方式: POST

    https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN

    2 发送客服消息

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

    (1)发送文本消息

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

    (2)发送图片消息

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

    (3)发送语音消息

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

    (4)发送视频消息

    {
        "touser":"OPENID",
        "msgtype":"video",
        "video":
        {
          "media_id":"MEDIA_ID",
          "thumb_media_id":"MEDIA_ID",
          "title":"TITLE",
          "description":"DESCRIPTION"
        }
    }

    (5)发送音乐消息

    {
        "touser":"OPENID",
        "msgtype":"music",
        "music":
        {
          "title":"MUSIC_TITLE",
          "description":"MUSIC_DESCRIPTION",
          "musicurl":"MUSIC_URL",
          "hqmusicurl":"HQ_MUSIC_URL",
          "thumb_media_id":"THUMB_MEDIA_ID" 
        }
    }

    (6)发送图文消息(点击跳转到外链) 图文消息条数限制在8条以内,注意,如果图文数超过8,则将会无响应。

    {
        "touser":"OPENID",
        "msgtype":"news",
        "news":{
            "articles": [
             {
                 "title":"Happy Day",
                 "description":"Is Really A Happy Day",
                 "url":"URL",
                 "picurl":"PIC_URL"
             },
             {
                 "title":"Happy Day",
                 "description":"Is Really A Happy Day",
                 "url":"URL",
                 "picurl":"PIC_URL"
             }
             ]
        }
    }

    (7)发送图文消息(点击跳转到图文消息页面) 图文消息条数限制在8条以内,注意,如果图文数超过8,则将会无响应。

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

    (8)发送卡券

    {
      "touser":"OPENID", 
      "msgtype":"wxcard",
      "wxcard":{              
               "card_id":"123dsdajkasd231jhksad"        
                },
    }

    特别注意客服消息接口投放卡券仅支持非自定义Code码和导入code模式的卡券的卡券,详情请见:是否自定义code码

    请注意,如果需要以某个客服帐号来发消息(在微信6.0.2及以上版本中显示自定义头像),则需在JSON数据包的后半部分加入customservice参数,例如发送文本消息则改为:

    {
        "touser":"OPENID",
        "msgtype":"text",
        "text":
        {
             "content":"Hello World"
        },
        "customservice":
        {
             "kf_account": "test1@kftest"
        }
    }

    3 请求参数说明

    参数是否必须说明
    access_token调用接口凭证
    touser普通用户openid
    msgtype消息类型,文本为text,图片为image,语音为voice,视频消息为video,音乐消息为music,图文消息(点击跳转到外链)为news,图文消息(点击跳转到图文消息页面)为mpnews,卡券为wxcard
    content文本消息内容
    media_id发送的图片/语音/视频/图文消息(点击跳转到图文消息页)的媒体ID
    thumb_media_id缩略图的媒体ID
    title图文消息/视频消息/音乐消息的标题
    description图文消息/视频消息/音乐消息的描述
    musicurl音乐链接
    hqmusicurl高品质音乐链接,wifi环境优先使用该链接播放音乐
    url图文消息被点击后跳转的链接
    picurl图文消息的图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80

    4 java接口开发

    (1)Message客服接口消息封装对象

    public class Message {
    
        private String touser;
        private String msgtype;
        private TextContent text;
        private MediaContent image;
        private MediaContent voice;
        private MediaContent video;
        private MusicContent music;
        private Articles news;
    
        public String getTouser() {
            return touser;
        }
        public void setTouser(String touser) {
            this.touser = touser;
        }
        public String getMsgtype() {
            return msgtype;
        }
        public void setMsgtype(String msgtype) {
            this.msgtype = msgtype;
        }
        public TextContent getText() {
            return text;
        }
        public void setText(TextContent text) {
            this.text = text;
        }
        public MediaContent getImage() {
            return image;
        }
        public void setImage(MediaContent image) {
            this.image = image;
        }
        public MediaContent getVoice() {
            return voice;
        }
        public void setVoice(MediaContent voice) {
            this.voice = voice;
        }
        public MediaContent getVideo() {
            return video;
        }
        public void setVideo(MediaContent video) {
            this.video = video;
        }
        public MusicContent getMusic() {
            return music;
        }
        public void setMusic(MusicContent music) {
            this.music = music;
        }
        public Articles getNews() {
            return news;
        }
        public void setNews(Articles news) {
            this.news = news;
        }
        @Override
        public String toString() {
            return "Message [touser=" + touser + ", msgtype=" + msgtype + ", text="
                    + text + ", image=" + image + ", voice=" + voice + ", video="
                    + video + ", music=" + music + ", news=" + news + "]";
        }
    }

    (2)TextContent文本消息内容封装对象

    public class TextContent {
    
        private String content;
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }

    (3)MediaContent媒体ID封装对象

    public class MediaContent {
    
        private String media_id;
    
        public String getMedia_id() {
            return media_id;
        }
        public void setMedia_id(String media_id) {
            this.media_id = media_id;
        }
    }

    (4)MusicContent音乐消息封装对象

    public class MusicContent {
    
        private String title;
        private String description;
        private String musicurl;
        private String hqmusicurl;
        private String thumb_media_id;
    
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
        public String getMusicurl() {
            return musicurl;
        }
        public void setMusicurl(String musicurl) {
            this.musicurl = musicurl;
        }
        public String getHqmusicurl() {
            return hqmusicurl;
        }
        public void setHqmusicurl(String hqmusicurl) {
            this.hqmusicurl = hqmusicurl;
        }
        public String getThumb_media_id() {
            return thumb_media_id;
        }
        public void setThumb_media_id(String thumb_media_id) {
            this.thumb_media_id = thumb_media_id;
        }
    }

    (5)Articles图文集合封装对象

    public class Articles {
    
        private Article[] articles;
    
        public Article[] getArticles() {
            return articles;
        }
        public void setArticles(Article[] articles) {
            this.articles = articles;
        }
    }

    (6)Article图文消息封装对象

    public class Article {
        private String title;
        private String description;
        private String url;
        private String picurl;
        private String thumb_media_id;
        private String author;  
        private String content_source_url;  
        private String content; 
        private String digest;  
        private Integer show_cover_pic;
    
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
        public String getUrl() {
            return url;
        }
        public void setUrl(String url) {
            this.url = url;
        }
        public String getPicurl() {
            return picurl;
        }
        public void setPicurl(String picurl) {
            this.picurl = picurl;
        }
        public String getThumb_media_id() {
            return thumb_media_id;
        }
        public void setThumb_media_id(String thumb_media_id) {
            this.thumb_media_id = thumb_media_id;
        }
        public String getAuthor() {
            return author;
        }
        public void setAuthor(String author) {
            this.author = author;
        }
        public String getContent_source_url() {
            return content_source_url;
        }
        public void setContent_source_url(String content_source_url) {
            this.content_source_url = content_source_url;
        }
        public String getContent() {
            return content;
        }
        public void setContent(String content) {
            this.content = content;
        }
        public String getDigest() {
            return digest;
        }
        public void setDigest(String digest) {
            this.digest = digest;
        }
        public Integer getShow_cover_pic() {
            return show_cover_pic;
        }
        public void setShow_cover_pic(Integer show_cover_pic) {
            this.show_cover_pic = show_cover_pic;
        }
    }

    (7)客服消息请求接口

    public class CrmSendMessageService{
    
        private RestTemplate restTemplate ; 
    
        private String serviceHost = "https://api.weixin.qq.com";
    
        public CrmSendMessageServiceImpl() {
            restTemplate = RestTemplateFactory.makeRestTemplate();
        }
    
        @Override
        public WeixinResponse sendMessage(String accessToken, Message message) {
            WeixinResponse weixinResponse = null;
            String url = new StringBuffer(serviceHost).append("/cgi-bin/message/custom/send?access_token=")
                    .append(accessToken).toString();
            weixinResponse =  restTemplate.postForObject(url, message, WeixinResponse.class);
            return weixinResponse;
        }
    
    }

    注:接口发送http请求基于Spring RestTemplate。
    参考文章地址:
    1.Spring RestTemplate详解
    2.Spring RestTemplate详解

    (8)WeixinResponse客服消息接口返回对象

    public class WeixinResponse {
        private String msgid;
        private String code;
        private int errcode;
        private String errmsg;
    
        public String getMsgid() {
            return msgid;
        }
        public void setMsgid(String msgid) {
            this.msgid = msgid;
        }
        public int getErrcode() {
            return errcode;
        }
        public void setErrcode(int errcode) {
            this.errcode = errcode;
        }
        public String getErrmsg() {
            return errmsg;
        }
        public void setErrmsg(String errmsg) {
            this.errmsg = errmsg;
        }
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }   
    }

    5 接口实例开发

    /**
     * 发送客服消息
     * @param openId 要发给的用户
     * @param accessToken 微信公众号token
     * @param weixinAppId 微信公众号APPID
     */
    private void sendCustomMessage(String openId,String accessToken,String weixinAppId){
            try {
                RestTemplate rest = new RestTemplate();
                String postUrl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + accessToken;
                //推送图文消息
                Message message = new Message();
                message.setTouser(openId);//普通用户openid
                message.setMsgtype("news");//图文消息(点击跳转到外链)为news
                Articles news = new Articles();
                Article article = new Article();
                article.setDescription("客服消息图文描述");//图文消息/视频消息/音乐消息的描述
                                           article.setPicurl("http://mmbiz.qpic.cn/mmbiz_jpg/CDW6Ticice130g6RcXCkNNDWic4dEaAHQDia2OG5atHBqSvsPuCfuqoyeeLWENia4ciaKt3KHWQ9t2LRPDpUo5AkOyyA/0");//图文消息的图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80
                article.setTitle("客服消息图文标题");//图文消息/视频消息/音乐消息的标题
                //图文推送链接
                String url="https://www.baidu.com";
                article.setUrl(url);//图文消息被点击后跳转的链接
                Article[] articles = {article};
                news.setArticles(articles);
                message.setNews(news);
                int i=1;
                while(i<=3){//循环发送3次
                    WeixinResponse response = rest.postForObject(postUrl, message, WeixinResponse.class, new HashMap<String,String>());
                    LOG.info("发送客服消息返回信息:"+response.toString());
                    if(response.getErrcode()==0){//发送成功-退出循环发送
                        i=4;
                        break;
                    }else{
                        i++;//发送失败-继续循环发送
                    }
                }
            } catch (Exception e) {
                LOG.error("发送客服消息失败,openId="+openId,e);
            }
        }

    6 客服接口图文推送上传图片

    在发送图文消息时,我们需要添加图片的地址,介绍一个好方法。
    (1)进入微信公众平台接口调试工具
    https://mp.weixin.qq.com/debug
    (2)选择类型和列表
    接口类型:基础支持
    接口列表:上传logo接口/media/uploadimg
    这里写图片描述
    添加access_token,选择类型是image,最后选择文件
    注:添加视频、音乐是一样的
    (3)最后就会生成图片的url
    这里写图片描述
    (4)在浏览器访问url即可看见生成的图片

    展开全文
  • java 微信 api 自定义菜单 客服接口 支付接口
  • 微信公众号接口调用 java demo, maven工程, 包含获得微信 AccessToken, 获得微信用户信息, 微信公众号用于调用微信JS接口的临时票据, 微信分享, 发送模板消息等
  • 微信公众号客服接口给指定用户openid发送消息

    万次阅读 热门讨论 2018-02-06 12:06:55
    客服接口-发消息   接口调用请求说明 http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN 各消息类型所需的JSON数据包如下: 发送文本消息 { "...

    微信开发文档:

     

    客服接口-发消息

     

    接口调用请求说明

    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"
        }
    }

    创建封装实体类:

    import java.util.Map;
    
    /**
     * 客户接口消息发送实体
     *
     * @author 
     * @date 2018-2-6 11:00:30
     */
    public class TestMessage {
    
        //openid
        private String touser;
    
        //消息类型
         private String msgtype;
    
         //消息内容
         private Map<String,Object> text ;
    
    
        public String getTouser() {
            return touser;
        }
    
        public void setTouser(String touser) {
            this.touser = touser;
        }
    
        public String getMsgtype() {
            return msgtype;
        }
    
        public void setMsgtype(String msgtype) {
            this.msgtype = msgtype;
        }
    
        public Map<String, Object> getText() {
            return text;
        }
    
        public void setText(Map<String, Object> text) {
            this.text = text;
        }
    }
    

     

     

     

    后台controller代码:

     

     
     
    /**
     * 状态修改为测试中
     *
     * @param id 要测试的ID
     * @param request
     * @return 内容展示页面
     */
    @ResponseBody
    @RequestMapping(value = "/service/test", method = RequestMethod.PUT)
    public ResponseVO ContentTest(Long id, HttpServletRequest request) {
    
        ResponseVO vo=new ResponseVO();
        if(id!=null){
            //根据接收的ID查询相应的内容实体
            WeixinContent weixinContent = weixinContentService.selectById(id);
         //判断查询到的对象的合法性
        if (weixinContent!=null&&(weixinContent.getState() == 1||weixinContent.getState()==4)) {
            //修改内容实体状态为测试中
            weixinContent.setState(2);
    
            //将内容实体进行保存操作
            weixinContentService.updateById(weixinContent);
            //获得内容静态页面的访问路径
           String templatesUrl= weixinContent.getTemplatesUrl();
            //拼接访问的完整路径
            String saveUrl =fileuploadPrefix + "/" + templatesUrl;
            //获得内容信息标题
            String title = weixinContent.getTitle();
            //拼接发送的消息内容
            String content="你好!标题("+title+")<a href='"+saveUrl+"'>点我测试</a>";
            //创建微信用户查询条件
            Wrapper<WeixinUser> wrapper=new EntityWrapper<>();
            wrapper.where("tagid_list={0}","[101]");
            //获得满足条件的集合
            List<WeixinUser> weixinUsers = weixinUserService.selectList(wrapper);
            //遍历用户集合调用业务层进行消息发送
            for (WeixinUser weixinUser : weixinUsers) {
                String openid = weixinUser.getOpenid();
                //调用业务层进行发送消息
                wxContentTextService.contentTest(openid,content);
            }
    
            vo.setSuccess(true);
        } else {
            //不是未测试状态所以不能进行状态修改
            vo.setSuccess(false);
        }
    
        }
        return vo;
    }
    

    后台service代码:

     
    /**
     * <p>
     * 菜单信息 服务实现类
     * </p>
     *
     * @author 
     * @date 2018/01/15
     */
    @Service
    public class WxContentTextService {
    
        private static Logger log = LoggerFactory.getLogger(WxContentTextService.class);
    
        /**
         * 客服接口给用户发送消息接口
         */
        public static String  content_openid="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN";
    
        @Autowired
        private TokenFeignService tokenFeignService;
    
        @Autowired
        private WeixinPortalService weixinPortalService;
    
        /**
         *
         * @param openid   openid
         * @param saveUrl   静态页面访问地址
         * @return
         */
        public ResponseVO contentTest(String openid,String saveUrl){
            //获得令牌
            String accessToken = tokenFeignService.getToken();
    
            //创建返回实体对象
            ResponseVO vo = new ResponseVO();
            //替换token
            String url=content_openid.replace("ACCESS_TOKEN", accessToken);
    
            TestMessage testMessage=new TestMessage();
            //设置消息的类型
            testMessage.setMsgtype("text");
            //设置要发送的openid集合
            testMessage.setTouser(openid);
            //创建集合
            Map<String,Object> map=new HashMap<>();
            //设置发送内容
            map.put("content",saveUrl);
            testMessage.setText(map);
            //将测试消息对象转成json
            String jsonTestMessage = JSONObject.toJSONString(testMessage);
            //调用接口进行发送
            JSONObject jsonObject = httpRequest(url, "POST", jsonTestMessage);
    
            log.error("分组群发消息失败 errcode:{" + jsonObject.getInteger("errcode")+"} " +
                    "errmsg:{"+jsonObject.getString("errmsg")+"} ");
            Integer errcode = jsonObject.getInteger("errcode");
            String errorCodeText = ErrorCodeText.errorMsg(errcode);
    
            if (errcode == 0){
                vo.setSuccess(true);
            }else{
                vo.setSuccess(false);
            }
            vo.setCode(errcode);
            vo.setText(errorCodeText);
            return vo;
    
        }
    }
    

    获取token的业务层:

    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    /**
     * 进行请求分发
     *
     */
    @FeignClient(value = "weixin-2")
    public interface TokenFeignService {
    
        /**
         * 进行token请求
         * @param
         * @return
         */
        @RequestMapping(value = "/getToken",method = RequestMethod.GET)
        String getToken();
    }
    

    微信请求工具类utils

     
    public class WeixinHttpUtil {
    
        private static Logger log = LoggerFactory.getLogger(WeixinHttpUtil.class);
    
        /**
         * 描述:  发起https请求并获取结果
         * @param requestUrl 请求地址
         * @param requestMethod 请求方式(GET、POST)
         * @param outputStr 提交的数据
         * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
         */
        public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
            JSONObject jsonObject = null;
            StringBuffer buffer = new StringBuffer();
            try {
                // 创建SSLContext对象,并使用我们指定的信任管理器初始化
                TrustManager[] tm = { new MyX509TrustManager() };
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
                // 从上述SSLContext对象中得到SSLSocketFactory对象
                SSLSocketFactory ssf = sslContext.getSocketFactory();
    
                URL url = new URL(requestUrl);
                HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
                httpUrlConn.setSSLSocketFactory(ssf);
    
                httpUrlConn.setDoOutput(true);
                httpUrlConn.setDoInput(true);
                httpUrlConn.setUseCaches(false);
    
                // 设置请求方式(GET/POST)
                httpUrlConn.setRequestMethod(requestMethod);
    
                if ("GET".equalsIgnoreCase(requestMethod))
                {httpUrlConn.connect();}
    
                // 当有数据需要提交时
                if (null != outputStr) {
                    OutputStream outputStream = httpUrlConn.getOutputStream();
                    // 注意编码格式,防止中文乱码
                    outputStream.write(outputStr.getBytes("UTF-8"));
                    outputStream.close();
                }
    
                // 将返回的输入流转换成字符串
                InputStream inputStream = httpUrlConn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    
                String str = null;
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }
                bufferedReader.close();
                inputStreamReader.close();
                // 释放资源
                inputStream.close();
                inputStream = null;
                httpUrlConn.disconnect();
                jsonObject = JSONObject.parseObject(buffer.toString());
            } catch (ConnectException ce) {
                log.error("Weixin server connection timed out.");
            } catch (Exception e) {
                log.error("https request error:{}", e);
            }
            return jsonObject;
        }
    }
    
     

    应网友要求贴出获取token部分代码,首先要配置公众号相关配置

    1.IP白名单

    2.配置开发模式

    3.在自己配置的白名单服务器就可以获取token,根据自己配置的服务器接口就可以监听所有公众号的操作,从而得到操作用户信息和具体操作内容

    3.1这个就是通过springCloud远程调用获取token接口

    @Controller
    @RequestMapping("")
    public class WeixinTokenController {
    
        @Autowired
        private WeixinAccessTokenTask weixinAccessTokenTask;
    
        @RequestMapping("getToken")
        @ResponseBody
        public String getToken(){
            AccessToken token = weixinAccessTokenTask.getLastAccessToken();
            return token.getAccessToken();
        }
    
    }

    3.2具体获取token业务

    @Component
    public class WeixinAccessTokenTask implements ApplicationListener {
    
        protected final static Logger logger = LoggerFactory.getLogger(WeixinAccessTokenTask.class);
    
        private static boolean isStart = false;
    
        /**
         * 微信Access_Token刷新地址
         */
        private String uri = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
        /**
         * 存放Access_Token的标识符
         */
        private String tokenKey = "WEIXIN_ACCESS_TOKEN";
        /**
         *  最近一次的Access_Token
         */
        private AccessToken lastAccessToken;
    
        /**
         * 微信分配的appID
         */
        @Value("${app.id}")
        private String appID;
        /**
         * 微信分配的appsecret
         */
        @Value("${app.secrect}")
        private String appsecrect;
    
        private long lastRunTime;
    
        /**
         * 刷新Access_Token
         * @return boolean 刷新是否成功
         */
        @Scheduled(cron="0 0/5 * * * ?")
        public boolean refresh(){
            boolean refresh = this.refresh(false);
            //重置最后一次定时器运行时间
            lastRunTime = System.currentTimeMillis();
            return refresh;
        }
    
    
        /**
         * 刷新Access_Token
         * @param forced 是否强制
         * @return boolean 刷新是否成功
         */
        public boolean refresh(boolean forced){
            if(!(forced || this.isNeedRefresh())){
                return false;
            }
    
            try {
                AccessToken token = this.getWeixinAccessToken();
                //把token存入lastAccessToken,便于下次检验token是否有效
                lastAccessToken = token;
                return true;
            } catch (IOException e){
                e.printStackTrace();
            }
            return false;
        }
        /**
         * 请求微信接口获取最新的access_token信息
         * @return AccessToken
         */
        public AccessToken getWeixinAccessToken() throws IOException{
            String uri = this.uri.replace("APPID",
                    this.getAppID()).replace("APPSECRET",
                    this.getAppsecrect());
            URL url = new URL(uri);
    
            HttpURLConnection conn = null;
            BufferedReader reader = null;
            StringBuffer buffer = new StringBuffer();
            try{
                conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.connect();
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    
                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }
            }finally {
                if(reader != null){
                    reader.close();
                }
    
                if(conn != null){
                    conn.disconnect();
                }
            }
            //返回的参数是json格式
            JSONObject jsonObject = JSONObject.parseObject(buffer.toString());
            AccessToken token = new AccessToken();
            if (!jsonObject.containsKey("access_token")) {//如果没拿到token,肯定发生了问题,打印错误日志
                logger.info(jsonObject.toJSONString());
            }
            String accessToken = jsonObject.getString("access_token");
            String expiresInStr = jsonObject.getString("expires_in");
            int expiresIn = Integer.parseInt(expiresInStr);
            token.setAccessToken(accessToken);
            token.setExpiresIn(expiresIn);
            //设置token的更新时间
            token.setUpdateTime(new Date());
            logger.info("最新的token>>>> "+ AesUtil.aesEncrypt(accessToken));
            return token;
        }
    
        /**
         *  是否需要刷新
         *
         *  @return boolean 判断是否需要刷新
         */
        private boolean isNeedRefresh(){
            AccessToken token = this.getLastAccessToken();
            /*如果上次会话不存在,肯定是需要刷新缓存的*/
            if(null == token){
                return true;
            }
            //当前系统时间
            long now = System.currentTimeMillis();
            //此次运行和上次运行的时间间隔,5min
            long interval = now - this.lastRunTime;
            //上次token的更新时间
            long lastTimeMillis = this.getLastTimeMillis();
            //此处在微信规定7200秒的基础上减去1800秒,即度过1h30m的时间,就认为token已失效,以此保证token的有效性
            int expiresIn = 5400*1000;
            /*如果时间间隔不足以支撑到下次运算时的超时时间,则会话会在本次被刷新*/
    //        logger.info("判断是否需要刷新开始---------");
    //        logger.info("                   此时此刻 now            ---------" + now);
    //        logger.info("此次运行和上次运行的时间间隔 interval       ---------" + interval);
    //        logger.info("        上次token的更新时间 lastTimeMillis ---------" + lastTimeMillis);
    //        logger.info("               token有效期  expiresIn      ---------" + expiresIn);
    //        logger.info("计算表达式(lastTimeMillis + expiresIn) <= (now + interval)---------" + ((lastTimeMillis + expiresIn) <= (now + interval)));
            if((lastTimeMillis + expiresIn) <= (now + interval)){
                return true;
            }
            return false;
        }
    
        private String getAppID() {
            return appID;
        }
    
        public void setAppID(String appID) {
            this.appID = appID;
        }
    
        private String getAppsecrect() {
            return appsecrect;
        }
    
        public void setAppsecrect(String appsecrect) {
            this.appsecrect = appsecrect;
        }
    
        public AccessToken getLastAccessToken(){
            if(this.lastAccessToken == null){
                return null;
            }
            return this.lastAccessToken;
        }
    
        //获得token有效期的时间戳
        private long getLastTimeMillis(){
            AccessToken token = this.getLastAccessToken();
            Date updateTime = token.getUpdateTime();
            if(updateTime == null){
                return 0L;
            }
            long millis = updateTime.getTime();
            return millis;
        }
    
        @Override
        public void onApplicationEvent(ApplicationEvent applicationEvent) {
            if (!isStart) {
                isStart = true;
                logger.info("启动token刷新服务..........");
                this.refresh();
            }
        }
    }
    

     

    展开全文
  • 联通客服接口规范

    2013-10-25 14:11:25
    联通客服接口H2协议,包头长度为固定的102,包体长度不定长。
  • 微信平台更新之后,发现客服接口不错。研究了下 和大家分享下。 按照官方文档,是向客服接口发送规定的JSon 就可以了。 首先先封装下 JSon 的类: package com.lwz.wx.bean.kf; // 这个是最外层的 也可以说是基类吧...
  • 计算机网络客户服务器模式应用程序接口.pdf计算机网络客户服务器模式应用程序接口.pdf计算机网络客户服务器模式应用程序接口.pdf计算机网络客户服务器模式应用程序接口.pdf计算机网络客户服务器模式应用程序接口.pdf
  • 通过微信客服接口发送一条信息,微信的服务号里却同时接受到三条一模一样的数据。 经过我反复调试,最后发现与微信的响应机制有关:微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。如何...
  • 微信自定义菜单和客服接口,这两个大家可能会一起用到,分享给大家
  • QQ 客服接口详解

    千次阅读 2013-08-29 13:04:47
    接口说明:  1、取状态图片接口:  接口样例:http://wpa.qq.com/pa?p=1:28543472:11  说明:Web网页中可引用此接口,来获得指定QQ用户的在线状态;该接口返回一张图片来表示用户当前的在线状态;目前,...
  • 我们在微信公众号的后台可以发现微信给我们制定了两种模式,一种是开发者模式(也就是我们一直在做的开发),还有一种模式是编辑模式,然而很蛋疼...②【服务器5s无响应】解决方案是接入多客服,以方便我们的消息处理!
  • 主要为大家详细介绍了php微信高级接口群发、多客服的相关资料,感兴趣的小伙伴们可以参考一下
  • JAVA接口规范.doc

    2019-09-19 15:05:19
    APP接口开发规范文档-V1.0,java接口开发规范 查询类接口是指客户端传递一些参数,服务端根据参数依据需求,前往...第二种比如获取客户,客户端把用户的身份信息上传到接口,服务器返回此身份下的所有客户数组集合
  • 微信小程序客服接口

    万次阅读 2017-05-11 11:11:45
    电商应用中充当客服角色,针对某一款商品咨询服务 看了眼文档 https://mp.weixin.qq.com/debug/wxadoc/dev/api/custommsg/receive.html 添加了一个客服按钮 class="button-image" size="22" /> 只能改尺寸跟...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 420,227
精华内容 168,090
关键字:

客服接口

友情链接: VB.zip