Appearance
PHP 示例
KeepSDK 打你的地址分两种,不要抄错:
| 你的地址 | 怎么来 | PHP 怎么取参数 |
|---|---|---|
login_url(页游 / H5) | 浏览器 302,GET | $_GET |
login_url(端游) | 网关 GET | $_GET,然后回 JSON ticket |
deliver_url / role_url 等 | 网关 POST JSON | json_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。