validate([ 'store_id' => ['bail', 'required', 'int'], 'items' => ['bail', 'required', 'array'], 'items.*.product_category_id' => ['bail', 'required', 'int'], 'items.*.products_total_amount' => ['bail', 'required', 'numeric', 'min:0', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'], 'items.*.discount' => ['bail', 'nullable', 'numeric', 'gt:0', 'lt:10', 'regex:/^[0-9](\.\d{1,2})?$/'], ]); $user = $request->user(); if (! $user->userInfo->is_company) { throw new BizException('非内部员工'); } $store = Store::findOrFail($request->input('store_id')); $preview = OfflineOrderPreview::create([ 'store_id' => $store->id, 'staff_id' => $user->id, 'payload' => ['items' => $request->input('items')], ]); $scene = http_build_query([ 'oop' => $preview->id, 'i' => $user->userInfo->code, ]); // 生成小程序码 $app = Factory::miniProgram(config('wechat.mini_program.default')); $response = $app->app_code->getUnlimit($scene, [ 'page' => 'pages/welcome/index', 'check_path' => false, 'env_version' => app()->isProduction() ? 'release' : $request->input('env_version', 'trial'), 'width' => $request->input('width', 200), ]); // 保存小程序码 if ($response instanceof StreamResponse) { $directory = 'offline-order-preview'; $filename = "{$preview->id}.png"; $disk = Storage::disk('public'); $response->save($disk->path($directory), $filename); $preview->update(['qrcode' => $disk->url("{$directory}/{$filename}")]); return response()->json([ 'id' => $preview->id, 'qrcode' => $preview->qrcode, ]); } logger('offline_order_preview 小程序码生成失败', $response); throw new BizException('生成失败, 请重试'); } public function show($id) { $preview = OfflineOrderPreview::findOrFail($id); return response()->json([ 'id' => $preview->id, 'qrcode' => $preview->qrcode, ]); } }