​简短回顾一下微信小程序端的流程:

  1. 用户通过扫码进入小程序的鉴权页面,更新状态到ACCESSED已扫码
  2. 用户点击确认授权,微信通过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 搭建第三方登录模块(四):微信小程序开发的更多相关文章

  1. 使用 Abp.Zero 搭建第三方登录模块(一):原理篇

    ​第三方登录是基于用户在第三方平台上(如微信,QQ, 百度)已有的账号来快速完成系统的登录.注册-登录等功能. 微信的鉴权 以微信的鉴权为例: 假如你的网站有一个扫码登录的功能,会弹出一个由微信提供的 ...

  2. 使用 Abp.Zero 搭建第三方登录模块(三):网页端开发

    ​简短回顾一下网页端的流程,总的来说网页端的职责有三: 生成一个随机字符作为鉴权会话的临时Token, 生成一个小程序码, Token作为参数固化于小程序码当中 监控整个鉴权过程状态,一旦状态变为AU ...

  3. 微信小程序开发环境搭建

    关注,QQ群,微信应用号社区 511389428 微信小程序可谓是今天最火的一个名词了,一经出现真是轰炸了整个开发人员,当然很多App开发人员有了一个担心,微信小程序的到来会不会给移动端App带来一个 ...

  4. 微信小程序开发系列一:微信小程序的申请和开发环境的搭建

    我最近也刚刚开始微信小程序的开发,想把我自学的一些心得写出来分享给大家. 这是第一篇,从零开始学习微信小程序开发.主要是小程序的注册和开发环境的搭建. 首先我们要在下列网址申请一个属于自己的微信小程序 ...

  5. 微信小程序开发系列四:微信小程序之控制器的初始化逻辑

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 这个教程的前两篇文章,介绍了如何 ...

  6. 微信小程序开发用户授权登录

    用wx.login获取登录凭证code <!--pages/user/index.wxml--> <view hidden='{{boolean}}'> <view wx ...

  7. 微信小程序开发:python+sanic 实现小程序登录注册

    开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + sanic + 微信小程序实现用户快速注册登录全栈方案. 微信小程 ...

  8. 微信小程序开发(四)线程架构和开发步骤

    线程架构 从前面的章节我们可以知道,.js文件是页面逻辑处理层.我们可以按需在app.js和page.js中添加程序在生命周期的每个阶段相应的事件.如在页面的onLoad时进行数据的下载,onShow ...

  9. 微信小程序开发教程(四)线程架构与开发步骤

    线程架构 从前面的章节我们可以知道,.js文件是页面逻辑处理层.我们可以按需在app.js和page.js中添加程序在生命周期的每个阶段相应的事件.如在页面的onLoad时进行数据的下载,onShow ...

  10. 搭建微信小程序开发环境

    1.下载开发工具 点击进入下载地址选择和自己电脑匹配的安装包,并安装: image.png 安装完成后出现应用icon: image.png 2.创建项目 能够扫码登录的前提是微信号已经注册了小程序, ...

随机推荐

  1. 部署MooseFS分布式文件系统

    MooseFS是一个分布式文件系统,其本身具有高可用性,高拓展性,开放源代码,高容错,等在数据的读写性能方面,通过dd测试,MooseFS也就是写入的速度稍微好于NFS,读上没有差别. MooseFS ...

  2. 常见的WCF面试问题

    WCF和ASMX WebService的区别是什么? 最基本的区别在于,ASMX或者ASP.NET WebService是用来通过基于HTTP的SOAP来实现通讯.但WCF可以使用任意协议(HTTP, ...

  3. XXE注入详解

    XML介绍 XML全称可扩展标记语言(EXtensible Markup Language),XML跟HTML格式类似,但是作用不同,XML侧重于数据传输,HTML注重于标记语言,也就是说XML其实是 ...

  4. 【Java并发入门】01 并发编程Bug的源头

    一.根本原因 「CPU.内存.磁盘之间的速度差异」 为了能同时执行多个任务,CPU 发展出时间片轮转.多核等 CPU 要从内存中读数据太慢了,所以给自己设置了缓存 CPU 读磁盘更慢了,所以可以让该线 ...

  5. HBase-宽表和高表的对比

    一.宽表和高表定义 HBase 中的表可以设计为高表(tall-narrow table) 和 宽表(flat-wide table): (1) 宽表是指很多列较少行,即列多行少的表,一行中的数据量较 ...

  6. NC16527 [NOIP2013]货车运输

    题目链接 题目 题目描述 A 国有 n 座城市,编号从 1 到 n ,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆 ...

  7. Smartctrl 命令使用说明

    一.smartctl工具简介  Smartmontools是一种硬盘检测工具,通过控制和管理硬盘的SMART(Self Monitoring Analysis and Reporting Techno ...

  8. Java集合框架学习(十五) ListIterator接口详解

    ListIterator介绍 一个为list对象设计的迭代器,允许开发人员在2个方向上迭代,修改和获得list迭代位置. ListIterator 没有所谓当前元素. 它的游标位置总是位于previo ...

  9. C++ 多线程的错误和如何避免(1)

    在终止程序之前没有使用 join() 等待后台线程 前提分析:线程分为 joinable  状态和 detached 状态 添加 .join() 这句代码的时候,就表示主线程需要等待子线程运行结束回收 ...

  10. Golang微服务框架go-kratos分析:框架架构分析

    一.kratos设计理念 这里主要讲解 kratos v2 的设计理念. kratos 框架制定接口规范,然后通过插件来实现具体需求,实现自由定制.可插拔的微服务框架. 我们既可以选择 kratos ...