diff --git a/MySQL_change.sql b/MySQL_change.sql
index 474a711..c50c5fa 100644
--- a/MySQL_change.sql
+++ b/MySQL_change.sql
@@ -282,3 +282,37 @@ ALTER TABLE `suppliers`
ALTER TABLE `orders`
ADD COLUMN `pay_user_id` INT NOT NULL DEFAULT 0 COMMENT '支付用户的user_id(跳转到外部小程序支付时用到)' AFTER `agent_cloud_price`;
+# 18:47 2021/9/11
+ALTER TABLE `agents`
+ CHANGE COLUMN `appid` `appid` VARCHAR(30) NULL COMMENT '微信AppID' COLLATE 'utf8_general_ci' AFTER `remember_token`,
+ CHANGE COLUMN `appsecret` `appsecret` CHAR(32) NULL COMMENT '微信AppSecret' COLLATE 'utf8_general_ci' AFTER `appid`,
+ CHANGE COLUMN `mchid` `mchid` VARCHAR(32) NULL COMMENT '微信支付mch_id' COLLATE 'utf8_general_ci' AFTER `appsecret`,
+ CHANGE COLUMN `mchkey` `mchkey` CHAR(32) NULL COMMENT '微信支付key' COLLATE 'utf8_general_ci' AFTER `mchid`;
+
+CREATE TABLE `mini_program_template_lists` (
+ `template_id` INT(10) NOT NULL,
+ `user_version` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '版本号' COLLATE 'utf8_general_ci',
+ `user_desc` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '描述' COLLATE 'utf8_general_ci',
+ `source_miniprogram_appid` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '来源小程序' COLLATE 'utf8_general_ci',
+ `source_miniprogram` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '模板小程序APPID' COLLATE 'utf8_general_ci',
+ `developer` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '上传者微信昵称' COLLATE 'utf8_general_ci',
+ `template_type` INT(10) NOT NULL DEFAULT '0' COMMENT '模板ID',
+ `create_time` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`template_id`) USING BTREE
+)
+COMMENT='小程序模板列表'
+COLLATE='utf8_general_ci'
+ENGINE=InnoDB;
+
+CREATE TABLE `mini_program_upload_logs` (
+ `id` INT(10) NOT NULL AUTO_INCREMENT,
+ `agent_id` INT(10) NOT NULL COMMENT '代理商ID',
+ `appid` VARCHAR(50) NOT NULL COMMENT '代理商APPID' COLLATE 'utf8_general_ci',
+ `template_id` INT(10) NOT NULL COMMENT '小程序template_id',
+ `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `agent_id` (`agent_id`) USING BTREE
+)
+COMMENT='注册小程序日志'
+COLLATE='utf8_general_ci'
+ENGINE=InnoDB;
diff --git a/app/Admin/Controllers/AgentController.php b/app/Admin/Controllers/AgentController.php
index 96375f7..9b4c8cf 100644
--- a/app/Admin/Controllers/AgentController.php
+++ b/app/Admin/Controllers/AgentController.php
@@ -3,6 +3,7 @@
namespace App\Admin\Controllers;
use App\Admin\Extensions\Grid\AuditAgent;
+use App\Admin\Extensions\Grid\UploadMiniProgram;
use App\Admin\Repositories\Agent;
use App\Common\AgentType;
use App\Common\UserStatus;
@@ -51,6 +52,11 @@ class AgentController extends AdminController
$column->append((new AuditAgent(null, 1))->setKey($this->id))->append(' ');
$column->append((new AuditAgent(null, 2))->setKey($this->id));
})
+ ->if(fn() => $this->status == UserStatus::NORMAL)
+ ->display('')
+ ->then(function ($column) {
+ $column->append((new UploadMiniProgram())->setKey($this->id));
+ })
->else()
->using(UserStatus::array())
->dot([
diff --git a/app/Admin/Controllers/MiniProgramDraftController.php b/app/Admin/Controllers/MiniProgramDraftController.php
index f32f4e7..e0c920e 100644
--- a/app/Admin/Controllers/MiniProgramDraftController.php
+++ b/app/Admin/Controllers/MiniProgramDraftController.php
@@ -19,6 +19,7 @@ class MiniProgramDraftController extends AdminController
return Grid::make(new MiniProgramDraft, function (Grid $grid) {
$grid->disableCreateButton();
$grid->disableRowSelector();
+ $grid->disableActions();
$grid->column('draft_id');
$grid->column('user_version');
@@ -27,6 +28,8 @@ class MiniProgramDraftController extends AdminController
$grid->column('source_miniprogram_appid');
$grid->column('developer');
$grid->column('create_time')->display(fn($v) => date('Y-m-d H:i:s', $v));
+
+ $grid->column('op');
});
}
}
diff --git a/app/Admin/Controllers/MiniProgramTemplateController.php b/app/Admin/Controllers/MiniProgramTemplateController.php
index f97b6d6..dc0dbd9 100644
--- a/app/Admin/Controllers/MiniProgramTemplateController.php
+++ b/app/Admin/Controllers/MiniProgramTemplateController.php
@@ -1,7 +1,8 @@
disableCreateButton();
$grid->disableRowSelector();
+ $grid->disableViewButton();
+ $grid->disableEditButton();
+
+ $grid->disableDeleteButton();
+
+ $grid->tools(new PullTemplateList);
$grid->column('template_id');
$grid->column('template_type')->using([0 => '普通模板', 1 => '标准模板']);
diff --git a/app/Admin/Extensions/Grid/PullTemplateList.php b/app/Admin/Extensions/Grid/PullTemplateList.php
new file mode 100644
index 0000000..2364c4d
--- /dev/null
+++ b/app/Admin/Extensions/Grid/PullTemplateList.php
@@ -0,0 +1,56 @@
+appendHtmlAttribute('class', 'btn btn-primary');
+ $this->defaultHtmlAttribute('href', 'javascript:;');
+
+ return "formatHtmlAttributes()}>{$this->title}";
+ }
+
+ public function handle(Request $request)
+ {
+ try {
+ $setting = AdminSetting::val(['service_appid', 'service_appsecret', 'service_token', 'service_aeskey']);
+ $config = [
+ 'app_id' => $setting['service_appid'],
+ 'secret' => $setting['service_appsecret'],
+ 'token' => $setting['service_token'],
+ 'aes_key' => $setting['service_aeskey'],
+ ];
+
+ $openPlatform = Factory::openPlatform($config);
+ $codeTemplate = $openPlatform['code_template'];
+ $list = $codeTemplate->list();
+
+ MiniProgramTemplateList::insertOrIgnore($list['template_list']);
+ //删除不存在的数据
+ MiniProgramTemplateList::whereNotIn('template_id', array_column($list['template_list'], 'template_id'))->delete();
+
+ return $this->response()->success("操作成功")->refresh();
+ } catch (\Exception $e) {
+ return $this->response()->error($e->getMessage());
+ }
+ }
+
+ public function confirm()
+ {
+ return ['此操作将数据与腾讯服务器数据同步,是否继续?', ''];
+ }
+}
diff --git a/app/Admin/Extensions/Grid/UploadMiniProgram.php b/app/Admin/Extensions/Grid/UploadMiniProgram.php
new file mode 100644
index 0000000..95116f0
--- /dev/null
+++ b/app/Admin/Extensions/Grid/UploadMiniProgram.php
@@ -0,0 +1,89 @@
+appendHtmlAttribute('class', 'btn btn-sm btn-primary');
+ $this->defaultHtmlAttribute('href', 'javascript:;');
+
+ return "formatHtmlAttributes()}>{$this->title}";
+ }
+
+ public function handle(Request $request)
+ {
+ $template = MiniProgramTemplateList::orderBy('template_id', 'desc')->first();
+ if (MiniProgramUploadLog::query()->where(['agent_id' => $this->getKey(), 'template_id' => $template->template_id])->exists()) {
+ return $this->response()->error('该代理商已经上传过小程序,无需重复上传');
+ }
+
+ $agent = Agent::find($this->getKey());
+ if (empty($agent->appid)) {
+ return $this->response()->error('该代理商未注册过小程序,请先注册');
+ }
+
+ try {
+ $setting = AdminSetting::val(['service_appid', 'service_appsecret', 'service_token', 'service_aeskey']);
+ $config = [
+ 'app_id' => $setting['service_appid'],
+ 'secret' => $setting['service_appsecret'],
+ 'token' => $setting['service_token'],
+ 'aes_key' => $setting['service_aeskey'],
+ ];
+
+ $openPlatform = \EasyWeChat\Factory::openPlatform($config);
+ $refreshToken = $openPlatform->getAuthorizer($agent->appid)['authorization_info']['authorizer_refresh_token'] ?? null;
+ if (!$refreshToken) {
+ return $this->response()->error('获取refresh_token失败');
+ }
+ $code = $openPlatform->miniProgram($agent->appid, $refreshToken)['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);
+// $qrcode = $code->getQrCode();
+
+ if (isset($commit['errcode'], $commit['errmsg']) && $commit['errcode'] == 0 && $commit['errmsg'] == 'ok') {
+ MiniProgramUploadLog::insert([
+ 'agent_id' => $agent->id,
+ 'appid' => $agent->appid,
+ 'template_id' => $templateId,
+ ]);
+ return $this->response()->success("上传成功")->refresh();
+ } else {
+ throw new \Exception(join(',', $commit));
+ }
+ } catch (\Exception $e) {
+ return $this->response()->error($e->getMessage());
+ }
+ }
+
+ public function confirm()
+ {
+ return ['确定要上传小程序吗?', ''];
+ }
+}
diff --git a/app/Admin/Repositories/MiniProgramDraft.php b/app/Admin/Repositories/MiniProgramDraft.php
index 9da52c9..7c5b6c0 100644
--- a/app/Admin/Repositories/MiniProgramDraft.php
+++ b/app/Admin/Repositories/MiniProgramDraft.php
@@ -48,7 +48,7 @@ class MiniProgramDraft extends Repository
} else {
$data['total'] = count($list['draft_list']);
$data['subjects'] = $list['draft_list'] ?? [];
- Cache::put($cache_key, $list['draft_list'], 120);
+ Cache::put($cache_key, $list['draft_list'], 180);
}
}
diff --git a/app/Admin/Repositories/MiniProgramList.php b/app/Admin/Repositories/MiniProgramList.php
index bb88508..eed7652 100644
--- a/app/Admin/Repositories/MiniProgramList.php
+++ b/app/Admin/Repositories/MiniProgramList.php
@@ -48,7 +48,7 @@ class MiniProgramList extends Repository
} else {
$data['total'] = count($list['list']);
$data['subjects'] = $list['list'] ?? [];
- Cache::put($cache_key, $list['list'], 120);
+ Cache::put($cache_key, $list['list'], 180);
}
}
diff --git a/app/Admin/Repositories/MiniProgramTemplate.php b/app/Admin/Repositories/MiniProgramTemplate.php
deleted file mode 100644
index b1651b5..0000000
--- a/app/Admin/Repositories/MiniProgramTemplate.php
+++ /dev/null
@@ -1,60 +0,0 @@
- $setting['service_appid'],
- 'secret' => $setting['service_appsecret'],
- 'token' => $setting['service_token'],
- 'aes_key' => $setting['service_aeskey'],
- ];
-
- $cache_key = 'mini_program:template_list';
- if ($data['subjects'] = Cache::get($cache_key)) {
- $data['total'] = count($data['subjects']);
- } else {
- $openPlatform = Factory::openPlatform($config);
- $codeTemplate = $openPlatform['code_template'];
-
- if (empty($codeTemplate) || (!$list = $codeTemplate->list())) {
- $data['total'] = 0;
- $data['subjects'] = [];
- } else {
- $data['total'] = count($list['template_list']);
- $data['subjects'] = $list['template_list'] ?? [];
- Cache::put($cache_key, $list['template_list'], 120);
- }
- }
-
- return $model->makePaginator(
- $data['total'] ?? 0, // 传入总记录数
- $data['subjects'] ?? [] // 传入数据二维数组
- );
- }
-}
diff --git a/app/Admin/Repositories/MiniProgramTemplateList.php b/app/Admin/Repositories/MiniProgramTemplateList.php
new file mode 100644
index 0000000..83141ab
--- /dev/null
+++ b/app/Admin/Repositories/MiniProgramTemplateList.php
@@ -0,0 +1,21 @@
+setKeyName('template_id');
+ }
+}
diff --git a/app/AdminSettled/Controllers/AgentController.php b/app/AdminSettled/Controllers/AgentController.php
index 9705c09..a88210e 100644
--- a/app/AdminSettled/Controllers/AgentController.php
+++ b/app/AdminSettled/Controllers/AgentController.php
@@ -59,12 +59,12 @@ class AgentController extends AdminController
$form->disableDeleteButton();
$form->text('username')->required();
- $form->password('password')->required();
+ $form->password('password')->minLength(6, '密码最少6个字符')->required();
$form->text('name')->required();
- $form->text('appid')->placeholder('可以先不填,审核通过之后再设置');
- $form->text('appsecret')->placeholder('可以先不填,审核通过之后再设置');
- $form->text('mchid')->placeholder('可以先不填,审核通过之后再设置');
- $form->text('mchkey')->placeholder('可以先不填,审核通过之后再设置');
+// $form->text('appid')->placeholder('可以先不填,审核通过之后再设置');
+// $form->text('appsecret')->placeholder('可以先不填,审核通过之后再设置');
+// $form->text('mchid')->placeholder('可以先不填,审核通过之后再设置');
+// $form->text('mchkey')->placeholder('可以先不填,审核通过之后再设置');
$form->radio('type')
->options(AgentType::array())
->default(AgentType::OPERATOR)
@@ -106,10 +106,10 @@ class AgentController extends AdminController
//处理特殊字段
$form->status = UserStatus::UNAUDITED;
$form->rate = 0.05;
- $form->appid = $form->appid ?: '暂未填写';
- $form->appsecret = $form->appsecret ?: '暂未填写';
- $form->mchid = $form->appid ?: '暂未填写';
- $form->mchkey = $form->appid ?: '暂未填写';
+// $form->appid = $form->appid ?: '暂未填写';
+// $form->appsecret = $form->appsecret ?: '暂未填写';
+// $form->mchid = $form->appid ?: '暂未填写';
+// $form->mchkey = $form->appid ?: '暂未填写';
$form->type = in_array($form->type, UserStatus::array()) ? $form->type : AgentType::OPERATOR;
})->saved(function (Form $form) {
return $form->response()->success('操作成功,请等待管理员审核');
diff --git a/app/Models/MiniProgramTemplateList.php b/app/Models/MiniProgramTemplateList.php
new file mode 100644
index 0000000..e3aaaf0
--- /dev/null
+++ b/app/Models/MiniProgramTemplateList.php
@@ -0,0 +1,11 @@
+ '版本号',
'user_desc' => '描述',
'source_miniprogram' => '来源小程序',
- 'source_miniprogram_appid' => '上传者微信号',
+ 'source_miniprogram_appid' => '模板小程序APPID',
'developer' => '上传者微信昵称',
'create_time' => '创建时间',
'template_type' => '模板类型',
'authorizer_appid' => 'APPID',
+ 'op' => '操作',
],
'options' => [
],