503 lines
17 KiB
PHP
503 lines
17 KiB
PHP
<?php
|
||
|
||
/**
|
||
* @author Any
|
||
* @description KISS
|
||
* @date 2021-4-17
|
||
* @version 1.0.0
|
||
*
|
||
* _____LOG_____
|
||
*
|
||
*/
|
||
namespace app\modules\api\models;
|
||
|
||
|
||
use app\components\FlashStorage;
|
||
use app\models\Coach;
|
||
use app\models\DeviceUniqueBindStore;
|
||
use app\models\DeviceUniqueBindUser;
|
||
use app\models\DeviceUniqueData;
|
||
use app\models\Order;
|
||
use app\models\StoreBindDevice;
|
||
use app\models\User;
|
||
use app\components\SiteHelper;
|
||
use app\modules\api\components\ApiHelper;
|
||
use app\models\District;
|
||
use app\components\auth\AToken;
|
||
use app\components\wechat\aes\WxBizDataCrypt;
|
||
|
||
|
||
class WindowsApiForm extends ApiModel
|
||
{
|
||
|
||
public $unique;
|
||
public $test_type;
|
||
public $user_id;
|
||
public $token;
|
||
public $data;
|
||
public $wechat_mp;
|
||
private $token_en = "9NtOFsxUlXzAqWdo3QJIHgnDeR0uPw1L";
|
||
|
||
public function rules()
|
||
{
|
||
return [
|
||
[['unique'], 'trim'],
|
||
[['unique','user_id','test_type','token','data'], 'string'],
|
||
[['unique','token'], 'required'],
|
||
];
|
||
}
|
||
|
||
/**
|
||
* @ Author : Lw
|
||
* @ CreateTime : 2022-07-07
|
||
* @ Info : 获取缓存名称
|
||
*/
|
||
public function getCacheName(){
|
||
if(empty($this->unique)){
|
||
$this->unique = "";
|
||
}
|
||
$v = 6;
|
||
$arr = [
|
||
'bind_store' => "api:WindowsApiForm:bind_store:{$this->unique}_{$v}", # 绑定店铺
|
||
];
|
||
return $arr;
|
||
}
|
||
|
||
|
||
/**
|
||
* @ Author : Lw
|
||
* @ CreateTime : 2022-07-07
|
||
* @ Info : 获取二维码状态
|
||
*/
|
||
public function actionStatus(){
|
||
$data = "rwrwe";
|
||
$key = "";
|
||
$method = "AES-128-CBC";
|
||
echo "<pre>";
|
||
// var_dump(openssl_get_cipher_methods());
|
||
// $ivlen = openssl_cipher_iv_length($method);
|
||
// $iv = openssl_random_pseudo_bytes($ivlen);
|
||
$iv = random_bytes(openssl_cipher_iv_length($method));
|
||
$ciphertext = openssl_encrypt($data, $method, $key,OPENSSL_RAW_DATA ,$iv);
|
||
var_dump(base64_encode($ciphertext));
|
||
$ciphertext_ = openssl_decrypt($ciphertext, $method, $key,OPENSSL_RAW_DATA ,$iv);
|
||
var_dump($ciphertext_);
|
||
exit();
|
||
echo "<pre>";
|
||
$res = $this->code2session("test");
|
||
if($res['code'] != 0)
|
||
var_dump(111,$res);
|
||
return $res;
|
||
$session_key = $res['data']['session_key'];
|
||
$openid = $res['data']['openid'];
|
||
$res = $this->decrypted_data($session_key);
|
||
if($res['code'] != 0){
|
||
var_dump(222,$res);
|
||
return $res;
|
||
}
|
||
}
|
||
|
||
/***
|
||
* 用户数据解密
|
||
*/
|
||
private function decrypted_data($session_key){
|
||
$pc = new WxBizDataCrypt($this->wechat_mp->appId, $session_key);
|
||
$errCode = $pc->decryptData($this->encrypted_data, $this->iv, $data );
|
||
if ($errCode == 0) {
|
||
return [
|
||
'code' => 0,
|
||
'msg' => 'success',
|
||
'data' => $data
|
||
];
|
||
} else {
|
||
return [
|
||
'code' => 1,
|
||
'msg' => $errCode,
|
||
];
|
||
}
|
||
}
|
||
|
||
private function code2session($code)
|
||
{
|
||
$api = "https://api.weixin.qq.com/sns/jscode2session?appid={$this->wechat_mp->appId}&secret={$this->wechat_mp->appSecret}&js_code={$code}&grant_type=authorization_code";
|
||
$this->wechat_mp->curl->get($api);
|
||
if($this->wechat_mp->curl->error_code != 0){
|
||
return [
|
||
'code' => 1,
|
||
'msg' => "err_code:{$this->wechat_mp->curl->error_code}err_msg:{$this->wechat_mp->curl->error_msg}"
|
||
];
|
||
}
|
||
$resp = $this->wechat_mp->curl->response;
|
||
$res = json_decode($resp, true);
|
||
if(!isset($res['openid'])){
|
||
return [
|
||
'code' => 1,
|
||
'msg' => isset($res['errmsg']) ? $res['errmsg'] : 'error'
|
||
];
|
||
}
|
||
return [
|
||
'code' => 0,
|
||
'msg' => 'ok',
|
||
'data' => $res
|
||
];
|
||
}
|
||
|
||
// 获取用户缓存name,可适用于更新用户头像和昵称使用
|
||
public function getUserCacheName($id){
|
||
// id -- 用户id
|
||
return [
|
||
'user' => "api:getUserInfo_v3:{$id}", # 用户
|
||
'coach' => "api:getCoachInfo_v8:{$id}", # 教练
|
||
];
|
||
}
|
||
|
||
// 获取用户信息
|
||
public function getUserInfo($id){
|
||
$cache_name = $this->getUserCacheName($id)['user'];
|
||
$get = FlashStorage::getCache($cache_name);
|
||
$time = 60*60*24;
|
||
if(!empty($get)){
|
||
$res = json_decode($get,true);
|
||
}else{
|
||
$find = User::findOne([
|
||
'id' => $id,
|
||
]);
|
||
if(empty($find)){
|
||
$time = 60*10;
|
||
$res = [
|
||
'nickname' => base64_encode('暂无用户 -- '),
|
||
'img' => 'https://cloudlinker-pubulic.oss-cn-beijing.aliyuncs.com/62aa8d6322ee0a486ead61fd/ef1dee5f87.jpg',
|
||
];
|
||
}else{
|
||
$res = [
|
||
'nickname' => base64_encode($find->nickname),
|
||
'img' => SiteHelper::getFullUrl($find->avatar_url),
|
||
];
|
||
}
|
||
try{
|
||
FlashStorage::setCache($cache_name,json_encode($res,JSON_UNESCAPED_UNICODE),$time);
|
||
}catch (\Exception $e){
|
||
|
||
}
|
||
}
|
||
$arr = [
|
||
'nickname' => base64_decode($res['nickname']),
|
||
'img' => $res['img'],
|
||
];
|
||
return $arr;
|
||
}
|
||
|
||
// 获取教练信息
|
||
public function getCoachInfo($id){
|
||
$cache_name = $this->getUserCacheName($id)['coach'];
|
||
$get = FlashStorage::getCache($cache_name);
|
||
$time = 60*60*24;
|
||
if(!empty($get)){
|
||
$res = json_decode($get,true);
|
||
}else{
|
||
$find = User::findOne([
|
||
'id' => $id,
|
||
]);
|
||
$find_coach = Coach::findOne([
|
||
'user_id' => $id,
|
||
'is_delete' => 0,
|
||
]);
|
||
if(empty($find) || empty($find_coach)){
|
||
$time = 60*1;
|
||
$res = [
|
||
'nickname' => base64_encode('暂无用户 -- '),
|
||
'img' => 'https://cloudlinker-pubulic.oss-cn-beijing.aliyuncs.com/62aa8d6322ee0a486ead61fd/ef1dee5f87.jpg',
|
||
];
|
||
if(!empty($find)){
|
||
$res['nickname'] = base64_encode($find->real_name);
|
||
}
|
||
if(!empty($find_coach)){
|
||
$res['img'] = SiteHelper::getFullUrl($find_coach->coach_photo);
|
||
}
|
||
}else{
|
||
$res = [
|
||
'nickname' => base64_encode($find->real_name),
|
||
'img' => SiteHelper::getFullUrl($find_coach->coach_photo),
|
||
];
|
||
}
|
||
try{
|
||
FlashStorage::setCache($cache_name,json_encode($res,JSON_UNESCAPED_UNICODE),$time);
|
||
}catch (\Exception $e){
|
||
|
||
}
|
||
}
|
||
$arr = [
|
||
'nickname' => base64_decode($res['nickname']),
|
||
'img' => $res['img'],
|
||
];
|
||
return $arr;
|
||
}
|
||
|
||
// 解除绑定
|
||
public function actionUnbind(){
|
||
if(empty($this->unique)){
|
||
return $this->apiReturnError('非法请求');
|
||
}
|
||
if(empty($this->token)){
|
||
return $this->apiReturnError('非法请求');
|
||
}
|
||
if($this->token != $this->token_en){
|
||
return $this->apiReturnError('非法请求');
|
||
}
|
||
$cache = $this->getCacheName();
|
||
$get = FlashStorage::getCache($cache['bind_store']);
|
||
if($get == 'error'){
|
||
return $this->apiReturnError('店铺未绑定');
|
||
}
|
||
if(empty($get)){
|
||
$find = DeviceUniqueBindStore::findOne([
|
||
'unique' => $this->unique,
|
||
'is_delete' => 0,
|
||
]);
|
||
if(empty($find)){
|
||
FlashStorage::setCache($cache['bind_store'],'error',60*60*24);
|
||
return $this->apiReturnError('店铺未绑定');
|
||
}else{
|
||
$get = json_encode($find->toArray(),JSON_UNESCAPED_UNICODE);
|
||
FlashStorage::setCache($cache['bind_store'],$get,60*60*24);
|
||
}
|
||
}
|
||
$json_de = json_decode($get,True);
|
||
$find = DeviceUniqueBindUser::find()
|
||
->andWhere([
|
||
'unique_id' => $json_de['id'],
|
||
'is_delete' => 0,
|
||
])->andWhere([
|
||
'in','status',[1,2]
|
||
])->select('*')->one();
|
||
if(empty($find)){
|
||
return $this->apiReturnSuccess('success');
|
||
}
|
||
$find->status = 5;
|
||
$find->save();
|
||
return $this->apiReturnSuccess('success');
|
||
}
|
||
|
||
/**
|
||
* showdoc
|
||
* @catalog 客户端接口
|
||
* @title 上传数据
|
||
*/
|
||
public function actionUp(){
|
||
if(empty($this->unique)){
|
||
return $this->apiReturnError('非法请求');
|
||
}
|
||
if(empty($this->token)){
|
||
return $this->apiReturnError('非法请求');
|
||
}
|
||
if($this->token != $this->token_en){
|
||
return $this->apiReturnError('非法请求');
|
||
}
|
||
if(empty($this->data)){
|
||
return $this->apiReturnError('没有请求数据');
|
||
}
|
||
$cache = $this->getCacheName();
|
||
$get = FlashStorage::getCache($cache['bind_store']);
|
||
if($get == 'error'){
|
||
return $this->apiReturnError('店铺未绑定');
|
||
}
|
||
if(empty($get)){
|
||
$find = DeviceUniqueBindStore::findOne([
|
||
'unique' => $this->unique,
|
||
'is_delete' => 0,
|
||
]);
|
||
if(empty($find)){
|
||
FlashStorage::setCache($cache['bind_store'],'error',60*60*24);
|
||
return $this->apiReturnError('店铺未绑定');
|
||
}else{
|
||
$get = json_encode($find->toArray(),JSON_UNESCAPED_UNICODE);
|
||
FlashStorage::setCache($cache['bind_store'],$get,60*60*24);
|
||
}
|
||
}
|
||
$get = json_decode($get,true);
|
||
// 获取最新的一条数据
|
||
$find_user = DeviceUniqueBindUser::findOne([
|
||
'is_delete' => 0,
|
||
'unique_id' => $get['id'],
|
||
'status' => 1,
|
||
]);
|
||
$uid = 0;
|
||
$bind_id = 0;
|
||
if(!empty($find_user)){
|
||
$uid = $find_user->uid;
|
||
$bind_id = $find_user->id;
|
||
}
|
||
try{
|
||
$json_de = json_decode($this->data,True);
|
||
}catch (\Exception $e){
|
||
return $this->apiReturnError('请求数据异常');
|
||
}catch (\Error $e){
|
||
return $this->apiReturnError('请求数据异常');
|
||
}
|
||
foreach ($json_de as $key=>$val){
|
||
if(empty($val)){
|
||
continue;
|
||
}
|
||
$pole_type = "";
|
||
$pole_class = "";
|
||
if(!empty(($val['pole_type']))){
|
||
$pole_type = $val['pole_type'];
|
||
unset($val['pole_type']);
|
||
}
|
||
if(!empty(($val['pole_class']))){
|
||
$pole_class = $val['pole_class'];
|
||
unset($val['pole_class']);
|
||
}
|
||
$obj = new DeviceUniqueData();
|
||
$obj->bind_id = $bind_id;
|
||
$obj->data = json_encode($val,JSON_UNESCAPED_UNICODE);
|
||
$obj->created_at = time();
|
||
$obj->is_delete = 0;
|
||
$obj->deleted_at = 0;
|
||
$obj->uid = $uid;
|
||
$obj->pole_type = strtolower($pole_type);
|
||
$obj->pole_class = strtoupper(mb_substr($pole_class,0,2));
|
||
$obj->pole_class_all = $pole_class;
|
||
$obj->save();
|
||
}
|
||
$file_folder_name = "Temp_暂无用户_0";
|
||
$file_name = Date('Ymd_His',time())."_time_".microtime(true);
|
||
$return = [
|
||
'status' => 2,
|
||
'file_folder_name' => $file_folder_name,
|
||
'file_name' => $file_name,
|
||
];
|
||
if(!empty($find_user)){
|
||
// 变更数据状态
|
||
$find_user->status = 3;
|
||
$find_user->end_at = time();
|
||
$find_user->save();
|
||
|
||
// 判断是否有订单号
|
||
if(!empty($find_user->order_id)){
|
||
// 订单号变更为已完成
|
||
Order::updateAll([
|
||
'status' => 0,
|
||
'updated_at' => time(),
|
||
],[
|
||
'id' => $find_user->order_id,
|
||
]);
|
||
}
|
||
$find_user_ = User::findOne([
|
||
'id' => $find_user->uid,
|
||
]);
|
||
if(!empty($find_user_)){
|
||
$real_name = !empty($find_user_->real_name)?$find_user_->real_name:$find_user_->username;
|
||
$file_folder_name = "{$real_name}_{$find_user_->id}";
|
||
$file_name = Date('Ymd_His',time())."_{$find_user->id}";
|
||
}else{
|
||
$file_folder_name = "Temp_暂无用户_{$find_user->uid}";
|
||
$file_name = Date('Ymd_His',time())."_{$find_user->id}";
|
||
}
|
||
$return = [
|
||
'status' => 1,
|
||
'file_folder_name' => $file_folder_name,
|
||
'file_name' => $file_name,
|
||
];
|
||
}
|
||
return $this->apiReturnSuccess('success',$return);
|
||
}
|
||
|
||
/**
|
||
* @ Author : Lw
|
||
* @ CreateTime : 2022-07-07
|
||
* @ Info : 测试
|
||
*/
|
||
public function actionTest(){
|
||
if(empty($this->test_type)){
|
||
return $this->apiReturnError('类型未填写');
|
||
}
|
||
if(empty($this->unique)){
|
||
return $this->apiReturnError('设备码未填写');
|
||
}
|
||
if(empty($this->token)){
|
||
return $this->apiReturnError('非法请求');
|
||
}
|
||
if($this->token != $this->token_en){
|
||
return $this->apiReturnError('非法请求');
|
||
}
|
||
switch ($this->test_type){
|
||
case "1": # 测试绑定
|
||
$cache = $this->getCacheName();
|
||
$find = DeviceUniqueBindStore::findOne([
|
||
'unique' => $this->unique,
|
||
'is_delete' => 0,
|
||
]);
|
||
if(!empty($find)){
|
||
FlashStorage::deleteCache($cache['bind_store']);
|
||
return $this->apiReturnError('已绑定');
|
||
}
|
||
$obj = new DeviceUniqueBindStore();
|
||
$obj->unique = $this->unique;
|
||
$obj->store_id = 1;
|
||
$obj->uid = 1;
|
||
$obj->created_at = time();
|
||
$obj->is_delete = 0;
|
||
$obj->deleted_at = 0;
|
||
if($obj->save()){
|
||
FlashStorage::deleteCache($cache['bind_store']);
|
||
return $this->apiReturnSuccess('绑定成功');
|
||
}
|
||
FlashStorage::setCache($cache['bind_store'],'error',60*60*24);
|
||
return $this->apiReturnError('绑定失败',$this->getModelError($obj));
|
||
break;
|
||
case "2": # 测试绑定用户
|
||
$cache = $this->getCacheName();
|
||
$find = DeviceUniqueBindStore::findOne([
|
||
'unique' => $this->unique,
|
||
'is_delete' => 0,
|
||
]);
|
||
if(empty($find)){
|
||
return $this->apiReturnError('未绑定店铺');
|
||
}
|
||
$find_bind = DeviceUniqueBindUser::find()
|
||
->andWhere([
|
||
'unique_id' => $find['id'],
|
||
'is_delete' => 0,
|
||
])->andWhere([
|
||
'in','status',[1,2]
|
||
])->select('*')->one();
|
||
$uid = 1;
|
||
if(empty($find_bind)){
|
||
# 创建一条数据
|
||
$obj = new DeviceUniqueBindUser();
|
||
$obj->unique_id = $find['id'];
|
||
$obj->uid = $uid;
|
||
$obj->c_id = $uid;
|
||
$obj->created_at = time();
|
||
$obj->start_at = time();
|
||
$obj->end_at = 0;
|
||
$obj->status = 1;
|
||
$obj->is_delete = 0;
|
||
$obj->deleted_at = 0;
|
||
if($obj->save()){
|
||
return $this->apiReturnSuccess('绑定成功');
|
||
}else{
|
||
return $this->apiReturnError('绑定失败');
|
||
}
|
||
}
|
||
# 判断是否有绑定
|
||
if(empty($find_bind->uid)){
|
||
$find_bind->uid = $uid;
|
||
$find_bind->start_at = time();
|
||
if(!$find_bind->save()) {
|
||
return $this->apiReturnError('绑定失败');
|
||
}
|
||
}
|
||
# 判断是否开始
|
||
if($find_bind->status != 1 && !empty($find_bind->uid) && !empty($find_bind->c_id)){
|
||
$find_bind->status = 1;
|
||
$find_bind->save();
|
||
}
|
||
return $this->apiReturnSuccess('绑定成功');
|
||
break;
|
||
default:
|
||
return $this->apiReturnError('类型出错');
|
||
}
|
||
}
|
||
} |