You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

549 lines
19 KiB
PHTML

2 years ago
<?php
namespace App\Controller;
use App\Model\GameModel;
use Think\Controller;
class DownController extends Controller {
/**
* 游戏下载
* @param int $game_id
* @param int $promote_id
* author: xmy 280564871@qq.com
*/
public function down($game_id,$promote_id=0){
$data = D("Game")->getGameDownInfo($game_id);
$game_info = $data['game_info'];
if(empty($game_info)){
$this->set_message(1034,'游戏不存在');
}
$packet = $data['packet'];
//判断系统
if(GameModel::ANDROID == $game_info['sdk_version']){
$down_url = $game_info['add_game_address'];
$file_url = $packet['file_url'];
}elseif(GameModel::IOS == $game_info['sdk_version']){
$down_url = $game_info['ios_game_address'];
$file_url = $packet['plist_url'];
}else{
$this->set_message(1048,'游戏版本错误');
}
//根据游戏下载按钮下载
$down_port = D('Game')->field('down_port,dow_status')->where(array('id'=>$game_id))->find();
if($down_port['dow_status'] == 0){
$this->set_message(1049,'下载地址错误');
}
if($down_port['down_port'] == 1){
if(!empty($packet)){//原包下载
D('Game')->addGameDownNum($game_id);
if(!empty($promote_id)){
$package_url = $this->package($packet,$promote_id);
if(!empty($package_url)) {
$file_url = $package_url;
}
}
/*$this->set_message(200,"成功",$game_info['sdk_version']==2?"https://".$_SERVER['HTTP_HOST'].substr($file_url, 1):"http://".$_SERVER['HTTP_HOST'].substr($file_url, 1));*/
if(!preg_match('/^http(s)?/', $file_url)) {
$file_url = 'https://' .$_SERVER['HTTP_HOST'] . substr($file_url, 1);
}
$this->set_message(200,"成功", $file_url);
}else{
$this->set_message(1050,"未上传原包");
}
}else{
if(!empty($down_url) && empty($promote_id)){
if(varify_url($down_url)){
D('Game')->addGameDownNum($game_id);
$this->set_message(200,"成功",$down_url);
}else{
$this->set_message(1049,'地址错误');
}
}else{
$this->set_message(1049,'下载地址错误');
}
}
}
/**
* 安卓打包渠道信息
* @param $source_info 原包信息
* @param $promote_id
* @return string
* author: xmy 280564871@qq.com
*/
public function package($source_info, $promote_id)
{
$file_path = $source_info['file_url'];
//验证原包是否存在
if (!varify_url($file_path)) {
$this->set_message(1050,"未上传原包");
} else {
$result = M('apply', 'tab_')
->alias('a')
->field('id, pack_url, plist_url')
->where(['a.game_id'=>$source_info['game_id'],'a.promote_id'=>$promote_id])
->find();
if(empty($result)) {
return '';
/*$this->set_message(1048,'此游戏不存在');*/
}
if(GameModel::ANDROID == $source_info['sdk_version']){
if(varify_url($result['pack_url'])) {
return $result['pack_url'];
}
}elseif(GameModel::IOS == $source_info['sdk_version']){
if(varify_url($result['plist_url'])) {
return $result['plist_url'];
}
}else{return '';
/*$this->set_message(1048,'游戏版本错误');*/
}
$zip = new \ZipArchive();
if ($source_info['sdk_version'] == 1) {
$str_ver = ".apk";
$file_name = "GamePack";
$url_ver = "META-INF/mch.properties";
} else {
$zip_open_game_source = zip_open(get_game_source_file_url($source_info['game_id']));
if ($zip_open_game_source) {
while ($zip_entry = zip_read($zip_open_game_source)) {
if (preg_match("/.app/", zip_entry_name($zip_entry))) {
$ios_app = substr(zip_entry_name($zip_entry), 8) . "<br/>";
}
$new_ios_1 = explode("/", $ios_app);
}
zip_close($zip_open_game_source);
}
$str_ver = ".ipa";
$file_name = "IosGamePack";
$url_ver = "Payload/" . $new_ios_1[0] . "/_CodeSignature/TXChannel";
}
$new_name = "game_package" . $source_info['game_id'] . "-" . $promote_id . $str_ver;
$to = "./Uploads/" . $file_name . "/" . $new_name;
copy(get_game_source_file_url($source_info['game_id']), ROOTTT . ltrim($to, './'));
$zip_res = $zip -> open(ROOTTT . ltrim($to, './'), \ZipArchive::CREATE);
if ($zip_res == true) {
#打包数据
$pack_data = array(
"game_id" => $source_info["game_id"],
"game_name" => $source_info['game_name'],
"game_appid" => get_game_appid($source_info["game_id"], "id"),
"promote_id" => $promote_id,
"promote_account" => get_promote_account($promote_id),
"source_version" => $source_info['source_version'],
);
$zip -> addFromString($url_ver, json_encode($pack_data));
$zip->close();
$newname = $new_name;
if (get_tool_status("oss_storage") == 1) {
if (C("oss_storage.is_cname")) {
$to = "http://" . C("oss_storage.domain") . "/" . str_replace("IosGamePack", "GamePack", $file_name) . "/" . $newname;
} else {
$to = "https://" . C("oss_storage.bucket") . "." . C("oss_storage.domain") . "/" . str_replace("IosGamePack", "GamePack", $file_name) . "/" . $newname;
$to = str_replace('-internal', '', $to);
}
if (!empty(C('oss_storage.bd_domain')) && strlen(C('oss_storage.bd_domain')) > 5) {
$to = C('oss_storage.bd_domain') . "/GamePack/" . $newname;
}
$new_to = ROOTTT . "Uploads/" . $file_name . "/" . $newname;
$updata['savename'] = $newname;
$updata['path'] = $new_to;
$this -> upload_game_pak_oss($updata);
@unlink($new_to);
} elseif (get_tool_status("cos_storage") == 1) {
$new_to = ROOTTT . "Uploads/" . $file_name . "/" . $newname;
$updata['path'] = $new_to;
$updata['savename'] = 'GamePack/'. $newname;
$to = $this->upload_cos($updata);
}
$promote = array('game_id' => $source_info['game_id'], 'promote_id' => $promote_id);
$plist_url = '';
if ($source_info['sdk_version'] == 2) {
$plist_url = $this -> create_plist($promote['game_id'], $promote['promote_id'], get_payload_name($source_info['game_id']), $to);
}
$jieguo = $this -> updateinfo($result['id'], $to, $promote, $plist_url);
if ($source_info['sdk_version'] == 2) {
return $plist_url;
}else{
return $to;
}
}
return $to;
}
}
/**
*上传到OSS
*/
public function upload_game_pak_oss($return_data = null)
{
/**
* 根据Config配置得到一个OssClient实例
*/
try {
Vendor('OSS.autoload');
$ossClient = new \OSS\OssClient(C("oss_storage.accesskeyid"), C("oss_storage.accesskeysecr"), C("oss_storage.domain"));
} catch (OssException $e) {
$this -> error($e -> getMessage());
}
$bucket = C('oss_storage.bucket');
// if(preg_match('/.apk/',$return_data['savename']) ){
$oss_name = "GamePack";
// }else{
// $oss_name="IosGamePack";
// }
$oss_file_path = $oss_name . "/" . $return_data["savename"];
$avatar = $return_data["path"];
try {
$this -> multiuploadFile($ossClient, $bucket, $oss_file_path, $avatar);
return true;
} catch (OssException $e) {
/* 返回JSON数据 */
$this -> error($e -> getMessage());
}
}
public function multiuploadFile($ossClient, $bucket, $url, $file)
{
//$file = __FILE__;
$options = array();
try {
#初始化分片上传文件
$uploadId = $ossClient -> initiateMultipartUpload($bucket, $url);
//$ossClient->multiuploadFile($bucket, $url, $file, $options);
} catch (OssException $e) {
printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n");
printf($e -> getMessage() . "\n");
return;
}
/*
* step 2. 上传分片
*/
$partSize = 5 * 1000 * 1024;
$uploadFile = $file;
$uploadFileSize = filesize($uploadFile);
$pieces = $ossClient -> generateMultiuploadParts($uploadFileSize, $partSize);
$responseUploadPart = array();
$uploadPosition = 0;
$isCheckMd5 = true;
foreach ($pieces as $i => $piece) {
$fromPos = $uploadPosition + (integer) $piece[$ossClient ::OSS_SEEK_TO];
$toPos = (integer) $piece[$ossClient ::OSS_LENGTH] + $fromPos - 1;
$upOptions = array(
$ossClient ::OSS_FILE_UPLOAD => $uploadFile,
$ossClient ::OSS_PART_NUM => ($i + 1),
$ossClient ::OSS_SEEK_TO => $fromPos,
$ossClient ::OSS_LENGTH => $toPos - $fromPos + 1,
$ossClient ::OSS_CHECK_MD5 => $isCheckMd5,
);
if ($isCheckMd5) {
$contentMd5 = \OSS\Core\OssUtil ::getMd5SumForFile($uploadFile, $fromPos, $toPos);
$upOptions[$ossClient ::OSS_CONTENT_MD5] = $contentMd5;
}
//2. 将每一分片上传到OSS
try {
$responseUploadPart[] = $ossClient -> uploadPart($bucket, $url, $uploadId, $upOptions);
} catch (OssException $e) {
printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
printf($e -> getMessage() . "\n");
return;
}
}
$uploadParts = array();
foreach ($responseUploadPart as $i => $eTag) {
$uploadParts[] = array(
'PartNumber' => ($i + 1),
'ETag' => $eTag,
);
}
/**
* step 3. 完成上传
*/
try {
$ossClient -> completeMultipartUpload($bucket, $url, $uploadId, $uploadParts);
} catch (OssException $e) {
printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n");
printf($e -> getMessage() . "\n");
return;
}
}
/**
*修改申请信息
*/
public function updateinfo($id, $pack_url, $promote, $plist_url)
{
$model = M('Apply', "tab_");
$data['id'] = $id;
$data['pack_url'] = $pack_url;
$data['dow_url'] = '/index.php?s=/Home/Down/down_file/game_id/' . $promote['game_id'] . '/promote_id/' . $promote['promote_id'];
$data['dow_status'] = 1;
$data['enable_status'] = 1;
$data['plist_url'] = $plist_url;
$res = $model -> save($data);
return $res;
}
/**
* 腾讯云上传
*
* @param null $data
*
* @return mixed
*
* @author: 鹿文学[lwx]<fyj301415926@126.com>
* @since: 2019\4\18 0018 17:40
*/
public function upload_cos($data=null) {
Vendor('COS5.vendor.autoload');
$schema=C("cos_storage.schema")?:"https";
$secretId = C("cos_storage.SecretId"); //"云 API 密钥 SecretId";
$secretKey = C("cos_storage.SecretKey"); //"云 API 密钥 SecretKey";
$region = C("cos_storage.domain"); //设置一个默认的存储桶地域
$cosClient = new \Qcloud\Cos\Client(
array(
'region' => $region,
'schema' => $schema, //协议头部默认为http
'credentials'=> array(
'secretId' => $secretId ,
'secretKey' => $secretKey
)
)
);
$bucket = C("cos_storage.bucket"); //存储桶名称 格式BucketName-APPID
$key = $data['savename'];
$srcPath = $data["path"];//本地文件绝对路径
try {
$result = $cosClient->Upload(
$bucket = $bucket,
$key = $key,
$body = fopen($srcPath, 'rb')
);
$location = $result['Location'];
if(!preg_match('/^(http)|(https)/', $location)) {
$result['Location'] = 'https://' . $result['Location'];
}
return $result['Location'];
} catch (\Exception $e) {
$this->error($e->getMessage());
}
}
public function create_plist($game_id = 0, $promote_id = 0, $marking = "", $url = "", $platform_id = 0, $position=1)
{
$find_web_stie = M('config') -> field('value') -> where(['name' => 'WEB_SITE']) -> find();
$xml = new \DOMDocument();
$xml -> load(ROOTTT . 'Uploads/Plist/testdemo.Plist');
$online = $xml -> getElementsByTagName('dict');//查找节点
$asd = $online -> item(1) -> getElementsByTagName('string');//第二个节点下所有string
foreach ($asd as $key => $value) {
switch ($value -> textContent) {
case 'ipa_url':
if (preg_match("/Uploads/", $url)) {
$value -> nodeValue = "https://" . $find_web_stie['value'] . ltrim($url, ".");//"https://iosdemo.vlcms.com/app/MCHSecretary.ipa";//替换xml对应的值
} else {
$value -> nodeValue = $url;
}
break;
case 'icon':
$icon_url = get_cover(get_game_icon_id($game_id), 'path', 2);
if (preg_match("/http/", $icon_url)) {
$value -> nodeValue = $icon_url;
} else {
$value -> nodeValue = "https://" . $find_web_stie['value'] . $icon_url;
}
break;
case 'com.dell':
$value -> nodeValue = $marking;
break;
case '1.0.0':
$value -> nodeValue = game_version($game_id);
break;
case 'mchdemo':
$value -> nodeValue = get_ios_game_name($game_id);
break;
}
if ($promote_id == 0) {
$xml -> save(ROOTTT . "Uploads/SourcePlist/$game_id.Plist");
} elseif ($platform_id > 0) {
$ppname = $game_id . "-" . $promote_id . "-" . $platform_id . "-" .$position;
$xml -> save(ROOTTT . "Uploads/GamePlist/$ppname.Plist");
} else {
$pname = $game_id . "-" . $promote_id;
$xml -> save(ROOTTT . "Uploads/GamePlist/$pname.Plist");
}
}
if ($promote_id == 0) {
return "./Uploads/SourcePlist/$game_id.Plist";
} elseif ($platform_id > 0) {
$ppname = $game_id . "-" . $promote_id . "-" . $platform_id . "-" . $position;
return "./Uploads/GamePlist/$ppname.Plist";
} else {
return "./Uploads/GamePlist/$pname.Plist";
}
}
/**
* 返回输出
* @param int $status 状态
* @param string $return_msg 错误信息
* @param array $data 返回数据
* author: xmy 280564871@qq.com
*/
public function set_message($status, $return_msg = 0, $data = [])
{
$msg = array(
"status" => $status,
"return_code" => $return_msg,
"data" => $data
);
echo json_encode($msg);
exit;
}
/**
* 安卓下载
* author: xmy 280564871@qq.com
*/
public function android_app_down(){
if($this->is_ios()){
$ios = M('app', 'tab_')->find(4);
$url="itms-services://?action=download-manifest&url=https://".$_SERVER['HTTP_HOST'].substr($ios['plist_url'],1);
Header("HTTP/1.1 303 See Other");
Header("Location: ".$url);
}else{
$app = M("app","tab_")->find(1);
Header("Location: ".$app['file_url']);
}
}
public function is_ios(){
if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')){
return true;
}else if(strpos($_SERVER['HTTP_USER_AGENT'], 'Android')){
return false;
}else{
return false;
}
}
/**
* 下载
* @param $file
* author: xmy 280564871@qq.com
*/
protected function down_file($file){
header('Content-Description: File Transfer');
header("Content-Type: application/force-download;");
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename={$file['file_name']}");
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize(__ROOT__.$file['file_url']));
header("Pragma: no-cache"); //不缓存页面
ob_clean();
flush();
readfile($file['file_url']);
}
public function down_error($message=''){
$this->assign("message",$message);
$this->display();
}
public function inviter_download() {
$pack_url = base64_decode($_REQUEST['url']);
$sdk_version = $_REQUEST['sdk_version'];
if(is_mobile_request()){
if($sdk_version == 1 && get_devices_type()==2)$this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载"));
if($sdk_version == 1 && is_weixin())$this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载"));
if($sdk_version == 2 && get_devices_type()==1)$this->redirect("Down/down_error",array('message'=>"请使用ios浏览器下载"));
}
switch ($sdk_version) {
case 1:
if(!empty($pack_url)){
if(preg_match("/oss/", $pack_url)){
$url=str_replace('-internal', '', $pack_url);
echo "<script>window.location.href='$url';</script>";
}elseif(preg_match("/clouddn/", $pack_url)){
$url = "http://".$pack_url;
redirect($url);
}elseif(preg_match("/myqcloud/", $pack_url)){
redirect($pack_url);
}elseif(preg_match("/bcebos/", $pack_url)){
redirect($pack_url);
}else{
if (!file_exists($pack_url)){
$this->error('文件不存在哦 亲!');
}else{
redirect("http://".$_SERVER['HTTP_HOST'].ltrim($pack_url,'.'));
}
}
}else{
$this->error('原包地址不存在');
}
break;
default:
$plist_url = substr($pack_url,'1',strlen($pack_url));
Header("HTTP/1.1 303 See Other");
Header("Location: "."itms-services://?action=download-manifest&url="."https://".$_SERVER["HTTP_HOST"]."/".$plist_url);
break;
}
}
}