一、登录流程
在谈论登录流程之前,我们需要先了解Wexin小程序的登录机制。微信小程序登录分为两种:一种是微信登录,一种是手机号登录。
微信登录:用户使用微信账号进行授权,获取用户信息,再访问开发者自己的服务器登录。相对于手机号登录,微信登录具有更好的用户体验,减少用户的操作步骤。
手机号登录:用户需要输入手机号和短信验证码,完成登录。对于不想使用微信授权登录的用户,可以选择手机号登录。开发者需要在服务器中存储用户的登录状态,给予用户持久化的方式。
在Uniapp中,通过微信小程序官方提供的API,可以方便地实现微信登录和手机号登录功能。
二、微信登录
微信登录是Uniapp在小程序端比较推荐的一种登录方式。Uniapp通过封装微信官方提供的Session API,实现了微信登录的功能。下面是实现微信登录的步骤:
1、在小程序manifest.json文件中,注册小程序的appid,并设置request合法域名和sld(顶级域名)
"appid": "yourAppid", // 注册小程序的appid "networkTimeout": { "request": 10000, // 单位为ms "connectSocket": 10000, // 单位为ms "uploadFile": 10000, // 单位为ms "downloadFile": 10000 // 单位为ms }, "permission": { "scope.userLocation": { "desc": "你的位置信息将用于小程序的定位功能,不会泄露给其他人" } }, "mp-weixin": { "subPackages": [] }, "debug": true, "request": { "domain": { "main": "www.yourdomain.com", // 服务器域名 "images": [ "https://www.yourdomain.com/images", "https://img.yourdomain.com" ] }, "header": { "Content-Type": "application/json" } }, "requiredBackgroundModes": ["audio", "location"]
2、在uni账户中添加微信应用,获取Appid与AppSecret,在Uniapp中使用这两个信息进行微信登录
// 在login.vue页面中引入uni-account-login组件,在template中添加uni-account-login组件// 在login.vue的<Script>标签中添加下面的代码 <script> import uniAccountLogin from '@/components/uni-account-login/uni-account-login.vue' export default { components: { uniAccountLogin }, data() { return { loginType: 'wx', // 微信登录 companyId: 'yourCompanyId', // 注册的企业ID或个人ID } }, // 小程序通过微信授权登录后,可以获取到用户的openid和session_key, // 维护着用户的登录状态,然后把登录结果返回给开发者的服务器。 onLoad() { uni.login({ provider: 'weixin', success: function (loginResult) { const wxcode = loginResult.code // 登录凭证 uni.request({ url: 'https://api.weixin.qq.com/sns/jscode2session', method: 'GET', data: { appid: 'yourAppid', // 注册的小程序appid secret: 'yourSecret', // 注册的小程序AppSecret js_code: wxcode, grant_type: 'authorization_code' }, success: (res) => { const openid = res.data.openid // 用户唯一标识 const sessionKey = res.data.session_key // 会话密钥 const result = { type: 'wx', openId: openid, session_key: sessionKey, companyId: 'yourCompanyId', // 注册的企业ID或个人ID } this.$refs.uniAccountLogin.login(result) } }) } }) } } </script>
三、手机号登录
手机号登录需要在Uniapp中调用小程序官方的API。下面是实现手机号登录的步骤:
1、在小程序manifest.json文件中,注册小程序的手机号登录模板
"mp-weixin": { "phone": { "templateMessageInfo": { "parameterList": [ { "name": "占位符唯一标识", "value": "{{占位符}}", // 替换为实际参数 "color": "#173177" // 参数字体颜色 } ], "templateId": "下发的模板消息唯一标识", // 模板id "type": "微信服务通知" // 模板类型 } } }
2、在uni账户中添加手机号登录模板,获取模板id,在Uniapp中使用模板id进行手机号登录
// 在login.vue页面中引入uni-account-login组件,在template中添加uni-account-login组件// 在login.vue的<Script>标签中添加下面的代码 <script> import uniAccountLogin from '@/components/uni-account-login/uni-account-login.vue' export default { components: { uniAccountLogin }, data() { return { loginType: 'phone', // 手机号登录 companyId: 'yourCompanyId', // 注册的企业ID或个人ID templateId: 'yourTemplateId' // 注册的手机号登录模板id } }, onLoad() { // 调用微信登录,获取用户信息 uni.login({ provider: 'weixin', success: function (loginResult) { const wxcode = loginResult.code // 登录凭证 uni.request({ url: 'https://api.weixin.qq.com/sns/jscode2session', method: 'GET', data: { ... }, success: (res) => { const openid = res.data.openid // 用户唯一标识 const sessionKey = res.data.session_key // 会话密钥 uni.getUserInfo({ provider: 'weixin', success: (infoResult) => { const userInfo = JSON.parse(infoResult.userInfo) const result = { type: 'phone', phone: '', templateId: this.templateId, companyId: this.companyId, openid: openid, session_key: sessionKey } // 调用uni-account-login组件,进行验证码验证 this.$refs.uniAccountLogin.sendCode(result, (phoneNumber) => { result.phone = phoneNumber this.$refs.uniAccountLogin.login(result) }) } }) } }) } }) } } </script>
四、登录状态
在Uniapp中,可以通过SessionStorage、本地存储、服务端存储等方式来维护用户的登录状态。通常情况下,为了保障用户信息的安全性,我们会选择服务端存储用户登录状态。
服务端存储用户登录状态需要以下步骤:
1、在服务端生成一个唯一的token,然后把token和用户信息关联。可以通过redis或memcached等缓存库来实现。同时在返回的api中,把token返回给用户。
2、在前端通过SessionStorage或本地存储来存储token信息。在用户请求的时候,把token添加在http header中,然后上传到服务端验证是否登录。
3、在服务端验证token,验证通过后返回用户信息。
// 在login.vue的<Script>标签中,添加下面的代码。 <script> verifiedLogin(res) { // 服务端返回的验证登录结果 if (res.code == 200) { // 登录成功 const data = res.data uni.setStorageSync('token', data.token) // 存储用户token uni.setStorageSync('userInfo', data.userInfo) // 存储用户信息 uni.switchTab({ url: '/pages/index/index' }) } else { uni.showToast({ title: '登录失败', icon: 'none' }) } }, login() { // 从uni-account-login组件中获取登录信息,提交到服务器进行登录信息验证 const result = this.$refs.uniAccountLogin.getLoginResult() console.log(JSON.stringify(result)) uni.request({ url: 'https://api.yourdomain.com/login', method: 'POST', data: { code: result.code, openid: result.openId ? result.openId : '', session_key: result.session_key ? result.session_key : '', phone: result.phone ? result.phone : '', verify_code: result.verifyCode ? result.verifyCode : '' }, success: (res) => { this.verifiedLogin(res.data) }, fail: () => {}, complete: () => {} }) } </script>
五、总结
Uniapp是一个跨平台的开发框架,开发者可以通过一套代码,覆盖App、小程序、H5等多种平台。微信小程序是Uniapp中非常重要的一个平台,同时小程序登录也是非常具有代表性的功能之一。本文从微信小程序登录流程、微信登录、手机号登录和登录状态四个方面,对Uniapp微信小程序登录进行了详细的阐述。阅读本文后,读者可以掌握Uniapp微信小程序登录的实现方式,为开发小程序提供指引。