diff --git a/app/Admin/Controllers/AgentController.php b/app/Admin/Controllers/AgentController.php index 1f11ec5..7775137 100644 --- a/app/Admin/Controllers/AgentController.php +++ b/app/Admin/Controllers/AgentController.php @@ -30,6 +30,7 @@ class AgentController extends AdminController { return Grid::make(new Agent(['miniUpload']), function (Grid $grid) { $grid->disableDeleteButton(); + $grid->disableRowSelector(); $grid->tools(new MiniProgramPull('更新小程序模板')); diff --git a/app/Admin/Controllers/AgentStatisticsController.php b/app/Admin/Controllers/AgentStatisticsController.php index afcb5cd..fa79cef 100755 --- a/app/Admin/Controllers/AgentStatisticsController.php +++ b/app/Admin/Controllers/AgentStatisticsController.php @@ -3,19 +3,12 @@ namespace App\Admin\Controllers; use App\Admin\Metrics\Examples\AgentStatistics; -use App\AdminAgent\Metrics\Examples\FinanceStatistics; -use App\AdminAgent\Metrics\Examples\OrderStatistics; -use App\AdminAgent\Metrics\Examples\UserStatistics; -use App\Common\OrderStatus; -use App\Models\Order; -use App\Models\OrderProductItem; use Dcat\Admin\Admin; use Dcat\Admin\Layout\Column; use Dcat\Admin\Layout\Content; use Dcat\Admin\Layout\Row; use Dcat\Admin\Http\Controllers\AdminController; use Dcat\Admin\Widgets\Box; -use Dcat\Admin\Widgets\Card; use Dcat\Admin\Widgets\Dropdown; use Illuminate\Support\Arr; use Illuminate\Support\Str; diff --git a/app/Admin/Controllers/GuideController.php b/app/Admin/Controllers/GuideController.php index 22eadc5..a62d71a 100644 --- a/app/Admin/Controllers/GuideController.php +++ b/app/Admin/Controllers/GuideController.php @@ -23,6 +23,7 @@ class GuideController extends AdminController { return Grid::make(new Guide(), function (Grid $grid) { $grid->disableDeleteButton(); + $grid->disableRowSelector(); //如果是审核页面,多加where条件判断 if (strpos(Route::current()->uri, 'audit')) { diff --git a/app/Admin/Controllers/MiniProgramTemplateController.php b/app/Admin/Controllers/MiniProgramTemplateController.php index d804e39..69ba693 100644 --- a/app/Admin/Controllers/MiniProgramTemplateController.php +++ b/app/Admin/Controllers/MiniProgramTemplateController.php @@ -43,8 +43,8 @@ class MiniProgramTemplateController extends AdminController $grid->column('op') ->if(fn() => true) ->then(function ($column) { -// $column->append((new MiniProgramUpload(null, 2))->setKey($this->template_id))->append(' '); - $column->append((new MiniProgramDelTemp)->setKey($this->template_id))->append(' '); + $column->append((new MiniProgramUpload(null, 2))->setKey($this->template_id))->append(' '); + $column->append((new MiniProgramDelTemp)->setKey($this->template_id)); }); }); } diff --git a/app/Admin/Controllers/OrderController.php b/app/Admin/Controllers/OrderController.php index fd9d248..d787bcf 100644 --- a/app/Admin/Controllers/OrderController.php +++ b/app/Admin/Controllers/OrderController.php @@ -30,6 +30,7 @@ class OrderController extends AdminController $grid->disableCreateButton(); $grid->disableDeleteButton(); $grid->disableEditButton(); + $grid->disableRowSelector(); $grid->column('id')->sortable(); $grid->column('order_no')->limit(10); diff --git a/app/Admin/Controllers/OrderStatisticsController.php b/app/Admin/Controllers/OrderStatisticsController.php index bc4f09d..394928c 100755 --- a/app/Admin/Controllers/OrderStatisticsController.php +++ b/app/Admin/Controllers/OrderStatisticsController.php @@ -5,7 +5,6 @@ namespace App\Admin\Controllers; use App\Admin\Metrics\Examples\OrderStatistics; use App\Common\OrderStatus; use App\Models\Order; -use App\Models\OrderProductItem; use Dcat\Admin\Admin; use Dcat\Admin\Layout\Column; use Dcat\Admin\Layout\Content; diff --git a/app/Admin/Controllers/SupplierStatisticsController.php b/app/Admin/Controllers/SupplierStatisticsController.php index d2434f4..8c7769d 100755 --- a/app/Admin/Controllers/SupplierStatisticsController.php +++ b/app/Admin/Controllers/SupplierStatisticsController.php @@ -3,19 +3,12 @@ namespace App\Admin\Controllers; use App\Admin\Metrics\Examples\AgentStatistics; -use App\AdminAgent\Metrics\Examples\FinanceStatistics; -use App\AdminAgent\Metrics\Examples\OrderStatistics; -use App\AdminAgent\Metrics\Examples\UserStatistics; -use App\Common\OrderStatus; -use App\Models\Order; -use App\Models\OrderProductItem; use Dcat\Admin\Admin; use Dcat\Admin\Layout\Column; use Dcat\Admin\Layout\Content; use Dcat\Admin\Layout\Row; use Dcat\Admin\Http\Controllers\AdminController; use Dcat\Admin\Widgets\Box; -use Dcat\Admin\Widgets\Card; use Dcat\Admin\Widgets\Dropdown; use Illuminate\Support\Arr; use Illuminate\Support\Str; diff --git a/app/Admin/Controllers/UserStatisticsController.php b/app/Admin/Controllers/UserStatisticsController.php index dc87092..95731c2 100755 --- a/app/Admin/Controllers/UserStatisticsController.php +++ b/app/Admin/Controllers/UserStatisticsController.php @@ -2,19 +2,13 @@ namespace App\Admin\Controllers; -use App\AdminAgent\Metrics\Examples\FinanceStatistics; -use App\AdminAgent\Metrics\Examples\OrderStatistics; use App\Admin\Metrics\Examples\UserStatistics; -use App\Common\OrderStatus; -use App\Models\Order; -use App\Models\OrderProductItem; use Dcat\Admin\Admin; use Dcat\Admin\Layout\Column; use Dcat\Admin\Layout\Content; use Dcat\Admin\Layout\Row; use Dcat\Admin\Http\Controllers\AdminController; use Dcat\Admin\Widgets\Box; -use Dcat\Admin\Widgets\Card; use Dcat\Admin\Widgets\Dropdown; use Illuminate\Support\Arr; use Illuminate\Support\Str; diff --git a/app/Admin/Extensions/Grid/MiniProgramAuditStatus.php b/app/Admin/Extensions/Grid/MiniProgramAuditStatus.php index a98a69d..1061378 100644 --- a/app/Admin/Extensions/Grid/MiniProgramAuditStatus.php +++ b/app/Admin/Extensions/Grid/MiniProgramAuditStatus.php @@ -36,9 +36,9 @@ class MiniProgramAuditStatus extends RowAction return "formatHtmlAttributes()}>{$this->title}"; } - public function handle() + public function handle(Request $request) { - return $this->action == 1 ? $this->auditStatus() : $this->undoAudit(); + return $request->action == 1 ? $this->auditStatus() : $this->undoAudit(); } private function auditStatus() diff --git a/app/Admin/Extensions/Grid/MiniProgramPull.php b/app/Admin/Extensions/Grid/MiniProgramPull.php index 675237b..33affa7 100644 --- a/app/Admin/Extensions/Grid/MiniProgramPull.php +++ b/app/Admin/Extensions/Grid/MiniProgramPull.php @@ -109,7 +109,7 @@ class MiniProgramPull extends RowAction MiniProgramTemplate::insertOrIgnore($list['template_list']); MiniProgramTemplate::whereNotIn('template_id', array_column($list['template_list'], 'template_id'))->delete(); //删除不存在的数据 - return $this->response()->success("更新列表成功")->refresh(); + return $this->response()->success("更新小程序模板成功")->refresh(); } catch (\Exception $e) { return $this->response()->error($e->getMessage()); } diff --git a/app/Admin/Extensions/Grid/MiniProgramUpload.php b/app/Admin/Extensions/Grid/MiniProgramUpload.php index e11f90c..e8749fd 100644 --- a/app/Admin/Extensions/Grid/MiniProgramUpload.php +++ b/app/Admin/Extensions/Grid/MiniProgramUpload.php @@ -1,17 +1,14 @@ action = $action; //$action:1=为指定代理商上传小程序;2=暂未确定 - $this->title = $action == 1 ? '上传小程序' : '为所有代理商上传'; + $this->action = $action; + $this->title = $action == 1 ? '上传小程序' : '上传到所有代理商'; } protected function html() @@ -40,16 +37,13 @@ class MiniProgramUpload extends RowAction public function handle(Request $request) { - return $this->action == 1 ? $this->uploadOne() : $this->uploadAll(); + return $request->action == 1 ? $this->uploadOne() : $this->uploadAll(); } //注:uploadOne在代理商列表页使用 private function uploadOne() { $template = MiniProgramTemplate::orderBy('template_id', 'desc')->first(); - /*if (MiniProgramUploadLog::query()->where(['agent_id' => $this->getKey(), 'template_id' => $template->template_id])->exists()) { - return $this->response()->error("该代理商已经上传过模板ID为 {$template->template_id} 的小程序,无需重复上传"); - }*/ $agent = Agent::find($this->getKey()); if (empty($agent->appid)) { @@ -57,85 +51,9 @@ class MiniProgramUpload extends RowAction } try { - $openPlatform = new OpenPlatform(); - $refreshToken = $openPlatform->refreshToken($agent->appid); - if (!$refreshToken) { - return $this->response()->error('获取refresh_token失败'); - } - $miniProgram = $openPlatform->miniProgram($agent->appid, $refreshToken); - - /** @var Client $code */ - $code = $miniProgram['code'] ?? null; - if (!$code) { - return $this->response()->error('获取code失败'); - } - - $templateId = $template->template_id; - $extJson = json_encode(['extAppid' => $agent->appid]); - $version = $template->user_version; - $description = $agent->company_name; - - //提交上传 - $commit = $code->commit($templateId, $extJson, $version, $description); - - if (!isset($commit['errcode'], $commit['errmsg']) || $commit['errcode'] != 0 || $commit['errmsg'] != 'ok') { - throw new \Exception(isset($commit['errmsg']) ? $commit['errmsg'] : join(',', $commit)); - } - - //提交审核,文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/submit_audit.html - $res = $code->submitAudit([]); - - $audit_err_code = $this->auditErrorCode(); - if (isset($res['errcode'], $res['errmsg']) && $res['errcode'] == 0 && $res['errmsg'] == 'ok') { - $filename = "mini_program_qrcode/{$agent->id}-{$agent->appid}-demo.jpg"; - - //保存上传记录 - MiniProgramUploadLog::insert([ - 'agent_id' => $agent->id, - 'appid' => $agent->appid, - 'user_version' => $template->user_version, - 'template_id' => $templateId, - 'qrcode' => $filename, - 'audit_id' => $res['auditid'], - 'created_at' => now(), - ]); - - //获取体验二维码并保存,30天内只获取一次 - $qrcode_path = Storage::path("mini_program_qrcode/{$agent->id}-{$agent->appid}-demo.jpg"); - if (!file_exists($qrcode_path) || time() - filemtime($qrcode_path) < 86400 * 30) { - $qrcode = $code->getQrCode(); - Storage::put("public/$filename", $qrcode); - } - - //设置域名,如果之前已经设置过了将记录下来,不再设置 - $host = env('APP_URL'); - $redis_key = 'mini_program_set_host:' . substr(md5($host), 0, 10); - if (!Redis::hget($redis_key, $agent->appid)) { - /** @var \EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Domain\Client $domain */ - $domain = $miniProgram['domain']; - - $param = [ - "action" => "add", - "requestdomain" => [$host], - "wsrequestdomain" => [str_replace('http', 'ws', $host)], - "uploaddomain" => [$host], - "downloaddomain" => [$host], - ]; - $domain->modify($param); //服务器域名,服务器域名多次设置仅第一次成功,这里不校验返回结果正确性 - $res = $domain->setWebviewDomain([$host]); //业务域名 - if (!isset($res['errcode'], $res['errmsg']) || $res['errcode'] != 0 || $res['errmsg'] != 'ok') { - throw new \Exception("设置业务域名{$host}失败,原因:" . $res['errmsg'] ?? (is_array($res) ? join(',', $res) : '未知')); - } - Redis::hset($redis_key, $agent->appid, 1); - } - - return $this->response()->success("上传成功,并已提交审核")->refresh(); - } else if (isset($audit_err_code[$res['errcode']])) { - throw new \Exception($audit_err_code[$res['errcode']]); - } else { - throw new \Exception($res['errmsg'] ?? join(',', $res)); - } - } catch (\Exception $e) { + new UploadMiniProgram($agent, $template); + return $this->response()->success("上传成功,并已提交审核")->refresh(); + } catch (GuzzleException | \Exception $e) { return $this->response()->error($e->getMessage()); } } @@ -143,13 +61,26 @@ class MiniProgramUpload extends RowAction //注:uploadAll在小程序模板列表页使用 private function uploadAll() { - return true; + //上传单个时,$this->getKey()是代理商ID,上传多个时,是小程序模板ID + $template_id = $this->getKey(); + + $ids = Agent::whereNotNull('appid') + ->where([ + ['id', '>', 1], //ID=1是支付小程序,管理员账号 + ['status', '=', UserStatus::NORMAL], + ['appid', '<>', ''], + ])->pluck('id'); + + foreach ($ids as $id) { + UploadMiniProgramQueue::dispatch($template_id, $id); + } + return $this->response()->success('已经为所有已注册过小程序,且状态正常的代理商上传小程序。上传需要一定时间,请耐心等待'); } public function confirm() { - $last_template_id = MiniProgramTemplate::max('template_id'); if ($this->action == 1) { + $last_template_id = MiniProgramTemplate::max('template_id'); return ["确定要上传模板ID为{$last_template_id}的小程序吗?", '']; } else { return ['上传确认', '确定要将此小程序模板上传给所有已审核的代理商吗?']; @@ -160,35 +91,4 @@ class MiniProgramUpload extends RowAction { return ['action' => $this->action]; } - - private function auditErrorCode(): array - { - return [ - -1 => '系统繁忙', - 86000 => '不是由第三方代小程序进行调用', - 86001 => '不存在第三方的已经提交的代码', - 85006 => '标签格式错误', - 85007 => '页面路径错误', - 85008 => '当前小程序没有已经审核通过的类目,请添加类目成功后重试', - 85009 => '已经有正在审核的版本', - 85010 => 'item_list 有项目为空', - 85011 => '标题填写错误', - 85023 => '审核列表填写的项目数不在 1-5 以内', - 85077 => '小程序类目信息失效(类目中含有官方下架的类目,请重新选择类目)', - 86002 => '小程序还未设置昵称、头像、简介。请先设置完后再重新提交', - 85085 => '小程序提审数量已达本月上限,请点击查看《临时quota申请流程》', - 85086 => '提交代码审核之前需提前上传代码', - 85087 => '小程序已使用 api navigateToMiniProgram,请声明跳转 appid 列表后再次提交', - 87006 => '小游戏不能提交', - 86007 => '小程序禁止提交', - 85051 => 'version_desc或者preview_info超限', - 85092 => 'preview_info格式错误', - 85093 => 'preview_info 视频或者图片个数超限', - 85094 => '需提供审核机制说明信息', - 86009 => '服务商新增小程序代码提审能力被限制', - 86010 => '服务商迭代小程序代码提审能力被限制', - 9400001 => '该开发小程序已开通小程序直播权限,不支持发布版本。如需发版,请解绑开发小程序后再操作。', - 9402202 => '请勿频繁提交,待上一次操作完成后再提交', - ]; - } } diff --git a/app/AdminAgent/Forms/LoadSupplierSpec.php b/app/AdminAgent/Forms/LoadSupplierSpec.php index 3f3ce19..dabfa9e 100644 --- a/app/AdminAgent/Forms/LoadSupplierSpec.php +++ b/app/AdminAgent/Forms/LoadSupplierSpec.php @@ -21,6 +21,7 @@ class LoadSupplierSpec extends Form implements LazyRenderable ->pluck('product_spec_id')->toArray(); $spec = ProductSpec::where('product_id', $id) ->whereNotIn('id', $agent_spec ?? [0]) + ->orderBy('supplier_date') ->get([ 'id AS product_spec_id', 'name AS supplier_name', @@ -29,13 +30,15 @@ class LoadSupplierSpec extends Form implements LazyRenderable 'stock AS supplier_stock', ])->toArray(); } else { - $spec = ProductSpec::where('product_id', $id)->get([ - 'id AS product_spec_id', - 'name AS supplier_name', - 'date AS supplier_date', - 'price AS supplier_price', - 'stock AS supplier_stock', - ])->toArray(); + $spec = ProductSpec::where('product_id', $id) + ->orderBy('supplier_date') + ->get([ + 'id AS product_spec_id', + 'name AS supplier_name', + 'date AS supplier_date', + 'price AS supplier_price', + 'stock AS supplier_stock', + ])->toArray(); } return $this->response()->data($spec); diff --git a/app/AdminGuide/Controllers/OrderController.php b/app/AdminGuide/Controllers/OrderController.php index ee53c2e..b1c7c02 100644 --- a/app/AdminGuide/Controllers/OrderController.php +++ b/app/AdminGuide/Controllers/OrderController.php @@ -22,10 +22,11 @@ class OrderController extends AdminController */ protected function grid() { - return Grid::make(new Order(['agent:id,name', 'user:id,nickname']), function (Grid $grid) { + return Grid::make(new Order(['agent:id,name']), function (Grid $grid) { $grid->disableBatchActions(); $grid->disableCreateButton(); $grid->disableActions(); + $grid->disableRowSelector(); $grid->model()->where('guide_id', Admin::user()->id); diff --git a/app/AdminSupplier/Controllers/FinanceStatisticsController.php b/app/AdminSupplier/Controllers/FinanceStatisticsController.php index bf55111..bc9bd14 100755 --- a/app/AdminSupplier/Controllers/FinanceStatisticsController.php +++ b/app/AdminSupplier/Controllers/FinanceStatisticsController.php @@ -3,9 +3,7 @@ namespace App\AdminSupplier\Controllers; use App\AdminSupplier\Metrics\Examples\FinanceStatistics; -use App\Common\OrderStatus; use App\Common\PayType; -use App\Models\Order; use App\Models\OrderProductItem; use Dcat\Admin\Admin; use Dcat\Admin\Layout\Column; diff --git a/app/AdminSupplier/Controllers/OrderController.php b/app/AdminSupplier/Controllers/OrderController.php index 7ee955a..6dd4da9 100644 --- a/app/AdminSupplier/Controllers/OrderController.php +++ b/app/AdminSupplier/Controllers/OrderController.php @@ -31,6 +31,7 @@ class OrderController extends AdminController $grid->disableCreateButton(); $grid->disableDeleteButton(); $grid->disableEditButton(); + $grid->disableRowSelector(); $grid->model()->where(function ($query) { return $query->whereHas('orderProductItem', function($query) { diff --git a/app/AdminSupplier/Controllers/OrderStatisticsController.php b/app/AdminSupplier/Controllers/OrderStatisticsController.php index 8376c40..dbd5844 100755 --- a/app/AdminSupplier/Controllers/OrderStatisticsController.php +++ b/app/AdminSupplier/Controllers/OrderStatisticsController.php @@ -4,7 +4,6 @@ namespace App\AdminSupplier\Controllers; use App\AdminSupplier\Metrics\Examples\OrderStatistics; use App\Common\OrderStatus; -use App\Models\Order; use App\Models\OrderProductItem; use Dcat\Admin\Admin; use Dcat\Admin\Layout\Column; diff --git a/app/AdminSupplier/Controllers/ProductStatisticsController.php b/app/AdminSupplier/Controllers/ProductStatisticsController.php index 712b7a4..1836817 100755 --- a/app/AdminSupplier/Controllers/ProductStatisticsController.php +++ b/app/AdminSupplier/Controllers/ProductStatisticsController.php @@ -3,11 +3,7 @@ namespace App\AdminSupplier\Controllers; use App\AdminSupplier\Metrics\Examples\ProductStatistics; -use App\Common\OrderStatus; use App\Common\ProductStatus; -use App\Models\AgentProduct; -use App\Models\Order; -use App\Models\OrderProductItem; use App\Models\Product; use Dcat\Admin\Admin; use Dcat\Admin\Layout\Column; diff --git a/app/Http/Controllers/Api/OrderController.php b/app/Http/Controllers/Api/OrderController.php index fc9aa53..8fa0545 100644 --- a/app/Http/Controllers/Api/OrderController.php +++ b/app/Http/Controllers/Api/OrderController.php @@ -327,7 +327,7 @@ class OrderController extends Controller 'supplier_id' => $ap->product->supplier_id, 'product_id' => $ap->product->id, 'num' => $formData['num'], - 'price' => $ap->product->price, + 'price' => $ap->product->price * $formData['num'], 'agent_product_spec_id' => json_encode($agent_product_spec_ids), 'product_type' => $ap->product->type, 'product_spec_id' => json_encode($product_spec_ids), diff --git a/app/Http/Controllers/Api/SpecialController.php b/app/Http/Controllers/Api/SpecialController.php index 977735e..2cccf38 100644 --- a/app/Http/Controllers/Api/SpecialController.php +++ b/app/Http/Controllers/Api/SpecialController.php @@ -17,7 +17,9 @@ class SpecialController extends Controller $detail = Special::query() ->select(['id', 'picture', 'updated_at', 'agent_product_id']) ->find($id); - $detail->picture = array_map(fn($v) => $prefix . $v, $detail->picture); + if ($detail->picture) { + $detail->picture = array_map(fn($v) => $prefix . $v, $detail->picture); + } $detail->product = AgentProduct::list($this->agent_id) ->whereIn('id', $detail->agent_product_id) diff --git a/app/Http/Controllers/Api/TestController.php b/app/Http/Controllers/Api/TestController.php index dbd6330..5d2ba12 100644 --- a/app/Http/Controllers/Api/TestController.php +++ b/app/Http/Controllers/Api/TestController.php @@ -2,11 +2,9 @@ namespace App\Http\Controllers\Api; -use App\Common\ProductStatus; -use App\Models\AgentProduct; +use App\Models\MiniProgramTemplate; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Log; /** * 仅用于测试 @@ -17,7 +15,7 @@ class TestController { public function index() { - dd(AgentProduct::where('agent_id', 10)->withTrashed()->count()); + dd(MiniProgramTemplate::find(26)->toArray()); } /** diff --git a/app/Jobs/UploadMiniProgramQueue.php b/app/Jobs/UploadMiniProgramQueue.php new file mode 100644 index 0000000..78e7657 --- /dev/null +++ b/app/Jobs/UploadMiniProgramQueue.php @@ -0,0 +1,54 @@ +template_id = $template_id; + $this->agent_id = $agent_id; + } + + /** + * Execute the job. + * + * @return void + * @throws Exception + */ + public function handle() + { + $agent = Agent::find($this->agent_id); + $template = MiniProgramTemplate::find($this->template_id); + + if (!$agent || !$template) return; + + try { + new UploadMiniProgram($agent, $template); + } catch (GuzzleException | \Exception $e) { + throw new Exception($e->getMessage()); + } + } +} diff --git a/app/Models/MiniProgramDraft.php b/app/Models/MiniProgramDraft.php index 9333ece..872a419 100644 --- a/app/Models/MiniProgramDraft.php +++ b/app/Models/MiniProgramDraft.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Model; class MiniProgramDraft extends Model { use HasFactory; + protected $primaryKey = 'draft_id'; public function __construct(array $attributes = []) { diff --git a/app/Models/MiniProgramTemplate.php b/app/Models/MiniProgramTemplate.php index 6a809c7..e234588 100644 --- a/app/Models/MiniProgramTemplate.php +++ b/app/Models/MiniProgramTemplate.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Model; class MiniProgramTemplate extends Model { use HasFactory; + protected $primaryKey = 'template_id'; public function __construct(array $attributes = []) { diff --git a/app/Service/UploadMiniProgram.php b/app/Service/UploadMiniProgram.php new file mode 100644 index 0000000..6e59380 --- /dev/null +++ b/app/Service/UploadMiniProgram.php @@ -0,0 +1,143 @@ +refreshToken($agent->appid); + if (!$refreshToken) { + throw new Exception('获取refresh_token失败'); + } + $miniProgram = $openPlatform->miniProgram($agent->appid, $refreshToken); + + /** @var Client $code */ + $code = $miniProgram['code'] ?? null; + if (!$code) { + throw new Exception('获取code失败'); + } + + $templateId = $template->template_id; + $extJson = json_encode(['extAppid' => $agent->appid]); + $version = $template->user_version; + $description = $agent->company_name; + + //提交上传 + $commit = $code->commit($templateId, $extJson, $version, $description); + + if (!isset($commit['errcode'], $commit['errmsg']) || $commit['errcode'] != 0 || $commit['errmsg'] != 'ok') { + throw new Exception($commit['errmsg'] ?? join(',', $commit)); + } + + //提交审核,文档:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/submit_audit.html + $res = $code->submitAudit([]); + + $audit_err_code = $this->auditErrorCode(); + if (isset($res['errcode'], $res['errmsg']) && $res['errcode'] == 0 && $res['errmsg'] == 'ok') { + $filename = "mini_program_qrcode/{$agent->id}-{$agent->appid}-demo.jpg"; + + //保存上传记录 + MiniProgramUploadLog::insert([ + 'agent_id' => $agent->id, + 'appid' => $agent->appid, + 'user_version' => $template->user_version, + 'template_id' => $templateId, + 'qrcode' => $filename, + 'audit_id' => $res['auditid'], + 'created_at' => now(), + ]); + + //获取体验二维码并保存,30天内只获取一次 + $qrcode_path = Storage::path("mini_program_qrcode/{$agent->id}-{$agent->appid}-demo.jpg"); + if (!file_exists($qrcode_path) || time() - filemtime($qrcode_path) < 86400 * 30) { + $qrcode = $code->getQrCode(); + Storage::put("public/$filename", $qrcode); + } + + //设置域名,如果之前已经设置过了将记录下来,不再设置 + $host = env('APP_URL'); + $redis_key = 'mini_program_set_host:' . substr(md5($host), 0, 10); + if (!Redis::hget($redis_key, $agent->appid)) { + /** @var \EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Domain\Client $domain */ + $domain = $miniProgram['domain']; + + $param = [ + "action" => "add", + "requestdomain" => [$host], + "wsrequestdomain" => [str_replace('http', 'ws', $host)], + "uploaddomain" => [$host], + "downloaddomain" => [$host], + ]; + $domain->modify($param); //服务器域名,服务器域名多次设置仅第一次成功,这里不校验返回结果正确性 + $res = $domain->setWebviewDomain([$host]); //业务域名 + if (!isset($res['errcode'], $res['errmsg']) || $res['errcode'] != 0 || $res['errmsg'] != 'ok') { + throw new Exception("设置业务域名{$host}失败,原因:" . $res['errmsg'] ?? (is_array($res) ? join(',', $res) : '未知')); + } + Redis::hset($redis_key, $agent->appid, 1); + } + + echo "上传成功,并已提交审核"; + } else if (isset($audit_err_code[$res['errcode']])) { + throw new Exception($audit_err_code[$res['errcode']]); + } else { + throw new Exception($res['errmsg'] ?? join(',', $res)); + } + } catch (Exception $e) { + throw new Exception($agent->id . '-' . $agent->appid . $e->getMessage()); + } + } + + private function auditErrorCode(): array + { + return [ + -1 => '系统繁忙', + 86000 => '不是由第三方代小程序进行调用', + 86001 => '不存在第三方的已经提交的代码', + 85006 => '标签格式错误', + 85007 => '页面路径错误', + 85008 => '当前小程序没有已经审核通过的类目,请添加类目成功后重试', + 85009 => '已经有正在审核的版本', + 85010 => 'item_list 有项目为空', + 85011 => '标题填写错误', + 85023 => '审核列表填写的项目数不在 1-5 以内', + 85077 => '小程序类目信息失效(类目中含有官方下架的类目,请重新选择类目)', + 86002 => '小程序还未设置昵称、头像、简介。请先设置完后再重新提交', + 85085 => '小程序提审数量已达本月上限,请点击查看《临时quota申请流程》', + 85086 => '提交代码审核之前需提前上传代码', + 85087 => '小程序已使用 api navigateToMiniProgram,请声明跳转 appid 列表后再次提交', + 87006 => '小游戏不能提交', + 86007 => '小程序禁止提交', + 85051 => 'version_desc或者preview_info超限', + 85092 => 'preview_info格式错误', + 85093 => 'preview_info 视频或者图片个数超限', + 85094 => '需提供审核机制说明信息', + 86009 => '服务商新增小程序代码提审能力被限制', + 86010 => '服务商迭代小程序代码提审能力被限制', + 9400001 => '该开发小程序已开通小程序直播权限,不支持发布版本。如需发版,请解绑开发小程序后再操作。', + 9402202 => '请勿频繁提交,待上一次操作完成后再提交', + ]; + } +} diff --git a/resources/js/agent-spec-edit.js b/resources/js/agent-spec-edit.js index b193c56..42a3e85 100644 --- a/resources/js/agent-spec-edit.js +++ b/resources/js/agent-spec-edit.js @@ -7,8 +7,12 @@ $(function () { var is_load = false; $('.spec-sync').click(function () { if (is_load) { - Dcat.confirm('本次载入将清除上次载入的所有数据,是否继续?', null, post()); + Dcat.confirm('本次载入将清除上次载入的所有数据,是否继续?', null, function () { + Dcat.loading(); + post(); + }); } else { + Dcat.loading(); post(); is_load = true; } @@ -46,8 +50,10 @@ $(function () { } forms.append(row); } + Dcat.loading(false); }, error: function () { + Dcat.loading(false); Dcat.error('服务器出现未知错误,获取供应商产品规格失败'); } }); diff --git a/upload.bat b/upload.bat new file mode 100644 index 0000000..3985b73 --- /dev/null +++ b/upload.bat @@ -0,0 +1 @@ +git push \ No newline at end of file