Browse Source

Merge branch 'master' of ssh://8.134.10.79:222/Leadfyy.co/hainan

master
lemon 4 years ago
parent
commit
cfabd4c619
  1. 1
      app/Admin/Controllers/AgentController.php
  2. 7
      app/Admin/Controllers/AgentStatisticsController.php
  3. 1
      app/Admin/Controllers/GuideController.php
  4. 4
      app/Admin/Controllers/MiniProgramTemplateController.php
  5. 1
      app/Admin/Controllers/OrderController.php
  6. 1
      app/Admin/Controllers/OrderStatisticsController.php
  7. 7
      app/Admin/Controllers/SupplierStatisticsController.php
  8. 6
      app/Admin/Controllers/UserStatisticsController.php
  9. 4
      app/Admin/Extensions/Grid/MiniProgramAuditStatus.php
  10. 2
      app/Admin/Extensions/Grid/MiniProgramPull.php
  11. 150
      app/Admin/Extensions/Grid/MiniProgramUpload.php
  12. 17
      app/AdminAgent/Forms/LoadSupplierSpec.php
  13. 3
      app/AdminGuide/Controllers/OrderController.php
  14. 2
      app/AdminSupplier/Controllers/FinanceStatisticsController.php
  15. 1
      app/AdminSupplier/Controllers/OrderController.php
  16. 1
      app/AdminSupplier/Controllers/OrderStatisticsController.php
  17. 4
      app/AdminSupplier/Controllers/ProductStatisticsController.php
  18. 2
      app/Http/Controllers/Api/OrderController.php
  19. 4
      app/Http/Controllers/Api/SpecialController.php
  20. 6
      app/Http/Controllers/Api/TestController.php
  21. 54
      app/Jobs/UploadMiniProgramQueue.php
  22. 1
      app/Models/MiniProgramDraft.php
  23. 1
      app/Models/MiniProgramTemplate.php
  24. 143
      app/Service/UploadMiniProgram.php
  25. 8
      resources/js/agent-spec-edit.js
  26. 1
      upload.bat

1
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('更新小程序模板'));

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

1
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')) {

4
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));
});
});
}

1
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);

1
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;

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

6
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;

4
app/Admin/Extensions/Grid/MiniProgramAuditStatus.php

@ -36,9 +36,9 @@ class MiniProgramAuditStatus extends RowAction
return "<a {$this->formatHtmlAttributes()}>{$this->title}</a>";
}
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()

2
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());
}

150
app/Admin/Extensions/Grid/MiniProgramUpload.php

@ -1,17 +1,14 @@
<?php
namespace App\Admin\Extensions\Grid;
use App\Models\AdminSetting;
use App\Common\UserStatus;
use App\Jobs\UploadMiniProgramQueue;
use App\Models\Agent;
use App\Models\MiniProgramTemplate;
use App\Models\MiniProgramUploadLog;
use App\Service\OpenPlatform;
use App\Service\UploadMiniProgram;
use Dcat\Admin\Grid\RowAction;
use EasyWeChat\Factory;
use EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Code\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Storage;
/**
* 上传(注册)小程序
@ -25,8 +22,8 @@ class MiniProgramUpload extends RowAction
public function __construct($title = null, $action = 1)
{
parent::__construct($title);
$this->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 => '请勿频繁提交,待上一次操作完成后再提交',
];
}
}

17
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);

3
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);

2
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;

1
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) {

1
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;

4
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;

2
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),

4
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)

6
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());
}
/**

54
app/Jobs/UploadMiniProgramQueue.php

@ -0,0 +1,54 @@
<?php
namespace App\Jobs;
use App\Models\Agent;
use App\Models\MiniProgramTemplate;
use App\Service\UploadMiniProgram;
use Exception;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class UploadMiniProgramQueue implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
private int $template_id; //小程序模板ID
private int $agent_id;
/**
* Create a new job instance.
*
* @param int $template_id 小程序模板ID
* @param int $agent_id 代理商ID
*/
public function __construct(int $template_id, int $agent_id)
{
$this->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());
}
}
}

1
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 = [])
{

1
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 = [])
{

143
app/Service/UploadMiniProgram.php

@ -0,0 +1,143 @@
<?php
namespace App\Service;
use App\Models\Agent;
use App\Models\MiniProgramTemplate;
use App\Models\MiniProgramUploadLog;
use EasyWeChat\OpenPlatform\Authorizer\MiniProgram\Code\Client;
use Exception;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Storage;
/**
* 上传小程序
* Class UploadMiniProgram
* @package App\Service
*/
class UploadMiniProgram
{
/**
* UploadMiniProgram constructor.
* @param Agent $agent
* @param MiniProgramTemplate $template
* @throws GuzzleException
* @throws Exception
*/
public function __construct(Agent $agent, MiniProgramTemplate $template)
{
try {
$openPlatform = new OpenPlatform();
$refreshToken = $openPlatform->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 => '请勿频繁提交,待上一次操作完成后再提交',
];
}
}

8
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('服务器出现未知错误,获取供应商产品规格失败');
}
});

1
upload.bat

@ -0,0 +1 @@
git push
Loading…
Cancel
Save