cxgj/modules/api/models/WindowsApiForm.php
2023-11-27 09:45:13 +08:00

503 lines
17 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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('类型出错');
}
}
}