微信授权移动端登录以及确定唯一用户问题。

本文详细介绍了移动端应用如何通过微信登录,包括OAuth2.0授权流程、注册微信开放平台、对接SDK、获取用户授权、access_token与refresh_token管理以及使用UnionId确保跨平台用户唯一性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 😜           是江迪呀
  • ✒️本文关键词移动端微信登录
  • ☀️每日   一言知行合一!

一、移动端使用微信登录流程

1.1 实际业务流程图:

在这里插入图片描述

1.2 微信授权登录流程图:

在这里插入图片描述

图中名词解释:

(1)什么是OAuth2.0?

OAuth 2.0(Open Authorization 2.0)是一种用于授权的开放标准,旨在允许第三方应用程序访问用户另一个服务提供者上的资源,而无需共享用户的凭证。该协议广泛用于身份验证和授权的领域,特别是在互联网服务和应用程序中。

(2)角色

  • 资源所有者(Resource Owner): 拥有资源的用户,这是指 —— 用户

  • 客户端(Client): 试图访问资源的应用程序或服务,这里指 —— 第三方应用

  • 授权服务器(Authorization Server): 负责验证资源所有者的身份并授予客户端访问资源的权限,这里指——微信服务器

  • 资源服务器(Resource Server): 存储和管理受保护的用户资源,仅在得到授权后提供这些资源,这里指——微信服务器

二、步骤

2.1 注册微信开放平台账号

官网地址入口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注册后获取AppIdsecret

2.2 对接SDK(前端需要做)

(1)IOS对接SDK

-(void)sendAuthRequest
{
	//构造SendAuthReq结构体
	SendAuthReq* req =[[[SendAuthReq alloc]init]autorelease];
	req.scope = @"snsapi_userinfo"; // 只能填 snsapi_userinfo
	req.state = @"123";
	//第三方向微信终端发送一个SendAuthReq消息结构
	[WXApi sendReq:req];
}

(2) Android对接SDK

{
	// send oauth request
	Final SendAuth.Req req = new SendAuth.Req();
	req.scope = "snsapi_userinfo"; // 只能填 snsapi_userinfo
	req.state = "wechat_sdk_demo_test";
	api.sendReq(req);
}

2.3 触发微信授权登录

我们以大众点评APP为例:

(1) 拉起微信客户端

有了步骤【2.2】后,用户在APP中点击微信登陆,微信客户端被拉起。

# 请求参数:
appid: 步骤【2.1】注册后可以获取
scope: 应用授权作用域,获取用户个人信息则填写 snsapi_userinfo

在这里插入图片描述

(2) 用户点击【同意】【拒绝】【取消】返回值

{
 	 "ErrCode": {
    "ERR_OK": 0,(用户同意) 
    "ERR_AUTH_DENIED": -4,(用户拒绝授权)
    "ERR_USER_CANCEL": -2(用户取消)
  },
  "code": "用户换取 access_token 的 code,仅在 ErrCode 为 0 时有效",
  "state": "第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用 sendReq 时传入,由微信终端回传,state 字符串长度不能超过 1K",
  "lang": "微信客户端当前语言",
  "country": "微信用户当前国家信息"
}

在这里插入图片描述

在用户同意授权后,我们获得了一个很重要的参数:code

2.3 通过通过 code 获取 access_token(后端需要做)

接口:

GET: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数:

参数是否必须说明
appid应用唯一标识,在微信开放平台提交应用审核通过后获得
secret应用密钥 AppSecret,在微信开放平台提交应用审核通过后获得
code填写第一步获取的 code 参数
grant_type固定填 authorization_code

返回:

{
  "access_token": "ACCESS_TOKEN",
  "expires_in": 7200,
  "refresh_token": "REFRESH_TOKEN",
  "openid": "OPENID",
  "scope": "snsapi_userinfo",
  "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

返回参数说明:

参数说明
access_token接口调用凭证
expires_inaccess_token 接口调用凭证超时时间,单位(秒)
refresh_token用户刷新 access_token
openid接口调用凭证
scope接口调用凭证
unionid接口调用凭证

2.4 获取用户信息(用户需要做)

接口:

GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

入参:

参数是否必须说明
access_token调用凭证
openid普通用户的标识,对当前开发者账号唯一
lang国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为 en

出参:

{
  "openid": "OPENID", //普通用户的标识,对当前开发者账号唯一
  "nickname": "NICKNAME", //普通用户昵称
  "sex": 1, //普通用户性别,1 为男性,2 为女性
  "province": "PROVINCE", //普通用户个人资料填写的省份
  "city": "CITY", //	普通用户个人资料填写的城市
  "country": "COUNTRY", // 国家,如中国为 CN
  "headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
  "privilege": ["PRIVILEGE1", "PRIVILEGE2"],
  "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

出参说明:

参数说明
openid普通用户的标识,对当前开发者账号唯一
nickname普通用户昵称
sex普通用户性别,1 为男性,2 为女性
province普通用户个人资料填写的省份
city普通用户个人资料填写的城市
country国家,如中国为 CN
headimgurl用户头像,最后一个数值代表正方形头像大小(有 0、46、64、96、132 数值可选,0 代表 640*640 正方形头像),用户没有头像时该项为空
privilege用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
unionid用户统一标识。针对一个微信开放平台账号下的应用,同一用户的 unionid 是唯一的。

2.5 刷新access_token

(1) 刷新token

在步骤【2.4】中我们需要获取微信用户的信息,需要使用到access_token 。这个令牌有效期是2小时。refresh_token 拥有较长的有效期(30 天)且无法续期,当 refresh_token 失效的后,需要用户重新授权后才可以继续获取用户头像昵称。

接口:

GET https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

入参:

参数是否必须说明
appid应用唯一标识
grant_type填 refresh_token
refresh_token填写通过 access_token 获取到的 refresh_token 参数

出参:

{
  "access_token": "ACCESS_TOKEN",
  "expires_in": 7200,
  "refresh_token": "REFRESH_TOKEN",
  "openid": "OPENID",
  "scope": "SCOPE"
}

(2)验证token是否有效

接口:

GET https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

入参:

参数是否必须说明
access_token调用接口凭证
openid普通用户标识,对该公众账号唯一证

出参:

token有效返回:

{
  "errcode": 0,
  "errmsg": "ok"
}

如果access_token 失效了,那么需要重新让用户授权登录

三、如何确定唯一用户

3.1 使用UnionId确定唯一用户

如果我们的产品拥有移动端(IOS/Andriod)网页端微信小程序,都是用微信登录,同一个用户使用在上述的客户端登陆,那么我们如果在自己的后端服务器中确定是同一个用户呢?
答案是:通过UnionId

在这里插入图片描述

这里我举个微信小程序和移动端关联确定唯一用户的实例:

微信小程序登录接口微信开放平台绑定了小程序后,会返回UnionId
在这里插入图片描述

3.2 绑定微信小程序:

在这里插入图片描述
测试返回值:

在这里插入图片描述
返回了UnionId

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是江迪呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值