微信公众号开通开发者之后,需要开发者开发后台代码对接微信公众平台。本篇文章程序猿小编将为大家介绍下微信公众平台的基本对接,包括微信发送到Token验证,接收普通消息,接收事件推送,被动回复用户消息。
成为微信公众号开发者后,我们需要获取几个重要的信息,如下图:

我们需要在我们的代码中配置开发者ID(AppID),开发者密码(AppSecret)以及令牌(Token),后续在开发过程中使用这些配置信息;

如果我们需要调用微信公众平台的接口,则需要在IP白名单中配置我们的服务器的IP地址,若未配置则在调用微信公众平台的接口时候,会报以下错误信息:

{“errcode”:40164,“errmsg”:“invalidip 61.141.254.90, not in whitelist hint: [JNpRaA0073sha6]”}

服务器地址(URL)就是我们后台服务器接收微信发送到Token验证,接收普通消息,接收事件推送的地址,此处要注意的是微信发送到Token验证是用的是Http+GET方法,接收普通消息和接收事件推送用的是Http+POST+XML;所以这个URL需要能同时支持GET和POST方法。

​微信发送Token验证形式如下:

http://***/wx/receive?signature=23959cb9a87f0dea51ebc7f49a8ccdc7ae2b1598&timestamp=20190619140400&nonce=***&echostr=true

接收普通消息和接收事件推送用消息我们抓包分析如下图所示:

综合以上分析,我们在接收微信公众平台发给我们信息的时候需要同时支持GET和POST方法,以下我们给出Struts2中Action和SpringMVC中Controller的写法。
1、Struts2中Action的写法:

public void receive() throws Exception {String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");//获取http请求的方法String requestMethod=request.getMethod();if (!CommonUtil.isEmpty(requestMethod) && requestMethod.equals("GET")) {String echostr = request.getParameter("echostr");// 签名校验,判断是否微信发送过来的消息if (SignUtil.checkSignature(signature, timestamp, nonce)) {logger.info("token校验时直接返回echostr :"+echostr);response.getOutputStream().println(echostr);}} else {
if (SignUtil.checkSignature(signature, timestamp, nonce)) {//判断是否微信发送过来的消息// 接收事件及推送消息String result = wechatService.processRequest(request);logger.info("事件处理结果result[{}]返回!", result);response.getOutputStream().println(result);
}}
}

2、SpringMVC中Controller的写法

