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
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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;
}
}
}