踩坑系列1 微信公众号项目

项目技术点:

  • 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手机可以获得错误提示信息,使用安卓的就只有挨个问题排查了

你可能感兴趣的:(踩坑系列1 微信公众号项目)