H5 特殊通知接口

H5通知接口说明

通知游戏服务器

编码说明

传输过程一律使用 UTF-8 without BOM 编码

请求格式

HTTP POST application/x-www-form-urlencoded

参数说明

通知参数分为公共参数和扩展参数。公共参数是对于不同的异步通知类型都具有的参数。扩展参数对于不同类型的异步通知参数也会有不同。

通知类型

目前通知类型如下:

类型 说明 渠道举例
inviteNotice 邀请结果通知 1758

公共参数

类型 说明 渠道举例
api 通知类型 举例:inviteNotice
channel_id 渠道编号
user_sdk 渠道 SDK 标识
source 通知类型 渠道通知过来的原始参数,JSON 格式
private_data 对于支持透传的渠道,这个字段将会有值,否则为空 举例:1758 如果有传 state 参数值,则会通过此字段通知给游服
notice_time 通知时间 举例:2016-01-01 09:07:03
sign md5(md5(sign_string)+enhanced_key),sign_string请参考 见签名算法及示例

inviteNotice 扩展参数

类型 说明 备注
inviter_uid 邀请者的渠道 user_id
invitee_uid 被邀请者的渠道 user_id
invitee_time 被邀请者接受邀请(或其他类似等价操作)的时间,格式 YYYY-mm-dd HH:ii:ss 举例:2016-01-01 09:07:03

接收通知步骤

  1. 接收AnySDK通知参数
  2. 检查AnySDK通知服务IP白名单
  3. 验证签名及检查是否重复通知(对于需要处理重复问题的通知类型)
  4. 成功响应及游戏逻辑处理(失败响应及日志记录)

游戏服务器响应内容

处理成功响应

ok 或者 OK (不带任何空白字符、隐藏字符、控制字符的2个字节长度的纯字符串)

处理失败响应

fail.* * 代表一定程度上可以描述错误原因的描述词汇或用语,可以使用下划线或者段横线连接

例如:游服接收异步通知的时候验签不匹配,可以返回类似错误 fail.sign_not_match

通知发起方IP

42.159.27.96

签名算法及示例

签名算法

  1. 准备验签密钥 "增强密钥",增强密钥可以在开发者后台"游戏列表"界面获取(此算发和支付通知验签算法的不同是,完全移除了支付通知中普通签名的验证,只验证增强密钥计算的签名)
  2. 对所有不为空的参数按照参数名字母升序排列,sign参数不参与签名;
  3. 将排序后的参数名对应的参数值字符串方式按顺序拼接在一起(所有参数);
  4. 做一次md5处理并转换成小写,得到的加密串1;
  5. 在加密串1末尾追加增强密钥,做一次md5加密并转换成小写,得到的字符串就是签名sign的值

注意:只有值参与签名,参数名不参与签名

例如收到的数据为:

a=3&c=1&b=2

那么待签字符串将类似如下这样(string=表示复制给名为string的变量,321表示待签字符串):

string=321

计算签名

sign=md5(md5(string)+enhanced_key)

PHP 验签示例

 $value) {
  $data[$key] = urldecode($value);
  }
 * */
$enhancedKey = 'OGM3ODFkNDRhYjUzYjM4ZmUzZjk';
if (checkSign($data, $enhancedKey)) {
        // @todo 验证成功,游戏服务器处理逻辑
        echo "ok";
} else {
        //@todo
        echo "fail.check_sign";
}

/**
 * 通用验签
 * @param array $data 接收到的所有请求参数数组,通过$_POST可以获得。注意data数据如果服务器没有自动解析,请做一次urldecode(参考rfc1738标准)处理
 * @param array $enhancedKey AnySDK分配的游戏enhancedKey
 * @return bool
 */
function checkSign($data, $enhancedKey) {
        if (empty($data) || !isset($data['sign']) || empty($enhancedKey)) {
                return false;
        }
        $sign = $data['sign'];
        //sign 不参与签名
        unset($data['sign']);
        $_sign = getSign($data, $enhancedKey);
        if ($_sign != $sign) {
                return false;
        }
        return true;
}

/**
 * 计算签名
 * @param array $data
 * @param string $key
 * @return string
 */
function getSign($data, $key) {
        //数组按key升序排序
        ksort($data);
        //将数组中的值不加任何分隔符合并成字符串
        $string = implode('', $data);
        //做一次md5并转换成小写,末尾追加游戏的privateKey,最后再次做md5并转换成小写
        return strtolower(md5(strtolower(md5($string)) . $key));
}

重复通知

间隔时间单位:分钟

2 -> 4 -> 8 -> 16 -> 32 -> 64 -> 128