微信开发项目学习总结
目录
开发过程
一、接入准备
1. 测试号申请
2. 编写接入类
文档说明
若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
开发要点
- 在 doGet 方法中通过 request 获取参数
- 将参数和自己填写的token参数值按流程进行排序(Arrays.sort())、加密(MessageDigest)和校验
- 返回内容(response.getWriter())
3. 参数配置
在 url 一栏中填写公网能访问的 servlet 地址
二、自定义菜单
1. 编写调用接口的工具类
/**
* sendHttpRequest
* @param urlstr,接口的调用地址
* @param method,请求调用方法
* @param outputstr,POST方法传过去的参数
* @param charset
* return string,返回微信端返回的状态码
*/
开发要点
- 获取连接,URL.openConnection()
- HttpsURLConnection 设置
- conn.getOutputStream() 向微信端传数据
- conn.getInputStream() 拿取微信端返回的数据
2. 按文档参数写按钮的pojo类
3. 编写创建自定义菜单类
开发要点:
- 将 pojo 数据转成 json
- 调用接口工具类(String.format() 拼接参数)
三、消息接收处理
微信用 xml 数据将消息信息 POST 过来
开发要点
- 将微信传来的数据转成pojo类
- 根据 MsgType 进行响应处理
- 消息分为普通消息和事件消息两大类
四、消息被动回复
将 pojo 类转成 xml 传给微信端
五、生成带用户参数的海报
开发要点
- ImageIO.read() 获取图片流
- BufferedImage.createGraphics() 得到 Graphics2D类
- drawImage() 方法
- ImageIO.write() 保存图片
- 微信上传临时素材
六、扫码积分功能
1. dbcp连接池
开发要点
- 根据 dbcp 官方文档配置参数
- 连接工厂类(BasicDataSourceFactory..createDataSource())
- *
2. 编写dao层
3. 扫码积分增加
开发要点
- String.replace() 获取二维码的参数即推荐人id
- 调用dao的积分累加保存(score=score+1)
- 到达定量返回提示信息
优化
1. 消息处理超时
问题:
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
方法:
- Executor 线程执行处理
- 将结果保存在数据库,避免重复调用
2. 请求排重
问题:
微信重试机制,导致重复处理相同的信息
方法:
关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。
- 定义 FIFO 的数据结构,不允许重复
3. 连接工厂单例化
问题:
1. 不需要每次获取数据库连接都读取配置文件
2. 连接工厂不需要每次都实例化
方法:
- 定义同时声明类
- 构造方法中读取参数实例化 BasicDataSource
- 公共方法得到单个实例
4. 不重复获取access_token
问题:
每次调用接口都要用到 token
access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
方法:
* 一次获取 token ,容错判断 token 的失效时间
* 可设定定时任务和微信服务器同步时间
5. 方便添加/删除功能
问题:
在消息处理类中,用 if-else 语句若日后增减功能则要重新编译
方法:
- 把业务做成实现接口规范的插件
- 利用配置名反射得到这个类
所用技术
- properties文件读取
- java反射机制
- HttpsURLConnection
- fastjson
- 内部类
- XStream
- 图片合并
- 连接池
- 线程
- 单例模式
心得
用户和开发者间通过微信服务端进行消息交互,因此要会看文档、根据文档要求转发的参数来。