使用 Abp.Zero 搭建第三方登录模块(四):微信小程序开发
简短回顾一下微信小程序端的流程:
- 用户通过扫码进入小程序的鉴权页面,更新状态到ACCESSED已扫码
- 用户点击确认授权,微信通过wx.login()接口获取第三方登录的必要信息:Code登录凭证。
微信小程序主要为用户授权行为提供交互功能,用户在扫码之后,提供一个交互UI,如下:

在使用 Abp.Zero 搭建第三方登录模块(二):服务端开发 - 林晓lx - 博客园 (cnblogs.com)中介绍了服务端已经搭建的接口,这次我们将调用Access和Authenticate,分别调用来完成已扫码和已授权状态的更新。
项目搭建
首先使用vue-cli创建一个web项目,命名为mp-weixin
vue create -p dcloudio/uni-preset-vue mp-weixin

在Pages下创建login/index.vue页面,作为登录授权页
目录结构如下:

pages.json:
{
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app"
}
},
{
"path": "pages/login/index",
"style": {
"navigationBarTitleText": "授权页"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
}
}

login目录下新建ajaxRequire.ts, 创建request对象,这一对象将利用uni-axios-ts库发送ajax请求
import axios from 'uni-axios-ts'
//发送网络请求
export const request = async (url: string, methods, data: any, onProgress?: (e) => void, cancelToken?) => {
let token = null
let timeout = 3000;
if (cancelToken) {
token = cancelToken.token
timeout = 0;
}
const service = axios.create()
service.interceptors.request.use(
(config) => {
config.header['Content-Type'] = "application/json"
return config
},
(error) => {
Promise.reject(error)
}
)
const re = await service.request({
headers: { 'Content-Type': 'multipart/form-data' },
url: url,
method: methods,
data: data,
cancelToken: token,
timeout: timeout,
onUploadProgress: function (progressEvent) { //原生获取上传进度的事件
if (progressEvent.lengthComputable) {
if (onProgress) {
onProgress(progressEvent);
}
}
},
})
return re as any;
}
///获得取消令牌
export const getCancelToken = () => {
const source = axios.CancelToken.source();
return source;
}

index.vue中创建loginExternalForms作为参数传输对象
export default {
data() {
return {
loginExternalForms: {
WeChat: {
token: "",
providerAccessCode: "",
},
}
};
}
}

onLoad函数中,option存有扫描小程序码中的scene参数,将scene参数赋值给token变量
onLoad(option) {
this.loginExternalForms.WeChat.token = option.scene;
this.start();
},

start中我们调用Access接口,更改状态至ACCESSED(已扫码) ,若返回成功,则提示点用户点击确认授权,若返回的结果异常"WechatMiniProgramLoginInvalidToken"时,表明此时小程序码已过期,需在网页端更新小程序码。
async start() {
var currentForms = this.loginExternalForms["WeChat"];
this.loading = true;
await request(`${this.prefix}/MiniProgram/Access`, "post", currentForms)
.then((re) => {
this.successMessage("您已扫描二维码,请点击确认登录以完成");
})
.catch((c) => {
var err = c.response?.data?.error?.message;
if (err != null) {
if (err == "WechatMiniProgramLoginInvalidToken") {
this.isInvalid = true;
} else {
this.errorMessage(c.err);
}
}
})
.finally(() => {
setTimeout(() => {
this.loading = false;
}, 1.5 * 1000);
});
},

Prefix是你的服务地址前缀
prefix: "https://localhost:44311/api/services/app"

在Html中,我们创建授权登录与取消按钮,仅当isInvalid 为true时可以点击授权
<button
@click="handleWxLogin"
:disabled="isInvalid || loading"
class="sub-btn"
>
授权登录
</button>
<button @click="cancelWxLogin" :disabled="loading" class="sub-btn">
取消
</button>

创建 handleExternalLogin用于处理用户点击授权登录后的逻辑,调用Authenticate接口,更新状态至AUTHORIZED(已授权)在此之前需要调用uni.login获取小程序登录凭证code。
有关uni.login函数,请参考官方文档uni.login(OBJECT) | uni-app官网 (dcloud.io)
uniapp支持多种小程序,为了保留一定的扩展能力,handleExternalLogin函数中我们保留参数authProvider,已实现的微信小程序登录handleWxLogin函数调用时传递参数"WeChat",
async handleExternalLogin(authProvider) {
var currentForms = this.loginExternalForms[authProvider];
this.loading = true;
await request(
`${this.prefix}/MiniProgram/Authenticate`,
"post",
currentForms
)
.then((re) => {
uni.redirectTo({
url: "/pages/index/index",
});
})
.catch((c) => {
var err = c.response?.data?.error?.message;
if (err != null) {
if (err == "WechatMiniProgramLoginInvalidToken") {
this.isInvalid = true;
} else {
this.errorMessage(c.err);
}
}
setTimeout(() => {
this.loading = false;
}, 1.5 * 1000);
});
},
async handleWxLogin() {
const that = this;
uni.login({
provider: "weixin",
success: (loginRes) => {
that.loginExternalForms.WeChat.providerAccessCode = loginRes.code;
that.handleExternalLogin("WeChat");
},
});
},

创建取消登录函数
cancelWxLogin() {
uni.redirectTo({
url: "/pages/index/index",
});
},

执行成功通知函数
successMessage(value = "执行成功") {
uni.showToast({
title: value,
icon: "success",
duration: 1.5 * 1000,
});
},

接下来简单编写一个界面,
界面将清晰的反映isInvalid与loading状态时对应的UI交互:
正常

小程序码过期

整体测试
模拟器测试
打开网页后,将图像另存为

在微信小程序调试工具,“通过二维码编译”

等待手机界面显示授权页面后点击“授权登录”:

