- 小程序验证签名(登录)的流程(含官方解答的最佳实践)
小程序审核突然没通过,理由如下: [图片] 这个问题开发过程中自己确实遇到过,几率性的,一般第一次不行,第二次肯定可以了,但是不是一开始写小程序就有的,不知道什么时候开始就这样了,验证的逻辑都是按照官方的,从来没有改变过。然后上社区一搜,很多类似的问题,如下图所示。 [图片] 看了下这个问题,第一次验证签名如下: [图片] 小程序端通过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-05 - 官方怎么看?只需两步获取任何微信小程序源码
看来此问题无解,结贴了,大家混淆下,该干啥干啥。 - 需求的场景描述 获取任何微信小程序源码的漏洞,官方怎么看 此问题年初的时候就有人爆出来过,后来以为修复了,不过目前来看仍然可用…… 希望能引起重视,要不然整合生态圈相当脆弱,虽然有侵权保护机制,但这只能保护到品牌,对于开发者来说如果被拿到源码,就成了原创者的血泪史了! - 希望提供的能力 希望能解决源码泄露的安全问题 如果目前还在不到从根本上解决问题的话,官方对我们开发者有什么好的建议可以临时性地解决此问题?
2018-09-06 - setData时key为数组元素属性时,元素的index只能识别0-9?
[图片] 如上图,key为数组元素单个属性时,元素的index难道只能识别0-9纯数字?伪代码如下: index=fun(); //比如此时index为点击某item回传的位置 setData({ 'array[index].message' : '' }) 这样会报“APP-SERVICE-Engine:Only number 0-9 could inside [ ]……”的错误…… 这中常规需求居然不行吗?那setData真的谈不上“非常灵活”啊……只设置0-9的纯数字这个只有过家家写demo的时候才会这样做吧?真实项目中一般都是需要动态设置某个index对应元素的属性啊……难道非得要设置整个列表数据吗?然而你们的setData太多的时候也容易有性能问题啊…… 跪求官方大哥或者其它大哥解答,十分感谢 :)
2018-05-27 - 关于map组件设置markers的问题
- 需求的场景描述(希望解决的问题) [代码]<[代码][代码]map[代码] [代码]class[代码][代码]=[代码][代码]'map'[代码] [代码]id[代码][代码]=[代码][代码]'map'[代码] [代码]bindmarkertap[代码][代码]=[代码][代码]'bind_mkr_tap'[代码] [代码]bindcallouttap[代码][代码]=[代码][代码]'bind_mkr_callout_tap'[代码] [代码]bindtap[代码][代码]=[代码][代码]'bind_map_tap'[代码] [代码]longitude[代码][代码]=[代码][代码]"{{longitude}}"[代码] [代码]latitude[代码][代码]=[代码][代码]"{{latitude}}"[代码] [代码]markers[代码][代码]=[代码][代码]"{{markers}}"[代码] [代码]style[代码][代码]=[代码][代码]"height:{{map_height}}px;"[代码] [代码]show-location>[代码]</map> [代码][代码][代码]//获取点数据[代码][代码] [代码][代码]wx.request({[代码][代码] [代码][代码]url: getApp().data.net_config.service.host,[代码][代码] [代码][代码]header: getApp().data.net_config.service.header,[代码][代码] [代码][代码]method: [代码][代码]'POST'[代码][代码],[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]'pg'[代码][代码]: [代码][代码]'rcjg'[代码][代码],[代码][代码] [代码][代码]'type'[代码][代码]: [代码][代码]'ini_data'[代码][代码] [代码][代码]},[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码] [代码] [代码][代码]if[代码] [代码](getApp().data.util.json_state(res.data.state)) {[代码][代码] [代码][代码]let d = res.data.data[代码] [代码] [代码][代码]var[代码] [代码]index = [代码][代码]0[代码][代码] [代码][代码]for[代码] [代码]([代码][代码]var[代码] [代码]Key [代码][代码]in[代码] [代码]d) {[代码][代码] [代码][代码]//let markers_new = [];[代码][代码] [代码][代码]let g = map.bd09_To_Gcj02(d[Key].lng, d[Key].lat)[代码][代码] [代码][代码]let content = [代码][代码]"档案号:\n\r"[代码] [代码]+ d[Key].dah + [代码][代码]"\n\r店名:\n\r"[代码] [代码]+ d[Key].name[代码] [代码] [代码][代码]let iconPath = map.get_mkr_ico(d[Key].lx);[代码][代码] [代码][代码]//console.log(g)[代码][代码] [代码][代码]let markers_new = {[代码][代码] [代码][代码]id: d[Key].Id,[代码][代码] [代码][代码]mark_index: index,[代码][代码] [代码][代码]dah: d[Key].dah,[代码][代码] [代码][代码]name: d[Key].name,[代码][代码] [代码][代码]lx: d[Key].lx,[代码][代码] [代码][代码]callout: {[代码][代码] [代码][代码]content: content,[代码][代码] [代码][代码]display: [代码][代码]'BYCLICK'[代码][代码],[代码][代码] [代码][代码]textAlign: [代码][代码]'left'[代码][代码],[代码][代码] [代码][代码]borderRadius: [代码][代码]50[代码][代码] [代码][代码]},[代码][代码] [代码][代码]latitude: g[[代码][代码]1[代码][代码]],[代码][代码] [代码][代码]longitude: g[[代码][代码]0[代码][代码]],[代码][代码] [代码][代码]iconPath: iconPath,[代码][代码] [代码][代码]width: [代码][代码]20[代码][代码],[代码][代码] [代码][代码]height: [代码][代码]20[代码][代码] [代码][代码]}[代码][代码] [代码][代码]let pr = [代码][代码]"markers["[代码] [代码]+ index + [代码][代码]"]"[代码][代码] [代码][代码]let pr_list = [代码][代码]"markers_list["[代码] [代码]+ index + [代码][代码]"]"[代码][代码] [代码][代码]console.log(index)[代码][代码] [代码][代码]that.setData({ [pr]: markers_new, [pr_list]: markers_new })[代码][代码] [代码][代码]index++[代码][代码] [代码][代码]}[代码]因为点的数据有3000+条,大小超过了setData的限制,直接用that.setData({ markers: markers_new, markers_list: markers_new })会出问题,所以以上采用按数组一个一个设置。 实际效果是设置一个会全部重新加载一遍点,3000个点耗时1小时都还没完全加载。 换一个思路,将获取到的数据以1000个为一组进行分组,然后通过wxs进行组合,如下: [代码]//获取点数据[代码][代码] [代码][代码]wx.request({[代码][代码] [代码][代码]url: getApp().data.net_config.service.host,[代码][代码] [代码][代码]header: getApp().data.net_config.service.header,[代码][代码] [代码][代码]method: [代码][代码]'POST'[代码][代码],[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]'pg'[代码][代码]: [代码][代码]'rcjg'[代码][代码],[代码][代码] [代码][代码]'type'[代码][代码]: [代码][代码]'ini_data'[代码][代码] [代码][代码]},[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码] [代码] [代码][代码]if[代码] [代码](getApp().data.util.json_state(res.data.state)) {[代码][代码] [代码][代码]let d = res.data.data[代码][代码] [代码][代码]let d_len =[代码][代码]0[代码][代码] [代码][代码]for[代码] [代码](let ever [代码][代码]in[代码] [代码]d) {[代码][代码]//计算长度[代码][代码] [代码][代码]d_len++;[代码][代码] [代码][代码]}[代码][代码] [代码][代码]let max_make_len = Math.ceil(d[d_len - [代码][代码]1[代码][代码]][[代码][代码]'Id'[代码][代码]] / [代码][代码]1000[代码][代码])[代码][代码] [代码][代码]// console.log(max_make_len)[代码][代码] [代码][代码]for[代码] [代码](let i = [代码][代码]0[代码][代码]; i < max_make_len; i++) {[代码][代码]//分组,防止数组过大[代码][代码] [代码][代码]that.data.make_map.push([])[代码][代码] [代码][代码]}[代码][代码] [代码] [代码] [代码][代码]// console.log(that.data.make_map)[代码][代码] [代码][代码]let index = [代码][代码]0[代码][代码] [代码][代码]for[代码] [代码](let Key [代码][代码]in[代码] [代码]d) {[代码][代码] [代码][代码]let g = map.bd09_To_Gcj02(d[Key].lng, d[Key].lat)[代码][代码] [代码][代码]let content = [代码][代码]"档案号:\n\r"[代码] [代码]+ d[Key].dah + [代码][代码]"\n\r店名:\n\r"[代码] [代码]+ d[Key].name[代码][代码] [代码][代码]let make_index = Math.ceil(Key / [代码][代码]1000[代码][代码])-[代码][代码]1[代码][代码] [代码][代码]let iconPath = map.get_mkr_ico(d[Key].lx);[代码][代码] [代码][代码]// console.log(make_index)[代码][代码] [代码][代码]let new_make = {[代码][代码] [代码][代码]id: d[Key].Id,[代码][代码] [代码][代码]mark_index: index,[代码][代码] [代码][代码]dah: d[Key].dah,[代码][代码] [代码][代码]name: d[Key].name,[代码][代码] [代码][代码]lx: d[Key].lx,[代码][代码] [代码][代码]callout: {[代码][代码] [代码][代码]content: content,[代码][代码] [代码][代码]display: [代码][代码]'BYCLICK'[代码][代码],[代码][代码] [代码][代码]textAlign: [代码][代码]'left'[代码][代码],[代码][代码] [代码][代码]borderRadius: [代码][代码]50[代码][代码] [代码][代码]},[代码][代码] [代码][代码]latitude: g[[代码][代码]1[代码][代码]],[代码][代码] [代码][代码]longitude: g[[代码][代码]0[代码][代码]],[代码][代码] [代码][代码]iconPath: iconPath,[代码][代码] [代码][代码]width: [代码][代码]20[代码][代码],[代码][代码] [代码][代码]height: [代码][代码]20[代码][代码] [代码][代码]}[代码][代码] [代码][代码]that.data.make_map[make_index].push(new_make)[代码] [代码] [代码][代码]index++[代码][代码] [代码][代码]}[代码][代码] [代码] [代码] [代码][代码]for[代码] [代码](let i = [代码][代码]0[代码][代码]; i < max_make_len;i++) {[代码][代码] [代码][代码]let pr = [代码][代码]"make_map["[代码] [代码]+ i + [代码][代码]"]"[代码][代码] [代码][代码]console.log(pr)[代码][代码] [代码][代码]that.setData({ [pr]: that.data.make_map[i] })[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码]<[代码][代码]wxs[代码] [代码]module[代码][代码]=[代码][代码]"map_make"[代码][代码]>[代码][代码]var make = function (d) {[代码][代码] [代码][代码]var make = [][代码][代码] [代码][代码]d.forEach(function (item, index) {[代码][代码] [代码][代码]make = make.concat(item)[代码][代码] [代码][代码]})[代码][代码] [代码][代码]return make[代码][代码]}[代码][代码]module.exports = {[代码][代码] [代码][代码]makes: make[代码][代码]};[代码][代码]</[代码][代码]wxs[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]map[代码] [代码]wx:if[代码][代码]=[代码][代码]"{{true}}"[代码] [代码]class[代码][代码]=[代码][代码]'map'[代码] [代码]id[代码][代码]=[代码][代码]'map'[代码] [代码]bindmarkertap[代码][代码]=[代码][代码]'bind_mkr_tap'[代码] [代码]bindcallouttap[代码][代码]=[代码][代码]'bind_mkr_callout_tap'[代码] [代码]bindtap[代码][代码]=[代码][代码]'bind_map_tap'[代码] [代码]longitude[代码][代码]=[代码][代码]"{{longitude}}"[代码] [代码]latitude[代码][代码]=[代码][代码]"{{latitude}}"[代码] [代码]markers[代码][代码]=[代码][代码]"{{map_make.makes(make_map)}}"[代码] [代码]style[代码][代码]=[代码][代码]"height:{{map_height}}px;"[代码] [代码]show-location>[代码]</map> [代码][代码][代码] [代码]然而markers加载不出来,经for测试,数据没有问题。 [代码]<[代码][代码]block[代码] [代码]wx:if[代码][代码]=[代码][代码]"{{true}}"[代码] [代码]wx:for[代码][代码]=[代码][代码]"{{map_make.makes(make_map)}}"[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]view[代码][代码]> {{index}}: </[代码][代码]view[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]view[代码][代码]> {{item.dah}} </[代码][代码]view[代码][代码]>[代码][代码]</[代码][代码]block[代码][代码]>[代码]- 希望提供的能力 1、多个markers数组可以直接组合。 2、setData能接收更多数据。 3、setData设置一个开关函数,全部赋值后,统一更新。 本人水平有限,如有解决办法,欢迎各位大大指正。
2018-07-20 - 开发者工具的编辑器匹配大括号{}问题
编辑js代码的时候, 编辑 器左边栏有收起、展开的按钮,好用;但是编辑器在识别大括号的起始位置、结束位置不准确,比如我要收起代码时,它给我收起前面一部分,后面的不管了。 对于中括号也有这样的情况。 有时候js文件里不能识别page是个完整的,误认为我的page不是完整的,导致页面显示问题,console提示“page not found.May be caused by :1. Forgot to add page route in app.json.2. Invoking Page() in async task”, 其他人有这个情况吗?
2018-07-18 - 如何禁止反编译获取到小程序源码?
您好,今日发现一款小程序与我们线上的小程序的前几版几乎一摸一样,包括ui布局,完全是像素级的还原。查阅资料发现有博客提到反编译可以获取到线上小程序的源码(博客地址:https://blog.csdn.net/qq_41139830/article/details/80531802),不清楚是否真的可以获取到线上小程序的源码,还请大神指教。如果真的存在这种情况,还希望能完善。期待您的答复! 谢谢!
2018-07-30