第三方登录-pc支付宝扫码登录流程

news2024/12/23 10:26:21

最近有个奇葩的需求,用户要支持支付宝扫码登录。这个需求很少见,那就做一下,看起来有点难,其实很简单。
先看结果
在这里插入图片描述

流程梳理

在这里插入图片描述

核心代码

获取支付宝扫码页面的url

	// 获取支付宝扫码登录页面的url
  async function getZFBLoginUrl() {
    try {
      let redirectUrl = 'https://yx.hubeidaily.net/zfblogin'; 
      let res: any = await getAuthAlipayPcUrl({ redirectUrl });
      if (res?.code !== 200) return;
      let url = res.data;
      window.open(url);
    } catch (error) {}
  }

<div onClick={() => getZFBLoginUrl()}>支付宝扫码登录</div>

在指定页面检测是否绑定账号

Zfblogin.tsx 空白页面

let urlState = useGetUrlParams('state');
let code = useGetUrlParams('auth_code');
const [token, setToken] = useAtom(tokenStore);
const setUserInfo = useSetAtom(userInfoStore);
const navigate = useNavigate();

useEffect(() => {
  if (urlState) isBinding(code, urlState);
}, []);


// 判断是否绑定
async function isBinding(code: string, state: string) {
  try {
    let params = { auth_code: code, state };
    let res: any = await getAuthAlipayAuthorize(params);
    console.log('判断是否绑定-res: ', res);
    if (res.code === 200) {
      toast('登录成功', 'success');
      setUserInfo(res.data.user);
      setToken(res.data.token);
      setTimeout(() => {
        handleLoginSuc();
      }, 1000);
    } else if (res.code === 10000) {
      // 未绑定
      navigate('/accountBind?type=zfb&state=' + state);
    } 
  } catch (error) { }
}

用已有账号绑定支付宝账号

AccountBind.tsx 账号绑定页面,手机号验证码绑定

  1. 如果有账号,直接绑定,并登录
  2. 如果没有账号,去注册
    let state = useGetUrlParams(‘state’); // state支付宝绑定时需要,支付宝返回来的
 // 提交
 const submit = async () => {
   let params = {
     ...allData,
     state: state,
   };
   try {
     setLoading(true);
     let res: any = await postAuthAlipayPcPersonBind(params);
     console.log('支付博绑定-res: ', res);
     if (res.code === 200) {
       toast('绑定成功', 'success');
       setUserInfo(res.data.user);
       setToken(res.data.token);
       setTimeout(() => {
         handleLoginSuc();
       }, 1000);
     } else if (res.code === 10001) {
       // 未注册
       toast('你还未注册,请先注册', 'warnning');
       setTimeout(() => {
         showLoginCpn();
       }, 1000);
     }
   } finally {
     setLoading(false);
   }
 };

未注册,则注册并登录

register.tsx 注册页面,注册绑定登录;区分普通登录和支付宝登录

  let state = useGetUrlParams('state'); // state 微信、支付宝绑定时需要

  // 提交
  const submit = async () => {
    try {
      let params = await formRef?.current?.validateFieldsReturnFormatValue();
      let res: any;
      if (!state) {
        // 普通注册
        res = await postAuthRegisterPerson(params);
      } else {
        // 支付宝注册
        params.state = state;
        res = await postAuthAlipayPcPersonRegister(params);
      }
      if (res.code === 200){}  // 成功后再执行相应逻辑
    } catch (error) {
      setLoading(false);
      console.log('error: ', error);
    }
  };

至此,大功告成;
其实,这里边核心东西不难,前端就是调调api,但是交互和测试会比较麻烦,要考虑注册、登录、绑定等一系列的交互。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1326275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL概括与SQL分类

文章目录 一、计算机语言二、SQL语言三、数据库系统四、MySQL简介 一、计算机语言 二、SQL语言 三、数据库系统 四、MySQL简介

如何通过宝塔面板搭建一个MySQL数据库服务并实现无公网ip远程访问?

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…

flink sql1.18.0连接SASL_PLAINTEXT认证的kafka3.3.1

阅读此文默认读者对docker、docker-compose有一定了解。 环境 docker-compose运行了一个jobmanager、一个taskmanager和一个sql-client。 如下&#xff1a; version: "2.2" services:jobmanager:image: flink:1.18.0-scala_2.12container_name: jobmanagerports:…

Kafka 如何保证高可用?

Kafka 的基本架构组成是&#xff1a;由多个 broker 组成一个集群&#xff0c;每个 broker 是一个节点&#xff1b;当创建一个 topic 时&#xff0c;这个 topic 会被划分为多个 partition&#xff0c;每个 partition 可以存在于不同的 broker 上&#xff0c;每个 partition 只存…

【新姿势】SpringBoot下时间配置新方式(同文件大小)

SpringBoot Duration 背景&#xff1a; 在SpringBoot项目中&#xff0c;我们经常需要配置时间参数&#xff0c;作为某一动作的间隔。以往我们通常是在配置文件中定义字段后&#xff0c;直接设置对应的秒或毫秒值&#xff0c;遇到计算时&#xff0c;直接在此基础上做运算。这种…

标准解析|海格里斯HEGERLS四向车调度算法如何解决同层多车车辆路径规划和避让问题?

随着当前各大企业对仓储存储需求的不断攀升&#xff0c;仓储货架业已进入智能自动化系统集成时代&#xff0c;从单一的货架存储已慢慢发展为货架穿梭车提升机拣选系统控制软件仓库管理软件等集成的仓储解决方案&#xff0c;如四向穿梭车系统&#xff0c;多层穿梭车系统&#xf…

