is_debug = $is_debug ;
$this->token_path = dirname(__FILE__).'/token.key';
$this->uniacid = $uniacid .'';
$this->goods_name = $goodsName;
$this->base_url = 'http://shouquan.migugu.com/';
$this->base_url = $this->is_debug ? 'http://shouquan.migugu.com/' : 'http://auth.soqq.com.cn/' ;
$this->base_url = 'http://auth.soqq.com.cn/'; //ToDo 调试模式 线下接口 授权接口写死
$this->check_url = $this->base_url .'auth/home.Index/index';
$this->uploadWxapp_url = $this->base_url .'auth/home.Index/uploadWxapp';
$this->get_auth_url = $this->base_url .'auth/home.Index/getAuth' ;
$this->get_domain_param_url = $this->base_url .'auth/home.Index/domain_param' ;
$this->get_wxapp_version_url = $this->base_url .'auth/home.Index/getWxappVersion' ;
$this->clear_up_token = $this->base_url .'auth/home.Index/clearToken' ;
$this->http_host = $_SERVER['HTTP_HOST'];
$this->server_name = $_SERVER['SERVER_NAME'];
$this->request_time = $_SERVER['REQUEST_TIME'].'';
}
/**
* @author jingshuixian
* @DataTime: 2020-06-08 13:12
* @功能说明:
*/
public function checkAuth(){
try {
//清除双方授权token --重新获取
$this->clearUp();
$this->public_key = $this->getPublicKey();
$this->getUpgradeMsg();
if(empty($this->public_key)){
return $this->returnErrorDataInfo( '(001)'.$this->errorMsg );
}else{
$data['domain'] = $this->domain_name_info ;
$data['version'] = $this->goods_version_info ;
return $this->returnDataInfo($data);
}
}catch (\Exception $e){
return $this->returnErrorDataInfo( "请用授权域名登陆 进行站点绑定" );
}
}
/**
* @author jingshuixian
* @DataTime: 2020-06-08 11:52
* @功能说明: 站点授权信息
*/
private function getAuthMsg(){
if(empty($this->domain_name_info) || count($this->domain_name_info) == 0 ){
return $this->returnDataInfo([],'(002)'.$this->errorMsg);
}else{
return $this->returnDataInfo($this->domain_name_info);
}
}
/**
* @author jingshuixian
* @DataTime: 2020-06-05 12:55
* @功能说明:
*/
private function getUpgradeMsg(){
try{
$this->public_key = $this->getPublicKey();
if(!$this->public_key){
return $this->returnErrorDataInfo( "请用授权域名登陆 进行站点绑定" );
}
$siginStr = $this->getSiginData([]);
$result = $this->curl_post($this->check_url ,$this->getPostData($siginStr)) ;
$result = json_decode( $result,true);
$data = $result['data'];
openssl_public_decrypt(base64_decode($data['goods_version_updata_info']), $sigin, $this->public_key);
$sigin = json_decode($sigin , true) ;
$this->goods_version_info = $data['goods_version_info'];
$this->goods_version_updata_info = $sigin;
return $this->returnDataInfo($this->goods_version_info);
}catch (Exception $e){
return $this->returnErrorDataInfo( "获取更新信息异常" );
}
}
/**
* @author jingshuixian
* @DataTime: 2020-06-05 14:09
* @功能说明: 开始升级
*/
public function update($toFilePath = null , $tempPaht = null){
//获取升级包信息
//检查权限
//下载升级包
//解压升级包
//写入版本文件
if(!$this->goods_version_info && !$this->goods_version_updata_info){
$this->getUpgradeMsg();
}
//状态码判断 2020/6/18 16:45 / lichuanming
if($this->goods_version_updata_info['url'] === 'ae40000001'){
return $this->returnErrorDataInfo ('升级服务已到期') ;
}
$result = $this->get_file($this->goods_version_updata_info['url'] , $tempPaht);
if($result === false){
return $this->returnErrorDataInfo ('下载文件失败') ;
}
$toFilePath = empty($toFilePath) ? './' : $toFilePath ;
$this->unzip($result , $toFilePath , $this->goods_version_updata_info['password'] );
return $this->returnDataInfo([],'更新成功' , '200') ;
}
/**
* @param array $data
* @param string $msg
* @param int $code
* @功能说明: 返回 json 数据
* @author jingshuixian
* @DataTime: 2020-06-06 21:25
*/
public function returnDataInfo($data = [] , $msg = '' , $code = 20000){
$resultData = [
'code' => $code ,
'msg' => $msg,
'data' => $data
];
return $resultData ;
}
public function returnErrorDataInfo($msg = '' , $code = -1 , $data = []){
return $this->returnDataInfo($data ,$msg ,$code);
}
/**
* @author jingshuixian
* @DataTime: 2020-06-05 16:02
* @功能说明:上传微信小程序
*/
public function uploadWxapp($uploadInfo,$wxapp_version = '')
{
//获取当前系统版本信息
//提交需要上传的版本信息
//验证系统的平台ID 版本ID 域名 平台ID 模块ID 上传KEY
//加密签名
//提交上传
/*try{
if(!$this->goods_version_updata_info){
$this->getUpgradeMsg();
}
$siginStr = $this->getSiginData();
$postData = $this->getPostData($siginStr);
$uploadInfo = $this->getSiginDataByOpenSSL($uploadInfo);
$this->log("uploadWxapp = uploadInfo", $uploadInfo);
$postData['ext_data'] = $uploadInfo;
$this->log("uploadWxapp = postData", $postData);
$result = $this->curl_post( $this->uploadWxapp_url ,$postData) ;
$this->log( "获取授权信息一" ,$result);
$result = json_decode( $result,true);
$this->log( "获取授权信息二" ,$result);
return $this->returnDataInfo($result);
}catch (\Exception $e){
return $this->returnErrorDataInfo('上传失败');
}*/
try{
$postData = $this->getPostData('');
$postData['ext_data'] = json_encode($uploadInfo);
$postData['wxapp_version'] = $wxapp_version; //新增微信版本号
$this->log("uploadWxapp = postData", $postData);
$result = $this->curl_post( $this->uploadWxapp_url ,$postData) ;
$this->log( "获取授权信息一" ,$result);
$result = json_decode( $result,true);
$this->log( "获取授权信息二" ,$result);
return empty($result) ? $this->returnErrorDataInfo('上传繁忙,稍后再试。。(001)') : $result;
}catch (\Exception $e){
return $this->returnErrorDataInfo('上传繁忙,稍后再试。。(002)');
}
}
/**
**@param $version_no
* @功能说明: 当前系统版本号
* @author lichuanming
* @DataTime: 2020/6/22 17:31
*/
public function getWxappVersion($version_no){
try{
$postData = $this->getPostData('');
$postData['version'] = $version_no;
$this->log("uploadWxapp = postData", $postData);
$result = $this->curl_post( $this->get_wxapp_version_url ,$postData) ;
$this->log( "获取版本信息一" ,$result);
$result = json_decode( $result,true);
$this->log( "获取版本信息二" ,$result);
return $result['data'];
}catch (\Exception $e){
return $this->returnErrorDataInfo('无法获取小程序版本信息');
}
}
/**
**@author lichuanming
* @DataTime: 2020/6/18 19:13
* @功能说明: 获取saas端的值
*/
public function getsAuthConfig(){
$this->public_key = $this->getPublicKey();
if(empty($this->public_key )){
return [];
}
$siginStr = $this->getSiginData([]);
$result = $this->curl_post($this->get_domain_param_url ,$this->getPostData($siginStr)) ;
$result = json_decode( $result,true);
$param_list = $result['data']['param_list'];
if(is_array($param_list)){
foreach ($param_list as $key =>$item){
$param = '';
openssl_public_decrypt(base64_decode($item), $param, $this->public_key);
$param_list[$key] = $param;
}
}
return $param_list;
}
/**
* @param $siginStr
* @功能说明: 获取提交信息
* @author jingshuixian
* @DataTime: 2020-06-05 16:35
*/
private function getPostData($siginStr)
{
$postData = $this->getPublicPostData();
$postData['sigin' ] = $siginStr;
return $postData ;
}
/**
* @author jingshuixian
* @DataTime: 2020-06-05 16:13
* @功能说明: 获取签名信息
*/
private function getSiginData($extData = [] , $siginType = 1 )
{
$data = $this->getPublicPostData();
if (!empty($extData)){
$data['ext_data'] = $extData ;
}
ksort($data);
$str_data = json_encode($data);
//$siginType = 1 采用 公钥加密
if($siginType == 1 ){
openssl_public_encrypt($str_data, $encrypted, $this->public_key);
if(empty($encrypted)){
return false ;
}
//处理特殊字符
$encrypted = base64_encode($encrypted);
}else{ #其他只做数据签名,不做信息加密
$encrypted =$this->getSiginDataByHash($data);
}
return $encrypted ;
}
private function getSiginDataByOpenSSL($data){
$str_data = is_array($data) ? json_encode($data) : $data;
openssl_public_encrypt($str_data, $encrypted, $this->public_key);
if(empty($encrypted)){
return false ;
}
//处理特殊字符
$encrypted = base64_encode($encrypted);
return $encrypted;
}
/**
* @param $data
* @功能说明: 普通数据签名算法(只支持 str 和数组 签名 )
* @author jingshuixian
* @DataTime: 2020-06-06 15:10
*/
private function getSiginDataByHash($data){
$data['token'] = $data['token']?$data['token']:'';
$this->log( 'getSiginDataByHash data ' , $data);
$data = is_array( $data ) ? json_encode($data) : (is_string($data) ? $data : time() . '') . 'LongbingShuixian';
$siginStr = hash( 'sha256', $data) ;
return $siginStr ;
}
/**
* @author jingshuixian
* @DataTime: 2020-06-06 14:45
* @功能说明: 获取公共提交数据
*/
private function getPublicPostData(){
$app_model_name = config('app.AdminModelList')['app_model_name'];
$token = @file_get_contents($this->token_path) ;
$token = $token?json_decode($token,true):'';
if(!empty($token)){
$token = $token['token'];
}
$data = [
'uniacid' => $this->uniacid ,
'app_model_name' => $app_model_name , //2020/6/22 新增参数 By.lichuanming
'goods_name' => $this->goods_name,
'http_host' => $this->http_host ,
'server_name' => $this->server_name ,
'request_time' => $this->request_time ,
'token' => $token
];
return $data ;
}
/**
* @param $url
* @param string $folder
* @功能说明: 下载文件
* @author jingshuixian
* @DataTime: 2020-06-05 14:15
*/
private function get_file($url, $folder = './data/upgradex/') {
set_time_limit(24 * 60 * 60);
$target_dir = $folder . '';
if (!is_dir($target_dir)) {
mkdir($target_dir, 0777, true);
}
$newfname = date('Ymd') . rand(1000, 10000000) . uniqid() . '.zip';
$newfname = $target_dir . $newfname;
$file = @fopen($url, "rb");
if ($file) {
$newf = fopen($newfname, "wb");
if ($newf) while (!feof($file)) {
fwrite($newf, fread($file, 1024 * 8) , 1024 * 8);
}
fclose($file);
if ($newf) {
fclose($newf);
}
}else{
return false ;
}
return $newfname;
}
/**
* @param $filename
* @param $toFilepath
* @param null $password 解压密码
* @功能说明: 解压文件
* @author jingshuixian
* @DataTime: 2020-06-05 14:44
*/
private function unzip($filename , $toFilepath , $password = null){
$zip = new ZipArchive;
$res = $zip->open($filename);
if ($res === true){
$password && $zip->setPassword($password); //解压密码
$zip->extractTo($toFilepath);
$zip->close();
}
return true ;
}
/**
* @param $key
* @param $value
* @功能说明: 打印日志
* @author jingshuixian
* @DataTime: 2020-06-05 13:29
*/
public function log($key , $value){
//关闭和开启调试
if($this->is_debug)
{
echo $key ." = " .(is_array($value) ? json_encode($value) : $value) . '
';
}else{
return false ;
}
}
/**
* @author jingshuixian
* @DataTime: 2020-06-05 13:34
* @功能说明: 获取秘钥
*/
private function getPublicKey(){
if(!empty($this->public_key)){
$this->log( "已经获得 " , $this->public_key);
return $this->public_key ;
}
$this->log('获取秘钥:' ,'开始');
$siginStr = $this->getSiginData([] , 2);
$this->log('获取秘钥 sigin:' ,$siginStr);
$result = $this->curl_post($this->get_auth_url ,$this->getPostData($siginStr) ) ;
$this->log('获取秘钥 result:' ,$result);
$result = json_decode( $result,true);
// todo 需要判断返回结果是否正确
$this->domain_name_info = $result['data']['domain_name_info'];
//写入token文件
$this->log("获取秘钥 保持token路径: " , dirname(__FILE__));
$token = $result['data']['token'];
$resultWriteToken = $this->writein_token($token);
$this->log("获取秘钥 写入token: " , $resultWriteToken ? '成功' : '失败' );
$this->public_key = $result['data']['public_key'];
return $this->public_key;
}
/**
* @param $url
* @param array $data
* @功能说明: post 请求
* @author jingshuixian
* @DataTime: 2020-06-05 12:53
*/
private function curl_post($url , $data=array()){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// POST数据
curl_setopt($ch, CURLOPT_POST, 1);
// 把post的变量加上
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
/**
**@param array $token
* @功能说明: token写入
* @author lichuanming
* @DataTime: 2020/6/19 11:35
*/
private function writein_token($token):bool {
$resultWriteToken = false;
if(is_array($token)){
//数据正常 直接保存
$resultWriteToken = file_put_contents($this->token_path , json_encode($token));
}else{
//读取原有token 数据
$token = @file_get_contents($this->token_path) ;
$token = $token?json_decode($token,true):'';
if(!empty($token)){
if($token['token_expiration_time'] < time()){
$token['token'] = '';
//写入空token
$resultWriteToken = file_put_contents($this->token_path , json_encode($token));
}
}
}
return $resultWriteToken?true:false;
}
/**
**@author lichuanming
* @DataTime: 2020/6/23 14:33
* @功能说明: 重置双方通讯token
*/
private function clearUp(){
//读取原有token 数据
$token = @file_get_contents($this->token_path) ;
$token = $token?json_decode($token,true):'';
if(!empty($token)){
if($token['token_expiration_time'] < time() || !$token['token']){ //token 过期
$this->public_key = $this->getPublicKey();
$siginStr = $this->getSiginData([]);
$result = $this->curl_post($this->clear_up_token,$this->getPostData($siginStr));
$result = json_decode($result,true);
if($result['data']['clear']){ //清除成功
$this->public_key = null;
}
}
}
}
}