Skip to content

PHP 示例 ​

KeepSDK 打你的地址分两种,不要抄错:

你的地址怎么来PHP 怎么取参数
login_url(页游 / H5)浏览器 302,GET$_GET
login_url(端游)网关 GET$_GET,然后回 JSON ticket
deliver_url / role_url 等网关 POST JSONjson_decode(file_get_contents('php://input'), true),不要 $_POST

把 keepsdk_sign.php 放到游戏服用,下面入口 require 它。$loginKey / $payKey 换成建游戏时拿到的密钥。

php
<?php
// keepsdk_sign.php
function keepsdk_sign($params, $key) {
    unset($params['sign']);
    ksort($params, SORT_STRING);
    $parts = array();
    foreach ($params as $k => $v) {
        $parts[] = $k . '=' . $v;
    }
    return md5(implode('&', $parts) . $key);
}

function keepsdk_sign_ok($params, $key) {
    $got = isset($params['sign']) ? strtolower($params['sign']) : '';
    $want = keepsdk_sign($params, $key);
    $t = isset($params['time']) ? intval($params['time']) : 0;
    if ($t <= 0 || abs(time() - $t) > 300) {
        return false;
    }
    return $got !== '' && $got === $want;
}

function keepsdk_read_json() {
    $raw = file_get_contents('php://input');
    $data = json_decode($raw, true);
    return is_array($data) ? $data : array();
}

function keepsdk_json($code, $message, $data = null) {
    header('Content-Type: application/json; charset=utf-8');
    $out = array('code' => $code, 'message' => $message);
    if ($data !== null) {
        $out['data'] = $data;
    }
    echo json_encode($out);
    exit;
}

function keepsdk_pick($src, $keys) {
    $out = array();
    foreach ($keys as $k) {
        if (isset($src[$k])) {
            $out[$k] = $src[$k];
        }
    }
    return $out;
}

登录 login_url(GET) ​

php
<?php
require 'keepsdk_sign.php';
session_start();
$loginKey = '你的login_key';

$p = keepsdk_pick($_GET, array(
    'app_id', 'uid', 'server_id', 'adult', 'client', 'time', 'sign',
));
if (!keepsdk_sign_ok($p, $loginKey)) {
    header('HTTP/1.1 403 Forbidden');
    echo 'sign error';
    exit;
}

$_SESSION['app_id'] = $p['app_id'];
$_SESSION['uid'] = $p['uid'];
$_SESSION['server_id'] = isset($p['server_id']) ? $p['server_id'] : '';

if (/* 端游:只回游戏自己签发的 ticket;页游不要回 JSON */ false) {
    keepsdk_json(0, 'ok', array('ticket' => '1_ad8c2398f84babb066c51c17704a50bd'));
}
header('Location: /game.php');

发货 deliver_url(POST JSON,pay_key) ​

php
<?php
require 'keepsdk_sign.php';
$payKey = '你的pay_key';

$p = keepsdk_read_json();
if (!keepsdk_sign_ok($p, $payKey)) {
    keepsdk_json(1, 'sign');
}

$orderId = isset($p['order_id']) ? $p['order_id'] : '';
// 按 order_id 幂等加币;已发过回 1010
if ($already) {
    keepsdk_json(1010, 'duplicate');
}
keepsdk_json(0, 'ok');

查角色 role_url ​

php
<?php
require 'keepsdk_sign.php';
$loginKey = '你的login_key';

$p = keepsdk_read_json();
if (!keepsdk_sign_ok($p, $loginKey)) {
    keepsdk_json(1, 'sign');
}

$roles = array(
    array(
        'role_id'   => '10001',
        'role_name' => '测试角色',
        'server_id' => isset($p['server_id']) ? $p['server_id'] : '',
        'level'     => 1,
        'power'     => 100,
        'sex'       => 1,
        'job'       => '战士',
    ),
);
if (count($roles) === 0) {
    keepsdk_json(1201, 'no role');
}
keepsdk_json(0, 'ok', $roles);

发礼包 gift_url ​

php
<?php
require 'keepsdk_sign.php';
$payKey = '你的pay_key';

$p = keepsdk_read_json();
if (!keepsdk_sign_ok($p, $payKey)) {
    keepsdk_json(1, 'sign');
}

// 1) 同 order_id 已处理过 → 1010
// 2) 同 uid + gift_id 已领过(含游戏内领取)→ 1010
if ($dupOrderOrAlreadyClaimed) {
    keepsdk_json(1010, 'duplicate');
}
keepsdk_json(0, 'ok');

封禁 ban_url ​

php
<?php
require 'keepsdk_sign.php';
$loginKey = '你的login_key';

$p = keepsdk_read_json();
if (!keepsdk_sign_ok($p, $loginKey)) {
    keepsdk_json(1, 'sign');
}

$action = isset($p['action']) ? $p['action'] : '';
// ban / unban / mute / unmute / kick;duration_sec=0 表示永久
keepsdk_json(0, 'ok');

聊天 POST /game/chat ​

php
<?php
require 'keepsdk_sign.php';
$loginKey = '你的login_key';

$body = array(
    'app_id'      => $_SESSION['app_id'],
    'uid'         => $_SESSION['uid'],
    'server_id'   => $_SESSION['server_id'],
    'content'     => $content,
    'chat_type'   => '9',
    'time'        => (string)time(),
);
$body['sign'] = keepsdk_sign($body, $loginKey);

$ch = curl_init('https://api.keepsdk.com/game/chat');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$raw = curl_exec($ch);
curl_close($ch);

$ret = json_decode($raw, true);
$action = isset($ret['data']['action']) ? $ret['data']['action'] : 'block';

打点 / VIP ​

创角、进服、下线各打一次 POST /game/report,字段与聊天相同,多一个 event。平台VIP信息、平台VIP收益 签名同样用 keepsdk_sign。