小程序开发: 踩坑笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lx_nhs/article/details/81607366

1. UnionID取不到的原因

原因1: 小程序没有关联绑定微信开放平台
原因2: 同一个微信开放平台下的相同主体的 App、公众号、小程序,如果用户已经关注公众号,或者曾经登录过App或公众号,则用户打开小程序时,开发者可以直接通过 wx.login 获取到该用户UnionID,无须用户再次授权。(解读:用户如果没有登录过app,也没有登录过公众号,也没有关注过公众号的情况下,小程序中通过 wx.login 是获取不到 unionid的, 此时需要通过对wx.getUserInfo回调过来的加密数据发送至后台进行解密从而得到用户UnionID). 官方文档: wx.getUserInfo()用法

2. 小程序每次请求都是一个新的session会话的问题

 后台使用shiro框架时发现: 小程序调用登录接口, 后台shiro确实也登录成功了, 但是之后访问其他接口还是被shiro拦截提示没有登录!
原因: 小程序的每次请求都是一个新的会话, 所以后台shiro中subject主体的sessionId也不一致, 故认为没有登录;
解决: 在登录接口成功时将shiro创建的sessionId返回给前端小程序, 小程序对此sessionId进行保存, 在下次发送request请求时加上请求头: Cookie:此sessionId, 代码如下:

// 调用登录接口,返回{'status': 'success', 'sessionId':'SHAREJSESSIONID=1d148a01-c69d-4f68-96ea-f4d8b4bb6f53'}, 将sessionId存入缓存或者全局变量中:
 wx.setStorageSync('USER_COOKIE', 'SHAREJSESSIONID=' + json.sessionId);
 // 发送请求时:
 wx.request({
 	url: 'xxxx',
 	data: {},
 	method: 'GET',
	header: {
      'clientType': 'wxLittleApps',
      'content-type': 'application/x-www-form-urlencoded;charset=utf-8',
      'Cookie': wx.getStorageSync('USER_COOKIE')
    },
    success: function(json){
    }
})

2. 底部tab导航栏只能使用wx.switchTabl()进行跳转

 使用wx.navigateTo或者wx.redirectTo进行页面跳转, 死活跳不过去, 最后在fail回调中打印看一下, 发现tab栏路径不能使用以上两种方法跳转, 只能使用wx.switchTab();

3. 参数的错误封装导致http请求400

 其实也不能算小程序的坑, 是以为请求携带的参数在springMVC封装时错误导致. 昨天遇到一个问题: 请求相同的接口, 不带参数的请求可以成功, 而带参数的请求报了400, 究其原因发现参数中有个time参数, 传递的是毫秒值, 而后台springMVC参数封装使用Date类型, 所以报了400

4.app.json中没有添加页面路径导致404

5.真机测试showToast一闪而过

 设置showToast的duration不生效, 结果发现是因为wx.hideLoading()方法不仅仅把loading框关掉了, 也把showToast提示框给关了, 网上说两者用的同一个框. 解决方法就是把wx.hideLoading()方法放在wx.showToast()之前.

6.发送模板消息通知返回41028form_id不正确,或者过期

 小程序发送模板消息只能通过两种方式触发: 1.表单提交; 2. 微信支付
今天在使用表单提交触发发送模板消息时, 总是返回41028错误代码, 检查了多遍配置和form_id等参数都没有问题, 为什么发送不了. 后来才知道发送有限制: 谁触发的表单就只能发送给谁…(不人性化,稍后给出解决方案)比如A提交表获取form_id只能推送消息给自己, 不能使用此form_id发送给别的用户(openId). 并且一次表单提交只能发送一条模板消息, 且有效时长为7天, form_id不能重复使用.

后台推送给指定用户或者定时推送消息解决方案:

① 改造用户经常访问的小程序页面的点击或者跳转事件为form, 保存form_id和openId至数据库, 每次发消息消耗一条数据库记录;

实现过程中出现的问题:

1.把一navigator按钮改造为表单提交后, 在开发者工具中测试每次都可以获取formId, 但是在真机测试, 有的时候拿得到, 有的时候拿不到. 这是因为: 若submit事件执行时间大于跳转时间, 则submit事件会被跳转事件打断. 解决: 把跳转事件写在submit事件的回调中.

② 使用vpush组件, 官网: https://dev.vpush.cloud/. 原理也是把一些小程序原生组件改造为表单提交.

7. access_token的那些坑

问题: 这几天在调试生成二维码, 需要用的access_token, 调用接口返回access_token, 有效时间为7200s, 也就是两个小时. 但是运行一段时间后(完全没有两个小时), 二维码就生成不了, 返回的二维码大小也不正常,109字节, 正常大小应该是100kb左右. 右键记事本打开, 发现提示:

{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [FEWb.A02631091]"}

意思很明了: access_token无效或者不是最新的!
原来access_token生成多次的话, 之前的就算没有到过期时间也会在5分钟后失效, 5分钟后只最新的可用.
但是项目中并没有其他调用获取access_token接口的地方啊, 为什么还会失效?
解决:
 原来是因为! 我们项目两个环境: 测试服和正式服! 使用的是相同的小程序配置(appId和secret). 两个服务器都在调用获取access_token接口!!!A刷新access_token, B五分钟后就失效… B刷新则A5分钟失效!!! 深坑.

猜你喜欢

转载自blog.csdn.net/lx_nhs/article/details/81607366