一、登录流程
在谈论登录流程之前,我们需要先了解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组件 -->
<template>
<uni-account-login :type="loginType" :id="companyId" @success="toIndex" @cancel="cancel" />
</template>
// 在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组件 -->
<template>
<uni-account-login :type="loginType" :id="companyId" @success="toIndex" @cancel="cancel" />
</template>
// 在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微信小程序登录的实现方式,为开发小程序提供指引。