Openapi.php 6.8 KB
<?php

namespace app\api\controller\tieta;

use app\common\controller\Api;
use lib\SM4;
use think\Controller;
use think\Db;
use think\Request;
use app\common\helper\HttpHelper;

/**
 * 铁塔Openapi对接
 */
class Openapi extends Api
{
    protected $noNeedLogin = ['*'];//*无需验证登陆
    protected $noNeedRight = ['*'];
    protected $jiemi_key = "975C7238C3824FB0";

    protected $appid = "df92a75c6a62bxxx";//服务商在铁塔平台的唯一标识
    protected $bizContent = "3vb+juxxxWxxHlW+WxZ9yg==";//Json格式字符串sm4加密后的密文,具体加密方式见1.6章节
    protected $encryptType = "SM4";//加密方式名称
    protected $requestId = "fbc66379-52d4-4d9d-91d7-c2f5b21e7e43";//请求标识
    protected $signType = "签名方式名称";//SM2
    protected $timestamp = "1640741365952";//获取时间戳(毫秒)
    protected $sign = "MEUCIQCoeDP9nkpqkLv05aN9CitEWEAbqzUv8KRx84paa464DAIgK0os3gu9wd9N1l05Wm/EzvEj7bN8v5mptbft5pq6Nus=";//通过sm2加签计算出来的签名值,具体加签方法见1.5章节
    //注:公共参数在请求时拼接成querystring形式后注意使用URL编码。
    //参数示例:appId=df92a75c6a62bxxx&bizContent=3vb%2xxxZuSWxxHlW%2BWxZ9yg%3D%3D&encryptType=SM4&requestId=fbc66379-52d4-4d9d-91d7-c2f5b21e7e43&sign=MEUxxxxxxDP9nkpqkLv05aN9CitEWEAbqzUv8KRx84paa464DAIgK0os3gu9wd9N1l05Wm%2FEzvEj7bN8v5mptbft5pq6Nus%3D&signType=SM2&timestamp=1640741365952

    public function _initialize()
    {
        $this->timestamp = $this->getMillisecond();
        //公共请求参数

        $header_data = [
            "appId" => $this->appid,
            "bizContent" => $this->bizContent,
            "encryptType" => $this->encryptType,
            "requestId" => $this->requestId,
            "signType" => $this->signType,
            "timestamp" => $this->timestamp,
        ];
        //获取sign值
        $this->sign = $this->sign_sm2_base64($header_data);
        $header_data["sign"] = $this->sign;
        dump($this->sign);
        $post_string = $this->format_param($header_data);
        dump($post_string);
        die;

        $param = $this->request->param();

        parent::_initialize();
    }

