123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 |
- <?php
- namespace crmeb\services;
- use function halt;
- use function input;
- use function json;
- class GmService
- {
-
-
- protected static $iv = 'abcdefghABCDEFGH';
- protected static $appID = "3f1a51c1-39d4-48e1-8119-a37b63c0ed8c";
- protected static $appSecretKey = "66a81e7a-dea3-4870-9c63-58712e13aa9b";
- protected static $tokenUrl = "https://mouldai.com/api/HOGENDY";
- protected static $token;
-
- const PUBLIC_KEY = "DE3w4DgjV+np0oHQzSDUgvlxGKPhi/gHBRp8dtjun+z6uqrRJE6B1qswZpaSCs3tp0tm98ZjjL9RTuNh4dyUuA==";
-
- const PRIVATE_KEY = "778NKKZgdS9IGm/crvajNPoq5CHJNEKXptciF/1SU3I=";
-
- const CGB_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE6mJz31IQpqtv42a67pfUe6q6UKUa/Lxf2rzJC4iAK0p3dOooG/d+N2fs6qmzK+7smovqcP7VhA8D+OIvaVjMsw==";
- public function __construct()
- {
-
- echo "--------php_crypto_init 初始化开始--------\n";
- $path = "/www/server/php/73/libcryptAPIsm_lnx64.so";
- php_crypto_init($path);
- echo "--------php_crypto_init 初始化结束-------\n";
- }
- public static function string2hex($string)
- {
- $hex = '';
- for ($i = 0; $i < strlen($string); $i++) {
- $ch = dechex(ord($string[$i]));
- if (strlen($ch) == 1) {
- $ch = "0" . $ch;
- }
- $hex .= $ch;
- }
- return $hex;
- }
-
- public static function getToken()
- {
-
- $seqNO = (string)rand(100000, 999999);
-
- $key = strtoupper(md5(self::getKey()));
-
-
- php_HextoAsc(self::string2hex(base64_decode(self::PRIVATE_KEY)), $k1);
- php_HextoAsc(self::string2hex(base64_decode(self::PUBLIC_KEY)), $k2);
- php_HextoAsc(self::string2hex(base64_decode(self::CGB_PUBLIC_KEY)), $gf_k);
-
- $data = [
- 'appID' => self::$appID,
- 'seqNO' => $seqNO,
- 'random' => strtoupper(md5($seqNO)),
- 'sm2EncryptData' => self::SM2Encrypt($key, $gf_k),
- 'sm2Sign' => self::SM2Sign($key, $k2, $k1),
- ];
- dump($data);
-
- $data['sign'] = self::SM3Crypt($data['random'] . $data['seqNO'] . self::$appSecretKey . $key);
- dump($data);
- exit;
-
- $res = self::https_post(self::$tokenUrl, $data);
- halt($res);
- exit();
-
- $token = self::SM2Decrypt(base64_decode($res['sm2EncryptData']), $k1);
- self::$token = $token;
-
- return $token;
- }
-
- public static function postJry()
- {
-
- $data = [
- 'head' => [
- 'id' => 8989
- ],
- 'body' => [
- 'code' => "000000",
- 'msg' => "测试请求"
- ]
- ];
- $res = self::scanPaymentCode($data);
- dump("返回结果");
- halt($res);
- }
-
- public static function scanPaymentCode($array = [])
- {
-
- php_HextoAsc(self::string2hex(base64_decode(self::PRIVATE_KEY)), $k1);
- php_HextoAsc(self::string2hex(base64_decode(self::PUBLIC_KEY)), $k2);
- php_HextoAsc(self::string2hex(base64_decode(self::CGB_PUBLIC_KEY)), $gf_k);
-
- $json = json_encode($array, JSON_UNESCAPED_UNICODE);
-
- $seqNO = (string)rand(100000, 999999);
-
- $key = strtoupper(md5(self::getKey()));
-
- $data = [
- 'appID' => self::$appID,
- 'seqNO' => $seqNO,
- 'signMethod' => "SM3",
- 'encryptMethod' => "SM4",
- 'appAccessToken' => self::getToken(),
- 'sm2EncryptData' => self::SM2Encrypt($key, $gf_k),
- 'sm2Sign' => self::SM2Sign($key, $k2, $k1),
- ];
-
- $data['sign'] = self::SM3Crypt($json . $data['seqNO'] . self::$appSecretKey . $key);
-
- $data['reqData'] = self::SM4Encrypt($json, $data['seqNO'] . $data['appAccessToken'] . self::$appSecretKey . $key);
- dump("业务数据json");
- dump($json);
- dump("请求数据");
- dump($data);
- $res = self::https_post("https://mouldai.com/apiSIT/tzyj/scanPaymentCode", $data);
-
- $sm2Key = self::SM2Decrypt(base64_decode($res['sm2EncryptData']), $k1);
- dump("sm2解密数据:" . $sm2Key);
-
- $rspData = self::SM4Decrypt($res['rspData'], $res['seqNO'] . $data['appAccessToken'] . self::$appSecretKey . $sm2Key);
- dump("sm4解密报文数据:" . $rspData);
-
- $sm3SignData = self::SM3Crypt($rspData . $res['seqNO'] . self::$appSecretKey . $sm2Key);
- dump("sm3响应报文拼接加签:" . $sm3SignData);
- $signData = $res['sign'];
- dump("sm3响应报文签名:" . $signData);
- if ($sm3SignData == $signData) {
- dump("验签成功!");
- }
- dump($res);
- return $res;
- }
-
- public static function getPostData()
- {
-
- $arr = input("post.");
-
- $arr = '{"sign":"1CA0926A5C8BC2E2347E57016650E731","signMethod":"MD5","rsaEncryptData":"xs8lNVCj4ZCsAbXoJHI+AmRPqDJk01dlt3q7Jb9Vox4SNvvx6F+DclM2v1FdnDxAsNgXBERLXCc3SOFnqtrcMdYxc2GKyF+YTLJKjX0NmlGkXlO2oipIzhIL94la\/NGEzlT+JL4I8KF5vZvE+4gudkg0mZ+jC6jPWc+qyM6RROdwbgYPCiOpVTaQ+jtIxwz4rCY\/a2z\/fAFazzApUbyRxsCTVRESJ+3dU8V9zYxE7VzrV+IlOCwJdAIAfGPcwjq5wd3p\/3yEeFDBbZz0N6jnIEIlkCH99NsNFWIYY2mH0K2z+ccpJlBejoNq+FaxusS2DvZfJhp8xa3dav8itVyiSw==","encryptMethod":"AES","reqData":"QbYx9PwqKwy30K1SSgiorq9Sg9taSxImEw6qwY93N0QhsRb1UHqBghS+WmbBRZxrBTCMYNGBsG1GFvUdJxIrdXaQ4qBU\/PTpIjLlD+bvRyE27OYgHrSpQ6umylxWXSTYUIO0qbdTjNTR8UwRKPlHjuUJ149E5eH+s\/oyE6zZi9KNzx8BwjeZ\/Qeo\/CQF7fMuu3uJF7XOOIDqLidXvevQEr8hHLUyT40a\/NZsOAoqQSoNppazy+tDuttATH7gFWjFKNzRtt89wDdbjWNtK95tc\/uUBojfjg5HKcctSmqQ7jW6HvA2J5k3WnC6mxsTdaU9WPjtKbnqGUTkoM9YbJs1VghcnnQLSH49wAY7kB5SwWwTaPkHZy5kvytfMvLjwgjUioW0qYSpZyaBww4dSXJ0bQ1Mb+TArunrCpIzl2T4ZkzWT3\/j0m4bJoq7le4l03NVAn8iA3ju2asrBbrySTWzQ9vXDQbq1q+S5uh9YTXrVq0dM6CMNV8KquOCEC0UyaTKxCK2+cAS9LDQD4APXRTuNhkR57LKox2CfvN+CTDlWw8QfFfYKdNpmt\/OHklrUez0LcfMluc08ce1fvoDCuOqMN51y5qhV+d3utWa5rBjvzhE8de5qi54l3qW4EV03sQRdvN7R433fxOVt33N1mZ3NOwx1xjnJ4ivdVuhZ1XbGHd\/B7NGGafQbx3RChEIT250Kl3vih\/P2yF1ozQC8MY6sAHgOxAufmos8DoOwwWy9L59lNqN2sAnVpPalvjM4UCa8pkSrToDaoU4Sc44JOBghQ==","appAccessToken":"","seqNO":"127600","appID":"a539d3d7-3d4b-454b-9c49-7fb83fb8b611"}';
- $arr = json_decode($arr, true);
-
- if (!isset($arr['rsaEncryptData']) || !isset($arr['seqNO']) || !isset($arr['signMethod']) || !isset($arr['sign']) || !isset($arr['encryptMethod']) || !isset($arr['reqData']) || !isset($arr['appID'])) {
- return self::runJson("1000001", "缺少参数");
- }
- dump("获取到的post数据");
- dump($arr);
-
- $rasKey = self::decryptByPublicKey($arr['rsaEncryptData']);
- dump("解密后的秘钥");
- dump($rasKey);
-
- $key = $arr['seqNO'] . self::$token . self::$appSecretKey . $rasKey;
-
- $key = strtoupper(md5($key));
-
- $res = $this->decrypt($arr['reqData'], $key);
- $res = json_decode($res, true);
- dump("数据结果");
- halt($res);
- }
-
- public static function SM2Encrypt($data, $pubkey)
- {
-
- php_SM2Encrypt($data, $cipher, $pubkey);
-
- php_SM2FormatConvert(102, $cipher, $der);
-
- $sm2encrypted = base64_encode($der);
- return $sm2encrypted;
- }
-
- public static function SM2Decrypt($data, $privkey)
- {
-
- $recode = php_SM2FormatConvert(101, $data, $c1c3c2);
- echo "<br/>recode:$recode \n";
-
- $recode = php_SM2Decrypt($c1c3c2, $plain, $privkey);
- echo "<br/>recode:$recode \n";
- echo "<br/>解密数据plain: $plain\n";
- return $plain;
- }
-
- public static function SM2Sign($data, $pubkey, $privkey)
- {
-
- $recode = php_SM2Sign($data, $redata, $privkey, $pubkey);
- echo "<br/>recode:$recode \n";
-
- $php_func = 'php_SM2FormatConvert';
- $recode = $php_func(202, $redata, $der);
- echo "<br/>recode:$recode \n";
- echo "<br/>data: " . $data . " len:" . strlen($data) . " \n";
- echo "<br/>signValue DER: " . base64_encode($der) . " len:" . strlen($der) . " \n";
-
- $sm2SignData = base64_encode($der);
- return $sm2SignData;
- }
-
- public static function SM3Crypt($data)
- {
- $recode = php_SM3Crypt($data, $sm3hash);
-
- return strtoupper(self::string2hex($sm3hash));
- }
-
- public static function hex2String($hexdata)
- {
- $bindata = "";
- for ($i = 0; $i < strlen($hexdata); $i += 2) {
- $bindata .= chr(hexdec(substr($hexdata, $i, 2)));
- }
- return $bindata;
- }
-
- public static function SM4Encrypt($data, $password)
- {
-
- $password = substr(strtoupper(md5($password)), 8, 16);
- echo "<br/>【SM4】MD5加密密码=======" . $password;
-
-
-
- $recode = php_CryptKey(0, $password, $key);
- echo "<br/>recode:$recode \n";
-
- $recode = php_SM4CBCCrypt(0, $data, $redata, $key, self::$iv);
- echo "<br/>recode:$recode \n";
- echo "<br/>redata: " . base64_encode($redata) . " \n";
- $SM4Encryptdata = base64_encode($redata);
- return $SM4Encryptdata;
- }
-
- public static function SM4Decrypt($data, $password)
- {
- echo "<br/>SM4解密数据=======" . $data;
-
- $password = substr(strtoupper(md5($password)), 8, 16);
- echo "<br/>MD5密码=======" . $password;
-
-
-
- $recode = php_CryptKey(0, $password, $key);
- echo "<br/>recode:$recode \n";
-
- $recode = php_SM4CBCCrypt(1, base64_decode($data), $dedata, $key, self::$iv);
- echo "<br/>sm4[解密]recode:$recode \n";
- return $dedata;
- }
-
- private static function decryptByPublicKey($data)
- {
- $data = base64_decode($data);
- openssl_public_decrypt($data, $decrypted, self::PUBLIC_KEY, OPENSSL_PKCS1_PADDING);
- return $decrypted;
- }
-
- private static function encryptByPrivateKey($data)
- {
- openssl_private_encrypt($data, $encrypted, self::PRIVATE_KEY, OPENSSL_PKCS1_PADDING);
-
- return base64_encode($encrypted);
- }
-
- private static function runJson($code = "000000", $msg = "完成")
- {
- return json(['code' => $code, 'message' => $msg]);
-
- }
-
- private static function https_post($url, $data = null)
- {
- $data = json_encode($data, JSON_UNESCAPED_SLASHES);
- $header [] = 'Content-Type:application/x-www-form-urlencoded';
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
- curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
- @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
- curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- $tmpInfo = curl_exec($ch);
- curl_close($ch);
- return json_decode($tmpInfo, true);
- }
-
- private static function getKey($length = 16)
- {
-
- $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ2345678';
- $key = '';
- for ($i = 0; $i < $length; $i++) {
- $key .= $chars[mt_rand(0, strlen($chars) - 1)];
- }
- return $key;
- }
- }
|