uniapp适配支付宝,微信登录模块

2023-11-07

uniapp 微信,支付宝登录

1.获取手机号2.获取个人信息(头像,昵称)
<template>
	<!-- #ifdef MP-WEIXIN -->
	<uni-popup ref="popup" type="center">
		<view class="center" v-if="type == 1">
			<view class="text">
				<span></span>
				<text style="color: #333333;">授权微信登录</text>
			</view>
			<image src="https://km-hz-test.oss-cn-hangzhou.aliyuncs.com/uni_mini/images/icon/wechart.png" mode=""></image>
			<button class='phone-bottom' type='primary' open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">微信用户一键登录</button>
		</view>
		<view v-if="type == 2" class="center">
			<view class="text">
				<span></span> 
				<text style="color: #333333;">授权微信头像,昵称</text>
			</view>
			<image src="https://km-hz-test.oss-cn-hangzhou.aliyuncs.com/uni_mini/images/icon/wechart.png" mode=""></image>
			<button class='phone-bottom' type='primary' @tap="getUserInfo()">授权微信头像,昵称</button>
		</view>
	</uni-popup>
	<!-- #endif -->
	
	
	<!-- #ifdef MP-ALIPAY -->
	<uni-popup ref="popup" type="center">
		<view class="center" v-if="type == 1">
			<view class="text">
				<span style="background-color: #1568dd;"></span> 
				<text style="color: #333333;">授权支付宝登录</text>
			</view>
			<image src="https://km-hz-test.oss-cn-hangzhou.aliyuncs.com/uni_mini/images/icon/alipay.png" mode="widthFix"></image>
			<button class='alipay-buttom' open-type="getAuthorize" @getAuthorize="getAlPhoneNumber" @error="onAuthError" scope="phoneNumber">支付宝用户一键登录</button>
		</view>
		<view v-if="type == 2" class="center">
			<view class="text">
				<span style="background-color: #1568dd;"> 1</span> 
				<text style="color: #333333;">授权支付宝头像,昵称</text>
			</view>
			<image src="https://km-hz-test.oss-cn-hangzhou.aliyuncs.com/uni_mini/images/icon/alipay.png" mode="widthFix"></image>
			<button
			    size="default"
			    open-type="getAuthorize"
			    scope="userInfo"
			    @getAuthorize="onGetAuthorize"
			    @error="onAuthError"
				class='alipay-buttom'
			  >
				授权支付宝头像,昵称
			  </button>
		</view>
	</uni-popup>
	<!-- #endif -->
	
</template>
引入弹框组件,VUEX。vuex 的作用是储存uni.login获取的code 用来做全局的判断,省略反复调用
import { mapState, mapMutations } from 'vuex';
import { uniPopup } from '../../uni_modules/uni-popup/uni-popup.vue';
components: {
			uniPopup
},
data () {
	return {
		type: 1,   // 判断是授权手机号还是用户信息
		userId: '',
	}
},
computed: {
	...mapState(['codeResult'])
},
methods: {
	...mapMutations(['setCodeResult']),
}
登录弹框开启,关闭
open () {
	this.$refs.popup.open()
},
close() {
	this.$refs.popup.close();
},
微信,支付宝登录获取code 存入全局
getCode () {
	// #ifdef MP-ALIPAY
	uni.login({
		provider: 'alipay',
		success: ( res ) => {
			let { code } = res;
			this.getUnionldAlipay(code);
		},
	});
	// #endif
	
	// #ifdef MP-WEIXIN
	uni.login({
		provider: 'weixin',
		success: ( res ) => {
			let { code } = res;
			this.getUnionldWx(code);
		},
	});
	// #endif
},
getUnionldWx (code) {
	this.$request('/code2session', {code,clientSource:4301}).then((res)=>{
		res.resultData.code = code;
		this.setCodeResult(res.resultData);
	})
},
getUnionldAlipay (code) {
	this.$request('/oauthToken', {code,clientSource:4293}).then((res)=>{
		res.resultData.code = code;
		this.setCodeResult(res.resultData);
	})
},
微信,支付宝获取个人手机号或个人信息,得到需要的token 和其他一些信息存入localStorage。this.$emit(‘callback’) 执行登录成功回调
// 支付宝登录
onGetAuthorize() {
	let _this = this;
	my.getOpenUserInfo({
		fail: res => {
		console.log(res);
		},
		success: res => {
			const userInfo = JSON.parse(res.response).response; // 以下方的报文格式解析两层 response
			console.log('支付宝获取用户信息', userInfo)
			let faceLink = userInfo.avatar;
			let name = userInfo.nickName;
			let userId = _this.userId;
			_this.$request('addUserInfo', {faceLink, name, userId}).then((res)=>{
				_this.$refs.popup.close()
				this.type = 1;
				this.$emit('callback')
			})
		
		},
  });
},
getAlPhoneNumber() {
	my.getPhoneNumber({ 
		scopes: "auth_user",
		success: result => {
			var resData = JSON.parse(result.response);
			console.log('result',resData)
			this.$request('/phoneLogin',{content: resData.response,clientSource:4293,alipayUserId: this.codeResult.userId }).then((res)=>{
				uni.setStorageSync('km_openId',this.codeResult.userId)
				uni.setStorageSync('km_phone',res.resultData.phone)
				uni.setStorageSync('km_userId', res.resultData.userId)
				uni.setStorageSync('Authorization',res.resultData.auth.accessToken);
				
				this.$emit('callback')
				// res.resultData.needAddInfo
				
				if (res.resultData.needAddInfo) {
					this.userId=res.resultData.userId;
					this.type = 2;
				} else {
					this.$refs.popup.close();
				}
			})
		},
		fail: res => {
			uni.showToast({
				title: "需要您授权手机号码",
				icon: 'none',
				duration: 2000
			})
		}
	});
},