    /**
     * test
     */
    public function test()
    {
        require_once '../extend/lib/SM4.php';

        $json = '{"BUSINESS":{"BUSICODE":"10014","BUSINAME":"不动产产权数据接口"},"PARAMETER":"7t7FyzdY4aR+S0HulzzLgqlT9KsY5OEgZ/ZT90uGET+YYUuCsD49stFfdCV3zXzZrzXjbpxtFaBY9dxPfzUsb6Qyz9wOMqpCur6oB5HOorb85n+9ATUpPBPijm95pQuzAC38uQYR46ct5/Kq3HMgh3Uh79ArAiLOC5vDOnTHdDvVHioZf4TP0NBrcipZ2LXw1v1tJMFzSoqR6vVCV/l8Uq+go+E985otZjZcPa7ShVpoXtPq5x+Wak36Tn89PtyTIPeWvvwiGmzKC8SrxJU/v9RXv3wMEcIaDEFCd34vgcsWxGiAx1xArNNNQ3ITX6CxNBD+YcvYwrcIDycJO/hsimzNL8M+rWW3m4xTi0OsDihir+Ox5emZ7diLg5TArLExoBZ5KEjB/EIUuYMqm2YZt6qtGwqZImDVVuDgReeMfcjJK0z/mmZN/VidEJfABN57wdWpZit1kQH7tv/aAHsSn5YpID06nMSpmwhRZbKMO6viAieQPkxzcEkqLRsE2zivWlvTzfw1EJnXppb+APfMIf0gvA2REo9YMUZfmRhUYkG3j7OvkOyDHqaYCskoU5+IVApgrdgiFFLZmZfV8lOJ7+tAKekz86hPnlGAB8l6hwiffX0a4oySeLJEpK3PH3HYrzdy8AkSiCbESJBNPW75GqnSGZbfKTmmIo9G2T8Y0t6LDq7GXSLCjoHCXg5ZVRdpDIU/rivrxF96q86iNCkOJt5NJlHkFITXpOztGpJjiC6DygD7Q0Ynpdczrt4Oypu0cifj+4ODsQdTWv4blQVSGanSD6D3MNPYxgSojMpY7vwmHUp6MqF4uNS52PE0PilhHki+xNDKJ2Vcf7g5BaNWPmYdjWUBSXu40HOdC9ZA1D8T0P621E3fFDuPL1FSlZ/WgbZizttFj5JcqQYU8pDiNEArSei6O0F7V2lPAEgRyYNtZwcXi5/cvquhzNyL9wiJmKHCHru5DyZk3Xa6lTGfq41DoU5qiQMNxuuvrstcMoe2CupjVNqpbl2PYvei/PmbCLyss+H+0bztzcjr+d4PSjwbHrqeU/+gwj2DSRxoY4xzNb4ZCydQN+zqwBbH/Ebv6FyyR7Ae8/fFDwakvwVW8gTHIxBVFhuizfUrRAqc2eRDlKrUsyKtpuFzZ132HGCDzLTixm0YLw1CU+U47ZMN8uncePN5lJ1LrosHSHBzvU5RYjV7GBOG8+UKCN4n82yJLwtewNK+Zp6QcZNillBlyk3sdEOyxmc0h0Iup1ozyuHmPKlB+/xTqtlu3QtWK4wH6mFaut+ix14S2UTjRpVoBqqfswQ0/PkKnK+aXAhVtkdudw61fi03X7mxw77MHLZEGPqhF/mSjyqEPHTHk59EtsclAgxqDd7ICgDfw45RFJY9Agu9cGw7ZPna3IpFuojahtu6YjfF4c+z8S2348kcx92pQwJ3kwhPj+b1SG2JMHkIKMhIh5mRMwNqLAk+ysh9QrzvtKZv0LrEeKJ92nYf3mG683FsNN8oSadatLD7YBdRanSTbIzkTlCd7jC6Ian6eqpjdHO02yW/MQta3YlMiclW1VTFcyx6ou/AEUrie0Yk3AjTp4JIILtwIJazPDLtjh0a97z30iEQjzrB3do+449d4+ZhZkIvKQyFJpwvm137d35m/2F2CK+CJDCYTLVd9qA5fFGGqBjQ4VyRx6e8Dogrd258gjYbQ5a7oMeZRTI/9Tpdd8psj23dSE+NasZvTUVLSFt7FOYoEve9G4maJw4LKgACUYYKgLYVe5SZeg0BKXYmibTZadprXYM/GpKF8/OI2co7z92+pE1wuCJV4C0f3QEFG3hj1SUA2wDGid41QC4bSk654L5fkQcQmGeG/wU+m05wHazwy5Iptom2vjDJPbq89E9tmN8PL3XXyU4vC17A0r5mnpBxk2KWUGXKTex0Q7LGZzSHQi6nWjPK4eY8qUH7/FOq2W7dC1YrjAfz1Aw5g5sGxzvsHNdHo72JF6bzQNEGKOksEhvivrMr2AYAYStHLglBu3WQ3/wiLC+aSOr4/Aebo+JANztmpNSyv7F00jorQMPostNwqT4dFcC9GoQvL/dcjxF1188G7abXG3vyu4rAPDduv+mnG6ltfr3memWgqgbubmRep0e8ZRUE9xz+5ZmsNKK489LQzv3l4w9ZY7E4dE1xY9MQnnU/kzE9i11x1nxCb1aFojzX+JHh5B4bS41TxQ0RlwRsea0w/JuNTE1/wOaAQLebFI7U"}';
        $arr = json_decode($json, true);

        $key = $this->jiemi_key;//解密key(16位)
        $data = $arr['PARAMETER'];
        $sm4 = new SM4();
//        echo "\n 加密key:" . $key . "\n";
//        echo "加密结果:" . $data . "\n";
        $b = $sm4->decrypt($key, $data);
//        echo "解密结果:" . $b . "\n";
        $b = json_decode($b, true);
        $this->success("解密成功", $b);

//        echo "\n 加密key:" . $key . "\n";
//        echo "明文:" . $data . "\n";
////        $a = $sm4->encrypt($key, $data);
//        echo "加密结果:" . $a . "\n";
//        $b = $sm4->decrypt($key, $a);
//        echo "解密结果:" . $b . "\n";

    }

    /**
     * 测试铁塔接口
     */
    public function testrequest()
    {
        $url = "https://testdjyopenapi.zgscdx.cn/api/v1/hy/testrequest";

        $json = [
            "key1" => 1,
            "key2" => 2
        ];

        $res = HttpHelper::curl($url, 'POST', $json);
        dump($res);
        die;
        $res = json_decode($res, true);
        $this->success("", $res);
    }

    /**
     * 国密sm2方式加签
     * 所有接口在请求时需要对除sign外的所有公共参数进行字典排序后以key=value&key=value的形式,
     * 例如:appId=xxx&bizContent=xxx&encryptType=SM4&requestId=xxx&signType=SM2&timestamp=1640741365952
     */
    public function sign_sm2_base64($data)
    {
        $data = $this->format_param($data);
        dump($data);
        die;
    }

    /**
     * 将数组 字典升序排列 后 用&拼接
     */
    public function format_param($header_data)
    {
        ksort($header_data);
        //构造传递的参数
        $post_params = [];
        foreach ($header_data as $k => &$v) {
            if (is_array($v)) {
                $v = implode(',', $v);
            }
            $post_params[] = $k . '=' . urlencode($v);
        }
        $post_string = implode('&', $post_params);
        return $post_string;
    }

    /**
     * 获取毫秒时间戳
     */
    public static function getMillisecond()
    {
        list($msec, $sec) = explode(' ', microtime());
        $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        return $msectimes = substr($msectime, 0, 13);

    }
}