项目技术点:
- xml/json解析,场景为消息接收和公众号菜单创建
- 通过发送get/post请求调用微信公众平台接口
- 消息加密,微信公众号可使用AES加密被动回复给用户的消息
- OAuth2.0 微信网页授权
- WeUI 微信前端CSS框架
- JS-SDK 微信网页JavaScript功能包
- 微信客服
- 模板消息
- 微信支付
一.微信服务器消息验证
1.场景
- 微信公众号服务器需要与微信服务器通讯
- 微信通过在公众号配置中写入token(公钥A),作为验证微信服务器的工具
- 使用非对称加密,类似于Https原理
2.服务器验证流程
- 公众号服务器接收到网络消息
- 从消息中提取signature、timestamp、nonce、echoStr字段
- 加入填在公众号配置的token,对timestamp、nonce、token进行字典排序,得到list
- 取list的哈希值,与signature比较
- 若两者相等,确定消息来自微信服务器
- 返回echoStr供微信服务器认证token
3.收获
- 实际接触服务器通信确认,加深对Https的理解
二.获取AccessToken的线程造成内存泄漏
1.场景
- 调用微信接口需要AccessToken
- AccessToken两小时失效,每天可请求次数有限,需开发者自行定时请求和存放
- 需要对AccessToken加并发锁防止并发刷新
2.问题
- 在Tomcat中单独开启线程定时获取AccessToken并刷新存储
- 关闭Tomcat时报Memory Leak错误
- 检查日志发现获取AccessToken的线程在Tomcat停止后并未结束
3.原因和解决办法
- 执行 $JAVA_HOME/bin/jstack 查看在运行的线程号
- 定位到jdk/bin目录执行 $ jstack 线程id 查看线程情况,确定是获取AccessToken的线程不是守护线程,在Tomcat关闭后没有自动结束
- 当前运行tomcat的jvm里还有非deamon的线程没有结束执行,例如被阻塞,或者还在执行任务。这个现象就是tomcat 端口都已经关闭了,但是java进程还在。tomcat的停止只是结束了自己的线程,关闭了自己的资源。但是应用开启的非deamon线程,这个 tomcat是无能为力的
- 将获取AccessToken的线程设置为守护线程,问题解决
4.收获
- 理解Tomcat和JVM在线程管理上的细节
- 实际应用了守护线程
三. OAuth2.0授权回调后重定向丢失Request
1.场景
- 用户在微信客户端访问第三方网页时,公众需要通过网页授权机制获取用户基本信息
- 通过调用下面的链接引导用户同意网页授权
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
2.问题
- 在用户通过引导链接确认网页授权时,request域存有参数
- 当用户访问引导链接完成授权后回调回来时,request域内的参数丢失
3.原因和解决办法
- 用户在授权后回调回来时,进行的是重定向操作,相当于开启了新会话,原request丢失
- 将参数保留在链接里的state中,回调后以get方式获取
四.使用微信支付接口
1.支付接口调用
- 采取JSAPI的支付场景
1)用户打开商户网页选购商品,发起支付,在网页通过JavaScript调用getBrandWCPayRequest接口,发起微信支付请求,用户进入支付流程
2)用户成功支付点击完成按钮后,商户的前端会收到JavaScript的返回值。商户可直接跳转到支付成功的静态页面进行展示
3)商户后台收到来自微信开放平台的支付成功回调通知,标志该笔订单支付成功 - 业务流程
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4
1)调用统一下单生成预付单信息
2)用户点击支付,发出支付申请
3)用户确认支付,输入密码验证
4)微信处理支付,发送支付信息给商户平台和用户
2.注意事项
- 使用微信提供的签名校验工具校验签名
- 使用ios手机可以获得错误提示信息,使用安卓的就只有挨个问题排查了