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

  1. 用户通过扫码进入小程序的鉴权页面,更新状态到ACCESSED已扫码
  2. 用户点击确认授权,微信通过wx.login()接口获取第三方登录的必要信息:Code登录凭证。

微信小程序主要为用户授权行为提供交互功能,用户在扫码之后,提供一个交互UI,如下:

在《使用 Abp.Zero 搭建第三方登录模块(二):服务端开发》中介绍了服务端已经搭建的接口,这次我们将调用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 = nulllet timeout = 3000;if (cancelToken) {token = cancelToken.tokentimeout = 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 搭建第三方登录模块(一):原理篇

    这是一篇系列博文,我将从原理分析.设计到代码编写,搭建一套基于微信小程序登录的网站第三方登录模块: 使用 Abp.Zero 搭建第三方登录模块(一):原理篇_林晓lx的博客-CSDN博客 使用 Abp ...

  2. 微信小程序开发uni-app 跨域处理 服务器搭建 仓库 VueX tabBar

    一.uni-app简介 官网:https://uniapp.dcloud.io/ PC端:移动端:(APP,WebApp):纯原生:(IOS,Android ) 应用商店:H5 Hybrid 模式(混 ...

  3. 《微信小程序-证件照换底色》之二:用pycharm搭建django框架来接收微信小程序上传的图片

    用pycharm搭建django框架来接收微信小程序的图片 上一篇:微信云开发实现每个用户在云端上传并且下载自己对应的图片 链接: https://blog.csdn.net/qq_44933075/ ...

  4. 微信小程序开发环境(阿里云服务搭建+可运行的demo)

    最近微信小程序异常火爆,很多人在学习,下面带着大家搭建下微信小程序的调试环境(client+server),并调试一套demo源码(JavaScript和node.js基础即可,微信推荐使用的语言,无 ...

  5. 一篇文入门微信小程序开发环境搭建

    2017年小程序发布以来,经过近5年的发展,微信小程序开发已经日趋成熟.越来越多的商家已经开通了线上的电商小程序,一个是给店铺引流,另一方面也是更好的为顾客服务. 本文利用一定的篇幅讲解一下微信小程序 ...

  6. node.js 微信小程序 部署服务器_微信小程序开发入门(一),Nodejs搭建本地服务器...

    1.  如何模拟真实环境中,读取服务端数据,首先需要使用Nodejs搭建一个本地服务器的环境. 在搭建web服务器之前,需要先安装node.js(安装版本最好为6.9.x) 安装后node.js,接下 ...

  7. 微信小程序开发第一节:环境搭建

    环境搭建 window10,自己已经配置过pycharm. 小程序环境:https://mp.weixin.qq.com/ 自己注册. 微信小程序开发工具下载安装 https://developers ...

  8. 01.微信小程序开发之环境搭建

    在开发之前你要有微信开发者工具,下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html 这里我要假设大家有已经拿到了 ...

  9. python搭建微信小程序卖货要收费用吗_你知道微信小程序开发收费吗?

    原标题:你知道微信小程序开发收费吗? 你知道微信小程序开发收费吗? 冰棍科技程序 2017-12-16 微信小程序越来越受人们的欢迎,这是为什么呢?因为小程序的出现,让我们的生活更加方便了起来,比如说 ...

最新文章

  1. 如何支持亿级用户分流实验?AB实验平台在爱奇艺的实践
  2. UNIX再学习 -- 进程间通信之管道
  3. 北斗云计算机怎么样,北斗定位2.0版服务平台来了
  4. 关联查询mysql_《MySQL数据库》关联查询
  5. mysql 7天自动拒单功能,mysql查询最近7天的数据,没有数据自动补0
  6. 持续集成:CruiseControl.NET + VisualSVN.Server
  7. matlab里dcgain,制系统的时域分析
  8. oracle脚本导入mysql数据库_oracle脚本导入mysql数据库
  9. JavaScript记录一下
  10. IntelliJ 一键添加双引号
  11. 打造自己的专业图像工具-Visual C++ 2005图像编程系列【一】
  12. 今日头条ocpm计费规则_今日头条广告投放推广新产品选OCPM还是CPA好?是新的计费方式吗?...
  13. Spark中DataFrame 基本操作函数
  14. docker 安装mysql_docker系列篇:docker以挂载配置文件和数据目录的方式安装mysql
  15. MSDN Windows XP Professional x64 Edition with SP2 +VL简体中文语言包+序列号
  16. Linux下c语言多线程编程
  17. VS2012快捷方式的路径
  18. netbeans 插件安装
  19. 湖南中医药大学成考2022年下学期网络课程学习与考试工作安排
  20. 解决MacBook浏览器打开北京工作居住证系统问题

热门文章

  1. Spring个人深入学习路线图
  2. 非静默授权没有弹出弹框_网易考拉Android统一弹框
  3. 四川文科高考300分可以上什么专科
  4. us域名,什么是us域名?
  5. 萝卜开会直播NO.2 | 换一个十年,感受不一样的世界
  6. ChemDraw如何画聚合物,看完就知道了!
  7. 【解决】ocam录制失败。 导致: WASRecord: pAudioClient- Initialize failed. (hr=0x80070005
  8. 2023轻薄投影仪首选:极米Z6X Pro入手超值!
  9. 渗透测试面试问题集合(转载自己看,链接在开头)
  10. java程序无法启动:Unsupported major.minor version 51.0