model = SupplysModel::findOne(['id' => $config['supply_id']]); } /** * 获取调用接口API * * @param integer $mall_id * @param integer $supply_id * @return Api */ public static function getConnect($mall_id = 0, $supply_id = 0): Api { $model = null; if (!empty($supply_id) && is_null($model)) { $model = SupplysModel::find()->cache(5)->where(['id' => $supply_id])->one(); } if (!empty($mall_id) && is_null($model)) { $model = SupplysModel::find()->cache(5)->where(['mall_id' => $mall_id])->orderBy('id asc')->one(); } if (self::_isInvalid($model)) { return self::$client[$model->id]; } self::$client[$model->id] = $client = new Api([ 'mall_id' => $model->mall_id, 'supply_id' => $model->id, 'app_key' => $model->app_key, 'app_secret' => $model->app_secret, 'app_host' => $model->app_host, 'token' => self::getToken($model), ]); return $client; } /** * 重新获取token * * @param SupplysModel $model * @return string */ private static function getToken(SupplysModel $model) { // 过期或者不存在,重新获取 $api = new Api([ 'mall_id' => $model->mall_id, 'supply_id' => $model->id, 'app_key' => $model->app_key, 'app_secret' => $model->app_secret, 'app_host' => $model->app_host, ]); try { $data = $api->getToken(); SupplysModel::updateAll([ 'token' => $data['token'], 'expire_time' => ($data['expiresAt'] / 1000) - 3600, ], ['id' => $model->id]); return $data['token']; } catch (\Exception $e) { \Yii::error($e); return false; } } /** * 通过model判断是否有效 * * @param SupplysModel $model * @return boolean */ private static function _isInvalid(SupplysModel $model) { return ( isset(self::$client[$model->id]) && bcsub($model->expire_time, 86400) > time() && $model->token ) ? true : false; } }