统一sdk服务器的实现

U8Server是采用J2EE框架SSH2实现的。当然你也可以采用任何其他你熟悉的语言实现。上一篇文章中,我们从类的抽象中,大致梳理了一下U8Server所要完成的工作。大的方向上,U8Server需要实现统一的用户登录认证,和支付中心两大功能。更深入的细节,U8Server需要完成以下功能:

游戏管理:查询游戏,创建游戏(同时生成游戏的唯一appID,appKey等),编辑游戏,删除游戏等功能。

渠道商管理:查询渠道商,,创建渠道商(设置该渠道商对应的登陆认证地址,支付回调地址等操作。),编辑渠道商,删除渠道商等功能。

渠道管理:查询某个游戏的渠道,创建渠道(将指定的游戏和一个渠道商连接起来,同时生成渠道ID,配置该游戏对应该渠道的appID,appKey等信息),编辑渠道,删除渠道。

登陆认证:完成各个游戏各个渠道的统一登陆认证功能

支付回调:支付之前获取订单号。所有第三方SDK的支付回调,然后将第三方支付回调以统一的格式返回给游戏服务器

对于游戏管理,渠道商管理,渠道管理三个功能,可以做成一个后台管理界面,通过后台操作,实现各个功能的管理。就是简单的数据库查询和数据增删改查功能。本文主要介绍统一的登陆认证和支付两个部分。

对于登陆认证,通过之前的流程图我们知道。所有渠道SDK登陆成功之后,都会返回sid等信息,客户端紧接着拿着这个sid去U8Server进行登录认证,U8Server再去第三方SDK服务器认证,认证成功之后,U8Server会生成一条用户信息,然后将生成一个token给客户端。客户端拿着这个token,登陆游戏服务器,游戏服务器再拿着这个token去U8Server进行认证。如果合法,则用户成功登陆。

那么,这样我们的登陆认证接口就有了,请看代码:

@Action("getToken")public void getLoginToken(){try{Log.i("The appID is "+this.appID);UGame game = gameManager.queryGame(this.appID);if(game == null){renderState(StateCode.CODE_GAME_NONE, null);return;}UChannel channel = channelManager.queryChannel(this.channelID);if(channel == null){renderState(StateCode.CODE_CHANNEL_NONE, null);return;}UChannelMaster master = channel.getMaster();if(master == null){renderState(StateCode.CODE_CHANNEL_NONE, null);return;}ISDKVerifier verifier = Class.forName(master.verifyClass)SDKVerifyResult sdkResult = verifier.verify(channel, sid, extension);if(sdkResult.isSuccess()){UUser user = userManager.getUserByCpID(appID, channelID, sdkResult.getUserID());if(user == null){user = userManager.generateUser(channel, sdkResult);}else{user.setLastLoginTime(new Date());}user.setToken(UGenerator.generateToken(user));userManager.saveUser(user);JSONObject data = new JSONObject();data.put("userID", user.getId());data.put("token", user.getToken());renderState(StateCode.CODE_AUTH_SUCCESS, data);}else{renderState(StateCode.CODE_AUTH_FAILED, null);}}catch (Exception e){Log.e(e.getMessage());renderState(StateCode.CODE_AUTH_FAILED, null);}}

这个请求处理方法getToken就是第一步,客户端拿到sid时,发起getToken请求。访问getToken时,客户端带上,appId,channelId,sid等数据。

注意这里的appID,channelId是U8Server之前通过后台分配该该游戏的。

在这个方法中,通过appID,查询到当前是哪个游戏,通过channelID查询到当前是哪个渠道。因为各个渠道的登陆认证方式不同,所以,我们抽象出来一个接口:ISDKVerifier。各个渠道SDK的登陆认证类实现该接口。然后将实现类的完整类名,存储在UChannelMaster对象中。

这样,通过渠道信息,我们就知道当前的SDK登陆认证实现类的完整类名,并进行实例化。然后登陆认证之后,返回一个认证结果。

如果认证成功,我们生成一条用户信息,同时生成一个token。然后将userID和该token返回给客户端。

这样,整个登陆认证过程中,第三方SDK的认证部分就结束了。接下来的流程仅仅是在U8Server和游戏服务器之前了。这就是当客户端拿到这个userID和token信息时,客户端就开始登陆游戏服务器。游戏服务器需要拿着这个userID和token去U8Server进行二次认证。看接口:

@Action("verifyAccount")public void loginVerify(){try{UUser user = userManager.getUser(this.userID);if(user == null){renderState(StateCode.CODE_USER_NONE, null);return;}if(StringUtils.isEmpty(this.token)){renderState(StateCode.CODE_VERIFY_FAILED, null);return;}long now = System.currentTimeMillis();if(!this.userManager.isTokenValid(user, token)){renderState(StateCode.CODE_TOKEN_ERROR, null);return;}JSONObject data = new JSONObject();data.put("userID", user.getId());data.put("username", user.getName());renderState(StateCode.CODE_AUTH_SUCCESS, data);return;}catch (Exception e){Log.e(e.getMessage());}renderState(StateCode.CODE_VERIFY_FAILED, null);}

服务器拿着userID和token来U8Server进行认证。U8Server验证token是否合法和是否超时,如果验证通过,则返回userID,username等用户信息给游戏服务器。否则,其他情况,均返回失败信息。

整个登陆认证,也就这两个接口。当接其他第三方SDK时,比如当乐,直接定义一个DLSDK同时实现ISDKVerifier接口,同时将该实现类,设置在当乐对应的UChannelMaster对象中。

接下来,我们再来看支付中心。支付中心之前也说了,也包括两个部分。首先是获取订单号。然后是支付通知回调。先看获取订单号接口:

我要扼住命运的咽喉。

统一sdk服务器的实现

相关文章:

你感兴趣的文章:

标签云: