博客> 集成微信登录方案设计
集成微信登录方案设计
2018-11-13 08:16 评论:0 阅读:1438 阮延超
属性 类扩展

理由
与web 端统一, 提高用户登录简易及融合社交因素

准备工作 WeChat iOS SDK 以及 各种Developer权限开通获取Appid 及 Secret 微信登录是基于OAuth2.0协议标准授权登录系统。

授权流程说明  Screen Shot 2016-02-17 at 09.41.01.png OS应用中注意 : 考虑到iOS应用商店审核指南中的相关规定,建议接入微信登录时,先检测用户手机是否已安装微信客户端,对未安装的用户隐藏微信登录按钮,只提供其他登录方式(一账通,及普通登录)。 建议将Appsecret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。

在登录界面,如果用户有安装微信APP 则显示微信登录图标; 若用户手机上有安装微信APP,则判断是否有微信账号在登录状态; 若用户微信没有登录,则弹出微信登录界面,登录后获取用户权限; 若用户微信已在登录状态,提示用户,是否允许授权,若不允许授权,结束登录,调回至登录页面; 若用户允许授权,提示用户是否绑定手机号,若用户选择不绑定手机号,直接跳转至流程9,完成登录; 授权临时票据(code)为获取Access Token做铺垫 根据Web端逻辑分析看,服务器端担任 (微信Access Token 的获取, 个人信息的获取, 匹配数据库,查看是不是已有的用户, 是否绑定手机号 等逻辑)获取服务器端Token及UserId 如果用户已绑定手机号, 用户登录成功 获取用户的信息 若用户未绑定手机号,进入绑定手机号流程,绑定的手机, 昵称和头像是系统所获的;。 在微信登录信息搜不出好用户的条件下,绑定手机号匹配用户,整合用户信息 ,昵称和头像是系统所获的,完成登录 在微信登录信息搜不出好用户的条件下,绑定新手机号完成手机绑定后,完成登录, 昵称和头像是微信所获的; 以上流程设计考虑到了web端已经实现的逻辑上加以添加。 web端微信登录逻辑概述:通过扫二维码 获取微信的权限, web端提取Access Token 而后通过Access Token 请求userinfo。 从userinfo 提取 unionid (用户在微信平台的唯一标示)来匹配用户是否已有账户。 如果存在就返回类似用户登录的信息, 如果不存在则必须通过绑定手机号 请求验证码来补全注册。 这里有夹缝 就是当微信登录是新号而绑定的是已有的手机号, 据我分析web端是返回已有的用户数据而不是weixin里提取的用户信息。 1 iOS 端的请求事咧: 第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。

第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

参数 是否必须 说明 appid 是 应用唯一标识,在微信开放平台提交应用审核通过后获得 scope 是 应用授权作用域,如snsapi_userinfo state 不必传 用于保持请求和回调的状态,授权请求后原样带回给第三方。 构造SendAuthReq结构体, 及第三方向微信终端发送一个SendAuthReq消息结构

返回说明 用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,SDK通过SendAuth的Resp返回数据给调用方。

  1. 通过code换取access_token;
  2. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

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

  1. 通过code获取access_token 获取第一步的code后,请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数 是否必须 说明 appid 是

应用唯一标识,在微信开放平台提交应用审核通过后获得 secret 是

应用密钥AppSecret,在微信开放平台提交应用审核通过后获得 code 是 用于保持请求和回调的状态,授权请求后原样带回给第三方。 grant_type 是 填authorization_code

返回说明

返回值 说明 access_token 接口调用凭证 expires_in access_token接口调用凭证超时时间,单位(秒) refresh_token 用户刷新access_token openid 授权用户唯一标识 scope 用户授权的作用域,使用逗号(,)分隔 unionid 当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段 正确的返回:

错误返回样例: {"errcode":40029,"errmsg":"invalid code”}

补充说明“刷新access_token有效期” access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短。而 refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

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

传递参数

参数 是否必须 说明 appid 是

应用唯一标识,在微信开放平台提交应用审核通过后获得 refresh_token 是 填写通过access_token获取到的refresh_token参数 grant_type 是 填 refresh_token

返回参数

返回值 说明 access_token 接口调用凭证 expires_in access_token接口调用凭证超时时间,单位(秒) refresh_token 用户刷新access_token openid 授权用户唯一标识 scope 用户授权的作用域,使用逗号(,)分隔 unionid 当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段

  1. 通过access_token调用接口 获取access_token后,进行接口调用,有以下前提:

参数 是否必须 说明 appid 是

应用唯一标识,在微信开放平台提交应用审核通过后获得 refresh_token 是 填写通过access_token获取到的refresh_token参数 grant_type 是 填 refresh_token 对于接口作用域(scope),能调用的接口有以下: 授权作用域(scope) 接口 接口说明

snsapi_base /sns/oauth2/access_token

/sns/oauth2/refresh_token

/sns/auth 通过code换取access_token、refresh_token和已授权scope

刷新或续期access_token使用

检查access_token有效性 snsapi_userinfo /sns/userinfo 获取用户个人信息

  1. 授权后可调用接口

通过code获取access_token的接口。

http请求方式: GET https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 返回 success example: { "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }

fail example: { "errcode":40029,"errmsg":"invalid code" }

检验授权凭证(access_token)是否有效

http请求方式: GET https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

返回 success example: { "errcode":0,"errmsg":"ok" }

fail example: { "errcode":40003,"errmsg":"invalid openid" }

获取用户个人信息(UnionID机制)

注意,在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常情况。

http请求方式: GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

返回 success example: { "openid":"OPENID", "nickname":"NICKNAME", "sex":1, "province":"PROVINCE", "city":"CITY", "country":"COUNTRY", "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", "privilege":[ "PRIVILEGE1", "PRIVILEGE2" ], "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"

}

fail example: { "errcode":40003,"errmsg":"invalid openid" }

调用频率限制

接口名 频率限制 通过code换取access_token 1万/分钟 刷新access_token 5万/分钟 获取用户基本信息 5万/分钟

Wechat 官方 移动应用微信登录开发指南 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN

收藏
0
sina weixin mail 回到顶部