• UC登录功能:商户需要创建的表


    1:类似PHP的hash_hmac

    DELIMITER ;;
    CREATE DEFINER=`root`@`%` FUNCTION `uc_session_hmacsha1`(
        `_secretkey` VARCHAR(64),
        `_message` VARCHAR(256)
    )
    RETURNS char(40) CHARSET utf8
    LANGUAGE SQL
    DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT '类似PHP的hash_hmac'
    BEGIN
    DECLARE ipad,opad BINARY(64);
    DECLARE hexkey CHAR(128);
    DECLARE hmac CHAR(40);
    SET hexkey = RPAD(HEX(_secretkey),128,"0");
    /* process in 64-bit blocks to avoid overflow when converting to decimal*/
    SET ipad = UNHEX(CONCAT(
    LPAD(CONV(CONV(MID(hexkey,1  ,16),16,10) ^ CONV('3636363636363636',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,17 ,16),16,10) ^ CONV('3636363636363636',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,33 ,16),16,10) ^ CONV('3636363636363636',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,49 ,16),16,10) ^ CONV('3636363636363636',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,65 ,16),16,10) ^ CONV('3636363636363636',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,81 ,16),16,10) ^ CONV('3636363636363636',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,97 ,16),16,10) ^ CONV('3636363636363636',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,113,16),16,10) ^ CONV('3636363636363636',16,10),10,16),16,"0")
    ));
    SET opad = UNHEX(CONCAT(
    LPAD(CONV(CONV(MID(hexkey,1  ,16),16,10) ^ CONV('5c5c5c5c5c5c5c5c',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,17 ,16),16,10) ^ CONV('5c5c5c5c5c5c5c5c',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,33 ,16),16,10) ^ CONV('5c5c5c5c5c5c5c5c',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,49 ,16),16,10) ^ CONV('5c5c5c5c5c5c5c5c',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,65 ,16),16,10) ^ CONV('5c5c5c5c5c5c5c5c',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,81 ,16),16,10) ^ CONV('5c5c5c5c5c5c5c5c',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,97 ,16),16,10) ^ CONV('5c5c5c5c5c5c5c5c',16,10),10,16),16,"0"),
    LPAD(CONV(CONV(MID(hexkey,113,16),16,10) ^ CONV('5c5c5c5c5c5c5c5c',16,10),10,16),16,"0")
    ));
    SET hmac = SHA1(CONCAT(opad,UNHEX(SHA1(CONCAT(ipad,_message)))));
    RETURN hmac;
    END;;
    DELIMITER ;

    2:商户自己生成的登录密钥

    CREATE TABLE `uc_session_key` (
        `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
        `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        `started` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        `expired` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        `secretkey` CHAR(32) NOT NULL,
        PRIMARY KEY (`id`),
        UNIQUE INDEX `secertkey` (`secretkey`),
        UNIQUE INDEX `expired` (`expired`),
        UNIQUE INDEX `started` (`started`)
    )
    COMMENT='商户自己生成的登录密钥'
    COLLATE='utf8_general_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=1
    ;

     3:商户自己自动来生成随机的登录密钥

    CREATE DEFINER=`root`@`%` EVENT `uc_session_autoadd`
        ON SCHEDULE
            EVERY 10 MINUTE STARTS '2018-10-28'
        ON COMPLETION PRESERVE
        ENABLE
        COMMENT '商户自己自动来生成随机的登录密钥'
        DO BEGIN
        DELETE FROM uc_session_key WHERE expired<CURRENT_TIMESTAMP();
        INSERT INTO uc_session_key(started,expired,secretkey)VALUES(CURRENT_TIMESTAMP(),TIMESTAMPADD(SECOND,86400,CURRENT_TIMESTAMP()),MD5(CONCAT(CURRENT_TIMESTAMP(6),RAND())));
    END

    4:商户获取自己指定keyid的信息

    DELIMITER ;;
    CREATE DEFINER=`root`@`%` FUNCTION `uc_session_key_getbykeyid`(
        `keyid` INT unsigned,
        `ssskey` VARCHAR(32)
    )
    RETURNS json
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT '商户获取自己指定keyid的信息'
    BEGIN
        DECLARE _ssskey VARCHAR(32);
        DECLARE _secretkey VARCHAR(32);
        DECLARE _expired TIMESTAMP;
        SELECT v INTO _ssskey FROM uc_settings WHERE k='ssskey';
        IF ISNULL(_ssskey) THEN
            RETURN JSON_OBJECT('errno',-1,'message','ssskey未设置');
        END IF;
        IF _ssskey<>ssskey THEN
            RETURN JSON_OBJECT('errno',-2,'message','ssskey不匹配');
        END IF;
        SELECT secretkey,expired INTO _secretkey,_expired FROM uc_session_key WHERE id=keyid;
        IF ISNULL(_secretkey) THEN
            RETURN JSON_OBJECT('errno',-3,'message',CONCAT('keyid=',keyid,'不存在'));
        END IF;
        RETURN JSON_OBJECT('errno',0,'secretkey',_secretkey,'expired',_expired);
    END;;
    DELIMITER ;

    5:商户获取自己的最新keyid

    DELIMITER ;;
    CREATE DEFINER=`root`@`%` FUNCTION `uc_session_key_getlastkeyid`()
    RETURNS int(10) unsigned
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT '商户获取自己的最新keyid'
    BEGIN
        DECLARE _keyid INT(10)UNSIGNED;
        SELECT id INTO _keyid FROM uc_session_key WHERE started<CURRENT_TIMESTAMP() AND expired>CURRENT_TIMESTAMP() ORDER BY expired DESC LIMIT 1;
        RETURN _keyid;
    END;;
    DELIMITER ;

    6:配置表

    CREATE TABLE `uc_settings` (
        `k` VARCHAR(32) NOT NULL DEFAULT '',
        `v` TEXT NOT NULL,
        PRIMARY KEY (`k`)
    )
    COLLATE='utf8_general_ci'
    ENGINE=MyISAM
    ;
    INSERT INTO `uc_settings` (`k`, `v`) VALUES ('ssskey', '123456123456');

     7:PHP脚本

    <?php
    
    $appid = 1;
    $ssskey = '123456123456';
    $pdo1 = new MyPDO('10.86.2.36', 3324, 'feieryun', 'feieryun', 'firadio_ucenter');
    $pdo2 = new MyPDO('10.86.2.36', 3324, 'feieryun', 'feieryun', 'firadio_ucenter');
    //取得UC的当前keyid
    $uc_keyid = $pdo1->fetch('SELECT `uc_session_keycenter_getkeyid`(:_appid)', array('_appid' => $appid));
    if (!is_numeric($uc_keyid)) {
        console('uc_keyid is not numeric.');
    }
    //取得商户的最新keyid
    $app_keyid = $pdo2->fetch('SELECT `uc_session_key_getlastkeyid`()');
    if (!is_numeric($app_keyid)) {
        console('app_keyid is not numeric.');
    }
    if ($uc_keyid === $app_keyid) {
        console('its same.');
    }
    //从商户数据库里分别取得UC和商户的secretkey
    $bykeyid_old = json_decode($pdo2->fetch('SELECT `uc_session_key_getbykeyid`(:keyid,:ssskey)', array('ssskey' => $ssskey, 'keyid' => $uc_keyid)), true);
    if (!isset($bykeyid_old['errno']) || $bykeyid_old['errno'] !== 0) {
        console($bykeyid_old);
    }
    $bykeyid_new = json_decode($pdo2->fetch('SELECT `uc_session_key_getbykeyid`(:keyid,:ssskey)', array('ssskey' => $ssskey, 'keyid' => $app_keyid)), true);
    if (!isset($bykeyid_new['errno']) || $bykeyid_new['errno'] !== 0) {
        console($bykeyid_new);
    }
    //更新UC的secretkey
    $result = json_decode($pdo1->fetch('SELECT `uc_session_keycenter_setnew`(:_appid,:old_secretkey,:new_keyid,:new_secretkey,:new_expired)',
    array('_appid' => $appid, 'old_secretkey' => $bykeyid_old['secretkey'],
    'new_keyid' => $app_keyid, 'new_secretkey' => $bykeyid_new['secretkey'], 'new_expired' => $bykeyid_new['expired'])), true);
    if (!isset($result['errno']) || $result['errno'] !== 0) {
        console($result);
    }
    console('OK.');
    function console($obj) {
        print_r($obj);
        exit;
    }
    class MyPDO {
        public function __construct($host, $port, $username, $password, $db) {
            $set = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'");
            try {
                $this->dbh = new PDO("mysql:host=$host;port=$port;dbname=$db;", $username, $password, $set);
            } catch (PDOException $e) {
                print "Error: " . $e->getMessage() . "<br/>";
                die();
            }
        }
        public function fetch($sql, $arr = array()) {
            $stmt = $this->dbh->prepare($sql);
            if (!$stmt->execute($arr)) {
                print_r($stmt->errorInfo());
                die();
            }
            return $stmt->fetch(3)[0];
        }
    }

    8:BAT

    @ECHO OFF
    :1
    php -c php.ini php-mysql-pdo.php
    TIMEOUT 10
    GOTO 1
    PAUSE

    9:php.ini

    [PHP]
    extension_dir = "ext"
    extension=pdo_mysql
  • 相关阅读:
    X oracle 12c new feature: Automatic Report Capturing Feature
    X 搭建Postgresql configure: error: readline library not found
    X windows上利用vmvare搭建共享存储搭建rac
    洛谷P1397 [NOI2013]矩阵游戏
    BSOJ 6289【NOIP2018模拟赛】黄昏
    BSOJ 4282 秀秀的照片
    BSOJ 5185【11.08题目】暴力破解
    BSOJ 5100 简单的区间
    VUE 项目自适应屏幕和浏览器
    yarn npm区别
  • 原文地址:https://www.cnblogs.com/xiangxisheng/p/9886196.html
Copyright © 2020-2023  润新知