看到你们跟进了很开心 麻烦看一下场景 https://developers.weixin.qq.com/community/develop/doc/00062e3647ca485f4967e951d56c00
建议 web-view 打开页面的时候可以自定义部分header信息建议 web-view 打开页面的时候可以允许开发者自定义部分header信息 主要是两个场景: 1、可以把小程序里的已登录用户信息等不适合放在网址里的信息放在自定义header里传递到页面 2、目前小程序 web-view的useragent和微信浏览器的useragent是一样的,网页端没办法区分,通过自定义header可以区分
2018-09-28@黄思程
web-view 自定义header需求 麻烦官方看一下希望web-view支持自定义header的需求已经提了大半年了 真心希望官方考虑一下 这样可以更好的与现有的H5进行结合,也让小程序的功能更加丰富多彩。 最主要的场景就是小程序登录后,不需要在H5中进行登录。 根据之前官方给的建议,在src中带特殊字段,种cookie,这也是我目前想到的唯一方式。 但是这个方式不好的地方就在于,我根本不知道这个cookie种下后,用户是否真的已经成功登录。 本来都是无状态请求,只要带authorization barer就可以了,就这么一个特殊需求,希望官方满足,真的谢谢各位开发大佬了。 https://developers.weixin.qq.com/community/develop/doc/00026a6118cde87203a65687f5b000?highLine=web-view%2520header https://developers.weixin.qq.com/community/develop/doc/000404a58703185fa6469d9c451000?highLine=web-view%2520header
2018-09-28和我的代码逻辑一模一样 我也是先尝试静默登录 不行转授权
想静默登陆,unionId获取机制是不是不合理?因为我们有两个小程序,当用户已经授权过一个小程序后,跳转到另外一个小程序时我们想静默登陆,根据code2session接口拿到unionid后,直接读取到对应用户信息,避免再次授权,但是发现有code2session获取 unionid 有限制 UnionID获取途径绑定了开发者帐号的小程序,可以通过下面 3 种途径获取 UnionID。 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。 第三条,移动应用指的是app,能不能包含小程序?难道小程序就不是移动应用了吗? 况且,不同主体时 unionid 更是获取不到,给我们的用户系统带来很多麻烦啊
2018-09-21会PHP也会小程序 代码优良 我跳槽你们给多少 [图片] [图片]
有些开发者就是太懒了,还蠢遇到问题也不会先搜索查找一下 提问的时候文字都舍不得多输几个,常常问题描述不清楚,代码还舍不得贴 可气的是有些人贴代码是截图,想帮他重现问题还得照着图片敲一遍代码 总喜欢问人要源码,提供的思路明明能解决问题了,他们也懒得去想 要不你们把项目外包给我做吧!?我快要失业了。
2018-09-07参考流程代码 [代码]authPromise = [代码][代码]new[代码] [代码]Promise(async (resolve, reject) => {[代码][代码] [代码][代码]while[代码] [代码](!authorization.token) {[代码][代码] [代码][代码]try[代码] [代码]{[代码][代码] [代码][代码]const data = await WXP.login();[代码][代码] [代码][代码]let res;[代码][代码] [代码][代码]try[代码] [代码]{[代码][代码] [代码][代码]if[代码] [代码](canAutoLogin) {[代码][代码] [代码][代码]res = await getToken(data.code);[代码][代码] [代码][代码]} [代码][代码]else[代码] [代码]{[代码][代码] [代码][代码]throw[代码] [代码]Error([代码][代码]'try user info'[代码][代码]);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]} [代码][代码]catch[代码] [代码](e) {[代码][代码] [代码][代码]canAutoLogin = [代码][代码]false[代码][代码];[代码][代码] [代码][代码]const set = await WXP.getSetting();[代码][代码] [代码][代码]if[代码] [代码](!set.authSetting[[代码][代码]'scope.userInfo'[代码][代码]]) {[代码][代码] [代码][代码]throw[代码] [代码]Error([代码][代码]'scope userInfo disabled'[代码][代码]);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]const user = await WXP.getUserInfo({[代码][代码] [代码][代码]withCredentials: [代码][代码]true[代码][代码],[代码][代码] [代码][代码]lang: [代码][代码]'zh_CN'[代码][代码],[代码][代码] [代码][代码]});[代码][代码] [代码][代码]// @todo 换 token 的时候出现了错误需要处理[代码][代码] [代码][代码]try[代码] [代码]{[代码][代码] [代码][代码]res = await getToken(data.code, user.iv, user.encryptedData);[代码][代码] [代码][代码]} [代码][代码]catch[代码] [代码](err) {[代码][代码] [代码][代码]throw[代码] [代码]err;[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]authorization.token = res.data.access_token;[代码][代码] [代码][代码]authPromise = [代码][代码]null[代码][代码];[代码][代码] [代码][代码]// 顺便获取一次[代码][代码] [代码][代码]store.dispatch([代码][代码]'user/USER_GET_PROFILE'[代码][代码])[代码][代码] [代码][代码]resolve();[代码][代码] [代码][代码]} [代码][代码]catch[代码] [代码](e) {[代码][代码] [代码][代码]const set = await WXP.getSetting();[代码][代码] [代码][代码]const router = Vue.prototype.$router;[代码][代码] [代码][代码]if[代码] [代码](!set.authSetting[[代码][代码]'scope.userInfo'[代码][代码]]) {[代码][代码] [代码][代码]router.push([代码][代码]'/pages/user/login'[代码][代码]);[代码][代码] [代码][代码]try[代码] [代码]{[代码][代码] [代码][代码]await [代码][代码]new[代码] [代码]Promise((res, rej) => {[代码][代码] [代码][代码]Vue.bus.on([代码][代码]'ON_USER_LOGIN'[代码][代码], (action, data) => {[代码][代码] [代码][代码]if[代码] [代码](action === [代码][代码]true[代码][代码]) {[代码][代码] [代码][代码]res(data);[代码][代码] [代码][代码]} [代码][代码]else[代码] [代码]{[代码][代码] [代码][代码]rej();[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]});[代码][代码] [代码][代码]} [代码][代码]catch[代码] [代码](err) {[代码][代码] [代码][代码]// 暂时先什么都不做 用户必须授权[代码][代码] [代码][代码]// authPromise = null;[代码][代码] [代码][代码]// reject(err);[代码][代码] [代码][代码]// throw err;[代码][代码] [代码][代码]}[代码][代码] [代码][代码]Vue.bus.off([代码][代码]'ON_USER_LOGIN'[代码][代码])[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码]});[代码]
小程序验证签名(登录)的流程(含官方解答的最佳实践)小程序审核突然没通过,理由如下: [图片] 这个问题开发过程中自己确实遇到过,几率性的,一般第一次不行,第二次肯定可以了,但是不是一开始写小程序就有的,不知道什么时候开始就这样了,验证的逻辑都是按照官方的,从来没有改变过。然后上社区一搜,很多类似的问题,如下图所示。 [图片] 看了下这个问题,第一次验证签名如下: [图片] 小程序端通过wx.login成功后获取的code rawdata,这个我都是同一用户登录,前后信息没啥变化 通过1中的code,后端调用api获得的session data,其中openid肯定同一用户每次也都一样的,session_key如果过期,那么第一次和第二次理论应该是不一样的。(但实际情况前后两次是一致的,具体可参见下图) 小程序端获取到的用户的签名 后端通过session key校验出来的签名。 很明显,4和5不一致,校验失败。接下来是第二次交验: [图片] 还是同样的逻辑顺序。 小程序端通过wx.login成功后获取的code。很明显,code跟第一次是不一样的,另外根据官方文档描述,因为又重新调用了wx.login,会导致session_key过期。(这似乎说明code发生变化也是对的,因为按推测,seesionkey应该也发生了变化,否则怎么叫“被更新”)请看下图官方文档说明:[图片] rawdata,这个我都是同一用户登录,前后信息没啥变化 根据1中的官方描述,奇怪的现象就发生了,在后端根据新的code,获取的session data,很明显session key还是第一次是一样的,也就是说,我重新调用了wx.login, code是变了,但是session key却和第一次保持一致的。 小程序端获取到的用户的签名 后端通过session key校验出来的签名。因为用的是同样的rawdata,同样的session key,所以两次校验的结果是一样的,但是第二次4中,小程序端获取的签名是跟此次校验结果是一致的。 所以问题就来了,这问题到底出在什么地方?似乎官方文档描述的就有问题,还是我本身的逻辑顺序有问题?请官方指教,谢谢。
2018-09-06其实是文档也写的有问题 行吧 我现在默认 是 点击就触发 不管是不是在当前页了 真的是不知道 到底是真机还是模拟器是对的
onTabItemTap 在模拟上的 bugPage 里面定义了 onTabItemTap 事件,但是并不会被触发,代码片段在 WAService.js [代码]WeixinJSBridge.on([代码][代码]"onTabItemTap"[代码][代码], (0,[代码][代码]l.surroundByTryCatch)([代码][代码]function[代码][代码](e, t) {[代码][代码] [代码][代码]if[代码] [代码](C.hasOwnProperty(t)) {[代码][代码] [代码][代码]var[代码] [代码]n = C[t][代码][代码] [代码][代码], r = n.page;[代码][代码] [代码][代码]if[代码] [代码]([代码][代码]"undefined"[代码] [代码]!= [代码][代码]typeof[代码] [代码]__wxConfig && __wxConfig.tabBar && __wxConfig.tabBar.list && __wxConfig.tabBar.list[e.index]) {[代码][代码] [代码][代码]var[代码] [代码]o = {[代码][代码] [代码][代码]index: e.index,[代码][代码] [代码][代码]pagePath: (__wxConfig.tabBar.list[e.index].pagePath || [代码][代码]""[代码][代码]).replace(/\.html$/, [代码][代码]""[代码][代码]),[代码][代码] [代码][代码]text: __wxConfig.tabBar.list[e.index].text[代码][代码] [代码][代码]};[代码][代码] [代码][代码]if[代码] [代码](o.pagePath !== n.route)[代码][代码] [代码][代码]return[代码][代码];[代码][代码] [代码][代码]r.hasOwnProperty([代码][代码]"onTabItemTap"[代码][代码]) && ((0,[代码][代码] [代码][代码]l.info)([代码][代码]"Invoke event onTabItemTap in page: "[代码] [代码]+ n.route),[代码][代码] [代码][代码]l.safeInvoke.call(r, [代码][代码]"onTabItemTap"[代码][代码], o))[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码]}));[代码] 问题在于 o.pagePath !== n.route 的判断。o 代表要跳转的 tab,n 是当前 tab,这里应该是 ===,而不是 !==,造成的现象是只有在当前 tab 点击当前 tab 才会触发事件,点击其他 tab 都不会触发。
2018-08-01我去 刚好想测内存占用 开始优化 就来这么一出
远程调试报initWatch is not defined更新了新的beta版点远程调试一直报 [代码]ReferenceError: initWatch is not defined[代码][图片] 尝试重启、重装、使用CleanMyMac卸载再重装,都是这个问题。
2018-07-31