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
<?php
 
//------------------------------------------------
// 签名加签函数PHP代码参考
//------------------------------------------------
 
class Signature
{
 
    /**
     * 签名
     *
     * @param string $data 原始数据
     * @param string $rsaPrivateKey 私钥
     * @param int $algo 加密算法
     * @return string
     */
    public static function sign($data, $rsaPrivateKey, $algo = OPENSSL_ALGO_SHA256)
    {
        $formatPrivateKey = self::formatRsaPrivateKey($rsaPrivateKey);
        openssl_sign($data, $signature, $formatPrivateKey, $algo);
        return base64_encode($signature);
    }
 
    /**
     * 验签
     *
     * @param string $data 原始数据
     * @param string $signature 签名数据
     * @param string $rsaPublicKey 公钥
     * @param int $algo 加密算法
     * @return int|false 1 if the signature is correct, 0 if it is incorrect, and -1 on error.
     */
    public static function verify($data, $signature, $rsaPublicKey, $algo = OPENSSL_ALGO_SHA256)
    {
        $rawSignature = base64_decode($signature);
        $formatPublicKey = self::formatRsaPublicKey($rsaPublicKey);
        return openssl_verify($data, $rawSignature, $formatPublicKey, $algo);
    }
 
    /**
     * 格式化公钥
     *
     * @param string $publicKey
     * @return string
     */
    public static function formatRsaPublicKey($publicKey)
    {
        return "-----BEGIN PUBLIC KEY-----\r\n" . wordwrap($publicKey, 64, "\r\n", TRUE) . "\r\n-----END PUBLIC KEY-----";
    }
 
    /**
     * 格式化私钥
     *
     * @param string $privateKey
     * @return string
     */
    public static function formatRsaPrivateKey($privateKey)
    {
        return "-----BEGIN RSA PRIVATE KEY-----\r\n" . wordwrap($privateKey, 64, "\r\n", TRUE) . "\r\n-----END RSA PRIVATE KEY-----";
    }
 
    /**
     * 生成payload - 用于x7手游通用接口
     */
    public static function genPayload($apiMethod, $appkey, $datetime, $body, $gameType, $method = "POST")
    {
        $payload = $method . " " . $apiMethod . "@" . $appkey . "#" . $gameType . "." . $datetime . "\n\n" . $body;
        return $payload;
    }
}
 