解决:OSError: cannot write mode RGBA as JPEG

解决&#xff1a;OSError: cannot write mode RGBA as JPEG 文章目录 解决&#xff1a;OSError: cannot write mode RGBA as JPEG背景报错问题报错翻译报错位置代码报错原因解决方法参考今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报错&#xff1a; Traceback…

CodeBlocks配置WinLibs

一、准备工作 1、去Code::Blocks - Browse /Binaries/Nightlies at SourceForge.net下载CodeBlocks最新的nightly build版本&#xff0c;并下载wxWidget dll和Mingw64 dll库文件。 我下载的CB 13411 &#xff0c;Mingw64dlls13.1.0.7z&#xff0c;wxmsw32u_gcc_cb_wx324_2D_g…

​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化

2022年亚马逊云科技re:Invent盛会于近日在拉斯维加斯成功召开&#xff0c;吸引了众多业界精英和创新者。亚马逊云科技边缘服务副总裁Jan Hofmeyr在演讲中分享了关于亚马逊云科技海外服务器边缘计算的最新发展和创新成果&#xff0c;引发与会者热烈关注。 re:Invent的核心主题是…

从Gitee克隆项目、启动方法

从gitee克隆VUE项目到本地后&#xff0c;不能直接运行&#xff0c;需要进行npm install安装node_modules文件夹里面的内容&#xff0c;因为在git上传的时候&#xff0c;一般都会过滤到node_modules中的依赖文件。 安装依赖以后&#xff0c;启动通过npm run serve启动项目出错。…

MySQL-1

1 数据库基础概念 Data数据 对客观事物的符号表示&#xff0c;如图形符号、数字、字母等&#xff0c;数据是数据库中存储的基本对象。2. DB数据库数据库(Database,简称DB)的定义&#xff1a;“按照数据结构来组织、存储和管理数据的仓库” 3. DBMS数据库管理系统概念&#xff…

多媒体信息化建设,动态数据中心,深入理解分布式系统

目录 一、前言二、双活数据中心三、数据备份方式四、设计双活数据中心需要考虑的问题1、延迟和稳定性2、Quorum/ Tie-Breaker3、工作负载 五、动态数据中心六、深入理解分布式系统1、内容介绍2、作者简介 大家好&#xff0c;我是哪吒。 文末送5本《深入理解分布式系统》 一、…

Amazon Toolkit — CodeWhisperer 使用

tFragment--> 官网&#xff1a;https://aws.amazon.com/cn/codewhisperer/?trkcndc-detail 最近学习了亚马逊云科技的 代码工具&#xff0c;感慨颇多。下面是安装 和使用的分享。 CodeWhisperer&#xff0c;亚马逊推出的实时 AI 编程助手&#xff0c;是一项基于机器学习…

Linux服务器nginx部署Vue前端(详细版)

提示&#xff1a;适用于前后端项目的部署 文章目录 前言一、打包前端文件二、下载和部署Nginx三、配置conf文件启动nginx 前言 搜索到这篇文章想必你已经对Nginx比较了解&#xff0c;我也不对Nginx进行介绍赘述了&#xff0c;只需要明白Nginx本身也是一个静态资源的服务器&…

【MYSQL】MYSQL 的学习教程(三)之索引核心知识点

1. 什么是索引&#xff1f; 索引是一种能提高数据库查询效率的数据结构&#xff0c;一般存储在磁盘的文件中&#xff0c;它是占用物理空间的 适当的索引能提高查询效率&#xff0c;过多的索引会影响数据库表的插入和更新功能。 2. 索引的优劣势 优势&#xff1a; 提高数据…

GEM5 Garent CPU cache消息传递路径:1. NI部分

简介 我们仔细分析下图怎么连的&#xff0c;以及消息传递路径。 图来自https://www.gem5.org/documentation/general_docs/ruby/ 代码的连接 fs.py->ruby.py-> gem5/configs/ruby/MESI_Two_Level.py 中的 create_system( options, full_system, system, dma_ports, b…

STM32单片机项目实例:基于TouchGFX的智能手表设计(7)MVP架构下的交互逻辑设计

STM32单片机项目实例&#xff1a;基于TouchGFX的智能手表设计&#xff08;7&#xff09;MVP架构下的交互逻辑设计 目录 一、概述 二、MVP架构下的交互逻辑 一、概述 本文例程是基于 TouchGFX 的智能手表设计—Designer 软件 UI 设计的例程 0B-2_STM32U575_MVP_Interactive工…

【点选验证码识别】某招标网站反爬虫分析与验证码自动识别

文章目录 1. 写在前面2. 风控描述3. 验证码裁剪4. 验证码识别 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣…

Redis基础篇-002 初识Redis

1、认识NoSQL 1.1 概念 NoSQL是一个非关系型数据库。 常见的NoSQL有&#xff1a;Redis、MongoDB 1.2 NoSQL与SQL的区别 类别SQLNoSQL数据结构结构化非结构化数据关联关联非关联查询方式SQL非SQL事务特性ACIDBASE存储方式磁盘内存扩展性垂直水平使用场景1&#xff09;数据结…

Uniapp + Vue3 封装请求工具挂载全局

新建request.js工具类 const http {// baseUrl 地址baseUrl: http://localhost:8080,// 请求方法request(config) {// config&#xff1a;请求配置对象&#xff0c;具体参照uniapp文档config beforeRequest(config)// 请求地址拼接config.url this.baseUrl config.url// 异…