GetCurrentUser接口返回正确数据,并显示于web页面之上

至此完成了小程序端的开发工作
项目地址
jevonsflash/abp-mp-auth (github.com)
结束语
小程序登录具有一定的扩展性,虽然通篇介绍微信小程序登录,但登录鉴权作为小程序抽象功能,uniapp集成了各个平台(微信、支付宝、百度、字节跳动小程序)的登录接口,通过uni.login可以获取相应平台的code
使用 Abp.Zero 搭建第三方登录模块(四):微信小程序开发的更多相关文章
- 使用 Abp.Zero 搭建第三方登录模块(一):原理篇
第三方登录是基于用户在第三方平台上(如微信,QQ, 百度)已有的账号来快速完成系统的登录.注册-登录等功能. 微信的鉴权 以微信的鉴权为例: 假如你的网站有一个扫码登录的功能,会弹出一个由微信提供的 ...
- 使用 Abp.Zero 搭建第三方登录模块(三):网页端开发
简短回顾一下网页端的流程,总的来说网页端的职责有三: 生成一个随机字符作为鉴权会话的临时Token, 生成一个小程序码, Token作为参数固化于小程序码当中 监控整个鉴权过程状态,一旦状态变为AU ...
- 微信小程序开发环境搭建
关注,QQ群,微信应用号社区 511389428 微信小程序可谓是今天最火的一个名词了,一经出现真是轰炸了整个开发人员,当然很多App开发人员有了一个担心,微信小程序的到来会不会给移动端App带来一个 ...
- 微信小程序开发系列一:微信小程序的申请和开发环境的搭建
我最近也刚刚开始微信小程序的开发,想把我自学的一些心得写出来分享给大家. 这是第一篇,从零开始学习微信小程序开发.主要是小程序的注册和开发环境的搭建. 首先我们要在下列网址申请一个属于自己的微信小程序 ...
- 微信小程序开发系列四:微信小程序之控制器的初始化逻辑
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 这个教程的前两篇文章,介绍了如何 ...
- 微信小程序开发用户授权登录
用wx.login获取登录凭证code <!--pages/user/index.wxml--> <view hidden='{{boolean}}'> <view wx ...
- 微信小程序开发:python+sanic 实现小程序登录注册
开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + sanic + 微信小程序实现用户快速注册登录全栈方案. 微信小程 ...
- 微信小程序开发(四)线程架构和开发步骤
线程架构 从前面的章节我们可以知道,.js文件是页面逻辑处理层.我们可以按需在app.js和page.js中添加程序在生命周期的每个阶段相应的事件.如在页面的onLoad时进行数据的下载,onShow ...
- 微信小程序开发教程(四)线程架构与开发步骤
线程架构 从前面的章节我们可以知道,.js文件是页面逻辑处理层.我们可以按需在app.js和page.js中添加程序在生命周期的每个阶段相应的事件.如在页面的onLoad时进行数据的下载,onShow ...
- 搭建微信小程序开发环境
1.下载开发工具 点击进入下载地址选择和自己电脑匹配的安装包,并安装: image.png 安装完成后出现应用icon: image.png 2.创建项目 能够扫码登录的前提是微信号已经注册了小程序, ...
随机推荐
- Webpack4+实现原理
目录 webpack4核心基础 1.webpack开篇 2.webpack配置文件 3.webpack配置文件注意点 4.webpack-sourcemap 5.webpack-file-loader ...
- Python3.11.3解决ModuleNotFoundError: No module named 'Crypto'
安装了Crypto但程序还提示 ModuleNotFoundError: No module named 'Crypto' 反复卸载安装都不行,最后修改了文件夹的名称解决了. 找到Python的安装路 ...
- React 的学习笔记一 (未完结)
一.React 是什么 React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript 库.使用 React 可以将一些简短.独立的代码片段组合成复杂的 UI 界面,这些代码片段被称作 ...
- MASA学习和总结
一.MASA概述 MASA是温州数闪科技推出的开源产品,目前有三个产品线,分别是MASA Stack,MASA Framework,MASA Blazor. MASA Stack:是一个开源.企业级. ...
- Java商城单体和微服务架构有什么区别
微服务架构 概述 BizSpring移动全端国际化电商平台,是建立在Spring Cloud 基础上的微服务应用,服务化是系统达到一定规模以后的必然选择,主流的互联网公司基本都在迁移到服务化架构. 我 ...
- SOCKS5协议解析
socks的官方文档:https://www.ietf.org/rfc/rfc1928.txt 本文改变其他作者之手,在原文基础上加入客户端的编写,完善了服务端代码,原文是Linux端的程序代码,本文 ...
- 《ASP.ENT Core 与 RESTful API 开发实战》(第3章)-- 读书笔记(上)
第 3 章 ASP.NET Core 核心特性 3.1 启动与宿主 ASP.NET Core 应用程序启动时,它首先会配置并运行其宿主,宿主主要用来启动.初始化应用程序,并管理其生命周期 ASP.NE ...
- Hive中Lateral view用法
1. lateral view 简介 hive函数 lateral view 主要功能是将原本汇总在一条(行)的数据拆分成多条(行)成虚拟表,再与原表进行笛卡尔积,从而得到明细表.配合UDTF函数 ...
- 2023 NOI春季测试游记
前言: 知周所众,在 2023.3.4 ,圈钱因部分地区 NOIP 趋势了而组织举办了春测,这个蒟蒻本来没有 NOIP 的资格,但却去上了春测. 3.2 晚上jijidawang来发表,结果少无数份( ...
- JS script脚本async和defer的区别
壹 ❀ 引 我在 google recaptcha 谷歌人机身份验证使用教程 一文中有引用这样一段外部资源代码,如下: <script src="https://www.google. ...