| <?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/>"; | 
| } |