| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | <?php namespace Api\Lib\Platform;use Dever;class Sign{    protected static $load;    public static function load($field, $config)    {        $key = $config['id'];        if (empty(self::$load[$key])) {            self::$load[$key] = new self($field, $config);        }        return self::$load[$key];    }    public function __construct($field, $config)    {        $this->field = $field;        $this->config = $config;    }    public function get()    {        $this->init();        $this->encrypt();        $this->after();        $this->field->set($this->config['name'], $this->info);        return $this->info;    }    public function check($arg = '')    {        if ($arg) {            $this->config['arg'] = $arg;        }        $sign = $this->field->{$this->config['name']};        if (!$sign) {            Dever::error('签名验证失败');        }        if ($this->config['encrypt'] > 0) {            $this->init();            $check = $this->field->ssl->decrypt($this->config['encrypt'], $sign, $this->info);        } else {            $check = $sign == $this->get();        }        if (!$check) {            Dever::error('签名验证失败');        }    }    protected function init()    {        $this->create();        if ($this->config['kv_sort'] == 2) {            ksort($this->info);        } elseif ($this->config['kv_sort'] == 3) {            $this->info = array_values($this->info);            sort($this->info, SORT_STRING);        }        $this->join();        $this->toString();    }    protected function create()    {        $this->info = [];        if ($this->config['arg']) {            $col = explode("\n", $this->config['arg']);            foreach ($col as $k => $v) {                if ($v == 'body') {                    $this->info = array_merge($this->field->body, $this->info);                } elseif ($v == 'header') {                    $this->info = array_merge($this->field->header, $this->info);                } elseif ($v == 'query') {                    $this->info = array_merge($this->field->query, $this->info);                } else {                    $k = $v;                    if (strstr($v, '=')) {                        $t = explode('=', $v);                        $v = $t[1];                        $k = $t[0];                    }                    $this->info[$k] = $this->field->value($v);                }            }        } else {            $this->info = $this->field->body;        }    }    protected function join()    {        if (strstr($this->config['kv_join'], '\\')) {            $this->config['kv_join'] = preg_replace_callback(                '/\\\\([nrtf])/', // 匹配 \n, \r, \t, \f 等特殊字符                function ($matches) {                    $map = [                        'n' => "\n",                        'r' => "\r",                        't' => "\t",                        'f' => "\f"                    ];                    return $map[$matches[1]]; // 直接从映射中获取替换值                },                $this->config['kv_join']            );        }    }    protected function toString()    {        $string = '';        foreach ($this->info as $k => $v) {                        if ($this->config['kv_value_empty'] == 2 && null === $v) {                continue;            }            if (is_array($v)) {                $v = Dever::json_encode($v);            }            if ($this->config['kv_key_handle']) {                $k = Dever::load('util', 'api')->format($this->config['kv_key_handle'], $k);            }            if ($this->config['kv_value_handle']) {                $v = Dever::load('util', 'api')->format($this->config['kv_value_handle'], $v);            }            if ($this->config['kv_type'] == 1) {                $string .= $v;            } elseif ($this->config['kv_type'] == 2) {                $string .= $k;            } elseif ($this->config['kv_type'] == 3) {                $string .= $k . '=' . $v;            } elseif ($this->config['kv_type'] == 4) {                $string .= $k . $v;            } elseif ($this->config['kv_type'] == 5) {                $string .= $k . ':' . $v;            }                        $string .= "{$this->config['kv_join']}";        }        if ($this->config['kv_join_handle'] == 1) {            $this->info = rtrim($string, $this->config['kv_join']);        } else {            $this->info = $string;        }    }    protected function encrypt()    {        $log = [];        $log['request_id'] = $this->field->request_id;        $log['name'] = $this->config['name'];        $log['string'] = $this->info;        if ($this->config['encrypt'] == -2) {            $this->info = md5($this->info);        } elseif ($this->config['encrypt'] == -3) {            $this->info = hash("sha256", $this->info);        } elseif ($this->config['encrypt'] == -4) {            $this->info = sha1($this->info);        } else {            $this->info = $this->field->ssl->encrypt($this->config['encrypt'], $this->info);        }        $log['encode'] = $this->info;        if ($this->field->log) {            Dever::log($log, 'api_sign');            Dever::debug($log, 'api_sign');        }    }    protected function after()    {        if ($this->config['after']) {            $this->info = Dever::load('util', 'api')->format($this->config['after'], $this->info);        }    }}
 |