干货分享:利用微信认证实现排行榜功能

这篇文章是满满的干货分享,我们在《星尘:地球之书》最新版本中加入了一个很酷的功能,在一局结束后,玩家可以把自己的游戏积分上传到服务器,用户只要使用微信扫一下二维码即可将成绩上传到排行榜服务器中!
qrcode
rank

这个功能使用是微信开放平台提供的微信验证登录接口来实现的,微信通过OAuth2.0协议标准来提供登录验证功能,简单来说,OAuth协议解决了这么一个问题:“如何在保证用户信息安全的情况下,允许其他应用获取用户资源”。为了形象解释一下这个协议,我们不妨举个生活中的例子。

假设土豪A有一笔财产保存在银行里,A休假时想委托自己的代理人B打理这批财产,但仅限于休假期间以及一定权限范围内的操作,那么土豪A,银行,代理人B三方应该如何协商进行呢?

显然,如果用传统方法,A大可以把账号密码告诉B,那么会有很多问题,首先不安全,账号密码意味着全部权限,无法实现只把一部分权限放出去的要求,另外A如果想收回权限,只能通过修改密码的方法,并且如果A想把不同的业务分给不同的代理人,那么用账号密码的方法也无法实现这一点。
OAuth协议就是为了解决这个问题而诞生的,这个协议通过“令牌”(Access Token)给予代理人访问资源的临时的权限,并且在令牌中设置权限范围,以完美解决授权的“临时性”和“可控制性”,这个协议整体上分为三个步骤完成:

摘自RFC6749

  1. 用户授权:用户(Reousrce Ower),代理人(协议里称为客户端Client)之间完成授权协议,也就是说客户端获得用户的资源使用授权
  2. 令牌获取:获得授权客户端向认证服务器请求一个临时的令牌(Access Token)
  3. 获取资源:获得令牌的客户端通过令牌向资源服务器(Resource Server)获取用户的资源(Resource Server)

显然,这个过程中最为关键的就是第一步,也就是用户如何安全的给予用户授权(authorization grant)给客户端,这个授权一旦确立,后面获取访问令牌和获取资源都是自动完成的。在OAuth协议的不同应用场合有不同的实现方式,微信使用的是扫描二维码的方法,具体流程如下。
weixin_auth
实现这个功能,需要按照以下步骤

1. 在微信开放平台上创建一个“网站应用”,并申请AppID和AppSecret

这个步骤需要提供一些身份信息,比如公司资质,并不复杂

2. 调用如下API接口,请求二维码

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

接口返回的是一个HTML页面,显示微信认证二维码,这个接口的具体参数可以参考官方文档

weixin_login

3. 通过轮询的方式,查询用户授权状态

上面这个接口返回的除了二维码外,还有一段js代码在浏览器中之星,通过ajax轮询的方式调用以下接口,以查询用户是否已经扫过二维码

https://long.open.weixin.qq.com/connect/l/qrconnect?uuid=UUID&_=TIMESTAMP

这个接口返回一个数字,比如返回405表示已经有用户扫描确认,返回402表示二维码已经超时失效等,一般情况下,这个接口是不需要开发者调用的,是由浏览器自动调用的,属于微信未公开的接口,但在UE4程序中,由于我们不希望把一套复杂的浏览器放在游戏中,所以用了一个取巧的办法,首先通过一个HTTP协议调用第一个接口,然后解析返回的HTML元素,提取页面中包含的二维码图片显示,然后通过循环调用第二个接口查询用户扫描二维码的状态

4. 用户扫描二维码并确认后,获取临时票据

如果用户成功扫描二维码并在微信上确认

2059230322

那么上一步中的那个接口会返回给客户端405的状态码,同时返回一个临时票据(Code),类似于下面的内容

window.wx_errcode=405;window.wx_code='031xZc5A0VtLjj1vX66A03x95A0xZc5h'

5. 客户端根据临时票据获取资源访问令牌

客户端调用如下接口获取令牌(Access Token)

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

其中CODE就是上一步服务器返回的临时票据,这个接口返回一段Json数据,包括用户ID、访问令牌、失效时长等信息

6. 获取令牌后,客户端就可以调用资源访问接口,获取用户的资源

调用如下接口可以获取用户的基本信息,这个接口的使用可以参照官方文档

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

返回结果中包括了用户的昵称、所在地区、头像等,有了这份数据,就可以将玩家的积分结合微信信息放入排行榜数据库中了