一、课程介绍
- 本套课程的学习内容,开发语言
- 微信公众号介绍,申请以及后台设置详解
- 编辑模式下的消息回复,菜单建立,素材管理等
- 开发前的环境搭建以及工具准备
- 开发者模式的切换、以及消息的接收与响应
- 百度BAE服务器的搭建,代码上传
二、公众号与微信的区别
- 微信定位于聊天、朋友圈等个人娱乐
- 公众号定位于商业用途,达到个人品牌的推广、企业品牌宣传等
三、公众号类型介绍
账号类型一旦成功建立账号,类型不可更改(企业号、服务号与订阅号)
企业号与服务号、订阅号的区别:
企业号 | 服务号 | 订阅号 | |
面向人群 | 面向企业、*、事业单位和非*组织,实现生产管理、协作运营的移动化 | 面向企业、*或组织,用以对用户进行服务 | 面向媒体和个人提供一种信息传播方式 |
消息显示方式 | 出现在好友会话列表首层 | 出现在好友会话列表首层 | 折叠在订阅号目录中 |
消息次数限制 | 最高每分钟可群发200次 | 每月主动发送消息不超过4条 | 每天群发一条 |
验证关注身份 | 通讯录成员可关注 | 微信用户扫码即可关注 | 微信用户扫码即可关注 |
消息保密 | 消息可转发、分享。支持保密消息,防止成员转发 | 消息可转发、分享 | 消息可转发、分享 |
高级接口权限 | 支持 | 支持 | 不支持(微信支付、推广等) |
定制应用 | 可根据需要定制应用,多个应用聚合成一个企业号 | 不支持,新增服务号需要重新关注 | 不支持,新增服务号需要重新关注 |
四、公众号申请
a.公众号申请需要在微信公众号平台进行操作:https://mp.weixin.qq.com/
b.申请流程
登陆微信公众平台->点击立即注册->选择订阅号->按流程注册->类型选择(订阅号)->主体类型(个人)->继续填写注册信息->进入公众号信息填写
c.公众号信息填写
账号名称:微信公众账号的昵称而并非微信号(微信号是在审核通过以后后台进行设置的)
功能介绍:内容介绍
五、微信公众平台介绍
微信公众平台是腾讯为了让用户申请和管理微信公众账号而推出的一个WEB平台。微信公众账号的操作和管理都要在这个平台进行。
a.功能模块
群发功能:主要是微信公众账号把所需要的信息推送给所有的关注用户,其中的信息有文字,图片,语音,图文五大类型。文字消息
自动回复:被添加自动回复、消息自动回复、关键词自动回复
自定义菜单:总共可添加15个菜单
投票管理:功能
b.管理模块
消息管理:查看用户发送的消息
用户管理:可对用户进行分组
素材管理:--
六、自动回复
编辑模式介绍:在编辑模式下实现消息自动回复、菜单创建;以及在微信公众平台推送消息给关注用户
a.设置被关注回复:
b.关键词自动回复
七、Java公众号开发环境准备
1.一个微信公众号
2.外网映射工具(开发调试)
与微信对接的url要具备以下条件
- 在公网上能够访问
- 端口只支持80端口
结论:需要借助映射工具将本机地址映射到公网上。(花生壳、ngrok等工具)
3.ngrok可以将内网映射到公网上去,这样就可以在公网访问你的本地网络服务
用法:
ngrok 8080
ngrok -config ngrok.cfg -subdomain dzj0712 8080
4.ngrok的使用
youName是你想要设置的域名,如 wswx
Port是你想映射的本地端口,如8080
最后,访问http://wswx.tunnel.echomod.cn/ 即可在外网访问你的本地服务器
a.在dos中进入所在盘符执行ngrok -config ngrok.cfg -subdomain dzj0712 8080得到以下结果
b.存在问题
ngrok是国外的工具,服务器也是在国外,在国内访问较慢,甚至无法访问
映射的公网地址是随机的,会造成不便
c.以上的a步骤直接使用了在国内部署的tunnel网络服务,它支持了ngrok的绝大多数功能,同时解决了ngrok在美国造成的访问缓慢等问题
八、数据交互原理
1.开发模式
开发模式与编辑模式是两者互斥的关系,也就是当打开开发模式之后编辑模式的自动回复与自定义菜单等功能就会跟着失效,同样的开发模式也会在编辑模式中失效
2.数据交互原理
当用户发送请求之后,用户会进行解析公众号的地址,并根据该地址将请求转发至微信公众号服务器。服务器处理完成后会将处理的结果返回给微信后台,之后微信后台再将结果转发给客户端。
开发人员主要进行的工作就是红字显示的服务器开发
九、开发模式接入
1.登陆微信公众平台
打开开发文档填写服务器配置
2.校验signature对请求进行加密
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
3.检验signature的Java示例代码:
a.微信服务器入口代码
1 package com.imooc.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import com.imooc.util.CheckUtil; 12 13 public class WeixinServlet extends HttpServlet{ 14 15 @Override 16 /** 17 * 使用doget方法进行验证 18 */ 19 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 20 // 获取微信公众号服务器发送的参数 21 String signature = req.getParameter("signature"); 22 String timestamp = req.getParameter("timestamp"); 23 String nonce = req.getParameter("nonce"); 24 String echostr = req.getParameter("echostr"); 25 26 PrintWriter out = resp.getWriter(); 27 //校验成功将随机字符串返回 28 if(CheckUtil.checkSignature(signature, timestamp, nonce)) { 29 out.print(echostr); 30 } 31 } 32 }
b.校验的工具类
1 package com.imooc.util; 2 3 import java.security.MessageDigest; 4 import java.util.Arrays; 5 6 /** 7 * 校验工具类 8 */ 9 public class CheckUtil { 10 private static final String token = "imooc"; 11 /** 12 * 13 * @param signature 加密签名 14 * @param timestamp 时间戳 15 * @param nonce 随机数字 16 * @return 17 */ 18 public static boolean checkSignature(String signature, String timestamp, String nonce) { 19 20 String[] arr = new String[] { token, timestamp, nonce }; 21 // 排序 22 Arrays.sort(arr); 23 // 生成字符串 24 StringBuffer content = new StringBuffer(); 25 for (int i = 0; i < arr.length; i++) { 26 content.append(arr[i]); 27 } 28 // sha1加密 29 String temp = getSha1(content.toString()); 30 // 与微信传过来的加密签名进行比较 31 return temp.equals(signature); 32 } 33 34 public static String getSha1(String str) { 35 if (str == null || str.length() == 0) { 36 return null; 37 } 38 char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 39 try { 40 MessageDigest mdTemp = MessageDigest.getInstance("SHA1"); 41 mdTemp.update(str.getBytes("UTF-8")); 42 43 byte[] md = mdTemp.digest(); 44 int j = md.length; 45 char buf[] = new char[j * 2]; 46 int k = 0; 47 for (int i = 0; i < j; i++) { 48 byte byte0 = md[i]; 49 buf[k++] = hexDigits[byte0 >>> 4 & 0xf]; 50 buf[k++] = hexDigits[byte0 & 0xf]; 51 } 52 return new String(buf); 53 } catch (Exception e) { 54 // TODO: handle exception 55 return null; 56 } 57 } 58 }
c.在xml中对servlet进行配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Weixin</display-name> <servlet> <servlet-name>weixinServlet</servlet-name> <servlet-class>com.imooc.servlet.WeixinServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>weixinServlet</servlet-name> <url-pattern>/wx.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
十、消息的接收与响应
http://dzj0712.tunnel.echomod.cn