PHP 对称加密 标准版本 生成 sign

逻辑流程

假设url 是
http://weixin.qq1121.com/?appid=70f023d800054140&user_id=100027&time=345678909

签名步骤一:按字典序排序参数
结果:
appid=70f023d800054140&time=345678909&user_id=100027

签名步骤二:将key与value 用“=”连接,将其他参数用“&”连接
结果:
appid=70f023d800054140&time=345678909&user_id=100027

签名步骤三:在string后加入KEY
结果:
appid=70f023d800054140&time=345678909&user_id=100027&key=6b3d4788d2d98ab2c11f835375e97dd2

//签名步骤四:MD5加密
88526ffff5da22a62c9ca41f48c33207

//签名步骤五:所有字符转为大写
88526FFFF5DA22A62C9CA41F48C33207

 

 

controller 层调用

        if(!$this->checkSign()){
            return Result::echoJson(0,'签名验证错误!',[]);
        }

 

 

底层代码

    // 验证签名
    public function checkSign(){
        $post = \Yii::$app->request->post();
        $post = [
            'appid'=>'70f023d800054140',
            'user_id'=>'100027',
            'time'=>'345678909',
            'sign'=>'88526FFFF5DA22A62C9CA41F48C33207',
        ];

        $sign = $this->makeSign($post);
        return $sign==$post['sign'];
    }

    /**
     * 生成签名
     * @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值
     */
    public function makeSign($data)
    {
        if(isset($data['sign'])){
            unset($data['sign']);
        }

        //签名步骤一:按字典序排序参数
        ksort($data);
        $string = http_build_query($data);
        //签名步骤二:在string后加入KEY
        $string = $string . "&key=".$this->_Config['secret'];
        //签名步骤三:MD5加密
        $string = md5($string);
        //签名步骤四:所有字符转为大写
        return strtoupper($string);
    }

 

发表评论

电子邮件地址不会被公开。