Files
jianfeng-server/app/Common/extend/LongbingUpgrade.php
2025-10-02 10:33:06 +08:00

620 lines
18 KiB
PHP
Executable File
Raw 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
class LongbingUpgrade{
private $uniacid ;
//产品/商品名称
private $goods_name ;
//授权服务器地址
private $base_url ;
//检查授权的地址
private $check_url ;
//上传小程序
private $uploadWxapp_url ;
private $get_auth_url ;
//获取授权详情
private $get_domain_param_url;
private $http_host ;
private $server_name ;
private $request_time ;
private $public_key ;
private $domain_name_info ;
private $goods_version_info ; //版本的基本信息
private $goods_version_updata_info ; //包括文件下载地址 和 解压密码
private $errorMsg = '授权失败请联系系统提供商Tel15680635005 。';
private $is_debug = false ;
private $token_path;
function __construct($uniacid , $goodsName ,$is_debug = false ){
//是否开启调试
$this->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) . '<br /><br /><br /> ';
}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;
}
}
}
}
}