使用 Abp.Zero 搭建第三方登录模块(四):微信小程序开发
简短回顾一下微信小程序端的流程:
- 用户通过扫码进入小程序的鉴权页面,更新状态到ACCESSED已扫码
- 用户点击确认授权,微信通过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 搭建第三方登录模块(四):微信小程序开发相关推荐
- 使用 Abp.Zero 搭建第三方登录模块(一):原理篇
这是一篇系列博文,我将从原理分析.设计到代码编写,搭建一套基于微信小程序登录的网站第三方登录模块: 使用 Abp.Zero 搭建第三方登录模块(一):原理篇_林晓lx的博客-CSDN博客 使用 Abp ...
- 微信小程序开发uni-app 跨域处理 服务器搭建 仓库 VueX tabBar
一.uni-app简介 官网:https://uniapp.dcloud.io/ PC端:移动端:(APP,WebApp):纯原生:(IOS,Android ) 应用商店:H5 Hybrid 模式(混 ...
- 《微信小程序-证件照换底色》之二:用pycharm搭建django框架来接收微信小程序上传的图片
用pycharm搭建django框架来接收微信小程序的图片 上一篇:微信云开发实现每个用户在云端上传并且下载自己对应的图片 链接: https://blog.csdn.net/qq_44933075/ ...
- 微信小程序开发环境(阿里云服务搭建+可运行的demo)
最近微信小程序异常火爆,很多人在学习,下面带着大家搭建下微信小程序的调试环境(client+server),并调试一套demo源码(JavaScript和node.js基础即可,微信推荐使用的语言,无 ...
- 一篇文入门微信小程序开发环境搭建
2017年小程序发布以来,经过近5年的发展,微信小程序开发已经日趋成熟.越来越多的商家已经开通了线上的电商小程序,一个是给店铺引流,另一方面也是更好的为顾客服务. 本文利用一定的篇幅讲解一下微信小程序 ...
- node.js 微信小程序 部署服务器_微信小程序开发入门(一),Nodejs搭建本地服务器...
1. 如何模拟真实环境中,读取服务端数据,首先需要使用Nodejs搭建一个本地服务器的环境. 在搭建web服务器之前,需要先安装node.js(安装版本最好为6.9.x) 安装后node.js,接下 ...
- 微信小程序开发第一节:环境搭建
环境搭建 window10,自己已经配置过pycharm. 小程序环境:https://mp.weixin.qq.com/ 自己注册. 微信小程序开发工具下载安装 https://developers ...
- 01.微信小程序开发之环境搭建
在开发之前你要有微信开发者工具,下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html 这里我要假设大家有已经拿到了 ...
- python搭建微信小程序卖货要收费用吗_你知道微信小程序开发收费吗?
原标题:你知道微信小程序开发收费吗? 你知道微信小程序开发收费吗? 冰棍科技程序 2017-12-16 微信小程序越来越受人们的欢迎,这是为什么呢?因为小程序的出现,让我们的生活更加方便了起来,比如说 ...
最新文章
- 如何支持亿级用户分流实验?AB实验平台在爱奇艺的实践
- UNIX再学习 -- 进程间通信之管道
- 北斗云计算机怎么样,北斗定位2.0版服务平台来了
- 关联查询mysql_《MySQL数据库》关联查询
- mysql 7天自动拒单功能,mysql查询最近7天的数据,没有数据自动补0
- 持续集成:CruiseControl.NET + VisualSVN.Server
- matlab里dcgain,制系统的时域分析
- oracle脚本导入mysql数据库_oracle脚本导入mysql数据库
- JavaScript记录一下
- IntelliJ 一键添加双引号
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【一】
- 今日头条ocpm计费规则_今日头条广告投放推广新产品选OCPM还是CPA好?是新的计费方式吗?...
- Spark中DataFrame 基本操作函数
- docker 安装mysql_docker系列篇:docker以挂载配置文件和数据目录的方式安装mysql
- MSDN Windows XP Professional x64 Edition with SP2 +VL简体中文语言包+序列号
- Linux下c语言多线程编程
- VS2012快捷方式的路径
- netbeans 插件安装
- 湖南中医药大学成考2022年下学期网络课程学习与考试工作安排
- 解决MacBook浏览器打开北京工作居住证系统问题
热门文章
- Spring个人深入学习路线图
- 非静默授权没有弹出弹框_网易考拉Android统一弹框
- 四川文科高考300分可以上什么专科
- us域名,什么是us域名?
- 萝卜开会直播NO.2 | 换一个十年,感受不一样的世界
- ChemDraw如何画聚合物,看完就知道了!
- 【解决】ocam录制失败。 导致: WASRecord: pAudioClient- Initialize failed. (hr=0x80070005
- 2023轻薄投影仪首选:极米Z6X Pro入手超值!
- 渗透测试面试问题集合(转载自己看,链接在开头)
- java程序无法启动:Unsupported major.minor version 51.0