hxp
2025-06-04 f4a514d5ac952110da846636ecbb9de951eaf3d2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php
include_once '/Common/CommFunc.php';
include_once '/Common/Logging.php';
include_once '/Common/PayOrder.php';
include_once "/ProjComm/CfgReader.php";
 
header("Content-type: text/html; charset=utf-8");
// http://docs.aldgames.com/docs/al-sdk#35uxhj
 
// $_SERVER['PHP_SELF'] = /api/quick/payxxxxx.php
// strripos 最后一次出现 / 的位置,再+1得到 payxxxxx.php
// +3   从pay后面开始
// -4   去除最后的.php
$appid = substr($_SERVER['PHP_SELF'], strripos($_SERVER['PHP_SELF'], "/") + 1 + 3, -4);
\Logging\CreateLogging("quick.pay" . $appid . ".php");
\Logging\LogInfo("CONTENT_TYPE: " . $_SERVER["CONTENT_TYPE"]);
$params = $_GET;
\Logging\LogInfo("params: " . print_r($params, true));
 
$success = "SUCCESS";
$failed = "FAILURE";
 
$order_id = $params['order_id']; //     阿拉丁游戏订单 ID
$money = floatval($params['money']); //     下单金额(档位金额),美元
$amount = floatval($params['amount']); //     支付金额(档位金额),美元 (重要的)
$amount_diff = floatval($params['amount_diff']); //     差价,美元(真实支付金额-下单金额,此字段仅供参考)
$gift = intval($params['gift']); //     游戏币、元宝、灵玉、钻石…等 (根据差价换算的虚拟币)(重要的)
$role_id = $params['role_id']; //     游戏角色id
$server_id = $params['server_id']; //     游戏服 id
$status = $params['status']; //     订单状态,1 为成功
$timestamp = $params['timestamp']; //     时间戳 (秒)
$user_id = $params['user_id']; //     阿拉丁游戏用户 id
$is_test = $params['is_test']; //     是否为测试订单:0否,1是
$pay_type = $params['pay_type']; //     支付方式:my_card MyCard支付,razer 雷蛇支付
$callback_info = $params['callback_info']; //     cp透传参数,原样返回  channelID_cp订单id_区服id_游戏充值编号
$cp_product_id = $params['cp_product_id']; //     cp产品 ID,原样返回
$cp_order_id = $params['cp_order_id']; //     cp订单号 ,原样返回
$sign = $params['sign']; //     签名:参数名按字母序升序排列后值用”#”进行拼接,md5(拼接字符串+”#”+游戏密钥) ,除了sign之外,其他参数全部参与签名
 
$uid = $user_id;
$sdkOrderID = $order_id;
$extrasParams = $callback_info;
$OrderAmount = $amount;
$payTime = \CommFunc\TimeToStrDateTime($timestamp);
 
if (!$uid || !$sdkOrderID || !$sign) {
    Ret($failed, "ParamError");
    exit;
}
 
if ($status != "1") {
    Ret($failed, "");
    exit;
}
 
if (
    !\CfgReader\ReadConfig()
    || !\CfgReader\GetConfigData("Quick", "Key_" . $appid . "_Callback_Key", $Callback_Key)
) {
    Ret($failed, "CfgError");
    exit;
}
 
ksort($params);
$signKey = '';
foreach ($params as $key => $val) {
    if ($key == "sign") {
        continue;
    }
    $signKey .= $val . '#';
}
$signKey .= $Callback_Key;
$md5SignLocal = md5($signKey);
 
if ($md5SignLocal != $sign) {
    Ret("ErrorSign", "md5SignLocal:" . $md5SignLocal . " != sign:" . $sign);
    exit;
}
 
$channelID = 1;
$cpOrderID = $cp_order_id;
$serverID = $server_id;
$OrderInfo = $cp_product_id;
 
$extrasLen = 4;
$extrasParams = explode("_",  $extrasParams, $extrasLen); // channelID_cp订单id_区服id_游戏充值编号
\Logging\LogInfo("extrasParams:" . print_r($extrasParams, true));
$extras_params = $extrasParams;
if (isset($extras_params) && count($extras_params) == $extrasLen) {
    // Ret("extras_params_error", " extras_params:" . print_r($extras_params, true));
    $channelID = $extras_params[0];
    $cpOrderID = $extras_params[1];
    $serverID = intval($extras_params[2]);
    $OrderInfo = $extras_params[3];
}else{
    // 网页充值,17 18服特殊处理ID互换
    if ($serverID == 17) {
        $serverID = 18;
        \Logging\LogInfo("17服18服网页充值时特殊处理ServerID互换!");
    } elseif ($serverID == 18) {
        $serverID = 17;
        \Logging\LogInfo("17服18服网页充值时特殊处理ServerID互换!");
    }
}
 
// 同步游戏服务器
 
$AccountID = $uid . "@" . $channelID;
 
$ret = $failed;
$msg = "";
// 没有创建订单步骤,直接使用sdk订单号
$returnArr = \PayOrder\DoReceivePayOrder($appid, $cpOrderID, $sdkOrderID, $AccountID, $serverID, $OrderInfo, $OrderAmount, $payTime, false);
switch ($returnArr["errorcode"]) {
    case 1:
        $ret = $success;
        break;
    case 2:
        $ret = "ErrorRepeat";
        break;
    default:
        if ($returnArr["errordesc"]) {
            $msg = $returnArr["errordesc"];
        }
        break;
}
Ret($ret, $msg);
exit;
 
function Ret($ret, $msg = "")
{
    global $success;
    echo $ret;
    $logMsg = $ret;
    if ($msg) {
        $logMsg .= " msg => " . $msg;
    }
    if ($ret != $success) {
        \Logging\LogError($logMsg);
    } else {
        \Logging\LogInfo($logMsg);
    }
}