功能概述

扫码登录能力,指的是开发者可在移动应用内使用此能力,拉取二维码,用户使用微信客户端扫描二维码后可以登录此移动应用。此能力可被应用在多设备登录、智能硬件、电视盒子等场景。


iOS 扫码授权获得 Code 流程

步骤一:请求函数

(BOOL)Auth:(NSString *)appId nonceStr:(NSString *)nonceStr timeStamp:(NSString*)timeStamp scope:(NSString *) scope signature:(NSString *)signature schemeData:(NSString *)schemeData;

参数说明

参数 是否必须 说明
appid 应用唯一标识
scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,APP 所拥有的 scope
nonceStr 一个随机的尽量不重复的字符串,用来使得每次的 signature 不同
timeStamp 时间戳
signature 签名
schemeData 会在扫码后拼在 scheme 后

步骤二:监听二维码回调,回调的时候显示二维码

 (void)onAuthGotQrcode:(UIImage *)image;  //得到二维码

步骤三:用户确认登录之后回调 authCode

-(void)onAuthFinish:(int)errCode AuthCode:(NSString *)authCode;    //成功登录

Android 扫码授权流程


流程

首先 APP 通过 IDiffDevOAuth.auth()接口发起授权,然后在 OAuthListener.onAuthGotQrcode()回调接口中获取二维码,在 APP 中展示二维码,最后用户通过微信扫码,授权.


接口

IDiffDevOAuth

boolean auth(String appId, String scope, String noncestr, String timestamp, String signature, OAuthListener listener)

参数说明

参数 是否必须 说明
appId 应用唯一标识
scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,APP 所拥有的 scope
noncestr 一个随机的尽量不重复的字符串,用来使得每次的 signature 不同
timestamp 时间戳
signature 签名
listener 授权流程的回调接口

OAuthListener
/**
 * auth之后返回的二维码接口
 *
 * @param qrcodeImgPath 废弃
 * @param imgBuf 二维码图片数据
 */
void onAuthGotQrcode(String qrcodeImgPath, byte[] imgBuf);

/**
 * 用户扫描二维码之后,回调该接口
 */
void onQrcodeScanned();

/**
 * 用户点击授权后,回调该接口
 */
void onAuthFinish(OAuthErrCode errCode, String authCode);

SDK 扫码登录签名算法

获取 Ticket

生成签名之前必须先获取对应的 sdk_ticket。

sdk_ticket 是用于生成签名的临时票据。正常情况下,sdk_ticket 的有效期为 7200 秒,通过 access_token 来获取。由于获取 sdk_ticket 的 api 调用次数非常有限,频繁刷新 sdk_ticket 会导致 api 调用受限,影响自身业务,开发者需在自己的服务存储与更新 sdk_ticket。

1.参考以下文档,使用 APP 的 Appid 和 AppSecret 获取 access_token

2.用第一步拿到的 access_token,采用 http GET 方式请求获得 sdk_ticket:

https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=2

成功返回如下 JSON:

{
	"errcode": 0,
	"errmsg": "ok",
	"ticket": "-p3A5zVP95IuafPhzA6lRR95_F9nZEBfJ_n4E9t8ZFWKJTDPOwccVQhHCwDBmvLkayF_jh-m9HOExhumOziDWA",
	"expires_in": 7200
}

获得 sdk_ticket 之后,就可以生成扫码登录的签名了。


签名生成

签名生成规则如下:

参与签名的字段包括第三方 appid,noncestr(随机字符串), 有效的 sdk_ticket, timestamp(时间戳) 。

对所有待签名参数按照字段名(即key)的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1。 这里需要注意的是所有参数名均为小写字符。 对 string1 作 sha1 加密,字段名和字段值都采用原始值,不进行 URL 转义。即 signature=sha1(string1)。


示例

appid=wxappid

sdk_ticket=-p3A5zVP95IuafPhzA6lRR95_F9nZEBfJ_n4E9t8ZFWKJTDPOwccVQhHCwDBmvLkayF_jh-m9HOExhumOziDWA

noncestr=noncestr

timestamp=1417508194

1.对所有待签名参数按照字段名(即key)的 ASCII 码从小到大排序(字典序)

appid、noncestr、sdk_ticket、timestamp

2.使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1:

appid=wxappid&noncestr=noncestr&sdk_ticket=-p3A5zVP95IuafPhzA6lRR95_F9nZEBfJ_n4E9t8ZFWKJTDPOwccVQhHCwDBmvLkayF_jh-m9HOExhumOziDWA&timestamp=1417508194

3.对 string1 进行 sha1 签名,得到 signature: 429eaaa13fd71efbc3fd344d0a9a9126835e7303