// 微信登录
getUserInfo () {
	let _this = this;
	uni.getUserProfile({
	    desc:'Wexin',     // 这个参数是必须的
		success:res=>{
			console.log(res)
			let faceLink = res.userInfo.avatarUrl;
			let name = res.userInfo.nickName;
			let userId = _this.userId;
			_this.$request('/addUserInfo', {faceLink, name, userId}).then((res)=>{
				_this.$refs.popup.close()
				this.type = 1;
				this.$emit('callback')
			})
		},
	    fail:err=>{
		    console.log(err)
	    }
    })
},

getPhoneNumber(val){
	let _this = this;
	console.log('授权手机号获取到的数据', val)
	let {code, openId, sessionKey, unionId } = this.codeResult;
	let { encryptedData, iv } = val.detail;
	
	this.$request('/wx-agent/userInfo2/wx/phoneLogin',{code, openId, sessionKey, unionId,encryptedData, iv,clientSource:4301 }).then((res)=>{
		uni.setStorageSync('km_openId',openId)
		uni.setStorageSync('km_phone',res.resultData.phone)
		uni.setStorageSync('km_userId', res.resultData.userId)
		uni.setStorageSync('Authorization',res.resultData.auth.accessToken);
		this.$emit('callback')
		// res.resultData.needAddInfo
		if (res.resultData.needAddInfo) {
			this.userId=res.resultData.userId;
			this.type = 2;
		} else {
			this.$refs.popup.close();
		}
	})
},
组件使用方法
import loginModule from '@/components/loginModule/index.vue'
components:{
	loginModule,
},
<loginModule ref="loginModule" @callback="callback"></loginModule>
methods: {
	open(){
		this.$refs.loginModule.open();
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uniapp适配支付宝,微信登录模块 的相关文章

  • vue2项目实现excel文件导入导出和拖拽上传

    文章目录 一 excle文件导出 二 excel文件导入 三 文件拖拽上传 四 完整代码 文件导入导出实现逻辑图 一 excle文件导出 导出员工接口返回的是二进制流 axios配置responseType为blob接收二进制流文件为Blo
  • 环信IM Demo登录方式如何修改为自己项目的?

    在环信即时通讯云IM 官网下载Demo 本地运行只有 手机 验证码 的方式登录 怎么更改为自己项目的Appkey和用户去进行登录呢 本文以Web端为例 教大家如何更改代码来实现 1 VUE2 Demo vue2 demo源码下载 vue2
  • 1-创建小程序项目

    注册 打开https mp weixin qq com 点击 立即注册 选择小程序 获取APPID 登录小程序在 开发管理 gt 开发设置 获取 APPID 开发工具 登录小程序在 开发工具 gt 开发者工具 获取 微信开发者工具 创建小程
  • vue中的防抖和节流

    在Vue中 防抖和节流是两种常用的优化技术 用于限制事件的触发频率 以提高页面性能 防抖 Debounce 是指在事件被触发后 等待一段时间后再执行回调函数 如果在这段等待时间内 事件又被触发 则重新计时 防抖通常用于限制重复触发频率较高的
  • 事件委托Tab栏切换

  • Vue + Element-ui组件上传图片报错问题解决方案

    在使用Vue和Element ui组件上传图片时 可能会遇到一些报错问题 以下是一些常见的问题及解决方案 报错 TypeError Cannot read property name of undefined 解决方案 这个错误通常是因为在
  • Typecho 最新XC主题 去除域名授权全解密源码

    简介 Typecho 最新XC主题 去除域名授权全解密源码 这是一款多样式主题 首页支持六种主题样式 支持Pjax优化访问速度 多种单页 如友链 说说等 评论支持表情 自定义编辑器 支持其他样式功能 该主题功能性挺高 比较花里胡哨 感觉有一
  • CMAKE_MAKE_PROGRAM is not set 解读

    目录 CMAKE MAKE PROGRAM 未设置 错误原因 解决方案 示例1 GNU Make 示例2 Ninja CMakeLists txt 的结构 示例 CMakeLists txt 文件 总结 CMAKE MAKE PROGRAM
  • AI壁纸画展头像表情包流量主微信抖音小程序开源版开发

    AI壁纸画展头像表情包流量主微信抖音小程序开源版开发 以下是AI壁纸画展头像表情包流量主微信抖音小程序开源版的开发功能列表 用户注册和登录 实现用户注册和登录功能 包括手机号登录 第三方登录等方式 图片上传和展示 用户可以上传自己的图片或选
  • 每天10个前端小知识 <Day 8>

    1 Javascript中如何实现函数缓存 函数缓存有哪些应用场景 函数缓存 就是将函数运算过的结果进行缓存 本质上就是用空间 缓存存储 换时间 计算过程 常用于缓存数据计算结果和缓存对象 缓存只是一个临时的数据存储 它保存数据 以便将来对
  • 前端基础:回顾es6相关知识

    Author note 题记 ECMAscript is international standard of javascript ECMA 是 js的国际标准版语言 let and const 为什么之前用var现在需要用let cons
  • 点击存储到固定时间清除存储

    这段代码 无意间想到的 随便写了下来 运行 根据点击之后传递一个参数 将他存入本地存储 方便测试为10秒 10秒后触发下一个事件 清除本地存储 结束
  • 低代码-详情页组件设计

    效果图 详情页数据结构定义 layout 按钮数据 buttonLayout headButton 页头按钮 footButton 页脚按钮 详情页表单配置 config 配置组件列表 detailLayout 默认行为 进表单初始化 只展
  • 新手也能看懂的【前端自动化测试入门】!

    前言 最近在网上搜索前端自动化测试相关的文档 但是发现网上的文章都是偏使用 没有把一些基础概念说清楚 导致后续一口气遇到一些 karma Jasmine jest Mocha Chai BDD 等词汇的时候很容易一头雾水 这次一方面整理一下
  • 【计算机选题推荐】校园兼职小程序的设计与实现

    精彩专栏推荐订阅 在下方主页 作者主页 计算机毕设木哥 文章目录 一 项目介绍 二 开发环境 三 系统展示 四 代码展示 五 项目总结 font color fe2c24 大家可以帮忙点赞 收藏 关注 评论啦 一 项目介绍 随着高等教育的普
  • Vue 如何使用WebSocket与服务器建立链接 持续保持通信

    WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求 链接建立后 客户端和服务器端就可以通过TCP链接直接交互数据 WebSocket链接后可以通过 send 方法来向服务器发送数据 并通过 onn
  • vue实现 marquee(走马灯)

    样式 代码 div class marquee prompt div class list prompt span class prompt item span div div data return listPrompt xxx xxxx
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升
  • 获取年与年之间的所有年份

    function getYearsBetween startYear endYear var years 存放结果的数组 for var year startYear year lt endYear year years push year
  • 如何在 Python 脚本中使用 Google OAuth2

    在使用 Python 脚本将视频上传到 YouTube 频道时 若希望将视频上传到第二个频道 需要解决 OAuth2 授权的问题 解决方案 创建新的 Google Cloud 项目 from google oauth2 import ser

随机推荐

  • leetcode分类刷题:滑动窗口(三、两个序列+窗口定长类型)

    1 通过对滑动窗口前两个题型的总结 我们几乎已经习惯在给定的一个序列里使用滑动窗口的模板解题了 本次对应的 三 两个序列 窗口定长类型 也是考察连续子数组 连续子串问题 只不过这次会给定两个序列 判断短序列在长序列中是否存在字母异位词或排列
  • SSH 与 SSM

    SSM 指 SpringMVC Spring 和 MyBatis SSH 指 Struts Spring 和 Hibernate 两种框架的对比和对照为 控制器 事务层 持久层 SSH Struts Spring Hibernate SSM
  • Vue组件学习之组件自定义事件

    主要介绍组件的自定义事件的概念 使用等 何为组件自定义事件 组件自定义事件是一种组件间的通信方式 方向是 子组件 gt 父组件 使用场景 A是子组件 B是父组件 如果要把B的数据传给A 可以使用props配置项 如果要把A的数据转给B 就要
  • 【Springboot】集成百度地图实现定位打卡功能

    目录 第一章 需求分析 第二章 概要设计 第三章 详细设计 3 1 环境搭建 3 1 1 获取百度地图ak 3 1 2 创建springboot项目 3 2 配置application properties 3 3 配置pox xml 3
  • pyTorch基本数据类型

    pyTorch基本数据类型 文章目录 pyTorch基本数据类型 首先比较一下python和pytorch的数据类型区别 pyhon的特点 pytorch的特点 维度为0的标量 维度为1的向量 维度为2的Tensor 维度为3的Tensor
  • eclipse学习心得

    1运行程序 在后台遇到断点时 进入debug调试状态 作用域 功能 快捷键 全局 单步返回 F7 全局 单步跳过 F6 全局 单步跳入 F5 全局 单步跳入选择 Ctrl F5 全局 调试上次启动 F11 全局 继续 F8 全局 使用过滤器
  • js设置input只保留一位小数

    前言 input中只保留小数点后一位 直接不让他输入 实现方法 这里主要用 input事件来监听 vue中的话用 input input中加上 type text 注意这里有坑 不能用数字类型 谷歌 360可以 火狐会报错 oninput
  • C++的rapidjson库的安装和用法(包括Windows和Linux)

    C 的rapidjson库的安装和用法 包括Windows和Linux 1 RapidJson在Linux下安装 1 确保安装了git以及cmake make 2 在github官网上clone下RapidJson的工程 git clone
  • SpringMVC实现文件上传和下载功能

    实现文件上传和下载功能 一 文件上传功能 目录结构 设立流程 1 数据库表结构 2 dao包 3 po包 4 service包 5 controller包 6 resources包 7 webapp 8 spring的xml配置文件 9 导
  • JSP实现简单用户登录

    使用初级的JSP代码实现用户登录 使用TXT文件存储用户数据 初学JSP与大家分享一些自己的代码 index jsp
  • 最小二乘法圆拟合(附完整代码)

    文章目录 一 2D圆弧拟合 1 不经过给定起点与终点 2 精确经过给定起点与终点 二 3D圆弧拟合 一 2D圆弧拟合 1 不经过给定起点与终点 平面圆的一般方程为 x 2
  • RFID医疗耗材柜管理系统中的解决方案

    1 社会背景 医疗物资管理 传统的管理流程由于周期短 效率高 被各大医院广泛采用 但随之高值耗材种类激增所带来的准入标准弱化 信息追踪困难 管理责任不明确 历史数据统计分析困难等一系列问题日趋严峻 其次医院内部设备 财务和临床科室相互独立兼
  • 【unordered_map和unordered_set的封装】

    文章目录 1 哈希表的基本改造 2 迭代器 2 1 迭代器的大致框架 2 2 运算符重载的实现 2 3 哈希表的完善 3 unordered map和unordered set的封装 3 1 unordered map 3 2 unorde
  • MPC入门与Matlab实现

    本文为B站视频 你还在用PID MPC模型预测控制 从公式到代码 的学习笔记 强烈推荐去看这位大佬的视频 链接放在了最后 别忘了给大佬一键三连哈 MPC入门与Matlab实现 前言 1 模型 2 预测 3 滚动优化 参考轨迹 优化目标 4
  • python使用pymysql总是超时的解决方案

    可以使用如下方法对代码进行包裹 import pymysql import yaml from loguru import logger mysql config db my db host 127 0 0 1 user test user
  • SQLite多线程读写

    多线程读写 SQLite 实质上是将数据写入一个文件 通常情况下 在应用的包名下面都能找到 xxx db 的文件 拥有 root 权限的手机 可以通过 adb shell 看到 data data packagename databases
  • Java程序员该如何突破瓶颈,成长为优秀的架构师

    一 如何定义架构师 Java架构师 首先要是一个Java程序员 熟练掌握使用各种框架 并知道它们实现的原理 Java虚拟机原理 调优 懂得JVM能让你写出性能更好的代码 池技术 什么对象池 怎么解决并发量 连接池 线程池 Java反射技术
  • MATLAB的一些简单命令(1)

    关键字 if A y prctile input linspace disp 注释 本博客讲解了一些matlab常用简单命令的含义 这些命令简单却容易忘记 所以便整合了一下 至于较为复杂的命令 则将会单独写博客记录 为什么代码段设置选项没有
  • 华为OD机试-不爱施肥的小布-2022Q4 A卷-Py/Java/JS

    题目 某农场主管理了一大片果园 fields表示不同果林的面积 单位 m 2 现在要为所有的果林施肥且必须在n天之内完成 否则影响收成 小布是果林的工作人员 他每次选择一片果林进行施肥 且一片果林施肥完后当天不再进行施肥作业 假设施肥机的能
  • uniapp适配支付宝,微信登录模块

    uniapp 微信 支付宝登录 1 获取手机号2 获取个人信息 头像 昵称