From 9ed09a2f7aeaafe9511a1e0bbaacaf4c4936fc31 Mon Sep 17 00:00:00 2001 From: chengxl Date: Wed, 21 May 2025 17:40:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=85=AC=E4=BC=97=E5=8F=B7?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/common/Material.php | 252 +++++++++++++++++++++++++++++++- application/common/Wechat.php | 61 ++++---- 2 files changed, 275 insertions(+), 38 deletions(-) diff --git a/application/common/Material.php b/application/common/Material.php index 7e1392e..7309997 100644 --- a/application/common/Material.php +++ b/application/common/Material.php @@ -3,6 +3,7 @@ namespace app\common; use think\Db; use app\common\QrCodeImage; use app\common\Wechat; +use think\Cache; class Material { @@ -23,6 +24,12 @@ class Material //默认头像 protected $sDefaultUserIcon = '/static/img/userImg.f3d9bc3b.jpg'; + protected $sMaterialStepName = 'upload_step_name_'; + protected $sMaterialError = 'upload_error_'; + + protected $sAppID; //= 'wx03cb871b66e34e10'; + protected $sAppSecret; //= 'f59ccaf00383dcfab489292c4697620a'; + public function __construct(\think\Request $request = null) { } @@ -161,7 +168,7 @@ class Material * @param sType select 查询|add 新增 * @param $sPath 图片地址 */ - public function addArticleMaterial($aParam = []){ + private function addArticleMaterial($aParam = []){ //文章ID $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; @@ -219,7 +226,7 @@ class Material /** * 添加期刊素材 */ - public function addJournalMaterial($aParam = []){ + private function addJournalMaterial($aParam = []){ //期刊ID $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; @@ -275,7 +282,7 @@ class Material /** * 更新期刊二维码关联微信公众号素材 */ - public function updateJournalQrcode($aParam = []){ + private function updateJournalQrcode($aParam = []){ //期刊ID $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; @@ -312,13 +319,14 @@ class Material if($response === false){ return json_encode(['status' => 3,'msg' => 'fail']); } + return json_encode(['status' => 1,'msg' => 'success','data' => $aUpdate]); } /** * 更新文章二维码关联微信公众号素材 */ - public function updateArticleQrcode($aParam = []){ + private function updateArticleQrcode($aParam = []){ $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; if(empty($iArticleId)){ @@ -361,7 +369,7 @@ class Material /** * 更新通讯作者关联微信公众号素材 */ - public function updateArticleAuthor($aParam = []){ + private function updateArticleAuthor($aParam = []){ $sEmail = empty($aParam['email']) ? '' : $aParam['email']; //文章图片 @@ -406,13 +414,14 @@ class Material } $sSql = $sStartSql.trim($sSql,',').$sEndSql; $result = Db::execute($sSql); + return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]); } /** * 更新通讯作者关联微信公众号素材 */ - public function updateJournalEditorQrcode($aParam = []){ + private function updateJournalEditorQrcode($aParam = []){ $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; //文章图片 @@ -455,6 +464,237 @@ class Material } $sSql = $sStartSql.trim($sSql,',').$sEndSql; $result = Db::execute($sSql); + return json_encode(['status' => 1,'msg' => 'success','data' => $aInsert]); } + + /** + * 写入Reids 防止两小时内重复上传 + */ + public function setStepForRedis($iArticleId = 0,$sStepName = 'addArticleMaterial'){ + //写入redis 避免重复请求 + $sStepNameForRedis = $this->getStepForRedis($iArticleId); + if(empty($sStepNameForRedis) || (!empty($sStepNameForRedis) && $sStepNameForRedis != 'finish')){ + $sRedisKey = $this->sMaterialStepName.'upload_article_id_'.$iArticleId; + return Cache::set($sRedisKey, $sStepName, 600); // 有效期600秒 + } + } + + /** + * 获取Reids 防止两小时内重复上传 + */ + public function getStepForRedis($iArticleId = 0){ + $sRedisKey = $this->sMaterialStepName.'upload_article_id_'.$iArticleId; + return Cache::get($sRedisKey); // 有效期600秒 + } + + /** + * 写入Reids 防止两小时内重复上传 + */ + public function setErrorForRedis($iArticleId = 0,$sStepName = 'addArticleMaterial'){ + $sRedisKey = $this->sMaterialError.$iArticleId; + return Cache::set($sRedisKey, $sStepName, 600); // 有效期600秒 + } + + /** + * 写入Reids 防止两小时内重复上传 + */ + public function getErrorForRedis($iArticleId = 0){ + $sRedisKey = $this->sMaterialError.$iArticleId; + return Cache::set($sRedisKey, $sStepName, 600); // 有效期600秒 + } + /** + * 上传素材 + */ + + public function uploadMaterial($aParam = []){ + + //获取参数 + $aParam = empty($aParam) ? $this->input->post() : $aParam; + + //文章ID + $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; + + //必填验证 + if(empty($iArticleId)){ + return json_encode(['status' => 2,'msg' => 'article_id is empty']); + } + //期刊ID + $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; + if(empty($iJournalId)){ + return json_encode(['status' => 2,'msg' => 'journal_id is empty']); + } + + // 获取微信公众号APPID和APPKEY + if(empty($aParam['wechat_app_id']) || empty($aParam['wechat_app_secret'])){ + return json_encode(['status' => 2,'msg' => 'Please configure the AppID and AppSecret']); + } + + //获取缓存标识 + $sStepName = $this->getStepForRedis($iArticleId); + if(!empty($sStepName) && $sStepName == 'finish'){ + return json_encode(['status' => 1,'msg' => 'The relevant materials for the article have been uploaded. Please try again in ten minutes']); + } + if(empty($sStepName)){ + //写入标识 + $this->setStepForRedis($iArticleId); + $sStepName = 'addArticleMaterial'; + } + + + //微信公众号密钥 + $aWechatParam = ['wechat_app_id' => $aParam['wechat_app_id'],'wechat_app_secret' => $aParam['wechat_app_secret']]; + + //获取文章参数 + $aArticle = empty($aParam['article_info']) ? [] : $aParam['article_info']; + + //上传文章素材参数组装 + $aArticleParam = ['article_id' => $iArticleId,'icon' => empty($aArticle['icon']) ? '' : $aArticle['icon']]; + $aArticleParam += $aWechatParam; + + //上传文章图片素材 + if(!empty($aArticleParam['icon']) && $sStepName == 'addArticleMaterial'){ + $aUploadResult = json_decode($this->addArticleMaterial($aArticleParam),true); + $aParam['article_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data']; + if(empty($aParam['article_info'])){ + $sMsg = empty($aUploadResult['msg']) ? 'Article material upload failed' : $aUploadResult['msg']; + $this->setErrorForRedis($iArticleId,$sMsg); + return json_encode(['status' => 2,'msg' => $sMsg]); + } + } + //写入Redis下一个执行方法 + $sStepName = 'updateArticleQrcode'; + $this->setStepForRedis($iArticleId,$sStepName); + //文章二维码图片上传 + if($sStepName == 'updateArticleQrcode'){ + $aUploadResult = json_decode($this->updateArticleQrcode($aArticleParam),true); + $aParam['article_qrcode_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data']; + if(empty($aParam['article_qrcode_info'])){ + $sMsg = empty($aUploadResult['msg']) ? 'Article QR code image upload failed' : $aUploadResult['msg']; + $this->setErrorForRedis($iArticleId,$sMsg); + return json_encode(['status' => 2,'msg' => $sMsg]); + } + } + //写入Redis下一个执行方法 + $sStepName = 'addJournalMaterial'; + $this->setStepForRedis($iArticleId, $sStepName); + //获取期刊信息 + $aJournal = empty($aParam['journal_info']) ? [] : $aParam['journal_info']; + //上传期刊素材相关参数组装 + $aJournalParam = ['journal_id' => $iJournalId,'icon' => empty($aJournal['icon']) ? '' : $aJournal['icon'],'editor_qrcode' => empty($aJournal['editor_qrcode']) ? '' : $aJournal['editor_qrcode']]; + $aJournalParam += $aWechatParam; + //上传期刊图片 + if(!empty($aJournalParam['icon']) && $sStepName == 'addJournalMaterial'){ + $aUploadResult = json_decode($this->addJournalMaterial($aJournalParam),true); + $aParam['journal_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data']; + if(empty($aParam['journal_info'])){ + + $sMsg = empty($aUploadResult['msg']) ? 'Journal material image upload failed' : $aUploadResult['msg']; + $this->setErrorForRedis($iArticleId,$sMsg); + return json_encode(['status' => 2,'msg' => $sMsg]); + } + } + //写入Redis下一个执行方法 + $sStepName = 'updateJournalQrcode'; + $this->setStepForRedis($iArticleId,$sStepName); + //上传期刊二维码 + if($sStepName == 'updateJournalQrcode'){ + $aUploadResult = json_decode($this->updateJournalQrcode($aJournalParam),true); + $aParam['journal_qrcode_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data']; + if(empty($aParam['journal_qrcode_info'])){ + $sMsg = empty($aUploadResult['msg']) ? 'Journal QR code image upload failed' : $aUploadResult['msg']; + $this->setErrorForRedis($iArticleId,$sMsg); + return json_encode(['status' => 2,'msg' => $sMsg]); + } + } + //写入Redis下一个执行方法 + $sStepName = 'updateJournalEditorQrcode'; + $this->setStepForRedis($iArticleId,$sStepName); + //期刊编辑二维码 + if(!empty($aJournalParam['editor_qrcode']) && $sStepName == 'updateJournalEditorQrcode'){ + $aUploadResult = json_decode($this->updateJournalEditorQrcode($aJournalParam),true); + $aParam['editor_qrcode_info'] = empty($aUploadResult['data']) ? [] : $aUploadResult['data']; + if(empty($aParam['editor_qrcode_info'])){ + $sMsg = empty($aUploadResult['msg']) ? "Journal editor's QR code image upload failed" : $aUploadResult['msg']; + $this->setErrorForRedis($iArticleId,$sMsg); + return json_encode(['status' => 2,'msg' => $sMsg]); + } + } + //写入下一个执行方法 + $sStepName = 'updateArticleAuthor'; + $this->setStepForRedis($iArticleId,$sStepName); + //作者 + $aAuthor = empty($aParam['author_info']) ? [] : $aParam['author_info']; + if(!empty($aAuthor) && $sStepName == 'updateArticleAuthor'){ + $sError = ''; + foreach ($aAuthor as $key => $value) { + if(empty($value['icon'])){ + continue; + } + //文章二维码图片上传 + $aUpload = ['email' => $value['email'],'icon' => $value['icon'],'user_id' => $value['user_id']]; + $aUpload += $aWechatParam; + $aAuthorResult = json_decode($this->updateArticleAuthor($aUpload),true); + $aAuthorData = empty($aAuthorResult['data']) ? [] : $aAuthorResult['data']; + if(empty($aAuthorData)){ + $sError .= empty($aAuthorResult['msg']) ? "The corresponding author's avatar upload failed:".$value['email'].';' : $aAuthorResult['msg']."-".$value['email'].';'; + } + $aAuthor[$key]['icon'] = empty($aAuthorData['media_url']) ? $value['icon'] : $aAuthorData['media_url']; + } + $aParam['author_info'] = $aAuthor; + } + if(!empty($sError)){ + $this->setErrorForRedis($iArticleId,$sError); + return json_encode(['status' => 2,'msg' => $sError]); + } + //写入redis 上传执行完成 + $this->setStepForRedis($iArticleId,'finish'); + //返回参数 + return json_encode(['status' => 1,'msg' => 'Upload successful','data' => $aParam]); + } + + /** + * 获取素材 + */ + + public function getMaterial($aParam = []){ + + //获取参数 + $aParam = empty($aParam) ? $this->input->post() : $aParam; + + //文章ID + $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; + + //必填验证 + if(empty($iArticleId)){ + return json_encode(['status' => 2,'msg' => 'article_id is empty']); + } + //期刊ID + $iJournalId = empty($aParam['journal_id']) ? '' : $aParam['journal_id']; + if(empty($iJournalId)){ + return json_encode(['status' => 2,'msg' => 'journal_id is empty']); + } + + //返回数据定义空数组 + $aData = []; + //文章图片素材 + $aWhere = ['article_id' => $iArticleId,'is_delete' => 2]; + $aData['ai_article_material'] = Db::name('ai_article_material')->field('media_id,media_url')->where($aWhere)->find(); + //文章二维码素材 + $aData['ai_article_qrcode'] = Db::name('ai_article_qrcode')->field('media_id,media_url')->where($aWhere)->find(); + //期刊素材 + $aJournalWhere = ['journal_id' => $iJournalId,'is_delete' => 2]; + $aData['ai_journal_material'] = Db::name('ai_journal_material')->field('media_id,media_url')->where($aJournalWhere)->find(); + //期刊二维码 + $aData['ai_journal_qrcode'] = Db::name('ai_journal_qrcode')->field('media_id,media_url')->where($aJournalWhere)->find(); + //期刊编辑 + $aData['ai_journal_editor_material'] = Db::name('ai_journal_editor_material')->field('media_id,media_url')->where($aJournalWhere)->find(); + //文章作者 + if(!empty($aParam['author_info'])){ + $aEmail = array_column($aParam['author_info'], 'email'); + $aWhere = ['email' => ['in',$aEmail],'is_delete' => 2]; + $aData['ai_author_material'] = Db::name('ai_author_material')->field('user_id,email,media_id,media_url')->where($aWhere)->find(); + } + return json_encode(['status' => 1,'msg' => 'Successfully obtained data','data' => $aData]); + } } diff --git a/application/common/Wechat.php b/application/common/Wechat.php index 76f7133..5c1dcd9 100644 --- a/application/common/Wechat.php +++ b/application/common/Wechat.php @@ -45,7 +45,6 @@ class Wechat return FALSE; } $result = json_decode($result, true); - if (!empty($result['access_token'])) { $sToken = $result['access_token']; Cache::set($this->sWechatAccessToken.'_'.$this->sAppID, $sToken, 7000); // 有效期7200秒 @@ -305,19 +304,18 @@ class Wechat return json_encode($aInfo); } - // //CURL请求 - // $sUrl = "https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token={$sToken}"; - // //参数组装 - // $sJsonData = json_encode([ - // 'media_id' => $sMediaId - // ], JSON_UNESCAPED_UNICODE); - // //发送CURL请求 - // $aCurlResult = $this->curlWechatApi($sUrl,$sJsonData); - // if($aCurlResult['status'] != 1){ - // return $aCurlResult; - // } - // $response = empty($aCurlResult['data']) ? [] : $aCurlResult['data']; -$response['publish_id'] = '100000001'; + //CURL请求 + $sUrl = "https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token={$sToken}"; + //参数组装 + $sJsonData = json_encode([ + 'media_id' => $sMediaId + ], JSON_UNESCAPED_UNICODE); + //发送CURL请求 + $aCurlResult = $this->curlWechatApi($sUrl,$sJsonData); + if($aCurlResult['status'] != 1){ + return $aCurlResult; + } + $response = empty($aCurlResult['data']) ? [] : $aCurlResult['data']; //判断是否推送成功 if(empty($response['publish_id'])){ return json_encode(['status' => 9,'msg' => "The publish_id of the published draft was not obtained"]); @@ -345,25 +343,24 @@ $response['publish_id'] = '100000001'; return json_encode(['status' => 2,'msg' => 'Please configure the AppID and AppSecret']); } - // //获取Token - // $sToken = $this->getAccessToken(); - // if (empty($sToken)) { - // return json_encode(['status' => 3, 'msg' => 'Failed to obtain access_token']); - // } + //获取Token + $sToken = $this->getAccessToken(); + if (empty($sToken)) { + return json_encode(['status' => 3, 'msg' => 'Failed to obtain access_token']); + } - // //CURL请求 - // $sUrl = "https://api.weixin.qq.com/cgi-bin/freepublish/get?access_token={$sToken}"; - // //参数组装 - // $sJsonData = json_encode([ - // 'publish_id' => $sPublishId - // ], JSON_UNESCAPED_UNICODE); - // //发送CURL请求 - // $aCurlResult = $this->curlWechatApi($sUrl,$sJsonData); - // $response = empty($aCurlResult['data']) ? [] : $aCurlResult['data']; - // if(empty($response)){ - // return json_encode(['status' => 4,'msg' => 'Query failed']); - // } - $response = ['publish_id' => '1000001','publish_status' => 2,'article_id'=> '','article_detail','fail_idx' => [1,2]]; + //CURL请求 + $sUrl = "https://api.weixin.qq.com/cgi-bin/freepublish/get?access_token={$sToken}"; + //参数组装 + $sJsonData = json_encode([ + 'publish_id' => $sPublishId + ], JSON_UNESCAPED_UNICODE); + //发送CURL请求 + $aCurlResult = $this->curlWechatApi($sUrl,$sJsonData); + $response = empty($aCurlResult['data']) ? [] : $aCurlResult['data']; + if(empty($response)){ + return json_encode(['status' => 4,'msg' => 'Query failed']); + } return json_encode(['status' => 1,'msg' => 'query was successful','data' => $response]); } }