thinkphp5系列之整合小米登录

发布时间:1970-01-01  编辑:Mrs.默先森 

    前几天看到有童鞋做小米登录,遇到不少问题,抽了个小时间也体验一把【为发烧而生】,这一烧,一直没去过小米官网的超人,顺便把小米官网逛了个够,这一顿逛啊,发现东西还真不少,╮(╯▽╰)╭哎,我也就是去逛逛而已...


    废话不多说,先上链接

    小米开放平台:https://dev.mi.com/console/

    管理控制台:https://dev.mi.com/console/man/

    小米开放平台OAuth PHP SDK:https://github.com/xiaomi-passport/oauth-php-sdk

    文档中心:https://dev.mi.com/console/doc/

    小米Logo下载:https://dev.mi.com/docs/passport/file/mi_icon.zip

    开放数据接口权限列表:https://dev.mi.com/console/doc/detail?pId=762

    相关错误码定义:https://dev.mi.com/console/doc/detail?pId=765


    ①小米开放平台注册填写开发者资料

    点击右上角【资料修改】--【个人开发者】

    如果你是企业开发者那么点击【企业开发者即可】

    这里以个人开发者进行说明

    1501856023262844.png

    然后就是合同条款,点同意下一步即可

    next就是【开通开发者个人账号】

    按要求填写开发者资料,完事之后点击注册等待审核即可

    这个审核还是比较快的

    也有可能是超人比较帅的缘故

    完成之后可获得AppID和AppSecret

    AppID和

    ②创建网页应用

    点击导航栏上的【管理控制台:https://dev.mi.com/console/man/

    找到【网页应用】,点进去


    1501857798370529.png

    点击创建网页用用,按照要求进行填写即可

    ③启用应用并且填写回调地址

    点击导航栏上的【管理控制台:https://dev.mi.com/console/man/

    找到【账号服务】,点进去

    会看到小米账号未接入服务中自己刚创建好的应用

    点进去之后,点击立即启用就好了

    1501858318957237.png

    1501858318908778.png

    点击立即启用之后

    会弹出【启用账号服务】弹出框

    这里需要输入回调地址

    1501870685571936.png

    点击启用即可

    至此小米后台的配置工作就ok~\(≧▽≦)/~啦啦啦

    ④下载SDK上传至服务器

    下载好SDK【小米开放平台OAuth PHP SDK:https://github.com/xiaomi-passport/oauth-php-sdk

    里面有两个文件包

    1501855328888736.png

    把php-sdk-demo放到服务器上,访问就可以先行体验一把小米登录(上小米官网登录也算是体验把...),我们需要的是另外一个【php-sdk】,将该文件放到自己开发项目中,上传至服务器

    ⑤载入SDK

    按照自己路径加载以下文件

    小米sdk文件夹的名称我自己修改了

    默认是php-sdk

    require_once('./xiaomi-php-sdk/utils/XMUtil.php');
    require_once('./xiaomi-php-sdk/utils/AccessToken.php');
    require_once('./xiaomi-php-sdk/httpclient/XMHttpClient.php');
    require_once('./xiaomi-php-sdk/httpclient/XMOAuthClient.php');
    require_once('./xiaomi-php-sdk/httpclient/XMApiClient.php');

    ⑥引导用户到小米授权登录页面

    这里当点击小米登录之后

    跳转至以下代码所在方法

    这里超人的登录请求地址为:http://blog.ishilf.com/mi/login/login.html

    这个时候当请求http://blog.ishilf.com/mi/login/login.html时候会唤起小米登录页面

    class Login extends Controller
    {
    
       /**
        * 网站登录首页
        * @return \think\response\View
        */
       public function index ()
       {
          return view ();
       }
    
       /**
        *登录请求地址
        */
       public function login ()
       {
          $clientId     ='这里输入你自己的AppID';
          $clientSecret = '这里输入你自己的AppSecret';
          $redirectUri  = '这里输入你在启用应用时填写的回调地址';//这里超人设置的回调地址:http://blog.ishilf.com/mi/entry/index.html
    
          //引导用户到小米登录页面
          $oauthClient = new \XMOAuthClient( $clientId , $clientSecret );
          $oauthClient->setRedirectUri ( $redirectUri );
          $responseType = 'code';
          $state        = 'state';
          $url          = $oauthClient->getAuthorizeUrl ( $responseType , $state );
          Header ( "HTTP/1.1 302 Found" );
          Header ( "Location: $url" );
          exit;
       }
    }

    ⑦回调地址处理

    回调地址获取用户信息代码:

    class Entry extends Controller
    {
       //网站首页
       public function index ()
       {
          if(isset($_GET['code']) && isset($_GET['state'])){
             $clientId     ='这里输入你自己的AppID';
             $clientSecret = '这里输入你自己的AppSecret';
             $redirectUri  = '这里输入你在启用应用时填写的回调地址';//这里超人设置的回调地址:http://blog.ishilf.com/mi/entry/index.html
             $userProfilePath = '/user/profile';
             if ( isset( $_GET[ 'code' ] ) ) {
                $code        = $_GET[ 'code' ];
                $oauthClient = new \XMOAuthClient( $clientId , $clientSecret );
                $oauthClient->setRedirectUri ( $redirectUri );
                $token = $oauthClient->getAccessTokenByAuthorizationCode ( $code );
                //  token有较长的有效期,可以存储下来,不必每次去获取token
                //halt($token);
                if ( $token ) {
                   // 如果有错误,可以获取错误号码和错误描述
                   if ( $token->isError () ) {
                      $errorNo  = $token->getError ();
                      $errordes = $token->getErrorDescription ();
                      print "error no : " . $errorNo . "   error description : " . $errordes . "
    ";
                   } else {
                      // 拿到token id
                      $tokenId = $token->getAccessTokenId ();//halt ( $tokenId );
                      // 创建api client
                      $xmApiClient = new \XMApiClient($clientId, $tokenId);
                      // 获取nonce  随机数:分钟
                      $nonce = \XMUtil::getNonce();
                      $path = $userProfilePath;
                      $method = "GET";
                      $params = array('token' => $tokenId, "clientId" => $clientId);
                      // 计算签名
                      $sign = \XMUtil::buildSignature($nonce, $method,  $xmApiClient->getApiHost(), $path, $params, $token->getMacKey());
                      // 构建header
                      $head =\XMUtil::buildMacRequestHead($tokenId, $nonce, $sign);
                      // 访问api
                      $result = $xmApiClient->callApi($userProfilePath, $params, false, $head);
                      //halt($result);
                      $result = $xmApiClient->callApiSelfSign($userProfilePath, array(), $token->getMacKey());
                      halt($result);//打印用户信息
                   }
                }
             } else {
                print "Get token Error";
             }
          }
       }
    }

    跳转到回调地址时

    $_GET['code'],get中的code参数只有一次有效

    当再次刷新页面时会打印出错误码以及错误消息:error no : 96013 error description : invalid authorization code

    对照错误码表:授权码无效或已经过期, 授权码只能用一次, 而且 10 分钟有效

    当登录成功之后

    打印的用户信息如下

    array(4) {
      ["code"] => int(0)
      ["data"] => array(8) {
        ["miliaoIcon"] => string(83) "https://account.xiaomi.com/static/res/7c3e9b0/passport/acc-2014/img/n-avator-bg.png"
        ["miliaoIcon_120"] => string(83) "https://account.xiaomi.com/static/res/7c3e9b0/passport/acc-2014/img/n-avator-bg.png"
        ["miliaoIcon_320"] => string(83) "https://account.xiaomi.com/static/res/7c3e9b0/passport/acc-2014/img/n-avator-bg.png"
        ["miliaoIcon_75"] => string(83) "https://account.xiaomi.com/static/res/7c3e9b0/passport/acc-2014/img/n-avator-bg.png"
        ["miliaoIcon_90"] => string(83) "https://account.xiaomi.com/static/res/7c3e9b0/passport/acc-2014/img/n-avator-bg.png"
        ["miliaoIcon_orig"] => string(83) "https://account.xiaomi.com/static/res/7c3e9b0/passport/acc-2014/img/n-avator-bg.png"
        ["miliaoNick"] => string(6) "超人"
        ["userId"] => int(1040864045)
      }
      ["description"] => string(8) "no error"
      ["result"] => string(2) "ok"
    }


    需要注意

    第⑥步和第⑦步中$clientId、$clientSecret、$redirectUri、$user

    可以定义为常量或者放到配置项中

    就不需要再两个分别两次书写了

    以上即为接入小米登录详细操作

    在实际操作过程中遇到问题

    可在下方留言或者联系超人来协助解决

    标签php nginx Linux


本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动。

陶太富博客 http://blog.taotaifu.cn

最新发布

最新评论

0.073096s