服务端

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点要求:
  1. 该分数可以衡量游戏核心目标的完成情况
  2. 需要避免大量玩家并列排名的情况,可选择粒度较小的数值,或结合时间先后次序
举例:
  1. “欢喜斗地主”中的金豆数量

  2. “热血飞刀大战”的战力

  3. “子弹先生狙击战场”的金钱数量

  4. “贪吃蛇大作战”限时模式的当局分数

  5. “斗罗大陆”的战力

  6. “刀剑大作战”的当天最高击杀数

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);
    }
}

results matching ""

    No results matching ""