服务端
1 通过游戏大厅Token获取用户信息
CP登录小游戏大厅后,小游戏大厅会返回一个Token给CP,CP可以调用此接口获取其用户信息。
1.1 接口
https://play.open.oppomobile.com/instant-game-open/userInfo
1.2 请求方式
GET
1.3 URL请求参数
参数 | 参数类型 | 样例取值 | 参数说明 | 是否必须 |
---|---|---|---|---|
pkgName | String | com.oppo.testgame | 游戏包名 | 必须 |
token | String | ccb5ae1cf111de847db508edb90fa633 | 登录时获得的token | 必须 |
timeStamp | String | 1526304757000 | 时间戳,毫秒,取当前时间值 | 必须 |
sign | String | 5ADE5E82F7677D91F5 | 签名 | 必须 |
签名生成步骤:
(1)准备签名所需参数
pkgName(游戏包名)
appKey(游戏上架时分配的Key)
appSecret(游戏上架时分配的密钥)
token(登录时获得的token)
timeStamp(时间戳,毫秒,取当前时间值)
(2)将参数按照字典序排序,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串
例如:
appKey=11&appSecret=22&pkgName=com.oppo.testgame&timeStamp=1526304757000&token=ccb5ae1cf111de847db508edb90fa633
(3)使用 md5 算法对构造的源串进行加密,将得到的字符串所有字符转换为大写
例如:
C26228F50092BC9CA251AF41C4F70022
示例:
/instant-game-open/userInfo?pkgName=com.oppo.testgame&timeStamp=1526304757000&token=ccb5ae1cf111de847db508edb90fa633&sign=C26228F50092BC9CA251AF41C4F70022
1.4 响应消息
注意:出参为json字符串(如:{ "userInfo": "", "errorcode": "0", "errormsg": "ok" })
出参名称 | 出参类型 | 样例取值 | 参数说明 | 是否必须 |
---|---|---|---|---|
errorcode | String | 0 | 错误码 | 必须 |
errormsg | String | 成功 | 错误信息 | 必须 |
userInfo | UserInfo | 返回信息 | 可选 |
UserInfo信息如下:
出参名称 | 出参类型 | 样例取值 | 参数说明 |
---|---|---|---|
userId | String | 200006053 | 用户id |
userName | String | oppo | 用户昵称 |
avatar | String | http://www.oppo.com/avtar | 头像地址 |
sex | String | F | 用户性别,F-女,M-男,""-未设置性别 |
location | String | 深圳 | 用户位置信息 |
constellation | String | 白羊座 | 用户星座信息 |
age | integer | 18 | 用户年龄 |
示例:
{
"errorcode":200,
"errormsg":"成功",
"userInfo":
{
"userId":"2000060053",
"userName":"183******85",
"avatar":"http://cdopic0.oppomobile.com/play/201811/12/dff4c57b747f.jpg",
"sex":"F",
"location":"",
"constellation":"",
"age":18
}
}
1.5 错误码列表
errorcode | errormsg | 描述 |
---|---|---|
200 | 成功 | 请求成功 |
900 | 参数错误 | 参数错误 |
1005 | 认证失败 | 认证失败 |
500 | 系统错误 | 系统错误 |
2 排行榜数据更新接口信息
该接口的调用方必须是 cp 服务端
排行榜由开发者按照要求上报数据后,在OPPO小游戏相关场景展现的排行榜
2.1 接口
https://play.open.oppomobile.com/instant-game-open/rank/update
2.2 请求方式
POST
2.3 请求头
Header | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
2.4 URL请求参数
参数 | 参数类型 | 参数说明 | 是否必须 |
---|---|---|---|
userId | String | 用户id | 是 |
pkgName | String | 游戏包名 | 是 |
rankScore | String | 上报的分数(不能超过2147483647, 不能小于0) | 是 |
rankType | String | 排行榜类型: 0:大厅排行榜类型 | 是 |
timeStamp | String | 时间戳,毫秒,取当前时间值 | 是 |
sign | String | 签名 | 是 |
extension | String | 拓展字段 | 否 |
rankScore来源要求和举例
上报的分数有2点要求:
- 该分数可以衡量游戏核心目标的完成情况
- 需要避免大量玩家并列排名的情况,可选择粒度较小的数值,或结合时间先后次序
举例:
“欢喜斗地主”中的金豆数量
“热血飞刀大战”的战力
“子弹先生狙击战场”的金钱数量
“贪吃蛇大作战”限时模式的当局分数
“斗罗大陆”的战力
“刀剑大作战”的当天最高击杀数
2.5 响应消息
出参名称 | 出参类型 | 样例取值 | 参数说明 | 是否必须 |
---|---|---|---|---|
errCode | String | 200 | 错误码 | 必须 |
errMsg | String | 成功 | 错误信息 | 必须 |
2.6 错误码列表
errCode | errMsg | 描述 |
---|---|---|
200 | 请求成功 | 请求成功 |
500 | 系统异常 | 系统异常 |
501 | 参数错误 | 参数错误 |
502 | 签名错误 | 签名错误 |
签名生成
第一步,准备签名所需参数
pkgName(游戏包名)
appKey(游戏上架时分配的Key)
appSecret(游戏上架时分配的密钥)
userId(用户id)
rankScore(上报的分数)
rankType(排行榜类型)
timeStamp(时间戳)
第二步,将参数按照字典序排序,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串
appKey=11&appSecret=22&pkgName=com.oppo.testgame&rankScore=333&rankType=0&timeStamp=15281&userId=1111111
注意 : 参数名区分大小写
第三步,使用 md5 算法对构造的源串进行加密,将得到的字符串所有字符转换为大写
F852521612103827E831175417C0276F
实例代码:
curl -H "Content-Type: application/x-www-form-urlencoded" -X POST -v http://instantGame.game-test.wanyol.com/instant-game-open/rank/update -d "userId=2000060053&pkgName=com.lechang.leftright.kyx.nearme.gamecenter&rankType=0&rankScore=12&sign=BB20D131CDF4B0EA8D2128C829763C75&timeStamp=1556537240333"
签名参考代码:
package com.oppo.util;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
import org.apache.commons.codec.digest.DigestUtils;
public class Example {
public static String getSignContent() {
TreeMap<String, String> signMap = new TreeMap<>();
signMap.put("userId", userId);
signMap.put("pkgName", pkgName);
signMap.put("rankScore", rankScore);
signMap.put("rankType", rankType);
signMap.put("timeStamp", timeStamp);
signMap.put("appKey", appKey);
signMap.put("appSecret", appSecret);
Set<String> keys = treeMap.keySet();
StringBuilder sb = new StringBuilder();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
sb.append(key).append("=").append(treeMap.get(key)).append("&");
}
String signContent = sb.toString().substring(0, sb.length() - 1);
return signContent;
}
public static String sign(String content) {
String signString = DigestUtils.md5Hex(content).toUpperCase();
return signString;
}
public static void main(String[] args) {
String signContent = getSignContent();
String sign = sign(signContent);
System.out.println(sign);
}
}