function Test()
{
    $httpMethod = "POST";
    $apiMethod = "x7mall.mallEntry";
    $appkey = "0b9ce7b64b02fb17cc948c0b9a6eb462";
    $reqTime =  "2021-01-13T14:54:52+0800";
    $gameType = "client";
    $bizParams = '{"role":{"roleId":"","guid":"","roleName":"","serverId":"","serverName":"","roleLevel":"","roleCE":"","roleStage":"","roleRechargeAmount":""}}';
 
    //RSA密钥对,可以从签名助手页面获取测试秘钥对
    $rsaPrivateKey = "MIIEpAIBAAKCAQEAg14NcreEPJCZbyKsqvHG5aBlaw98l4pTnCuQcKbFjJ1CvaeJ0VJucskYj2MNrAhTuDDR8ogofA47YElH+0mkpiaadqDH31thII8dng9qrp69nXqSeFQdvj4307aYsixmRjQ+latAY3mEhRrkGByKLeRnGyQ0PlcAyJbOkPBzazYAAmKPETfND7c+E6+fKJw683dKaPBAW9LWr/7aygFfyjjJSwuc721oUcDVJOlJsC9NiZqElfBEQ13mKOnHZ/GPkFYSVqaWTmAuN5JXy/Cdo98DpD62LY3pIv4YkMhJq5rgfkgug6snjLlavYWOi9hCpIcei0XPd43GajaXa+7E4QIDAQABAoIBAC3z34ZqdaJt/o4mtfnSO34lvnRV5YJpC9hMUOlnHSGT/T20dnw3dpVGjQXTY3vzKb37reVGBctnexOybrCTUTohtNScZ25VW8N07KpWwD23H6MPtl7LJeBfiU3QyNdCusACFIZsckiZwGaDQpjAmwF0rTCMWI4aBxcj0bxXsDgnF++ryFPNU5hVE0jk1DuUeiOBjXxWstZaXzjKWRTD/MY7sWLgjvKYcxU4Pj+sUJogPjR5UMK8SkF74mX/lptxK9ZR94c94cVMSJxYhLhLng/QX3exfr22PQi5YFoj3W/TWkN7SehUxnCDeK7DEvhFyo6pBufUy9KwIwtrbQevGcECgYEA3hJdb4DpMt2bQJwJ8wFQXQBQy0Rg+0sDdrUV55pBVfY27jethClXxYnYs6i4IWkw91ufszz5/XqcXq96xQ0sItloJDLlH/DYcMlV+Bc9dyL9roP4+ZKgrHRnUbEtmxPxYKf3VlEeuE8ORzT4q0+NmOIxfAP+5hxYexB3rxw1gxkCgYEAl3ASyqIfPUIDvW/frs6ANYrx3g0S3n9hwTVC9Mg4tmXuLxxp0BCQHhELxSiXOCEbKm5Zz8AFMgzFjPKJyq0j7TS8wMzIoZ+rvi7UOyip7C9yWm34xRysry/w7+fmFdVZohC+6WvFY1V0Y9qbaFRNlF6bp+a5L46NxbMTRJqskQkCgYEAz8TW7m/pvtFfY/+Zv2XHTnvxG3yKUBJK11FtgRbtcgO+OPqWuUQE/qiNuulr/LZyPbvXmta9/c4tZtk/QAWm+aP2r4d+n3eyyTNV35u+wixWtGR9GON6uF7gG6ptRN5Pw2LjIjsbRs2QSkbhMUZo8FUQfzstzRVQIzOxBoCaAGECgYBIFwP7Dl5MrQZWwdD7yDXkRzaIfDTFUmJYtWAgYsgMnE1cg+wjLh9NENRHkOEbyTbDZjC+4ywV/Vp1lGff4bg+jWJlbZb8yaPaLzS8zMjHNHb9cWiBfPr/kpThv8UaE6xNqCcZu0IF3YJAnqpoaelcfgUfUohJiVUYDf1YJUGM8QKBgQCVheFKMbRbHdprov7W/IpNJjzCFBSL1pMGwxCGkkboBsC3oXNwcuGVk6r07ewJoTeRKhFA6E6OhMHNlycWqfC88lah02td/3zRAOO61a+2kvkW6LeQjwLHsrm+KiNhTsLAKIJ/Tv9su1cJxHVFXqM/ZR0pbyeeE6oa0nnD3Et1ww==";
    $rsaPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg14NcreEPJCZbyKsqvHG5aBlaw98l4pTnCuQcKbFjJ1CvaeJ0VJucskYj2MNrAhTuDDR8ogofA47YElH+0mkpiaadqDH31thII8dng9qrp69nXqSeFQdvj4307aYsixmRjQ+latAY3mEhRrkGByKLeRnGyQ0PlcAyJbOkPBzazYAAmKPETfND7c+E6+fKJw683dKaPBAW9LWr/7aygFfyjjJSwuc721oUcDVJOlJsC9NiZqElfBEQ13mKOnHZ/GPkFYSVqaWTmAuN5JXy/Cdo98DpD62LY3pIv4YkMhJq5rgfkgug6snjLlavYWOi9hCpIcei0XPd43GajaXa+7E4QIDAQAB";
 
    //生成payload
    $payload = Signature::genPayload($apiMethod, $appkey, $reqTime, $bizParams, $gameType, $httpMethod);
 
    //生成签名
    $signature = Signature::sign($payload, $rsaPrivateKey);
 
    //签名校验
    $passed = Signature::verify($payload, $signature, $rsaPublicKey);
 
    echo "--------------------------------------------------------------", "<br/>";
    echo "payload=", $payload, "<br/>";
    echo "--------------------------------------------------------------", "<br/>";
    echo "signature=", $signature, "<br/>";
    echo "--------------------------------------------------------------", "<br/>";
    echo "passed=", $passed ? "true" : "false", "<br/>";
}