U8SDK——和自己的服务器端对接
很多使用U8SDK的同学,公司里面不少都有自己的统一SDK登录认证和支付处理中心。 这些同学问的比较多的是, 怎么将U8SDK客户端打包框架和自己公司的服务器进行适配对接。
适配过程还算比较简单, 因为U8SDK这套框架, 客户端和服务器端的耦合很低,适配工作量完全可控。
这篇文章就给需要的同学简单介绍下:
U8SDK客户端整套框架中需要和服务器对接的地方,主要有两个部分
1、登录认证
一般渠道SDK登录的时候,都需要进行二次认证。这个过程是
SDK客户端获取到SDK返回的登录结果,往往是session或者token之类的,用于二次认证。但是各个渠道SDK这里返回的参数可能不一样。
比如UC登录认证需要客户端SDK登录成功返回的sid参数
当乐登录认证需要客户端SDK登录成功返回的mid和token参数
….
所以,和服务器的对接,我们需要定义一个渠道认证的扩展参数,不同的渠道SDK,这个扩展参数不一样。(可以看各个渠道SDK接入工程里面SDK登录成功的回调的地方)
比如服务器端,用于登录认证的接口可以定义如下格式(http://some-addr.com/auth):
appID:服务器分配给当前游戏的appID,每个游戏唯一
channel:当前渠道SDK的渠道号。比如UC的渠道号为11,当乐的是12,这个来区分,当前要去UC还是当乐做二次认证
extension:就是上面说的扩展参数。根据每个渠道二次认证的需要,参数个数,类型等可能都不一样。
比如uc的extension是 {“sid”:”wserswdfsdfdsd”}
当乐的extension是 {“mid”:”w454350″, “token”:”sdfsfdsfgsdffgdsf”}
服务器收到登录认证协议的时候,根据channel知道当前是哪个渠道。然后再去当前渠道里面,解析extension
目前u8sdk和u8server登录认证定义的协议参数如下(http://192.168.18.9:8080/getToken (POST格式)):
1 2 3 4 5 6 |
appID:u8server分配的游戏ID channelID:渠道号 extension:各个渠道的扩展参数 sdkVersionCode:当前使用的SDK版本,这个版本只需要和u8server这边对应上,防止有时候,某些游戏正在使用不兼容的多个版本的渠道SDK sign:签名,用于验证。md5("appID="+appID+"channelID="+channelID+"extension="+extension+appKey) 其中appKey是u8server分配给每个游戏的 |
返回的结果(JSON格式):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "state":1, //1:成功;其他:失败 "data":{ "userID":34543535, //u8server为当前用户生成的唯一id "sdkUserID":"3254354", //SDK登录认证成功之后返回的渠道SDK那边的用户ID "username":"ssdfsd", //u8server生成的当前用户的用户名,以固定后缀结尾。比如UC的,生成的为2543543543.uc "sdkUserName":"sdfdsf", //SDK的用户名 "token":"sdfsdfsddfdsfdsf", //u8server处理完成之后,生成的token,用于客户端接下来登录游戏服,游戏服来u8server进行二次认证 "extension":"dd" //扩展数据,防止这个时候需要返回一些特殊的数据.但是这里的格式,如果是json,那么需要对extension进行一 //个base64编码,客户端取到数据的时候,再进行base64解码 } } |
这 里的请求参数,各个渠道SDK中需要和服务器对接的仅仅就是extension的格式需要和服务器对接一下。比如uc的exension是 {“sid”:”wserswdfsdfdsd”},那么,服务器解析的时候,也需要按照这个来解析。(各个渠道的extension格式见下面表格)
返回的数据中的extension格式,如果渠道SDK中,需要使用,那么也需要按照服务器端定义的格式来解析。
2、获取订单号
u8sdk统一框架中,在打开支付界面之前,会去u8server获取一个订单号。这个订单号是u8server本地生成的。如果你用的不是u8server,是自己的服务器,那么流程希望也按照这个来进行。因为这个流程也是目前比较合适的流程。
【获取订单号协议,请放在游戏层中完成。】
首先,几乎所有的渠道SDK支付,都采用异步的方式,来进行支付成功或者失败的通知。所以,客户端在进行SDK支付的时候,SDK都会提供一个扩展字段,这个扩展字段在异步通知游戏服务器的时候,原封不动地包含在参数中。
那么,客户端进行SDK支付之前,先去u8server获取一个订单号,u8server这个时候在数据库订单表中创建一条订单记录,订单状态为等待支付。
客户端拿到订单号之后,将订单号放在SDK支付接口提供的扩展字段中
这样,SDK支付异步通知u8server的时候,u8server根据该扩展字段,取出订单号,根据订单号从订单表中查出订单信息,然后进行逻辑处理。
其次,对于少数SDK,比如vivo,支付之前,要游戏服务器去SDK服务器下单,然后他们SDK服务器返回一个订单号等信息,游戏服务器拿到这个订单号之后,需要把这个返回给客户端,客户端在调用SDK支付接口的时候,必须要用到该参数。
那么对于这种情况,获取订单号这个流程,也起到了作用。
客户端去u8server获取订单号,u8server这个时候再去SDK服务器下单,然后将返回的结果返回给客户端。但是,有些渠道这里返回的可能不止订单号,还有其他数据,客户端也需要。
所以,我们获取订单号的协议如下(http://192.168.18.9:8080/getOrderID (POST格式)):
1 2 3 4 5 6 7 8 9 10 11 |
userID:登录认证成功之后,u8server返回的userID productName:商品名称 productDesc:商品描述 money:商品价格,单位分 roleID:角色ID roleName:角色名称 serverID:服务器ID serverName:服务器名称 extension:扩展数据,支付成功,异步通知游戏服务器时,原封不动返回 sign:rsa签名,用于u8server服务器验证 |
签名函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
private static String generateSign(UToken token, PayParams data) throws UnsupportedEncodingException { StringBuilder sb = new StringBuilder(); sb.append("userID=").append(token.getUserID()).append("&") .append("productName=").append(data.getProductName()).append("&") .append("productDesc=").append(data.getProductDesc()).append("&") .append("money=").append(data.getPrice() * 100).append("&") .append("roleID=").append(data.getRoleId()).append("&") .append("roleName=").append(data.getRoleName()).append("&") .append("serverID=").append(data.getServerId()).append("&") .append("serverName=").append(data.getServerName()).append("&") .append("extension=").append(data.getExtension()) .append(U8SDK.getInstance().getAppKey()); String encoded = URLEncoder.encode(sb.toString(), "UTF-8"); String sign = RSAUtils.sign(encoded, ORDER_PRIKEY, "UTF-8"); return sign; } |
返回数据(JSON格式):
1 2 3 4 5 6 |
{ "orderID":"45634653456356", //订单号 "extension":"wretr" //扩展字段,部分SDK有需要返回的其他数据,都放在这里。但是这里的格式,如果是json,那么需要对extension进行一 //个base64编码,客户端取到数据的时候,再进行base64解码 } |
这里,客户端和服务器端的对接,客户端调用SDK支付接口的时候,要对orderID和extension进行解析即可。
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=1914