AuthDeviceController.php 3.57 KB
<?php

namespace app\api\controllers;


use Yii;

use common\helpers\Utils;
use common\helpers\Log as AppLog;
use domain\device\DeviceRepository;
use domain\device\Device;
use domain\device\DeviceStatus;
use stdClass;

use function date;
use function count;
use function time;

/**
 * 设备授权-控制器
 * Class AuthDeviceController
 * @package app\api\controllers
 *  manufacture	厂商ID	string	是个数字字符串,例如“001”代表 XX厂商
    device_id	设备id	string	设备的ID
    project	项目ID	string	项目ID
    model	型号ID	string	例如 001
    timestamp	时间戳	int	例如 2019-10-10 01:01:01
    sign	签名	string	用来认证请求是否合法 签名组合为 md5(manufacture + project+  model + production + timestamp + salt) salt 为客户端和服务器约定的key
    production	生产日期ID	string	日期 例如001
 *
 */
class AuthDeviceController extends BaseController
{
    private static $SIGN_SALT = '13456';

    private static function myLog($str)
    {
        AppLog::DEBUG($str);
    }
    /**
     * 设备授权接口
     * @return stdClass
     */
   public function actionIndex()
   {
       $e = new stdClass();
       $e->status = 1;
       $e->message = 'message';
       $e->serial_no = '';;
       $e->mac = '';

       $getPostData = file_get_contents('php://input', 'r');
       self::myLog('actionIndex postData:'.$getPostData);
       if (!$getPostData) {
           $e->status = 1;
           $e->message = '传入的数据为空';
           return $e;
       }
       $getPostData     = json_decode($getPostData, true);
       $manufactureNo	= isset($getPostData['manufacture'])?$getPostData['manufacture']:'';
       $deviceId	    = isset($getPostData['device_id'])?$getPostData['device_id']:'';
       $projectNo	    = isset($getPostData['project'])?$getPostData['project']:'';
       $modelNo	        = isset($getPostData['model'])?$getPostData['model']:'';
       $productionNo	= isset($getPostData['production'])?$getPostData['production']:'';
       $timestamp       = isset($getPostData['timestamp'])?$getPostData['timestamp']:'';
       $sign	        = isset($getPostData['sign'])?$getPostData['sign']:'';
       if (empty($deviceId) || empty($manufactureNo) || empty($projectNo) || empty($modelNo) || empty($productionNo)) {
           $e->message = '传入的数据部分为空';
           return $e;
       }
       $pattern = "/^[a-zA-Z0-9]+$/";
       $dexPattern = "/^[0-9a-fA-F]+$/";
       if (!preg_match($pattern, $deviceId) || !preg_match($dexPattern, $manufactureNo) || !preg_match($dexPattern, $modelNo) || !preg_match($dexPattern, $productionNo)) {
           $e->status = 9;
           $e->message = '传入的数据字段格式不对';
           return $e;
       }
       if (isset(Yii::$app->params['secretKey']) && !empty(Yii::$app->params['secretKey'])) {
           $salt = Yii::$app->params['secretKey'];
       } else {
           $salt = isset(Yii::$app->params['secretKey'])? Yii::$app->params['secretKey']: self::$SIGN_SALT;
       }

       $makeSign = md5($manufactureNo . $projectNo. $modelNo . $productionNo . $timestamp . $deviceId. $salt);
       if ($sign != $makeSign || empty($sign)) {
           $e->status = 2;
           $e->message = '签名出错';
           return $e;
       }

       $authResult = Device::authDevice($deviceId, $manufactureNo, $projectNo, $modelNo, $productionNo);

       $e->status = $authResult->status;
       $e->message = $authResult->message;
       if ($authResult->success) {
           $e->mac = $authResult->mac;
           $e->serial_no = $authResult->serial_no;
       }
      
       return $e;
   }
}