微信小程序登录

前段时间发布了一个微信小程序的简单登录,那段时间我一直在忙着项目,有一天,我清闲下来准备进入小程序群里面看一下来着,刚好有人问问题了,我一看这哥们的问题好像是我写的东西啊,我感觉是时候秀一波了,是时候展现我真正的技术了。我当时正在酝酿如何无形装逼时。这时候出现了一个打脸的。他说这种登录方式不可以使用了,当时我就有点不信了,结果自己测试了真的不可以使用了,没办法,只能更新一版新的了,说实话,那脸打的比较响亮啊快哭了,于是乎就有了今天就帮大家更新了一版。好了,闲话扯到这里结束了。


原来的简单登录是直接在前台获取openid,但是呢微信官方发现这个洞以后就给填了,不让你们玩了,你们在这么玩下去生态圈就没办法维持了,官方直接在安全域名处禁止添加https://api.weixin.qq.com,但是呢以前添加的用户还是可以用的。

如上图显示。

好了废话不多少,直接撸代码,同时在这里整理了一些项目中开发中遇到的一些经验分享给大家。

[plain]  view plain  copy
  1. //app.js  
  2. // 这里是调用公共函数库  
  3. var util = require('./utils/util.js')  
  4. App({  
  5.   
  6.     /**  
  7.     * 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)  
  8.     */  
  9.     onLaunch: function (options) {  
  10.   
  11.         // 调用API从本地缓存中获取数据  
  12.         var that = this  
  13.         var logs = wx.getStorageSync('logs') || []  
  14.         logs.unshift(Date.now())  
  15.         wx.setStorageSync('logs', logs)  
  16.   
  17.     },  
  18.   
  19.     /**  
  20.     * 当小程序启动,或从后台进入前台显示,会触发 onShow  
  21.     */  
  22.     onShow: function (options) {  
  23.           
  24.         var that = this,  
  25.         // scenes是场景值它的类型是整形  
  26.         scenes = options.scene,  
  27.         // sid是参数,建议兼容ios和android的时候强转换为整形  
  28.         sid = Number(options.query.sid)  
  29.   
  30.         // 获取用户信息  
  31.         that.getUserInfo(function (userInfo) {  
  32.             // 判断场景是否是从公众号进入(这里的意思是如果用户从公众号的自定义菜单进入的话且参数sid为1的话触发什么方法)  
  33.             // 获取场景值在onLaunch方法中也可以获取到,但是呢由于业务要求我们的这个方法需要用户进入就会触发  
  34.             // 各位可以根据需求去决定在哪里获取合适一些,onLaunch是小程序未关闭的情况下只执行一次,所以各位一定要考虑清楚  
  35.             if (scenes === 1035 && sid === 1) {  
  36.                 // 这里是从什么场景下要执行的方法  
  37.             }  
  38.         })  
  39.     },  
  40.   
  41.     /**  
  42.     * 获取用户信息  
  43.     */  
  44.     getUserInfo: function (cb) {  
  45.         var that = this  
  46.       
  47.         if (this.globalData.userInfo) {  
  48.               
  49.             typeof cb == "function" && cb(this.globalData.userInfo)  
  50.           
  51.         } else {  
  52.               
  53.             // 调用登录接口  
  54.             wx.login({  
  55.                 success: function (res) {  
  56.                       
  57.                     // 登录成功  
  58.                     // 在这里登录的时候会返回一个登录凭证,以前是发送一次请求换一个,现在好像是登录凭证有5分钟的有效时间  
  59.                     // 从这种情况来看微信小程序的发展还是不错的,以前估计没多少人访问,现在访问量上去后后台的布局都重新架构了  
  60.                     var code = res.code// 登录凭证  
  61.                       
  62.                     // 获取用户信息  
  63.                     wx.getUserInfo({  
  64.                         // 当你获取用户信息的时候会弹出一个弹框是否允许授权  
  65.                           
  66.                         // 这里点击允许触发的方法  
  67.                         success: function (res2) {  
  68.                           
  69.                             that.globalData.userInfo = res2.userInfo  
  70.   
  71.                             // 准备数据(下面的这些参数都是必须参数,请不要问为什么,看文档去吧)  
  72.                             var data = { encryptedData: res2.encryptedData, iv: res2.iv, code: code }  
  73.                               
  74.                             // 请求自己的服务器(在这里我结合promise封装了一下request请求,下面会把方法给大家分享一下)  
  75.                             util.commonAjax('方法名', 1, data)  
  76.                             .then(function (resolve) {  
  77.                                 // 这里自然不用解释了,这是接口返回的参数  
  78.                                 if (resolve.data.status === '200') {  
  79.                                     // 成功  
  80.                                     wx.setStorageSync('userInfo',  resolve.data.data)  
  81.                                     // 新手们注意一下,记得把下面这个写到这里,有好处。  
  82.                                     typeof cb == "function" && cb(that.globalData.userInfo)  
  83.                                 } else {  
  84.                                     // 失败  
  85.                                 }  
  86.                             })  
  87.                         },  
  88.                           
  89.                         // 这里是点击拒绝触发的方法  
  90.                         fail: function (res2) {  
  91.                             // 在这里做一下兼容,有些同行业的用户会点击拒绝玩一玩看你们的小程序是否存在bug,  
  92.                             // 所以在这里还是加上下面这两行代码吧,打开微信小程序的设置,允许小程序重新授权的页面  
  93.                             wx.openSetting({  
  94.                                 success: (res) => {  
  95.                                     // 下面的代码格式按照我的写,不要看工具打印的什么,在这里提醒大家一句,有时候不能相信开发者工具,因为  
  96.                                     // android和ios还有工具底层的js库是不同的,有些时候坑的你是一点脾气也没有,所以大家注意一下,  
  97.                                     // 不相信的慢慢的去自己跳坑吧  
  98.                                     if (res.authSetting["scope.userInfo"]) {  
  99.                                         // 进入这里说明用户重新授权了,重新执行获取用户信息的方法  
  100.                                         that.getUserInfo()  
  101.                                     }  
  102.                                 }  
  103.                             })  
  104.                         }  
  105.                     })  
  106.                 }  
  107.             })  
  108.         }  
  109.     },  
  110.   
  111.     /**  
  112.     * 全局变量配置(在这里放一些常量和配置文件,如果公共参数多的话大家也可以去重新布局一个文件,在里面进行设置)  
  113.     */  
  114.     globalData: {  
  115.         userInfo: null,  
  116.         url: '这是接口的url'  
  117.     }  
  118. })  
  119.   
  120. // 下面是util.js的东西  
  121.   
  122. /**  
  123.  * request请求封装  
  124.  * url   传递方法名  
  125.  * types 传递方式(1,GET,2,POST)  
  126.  * data  传递数据对象  
  127.  */  
  128. function commonAjax(url, types, data) {  
  129.       
  130.     // 获取公共配置  
  131.     var app = getApp()  
  132.     
  133.     // 公共参数(一般写接口的时候都会有些公共参数,你可以事先把这些参数都封装起来,就不用每次调用方法的时候再去写,)  
  134.     var d = {  
  135.         token: '123456789',// 例如:这是我们自己的验证规则  
  136.     }  
  137.     
  138.     // 合并对象(公共参数加传入参数合并对象) mergeObj对象在下面  
  139.     var datas = mergeObj(d, data)  
  140.   
  141.     // 这是es6的promise版本库大概在1.1.0开始支持的,大家可以去历史细节点去看一下,一些es6的机制已经可以使用了  
  142.     var promise = new Promise(function (resolve, reject, defaults) {  
  143.     // 封装reuqest  
  144.     wx.request({  
  145.       url: app.globalData.url + url,  
  146.       data: datas,  
  147.       method: (types === 1) ? 'GET' : 'POST',  
  148.       header: (types === 1) ? { 'content-type': 'application/json' } : { 'content-type':'application/x-www-form-urlencoded'},  
  149.       success: resolve,  
  150.       fail: reject,  
  151.       complete: defaults,  
  152.     })  
  153.   });  
  154.   return promise;  
  155. }  
  156.   
  157. /**  
  158.  * object 对象合并  
  159.  * o1     对象一  
  160.  * o2     对象二  
  161.  */  
  162. function mergeObj(o1, o2) {  
  163.   for (var key in o2) {  
  164.     o1[key] = o2[key]  
  165.   }  
  166.   return o1;  
  167. }  
  168.   
  169. function formatTime(date) {  
  170.   var year = date.getFullYear()  
  171.   var month = date.getMonth() + 1  
  172.   var day = date.getDate()  
  173.   
  174.   var hour = date.getHours()  
  175.   var minute = date.getMinutes()  
  176.   var second = date.getSeconds()  
  177.   
  178.   
  179.   return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')  
  180. }  
  181.   
  182. function formatNumber(n) {  
  183.   n = n.toString()  
  184.   return n[1] ? n : '0' + n  
  185. }  
  186.   
  187. module.exports = {  
  188.   formatTime: formatTime,  
  189.   commonAjax: commonAjax,  
  190. }  

上面的一些封装,大家可以根据自己的喜好去修改,毕竟一个人一个风格吗,代码写的有一些乱,大家见谅一下,因为项目有点乱,我现在也有点头大,不知道该把哪些东西归为一类讲个大家,所以显得有点乱,但是呢,上面的代码包括封装都是线上经过实战检测没问题的代码,至于后台的代码会在下个帖子中发表。



 付一段代码,望各位参考一下


  • 11
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值