@RequestMapping(value = "/receive", method = RequestMethod.GET, produces = "text/plain;charset=UTF-8")public @ResponseBodyString receiveWeixinMessageGet(HttpServletRequest request){String result = "";// 微信加密签名String signature = request.getParameter("signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echostr = request.getParameter("echostr");if (SignUtil.checkSignature(signature, timestamp, nonce)){result = echostr;}return result;}@RequestMapping(value = "/receive", method = RequestMethod.POST, produces = "text/xml;charset=UTF-8")public @ResponseBodyString receiveWeixinMessagePOST(HttpServletRequest request, HttpServletResponse response){String result = "";// 将请求、响应的编码均设置为UTF-8(防止中文乱码)try{request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");}catch (UnsupportedEncodingException e){e.printStackTrace();}// 接收参数微信加密签名、 时间戳、随机数String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");// 请求校验if (SignUtil.checkSignature(signature, timestamp, nonce)){// 调用核心服务类接收处理请求result = this.weixinService.processRequest(request);}return result;}

3、接收事件及推送消息

public String processRequest(HttpServletRequest request) {// xml格式的消息数据String respXml = null;// 默认返回的文本消息内容String respContent = "未知的消息类型!";try {// 调用parseXml方法解析请求消息(即读取POST的XML数据并解析)Map<String, String> requestMap = WechatUtil.parseXml(request);// 发送方帐号String fromUserName = requestMap.get("FromUserName");// 开发者微信号String toUserName = requestMap.get("ToUserName");// 消息类型String msgType = requestMap.get("MsgType");// 文本消息if (msgType.equals(WechatUtil.REQ_MESSAGE_TYPE_TEXT)) {// FIXME 处理文本消息}// 图片消息else if (msgType.equals(WechatUtil.REQ_MESSAGE_TYPE_IMAGE)) {// FIXME 处理图片消息}// 语音消息else if (msgType.equals(WechatUtil.REQ_MESSAGE_TYPE_VOICE)) {// FIXME 处理语音消息}// 视频消息else if (msgType.equals(WechatUtil.REQ_MESSAGE_TYPE_VIDEO)) {// FIXME 处理视频消息}// 地理位置消息else if (msgType.equals(WechatUtil.REQ_MESSAGE_TYPE_LOCATION)) {// FIXME 处理地理位置消息}// 链接消息else if (msgType.equals(WechatUtil.REQ_MESSAGE_TYPE_LINK)) {// FIXME 处理地理链接消息}// 事件推送else if (msgType.equals(WechatUtil.REQ_MESSAGE_TYPE_EVENT)) {// 事件类型String eventType = requestMap.get("Event");// 关注if (eventType.equals(WechatUtil.EVENT_TYPE_SUBSCRIBE)) {// FIXME 处理关注事件String eventKey = requestMap.get("EventKey");// 事件KEY值,qrscene_为前缀,后面为二维码的参数值if (!CommonUtil.isEmpty(eventKey)) {// FIXME 扫描带参数二维码事件}}// 取消关注else if (eventType.equals(WechatUtil.EVENT_TYPE_UNSUBSCRIBE)) {// FIXME 取消订阅后用户不会再收到公众账号发送的消息,因此不需要回复}// 扫描带参数二维码else if (eventType.equals(WechatUtil.EVENT_TYPE_SCAN)) {// FIXME 处理扫描带参数二维码事件}// 上报地理位置else if (eventType.equals(WechatUtil.EVENT_TYPE_LOCATION)) {// FIXME 处理上报地理位置事件}// 自定义菜单else if (eventType.equals(WechatUtil.EVENT_TYPE_CLICK)) {// FIXME 处理菜单点击事件}}} catch (Exception e) {e.printStackTrace();}return respXml;}

4、回复消息示例

// 回复默认文本消息
TextResp textResp = new TextResp();
textResp.setToUserName(fromUserName);
textResp.setFromUserName(toUserName);
textResp.setCreateTime(new Date().getTime());
textResp.setMsgType(WechatUtil.RESP_MESSAGE_TYPE_TEXT);
// 设置文本消息的内容
respContent = "欢迎进入***公众号!";
textResp.setContent(respContent);
// 将文本消息对象转换成xmlrespXml = WechatUtil.beanToXml(textResp);
回复图文消息
NewsResp newsResp = new NewsResp();
newsResp.setToUserName(fromUserName);
newsResp.setFromUserName(toUserName);
newsResp.setCreateTime(new Date().getTime());newsResp.setMsgType(WechatUtil.RESP_MESSAGE_TYPE_NEWS);
newsResp.setArticleCount(1);
Article article = new Article();
article.setTitle(YspConfig.getNewsTitle());
article.setDescription(YspConfig.getNewsDesp());
article.setUrl(YspConfig.NEWS_URL));
article.setPicUrl(YspConfig.IMAGE_URL);
List<Article> articleList = new ArrayList<Article>();
articleList.add(article);
newsResp.setArticles(articleList);
respXml = WechatUtil.beanToXml(newsResp);

以上为大家介绍了对接微信公众平台的基本,感兴趣的同学可以关注我们的微信公众号发送消息与小编一起交流探讨。另外要详细了解微信公众平台接口的同学可以查看微信公众平台技术文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432)。

