微信开发学习总结
2016-07-11 12:46
513 查看
微信开发项目学习总结
目录
微信开发项目学习总结目录
开发过程
一接入准备
测试号申请
编写接入类
文档说明
开发要点
参数配置
二自定义菜单
编写调用接口的工具类
开发要点
按文档参数写按钮的pojo类
编写创建自定义菜单类
开发要点
三消息接收处理
开发要点
四消息被动回复
五生成带用户参数的海报
开发要点
六扫码积分功能
dbcp连接池
开发要点
编写dao层
扫码积分增加
开发要点
优化
消息处理超时
问题
方法
请求排重
连接工厂单例化
不重复获取access_token
方便添加删除功能
所用技术
心得
开发过程
一、接入准备
1. 测试号申请
微信测试平台2. 编写接入类
[b]文档说明[/b]若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
[b]开发要点[/b]
在 doGet 方法中通过 request 获取参数
将参数和自己填写的token参数值按流程进行排序(Arrays.sort())、加密(MessageDigest)和校验
返回内容(response.getWriter())
3. 参数配置
在 url 一栏中填写公网能访问的 servlet 地址二、自定义菜单
1. 编写调用接口的工具类
/** * sendHttpRequest * @param urlstr,接口的调用地址 * @param method,请求调用方法 * @param outputstr,POST方法传过去的参数 * @param charset * return string,返回微信端返回的状态码 */
[b]开发要点[/b]
获取连接,URL.openConnection()
HttpsURLConnection 设置
conn.getOutputStream() 向微信端传数据
conn.getInputStream() 拿取微信端返回的数据
2. 按文档参数写按钮的pojo类
3. 编写创建自定义菜单类
[b]开发要点:[/b]将 pojo 数据转成 json
调用接口工具类(String.format() 拼接参数)
三、消息接收处理
微信用 xml 数据将消息信息 POST 过来[b]开发要点[/b]
将微信传来的数据转成pojo类
根据 MsgType 进行响应处理
消息分为普通消息和事件消息两大类
四、消息被动回复
将 pojo 类转成 xml 传给微信端五、生成带用户参数的海报
[b]开发要点[/b]ImageIO.read() 获取图片流
BufferedImage.createGraphics() 得到 Graphics2D类
drawImage() 方法
ImageIO.write() 保存图片
微信上传临时素材
六、扫码积分功能
1. dbcp连接池
[b]开发要点[/b]根据 dbcp 官方文档配置参数
连接工厂类(BasicDataSourceFactory..createDataSource())
*
2. 编写dao层
3. 扫码积分增加
[b]开发要点[/b]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
图片合并
连接池
线程
单例模式