biz_domain = WxHelper::getDomain(); $others->js_domain = WxHelper::getDomain(); $others->notify_url = WxHelper::getWechatNotifyUrl(true); $others->oauth_domain = WxHelper::getDomain(); // 如果token不存在, 自动生成token if (!$settings->token) { $settings->token = Password::generate(32); $settings->save(); } return $this->render('development', [ 'settings' => $settings, 'others' => $others ]); } /** * 开发设置-保存 */ public function actionDevelopmentSave() { $result = new stdClass(); $result->success = false; $result->code = null; $result->datas = []; if (false == $this->request->isPost) { return $this->renderJson($result); } $appId = $this->request->post('appId'); $appSecret = $this->request->post('appSecret'); $settings = WxHelper::getMpSetting(); $settings->appid = trim($appId); $settings->appsecret = trim($appSecret); // 保存 if ($settings->save()) { $result->success = true; } return $this->renderJson($result); } /** * 开发设置-检查微信开发设置是否成功 */ public function actionDevelopmentCheckWxConfig() { $result = new stdClass(); $result->success = false; $wechat = WxHelper::getWxPHPSDK(); // 检测微信开发设置 $result = $wechat->valid(true); if ($result) { $result->success = true; } return $this->renderJson($result); } /** * 域名设置 */ public function actionDomain() { $settings = WxHelper::getMpSetting(); return $this->render('domain', [ 'settings' => $settings ]); } /** * 域名设置-保存 */ public function actionDomainSave() { $result = new stdClass(); $result->success = false; $result->code = null; $result->datas = []; if (false == $this->request->isPost) { return $this->renderJson($result); } $domain = $this->request->post('domain'); $payDomain = $this->request->post('payDomain'); $settings = WxHelper::getMpSetting(); $settings->domain = trim($domain); $settings->pay_domain = trim($payDomain); if ($settings->save()) { $result->success = true; } return $this->renderJson($result); } /** * 微信支付设置 */ public function actionPayment() { $settings = WxHelper::getMpSetting(); $payment = new stdClass(); // 商户号 $payment->mch_id = isset($settings->mch_id) ? $settings->mch_id : ''; // API秘钥 $payment->api_key = isset($settings->api_key) ? $settings->api_key : ''; // API证书 $payment->ssl_cert_exists = !empty($settings->ssl_cert_content) ? true : false; // API秘钥 $payment->ssl_key_exists = !empty($settings->ssl_key_content) ? true : false; // CA证书 $payment->ssl_rootca_exists = !empty($settings->ssl_rootca_content) ? true : false; $payment->pay_domain = WxHelper::getWxpayAuthRoot(); $payment->domain_root = WxHelper::getDomain() . '/'; // 根目录(商户号支付测试菜单用到此域名) unset($settings); return $this->render('payment', [ 'payment' => $payment ]); } /** * 微信支付设置-保存 */ public function actionPaymentSave() { $result = new stdClass(); $result->code = null; $result->success = false; $result->datas = []; // 获取数据 $settings = WxHelper::getMpSetting(); if (!$settings) { $result->code = 101; // 操作有误,请重新操作 return json_encode($result); } // 保存修改 $mch_id = $this->request->post('mch_id'); $api_key = $this->request->post('api_key'); if (!empty($mch_id)) { $settings->mch_id = $mch_id; } if (!empty($api_key)) { $settings->api_key = $api_key; } if ($settings->save()) { $result->success = true; } return json_encode($result); } /** * 微信支付设置-上传API证书文件: apiclient_cert.pem */ public function actionPaymentUploadCert() { $result = new stdClass(); $result->success = false; $result->error = null; $settings = WxHelper::getMpSetting(); if (!$settings) { $result->error = '工程师服务号设置不存在'; return json_encode($result); } // 检查文件后缀是否正确(.pem) $file = $_FILES['cert']; $tmp = explode('.', $file['name']); $suffix = end($tmp); if ($suffix != 'pem') { $result->error = '文件格式有误'; return json_encode($result); } // 检查上传证书内容大小 $fileContent = file_get_contents($file["tmp_name"]); if (empty($fileContent) || strlen($fileContent) > 2048) { $result->error = '文件大小有误'; return json_encode($result); } // 将上传的证书文件保存到证书存储目录(certs/) $certRoot = Yii::getAlias('@certs'); $certDir = $certRoot . '/mp'; // 工程师服务号证书路径 if (!file_exists($certDir)) { mkdir($certDir, 0777, true); } $savePath = $certDir . '/' . 'apiclient_cert.pem'; move_uploaded_file($file["tmp_name"], $savePath); // 将上传证书文件内容保存到数据库 $settings->ssl_cert_content = $fileContent; if ($settings->save()) { $result->success = true; } else { throw new ErrorException(implode("\r\n", $settings->getFirstErrors())); } /** * 后台操作日志 */ AdminLogs::doImport('工程师服务号-API证书文件', 1); Yii::$app->session->setFlash('success', '更新成功'); return $this->renderJson($result); } /** * 微信支付设置-上传API秘钥文件: apiclient_key.pem */ public function actionPaymentUploadKey() { $result = new stdClass(); $result->success = false; $result->error = null; $settings = WxHelper::getMpSetting(); if (!$settings) { $result->error = '工程师服务号设置不存在'; return json_encode($result); } // 检查文件后缀是否正确(.pem) $file = $_FILES['key']; $tmp = explode('.', $file['name']); $suffix = end($tmp); if ($suffix != 'pem') { $result->error = '文件格式有误'; return json_encode($result); } // 检查上传证书内容大小 $fileContent = file_get_contents($file["tmp_name"]); if (empty($fileContent) || strlen($fileContent) > 2048) { $result->error = '文件大小有误'; return json_encode($result); } // 将上传的秘钥文件保存到证书存储目录(certs/) $certRoot = Yii::getAlias('@certs'); $certDir = $certRoot . '/mp'; // 工程师服务号证书路径 if (!file_exists($certDir)) { mkdir($certDir, 0777, true); } $savePath = $certDir . '/' . 'apiclient_key.pem'; move_uploaded_file($file["tmp_name"], $savePath); // 将上传证书文件内容保存到数据库 $settings->ssl_key_content = $fileContent; if ($settings->save()) { $result->success = true; } else { throw new ErrorException(implode("\r\n", $settings->getFirstErrors())); } /** * 后台操作日志 */ AdminLogs::doImport('工程师服务号-API秘钥文件', 1); Yii::$app->session->setFlash('success', '更新成功'); return $this->renderJson($result); } /** * 微信支付设置-上传CA证书: rootca.pem */ public function actionPaymentUploadRootca() { $result = new stdClass(); $result->success = false; $result->error = null; $settings = WxHelper::getMpSetting(); if (!$settings) { $result->error = '工程师服务号设置不存在'; return json_encode($result); } // 检查文件后缀是否正确(.pem) $file = $_FILES['rooca']; $tmp = explode('.', $file['name']); $suffix = end($tmp); if ($suffix != 'pem') { $result->error = '文件格式有误'; return json_encode($result); } // 检查上传证书内容大小 $fileContent = file_get_contents($file["tmp_name"]); if (empty($fileContent) || strlen($fileContent) > 2048) { $result->error = '文件大小有误'; return json_encode($result); } // 将上传的秘钥文件保存到证书存储目录(certs/) $certRoot = Yii::getAlias('@certs'); $certDir = $certRoot . '/mp'; // 工程师服务号证书路径 if (!file_exists($certDir)) { mkdir($certDir, 0777, true); } $savePath = $certDir . '/' . 'rooca.pem'; move_uploaded_file($file["tmp_name"], $savePath); // 将上传证书文件内容保存到数据库 $settings->ssl_rootca_content = $fileContent; if ($settings->save()) { $result->success = true; } else { throw new ErrorException(implode("\r\n", $settings->getFirstErrors())); } /** * 后台操作日志 */ AdminLogs::doImport('工程师服务号-CA证书', 1); Yii::$app->session->setFlash('success', '更新成功'); return $this->renderJson($result); } /** * 基本信息设置 */ public function actionInfo() { $settings = WxHelper::getMpSetting(); $setting = new stdClass(); // 名称 $setting->name = isset($settings->name) ? $settings->name : ''; // 简介 $setting->intro = isset($settings->intro) ? $settings->intro : ''; $setting->logoUrl = $settings->logo_path ? ImageManager::getUrl($settings->logo_path) : false; $setting->subscribe_title = isset($settings->subscribe_title) ? $settings->subscribe_title : ''; $setting->subscribe_desc = isset($settings->subscribe_desc) ? $settings->subscribe_desc : ''; $setting->subscribe_img = $settings->subscribe_img ? ImageManager::getUrl($settings->subscribe_img) : false; $setting->subscribe_url = isset($settings->subscribe_url) ? $settings->subscribe_url : ''; return $this->render('info', [ 'setting' => $setting ]); } /** * 基本信息设置-保存 */ public function actionInfoSave() { $result = new stdClass(); $result->success = false; $result->code = null; $result->datas = []; $name = $this->request->post('name'); $intro = $this->request->post('intro'); $subscribeTitle = $this->request->post('subscribeTitle'); $subscribeDesc = $this->request->post('subscribeDesc'); $subscribeUrl = $this->request->post('subscribeUrl'); $settings = WxHelper::getMpSetting(); if (!$settings) { $result->code = 101;//操作有误,请重新操作; return json_encode($result); } $settings->name = $name; $settings->intro = $intro; $settings->subscribe_title = $subscribeTitle; $settings->subscribe_desc = $subscribeDesc; $settings->subscribe_url = $subscribeUrl; if ($settings->save()) { $result->success = true; } return json_encode($result); } /** * 基本信息设置-上传LOGO */ public function actionInfoUploadLogo() { $image = $_FILES['logo']; // 图片路径数据整理 $tmp = explode('.', $image['name']); $suffix = end($tmp); $savePath = ImageManager::getMPSettingImgPath($suffix); $settings = WxHelper::getMpSetting(); if (empty($settings->logo_path)) { ImageManager::add($image["tmp_name"], $savePath); } else { ImageManager::replace($settings->logo_path, $savePath, $image["tmp_name"]); } $settings->logo_path = $savePath; $settings->save(); /** * 后台操作日志 */ AdminLogs::doImport('工程师服务号-LOGO', 1); return json_encode([ 'success' => true, ]); } /** * 基本信息设置-上传关注图文图片 */ public function actionInfoUploadSub() { $image = $_FILES['subscribe_img']; // 图片路径数据整理 $tmp = explode('.', $image['name']); $suffix = end($tmp); $savePath = ImageManager::getMPSettingImgPath($suffix); $settings = WxHelper::getMpSetting(); if (empty($settings->subscribe_img)) { ImageManager::add($image["tmp_name"], $savePath); } else { ImageManager::replace($settings->subscribe_img, $savePath, $image["tmp_name"]); } $settings->subscribe_img = $savePath; $settings->save(); /** * 后台操作日志 */ AdminLogs::doImport('工程师服务号-关注图文图片', 1); return json_encode([ 'success' => true, ]); } /** * 微信菜单 */ public function actionMenu() { $mpSettings = WxHelper::getMpSetting(); $settings = new stdClass(); $settings->menus_data = $mpSettings->menus_data; $settings->domain = WxHelper::getDomain(true); return $this->render('menu', [ 'settings' => $settings ]); } /** * 微信菜单-保存 * @return string */ public function actionMenuSave() { $e = new stdClass(); $e->success = false; $e->code = null; if ($this->request->isPost) { $menuJson = $this->request->post('menu_json'); $isPublish = (bool)$this->request->post('is_publish'); $settings = WxHelper::getMpSetting(); $wechat = WxHelper::getWxPHPSDK(); /** * @todo 把数组中所有空值全部移除 */ $menusData = (array)json_decode($menuJson, true); //$settings = MPSetting::find()->where(1)->one(); if (true == $isPublish) { /** * 把空数据全部删除 * 如果存在 二级菜单,一级菜单的 url type 全部删除 */ $_menus = $menusData; foreach ($_menus as $i => $_menu) { if (sizeof($_menu['submenus']) > 0) { unset($_menus[$i]['url'], $_menus[$i]['type']); if (isset($_menus[$i]['appid'])) { unset($_menus[$i]['appid']); } if (isset($_menus[$i]['pagepath'])) { unset($_menus[$i]['pagepath']); } foreach ($_menu['submenus'] as $j => $_subMenu) { if (isset($_subMenu['submenus'])) { unset($_menu['submenus'][$j]['submenus']); unset($menusData['submenus'][$j]['submenus']); } } $_menus[$i]['sub_button'] = array_reverse($_menu['submenus']); } else { //为url 加上前缀 http:// /* if ($_menu['url']) { $_menus[$i]['url'] = 'http://' . str_replace('http://', '', $_menu['url']); } */ } unset($_menus[$i]['submenus']); } // 格式化后的数据送给微信接口 $formatedMenus = [ 'button' => $_menus ]; // 存入原格式数据 $settings->menus_data = json_encode($menusData, JSON_UNESCAPED_UNICODE); if (false == $settings->save()) { throw new ErrorException(implode("\r\n", $settings->getFirstErrors())); } if ($wechat->createMenu($formatedMenus)) { $e->code = 'pulish_wechat_menu:ok'; $e->success = true; } else { $e->success = false; $e->code = 'pulish_wechat_menu:fail'; $e->errCode = $wechat->errCode; $e->errMsg = $wechat->errMsg; } // 调用接口发生错误的时候记录log if ($wechat->errMsg) { Yii::getLogger()->log($menusData, Logger::LEVEL_ERROR); Yii::getLogger()->log($formatedMenus, Logger::LEVEL_ERROR); Yii::getLogger()->log("{$wechat->errCode}:{$wechat->errMsg}", Logger::LEVEL_ERROR); } } else { $settings->menus_data = json_encode($menusData, JSON_UNESCAPED_UNICODE); if ($settings->save()) { $e->success = true; } } } return $this->renderJson($e); } /** * 小程序服务协议版本设置 */ public function actionServiceAgreement() { $settings = WxHelper::getMpSetting(); $setting = new stdClass(); // 服务协议版本号 $setting->agreement_version = isset($settings->agreement_version) ? $settings->agreement_version : ''; // 服务协议版本更新描述 $setting->agreement_update_desc = isset($settings->agreement_update_desc) ? $settings->agreement_update_desc : ''; return $this->render('service-agreement', [ 'setting' => $setting ]); } /** * 小程序服务协议版本设置-保存 */ public function actionServiceAgreementSave() { $result = new stdClass(); $result->success = false; $result->code = null; $result->datas = []; $agreement_version = $this->request->post('agreement_version'); $agreement_update_desc = $this->request->post('agreement_update_desc'); $settings = WxHelper::getMpSetting(); if (!$settings) { $result->code = 101; // 操作有误,请重新操作; return json_encode($result); } $settings->agreement_version = $agreement_version; $settings->agreement_update_desc = $agreement_update_desc; if ($settings->save()) { $result->success = true; } return json_encode($result); } }