微信公众平台的基础对接相关推荐

  1. 微信公众平台开发基础

     第一次进行微信公众平台的开发有一些基本概念的理解 1. 公众平台基本理解-再小的个人,也有自己的品牌 微信公众平台是腾讯公司在维信的基础上新增的功能模块,通过这样一个平台,个人和企业都可以打造一 ...

  2. 微信公众平台开发 - 动手篇。使用weinxinFundation开始一个微信公众平台的开发

    本文主要讲解如何使用 weinxinFundation 进行二次开发. 步骤如下: 1.创建新的web项目. 在eclipse里新建一个dynamicly web project,比如本文叫weixi ...

  3. 微信公众平台开发书籍推荐

    关键字:微信开发图书 微信公众平台开发书籍 微信图书 微信开发书籍 微信图书推荐 微信开发图书推荐 本文介绍了当前图书市场上最主要的微信公众平台开发类书籍,并对每本书的特色做了简要点评,供有需要购买的 ...

  4. 《微信公众平台入门到精通》,青龙老贼,详情版本

    <微信公众平台入门到精通>,青龙老贼,详情版本 <微信公众平台入门到精通>Vol.1   http://segmentfault.com/a/1190000000356021 ...

  5. 使用Java语言开发微信公众平台(五)——获取access_token

    在前四期的文章中,我们分别学习了"环境搭建与开发接入"."文本消息的接收与响应"."被关注回复与关键词回复"."图文消息的发送与响 ...

  6. 微信公php开发视频,PHP实现微信公众平台开发 全套视频资源下载

    好久没有更新东西了,今天给大家分享一份比较不错的视频学习资源吧. 主要是关于PHP实现微信公众平台开发, 不知道大家对于微信平台的开发有多少了解,那么今天就从基础开始吧,资源目录如下(PS :适各自的 ...

  7. 使用Java语言开发微信公众平台(六)

    在上一节课程中,我们来学习了微信公众平台最基础的一个接口--access_token,并且能够从微信公众平台中取到access_token. 那么,在本节课程中,我们要以上节课获取到的access_t ...

  8. php get 微信平台,微信公众平台开发,$_GET不到值

    PHP实现微信公众平台开发-基础篇<?php //1.将timestamp,nonce,toke按字典顺序排序 $timestamp = $_GET['timestamp']; $nonce = ...

  9. php教务人员查看,基于微信公众平台的教务查询系统的设计与实现(PHP+MySQL).doc

    摘要: 伴随着信息化建设步伐的加快和移动通信技术的快速发展,各种智能手机迅速普及,手机APP也得到了很大的发展.在这种情况下,人们对于信息需求的要求越来越高.尤其是对于高校师生而言,高校师生希望能方便 ...

最新文章

  1. 如何将本地项目上传到自己的GitHub上
  2. 推荐GitHub 上六大爆款AI学习项目,Star超过5.6w
  3. HTML5 Web SQL数据库
  4. dubbo内置哪几种服务容器_dubbo启动服务之容器(Container)
  5. linux 硬件抽象,Linux 内核硬件抽象
  6. 老生常谈:工厂模式兄弟姐妹
  7. win10系统调用架构分析
  8. iptables学习笔记:端口转发命令优化
  9. 使用Python处理声音文件(五):绘制立体声音乐左右声道频谱
  10. java bridge 模式_学习:java设计模式—Bridge模式
  11. 西湖大学张岳老师:图神经网络在自然语言处理中的应用
  12. 单片机12864c语言,51单片机+带字库液晶12864+DS1302数字时钟C源程序
  13. 多线程同步有几种实现方法C语言,线程同步与并发
  14. Android Studio项目编码设置为GBK或UTF-8  中文乱码 和 Eclipse项目编码设置
  15. 华为技术官又出神作,鸿蒙操作系统完整文档笔记现已疯传
  16. 腾讯云发布php项目,利用腾讯云服务器进行微校开放平台开发
  17. 无服务器人工智能去中心化,人工智能未来的发展方向是去中心化智能?
  18. turtle库描绘彩虹旋转图
  19. css3文字炫彩电音效果
  20. 基于单片机的倒车雷达系统设计c语言,基于单片机的倒车雷达设计.doc

热门文章

  1. H5游戏开发-面向对象编程
  2. redis集群搭建及管理命令
  3. Android文本输入框EditText属性和方法说明
  4. android租车管理系统,基于Android汽车租赁系统设计与实现.doc
  5. 2019中国IT上市公司50强
  6. 如何把pdf文件放到服务器,将生成的PDF文件存储在服务器上
  7. 2007-08-03 16:04 unresolved external symbol Direct3DCreate9
  8. Django实现用户管理
  9. 哈士奇不是人,但360真是狗啊
  10. java 监听客户端的退出_Java socket 服务端如何监控客户端异常关闭?