zx/app/controller/api/Common.php

569 lines
22 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\controller\api;
use app\common\repositories\delivery\DeliveryOrderRepository;
use app\common\repositories\store\product\ProductAssistSetRepository;
use app\common\repositories\store\product\ProductGroupBuyingRepository;
use app\common\repositories\store\product\ProductGroupRepository;
use app\common\repositories\store\product\ProductPresellRepository;
use app\common\repositories\store\product\ProductRepository;
use app\common\repositories\store\shipping\ExpressRepository;
use app\common\repositories\store\StoreCategoryRepository;
use app\common\repositories\system\attachment\AttachmentCategoryRepository;
use app\common\repositories\system\attachment\AttachmentRepository;
use app\common\repositories\system\CacheRepository;
use app\common\repositories\system\diy\DiyRepository;
use app\common\repositories\system\groupData\GroupDataRepository;
use app\common\repositories\system\groupData\GroupRepository;
use app\common\repositories\system\merchant\MerchantRepository;
use app\common\repositories\system\notice\SystemNoticeConfigRepository;
use app\common\repositories\user\UserRepository;
use app\common\repositories\user\UserSignRepository;
use app\common\repositories\user\UserVisitRepository;
use app\common\repositories\wechat\TemplateMessageRepository;
use app\common\repositories\wechat\WechatUserRepository;
use crmeb\basic\BaseController;
use crmeb\services\AlipayService;
use crmeb\services\CopyCommand;
use crmeb\services\MiniProgramService;
use crmeb\services\UploadService;
use crmeb\services\WechatService;
use Exception;
use Joypack\Tencent\Map\Bundle\Location;
use Joypack\Tencent\Map\Bundle\LocationOption;
use think\exception\ValidateException;
use think\facade\Cache;
use think\facade\Log;
use think\Response;
/**
* Class Common
* @package app\controller\api
* @author xaboy
* @day 2020/5/28
*/
class Common extends BaseController
{
/**
* @return mixed
* @author xaboy
* @day 2020/5/28
*/
public function hotKeyword()
{
$type = $this->request->param('type');
switch ($type) {
case 0:
$keyword = systemGroupData('hot_keyword');
break;
case 1:
$keyword = systemGroupData('community_hot_keyword');
break;
}
return app('json')->success($keyword);
}
public function express(ExpressRepository $repository)
{
return app('json')->success($repository->options());
}
public function menus()
{
return app('json')->success([
'global_theme' => $this->getThemeVar(systemConfig('global_theme')),
'banner' => systemGroupData('my_banner'),
'menu' => systemGroupData('my_menus')
]);
}
public function refundMessage()
{
return app('json')->success(explode("\n", systemConfig('refund_message')));
}
private function getThemeVar($type)
{
return app()->make(DiyRepository::class)->getThemeVar($type);
}
public function config()
{
$config = Cache::remember('get_api_config',function(){
$config = systemConfig(['open_update_info', 'store_street_theme', 'is_open_service', 'is_phone_login', 'global_theme', 'integral_status', 'mer_location', 'alipay_open', 'hide_mer_status', 'mer_intention_open', 'share_info', 'share_title', 'share_pic', 'store_user_min_recharge', 'recharge_switch', 'balance_func_status', 'yue_pay_status', 'site_logo', 'routine_logo', 'site_name', 'login_logo', 'procudt_increase_status', 'sys_extension_type', 'member_status', 'copy_command_status', 'community_status','community_reply_status','community_app_switch', 'withdraw_type', 'recommend_switch', 'member_interests_status', 'beian_sn', 'community_reply_auth','hot_ranking_switch','svip_switch_status','margin_ico','margin_ico_switch','first_avatar_switch','wechat_phone_switch','community_auth','promoter_type']);
$cache = app()->make(CacheRepository::class)->search(['copyright_status', 'copyright_context', 'copyright_image', 'sys_intention_agree']);
if (!isset($cache['sys_intention_agree'])) {
$cache['sys_intention_agree'] = systemConfig('sys_intention_agree');
}
$title = app()->make(UserSignRepository::class)->signConfig();
if (!$title) {
$config['member_status'] = 0;
}
if (!is_array($config['withdraw_type'])) {
$config['withdraw_type'] = ['1', '2', '3'];
}
$config['tempid'] = app()->make(SystemNoticeConfigRepository::class)->getSubscribe();
$config['global_theme'] = $this->getThemeVar($config['global_theme']);
$config['wechat_config_appid'] = systemConfig('wechat_appid') ? true : false;
$config = array_merge($config, $cache);
return $config;
}, 3600);
return app('json')->success($config);
}
/**
* @param GroupDataRepository $repository
* @return mixed
* @author xaboy
* @day 2020/6/3
*/
public function userRechargeQuota(GroupDataRepository $repository)
{
$recharge_quota = $repository->groupDataId('user_recharge_quota', 0);
$recharge_attention = explode("\n", systemConfig('recharge_attention'));
return app('json')->success(compact('recharge_quota', 'recharge_attention'));
}
/**
* @param $field
* @return mixed
* @author xaboy
* @day 2020/5/28
*/
public function uploadImage($field)
{
$name = $this->request->param('name');
$file = $this->request->file($field);
if (!$file)
return app('json')->fail('请上传图片');
if ($name) {
$f = $this->request->getOriginFile($field);
if ($f) {
$f['name'] = $name;
}
$this->request->setOriginFile($field, $f);
$file = $this->request->file($field);
}
$file = is_array($file) ? $file[0] : $file;
validate(["$field|图片" => [
'fileSize' => config('upload.filesize'),
'fileExt' => 'jpg,jpeg,png,bmp,gif',
'fileMime' => 'image/jpeg,image/png,image/gif,application/octet-stream'
]])->check([$field => $file]);
$upload = UploadService::create();
$info = $upload->to('def')->move($field);
if ($info === false) {
return app('json')->fail($upload->getError());
}
$res = $upload->getUploadInfo();
$res['dir'] = tidy_url($res['dir']);
return app('json')->success('上传成功', ['path' => $res['dir']]);
}
public function scanUploadImage($field, $token, AttachmentCategoryRepository $repository)
{
$id = $this->request->param('pid');
$merId = $this->request->param('mer_id',0);
$_merId = Cache::get('scan_mer_'.$token);
if ($merId != $_merId) return app('json')->fail('商户ID错误请重新扫码上传');
$name = $this->request->param('name');
$file = $this->request->file($field);
if (!$file)
return app('json')->fail('请上传图片');
if ($name) {
$f = $this->request->getOriginFile($field);
if ($f) {
$f['name'] = $name;
}
$this->request->setOriginFile($field, $f);
$file = $this->request->file($field);
}
if (!$file)
return app('json')->fail('请上传图片');
$file = is_array($file) ? $file[0] : $file;
if ($id) {
if (!$category = $repository->get($id, $merId))
return app('json')->fail('目录不存在');
$info = [
'enname' => $category->attachment_category_enname,
'id' => $category->attachment_category_id
];
} else {
$info = [
'enname' => 'def',
'id' => 0
];
}
validate(["$field|图片" => [
'fileSize' => config('upload.filesize'),
'fileExt' => 'jpg,jpeg,png,bmp,gif',
'fileMime' => config('upload.image_fileMime'),
]])->check([$field => $file]);
$type = (int)systemConfig('upload_type') ?: 1;
$upload = UploadService::create($type);
$data = $upload->to($info['enname'])->move($field);
if ($data === false) {
return app('json')->fail($upload->getError());
}
$res = $upload->getUploadInfo();
$res['dir'] = tidy_url($res['dir']);
$_name = '.' . $file->getOriginalExtension();
$data = [
'attachment_category_id' => $info['id'],
'attachment_name' => str_replace($_name, '', $file->getOriginalName()),
'attachment_src' => $res['dir']
];
$attach = app()->make(AttachmentRepository::class)->create((int)$type, (int)$merId, 0, $data);
Cache::sadd('scan_'.$token,$attach->attachment_id);
return app('json')->success(['src' => $data['attachment_src']]);
}
/**
* @return Response
* @author xaboy
* @day 2020/6/3
*/
public function wechatNotify()
{
try {
if($this->request->header('content-type') === 'application/json'){
return response(WechatService::create()->handleNotifyV3()->getContent());
}
return response(WechatService::create()->handleNotify()->getContent());
} catch (Exception $e) {
Log::info('支付回调失败:' . var_export([$e->getMessage(), $e->getFile() . ':' . $e->getLine()], true));
}
}
/**
* 电商收付通合并支付回调
*/
public function wechatCombinePayNotify($type)
{
if (!in_array($type, ['order', 'presell'], true))
throw new ValidateException('参数错误');
try {
return WechatService::create()->handleCombinePayNotify($type);
} catch (Exception $e) {
Log::info('电商收付通支付回调失败:' . var_export([$e->getMessage(), $e->getFile() . ':' . $e->getLine()], true));
}
}
/**
* 电商收付通合并支付回调
*/
public function routineCombinePayNotify($type)
{
if (!in_array($type, ['order', 'presell'], true))
throw new ValidateException('参数错误');
try {
return WechatService::create()->handleCombinePayNotify($type);
} catch (Exception $e) {
Log::info('小程序电商收付通支付回调失败:' . var_export([$e->getMessage(), $e->getFile() . ':' . $e->getLine()], true));
}
}
public function routineNotify()
{
try {
Log::info('支付回调header:' . var_export([$this->request->header()], true));
if($this->request->header('content-type') === 'application/json'){
return response(MiniProgramService::create()->handleNotifyV3()->getContent());
}
return response(MiniProgramService::create()->handleNotify()->getContent());
} catch (Exception $e) {
Log::info('支付回调失败:' . var_export([$e->getMessage(), $e->getFile() . ':' . $e->getLine(),$this->request->header()], true));
}
}
public function alipayNotify($type)
{
if (!in_array($type, ['order', 'user_recharge', 'presell', 'user_order'], true))
throw new ValidateException('参数错误');
$post = $_POST;
$get = $_GET;
$_POST = $this->request->post();
$_GET = $this->request->get();
try {
AlipayService::create()->notify($type);
} catch (Exception $e) {
Log::info('支付宝回调失败:' . var_export([$e->getMessage(), $e->getFile() . ':' . $e->getLine()], true));
} finally {
$_POST = $post;
$_GET = $get;
}
}
public function getVersion()
{
return app('json')->success(['version' => get_crmeb_version(), 'host' => request()->host(), 'system' => PHP_OS, 'php' => @phpversion()]);
}
/**
* 获取图片base64
* @return mixed
*/
public function get_image_base64()
{
list($imageUrl, $codeUrl) = $this->request->params([
['image', ''],
['code', ''],
], true);
checkSuffix([$imageUrl, $codeUrl]);
try {
$codeTmp = $code = $codeUrl ? image_to_base64($codeUrl) : '';
if (!$codeTmp) {
$putCodeUrl = put_image($codeUrl);
$code = $putCodeUrl ? image_to_base64('./runtime/temp' . $putCodeUrl) : '';
$code && unlink('./runtime/temp' . $putCodeUrl);
}
$imageTmp = $image = $imageUrl ? image_to_base64($imageUrl) : '';
if (!$imageTmp) {
$putImageUrl = put_image($imageUrl);
$image = $putImageUrl ? image_to_base64('./runtime/temp' . $putImageUrl) : '';
$image && unlink('./runtime/temp' . $putImageUrl);
}
return app('json')->success(compact('code', 'image'));
} catch (Exception $e) {
return app('json')->fail($e->getMessage());
}
}
public function home()
{
$banner = systemGroupData('home_banner', 1, 10);
$menu = systemGroupData('home_menu');
$hot = systemGroupData('home_hot', 1, 4);
$activity = systemGroupData('sys_activity', 1, 1)[0] ?? null;
$activity_lst = systemGroupData('sys_activity', 1, 3);
$ad = systemConfig(['home_ad_pic', 'home_ad_url']);
$category = app()->make(StoreCategoryRepository::class)->getTwoLevel();
return app('json')->success(compact('banner', 'menu', 'hot', 'ad','activity', 'activity_lst','category'));
}
public function activityLst($id)
{
$merId = (int)$id;
[$page, $limit] = $this->getPage();
return app('json')->success($merId ? merchantGroupData($merId, 'mer_activity', $page, $limit) : systemGroupData('sys_activity', $page, $limit));
}
public function activityInfo($id)
{
$activity = app()->make(GroupDataRepository::class)->getData((int)$id,1);
if (!$activity) {
return app('json')->fail('活动不存在');
}
$activity['merchant'] = $activity['group_mer_id'] ? app()->make(MerchantRepository::class)->search(['mer_id' => $activity['group_mer_id']])->field('mer_name,mer_avatar')->find() : null;
return app('json')->success($activity);
}
public function visit()
{
if (!$this->request->isLogin()) return app('json')->success();
[$page, $type] = $this->request->params(['page', 'type'], true);
$uid = $this->request->uid();
if (!$page || !$uid) return app('json')->fail();
$userVisitRepository = app()->make(UserVisitRepository::class);
$type == 'routine' ? $userVisitRepository->visitSmallProgram($uid, $page) : $userVisitRepository->visitPage($uid, $page);
return app('json')->success();
}
public function hotBanner($type)
{
if (!in_array($type, ['new', 'hot', 'best', 'good']))
$data = [];
else
$data = systemGroupData($type . '_home_banner');
return app('json')->success($data);
}
public function pay_key($key)
{
$cache = Cache::store('file');
if (!$cache->has('pay_key' . $key)) {
return app('json')->fail('支付链接不存在');
}
return app('json')->success($cache->get('pay_key' . $key));
}
public function lbs_geocoder()
{
$data = explode(',', $this->request->param('location', ''));
$locationOption = new LocationOption(systemConfig('tx_map_key'));
$locationOption->setLocation($data[0] ?? '', $data[1] ?? '');
$location = new Location($locationOption);
$res = $location->request();
if ($res->error) {
return app('json')->fail($res->error);
}
if ($res->status) {
return app('json')->fail($res->message);
}
if (!$res->result) {
return app('json')->fail('获取失败');
}
return app('json')->success($res->result);
}
public function getCommand()
{
$key = $this->request->param('key');
if (!preg_match('/^(\/@[1-9]{1}).*\*\//', $key)) {
return app('json')->fail('无效口令');
}
$userInfo = $this->request->isLogin() ? $this->request->userInfo() : null;
$command = app()->make(CopyCommand::class)->getMassage($key);
if (empty($command)) return app('json')->fail('无效口令');
$info = [];
if ($command['uid']) {
$user = app()->make(UserRepository::class)->get($command['uid']);
$info = [
'uid' => $user['uid'],
'nickname' => $user['nickname'],
'avatar' => $user['avatar'],
];
}
switch ($command['type']) {
case 0:
$data = app()->make(ProductRepository::class)->detail((int)$command['id'], $userInfo);
$ret['product_id'] = $command['id'];
break;
case 1:
$data = app()->make(ProductRepository::class)->detail((int)$command['id'], $userInfo);
$ret['product_id'] = $command['id'];
break;
case 2:
$data = app()->make(ProductPresellRepository::class)->apiDetail((int)$command['id'], $userInfo);
$ret['activity_id'] = $command['id'];
break;
case 4:
$data = app()->make(ProductGroupRepository::class)->apiDetail($command['id'], $userInfo);
$ret['activity_id'] = $command['id'];
break;
case 30:
$data = app()->make(ProductAssistSetRepository::class)->detail($command['id'], $userInfo);
$ret['activity_id'] = $command['id'];
break;
case 40:
$data = app()->make(ProductGroupBuyingRepository::class)->detail($command['id'], $userInfo);
$ret['activity_id'] = $command['id'];
break;
}
if ($userInfo && $command['uid']) app()->make(UserRepository::class)->bindSpread($userInfo, $command['uid']);
$ret['product_type'] = $command['type'];
$ret['user'] = $info;
$ret['com'] = $command['com'];
$ret['data'] = $data;
return app('json')->success($ret);
}
public function script()
{
return \response(systemConfig('static_script'));
}
public function appVersion()
{
return app('json')->success(systemConfig([
'appVersion',
'iosAddress',
'androidAddress',
'openUpgrade'
]));
}
public function deliveryNotify()
{
try {
$params = $this->request->param();
app()->make(DeliveryOrderRepository::class)->notify($params);
} catch (Exception $e) {
Log::info('同城配送订单回调失败:' . var_export([$e->getMessage(), $e->getFile() . ':' . $e->getLine()], true));
}
}
public function diy()
{
$merId = $this->request->param('id', 0);
$id = $this->request->param('did', 0);
$version = $this->request->param('version', 0);
$data = app()->make(DiyRepository::class)->show((int)$merId, (int)$id, 1);
if($version){
return app('json')->encode($data);
}
return app('json')->success('ok',$data['data']);
}
public function getNavigation()
{
return app('json')->success(app()->make(DiyRepository::class)->getNavigation());
}
public function micro()
{
$version = $this->request->param('version', 0);
$id = $this->request->param('id', 0);
$param = explode('=',$id);
if ($param && $param[0] == '/pages/small_page/index?id') $id = $param[1];
$data = Cache::remember('sys.get_sys_micro_'.$id,function()use($id){
$data = app()->make(DiyRepository::class)->getMicro($id);
return json_encode($data, JSON_UNESCAPED_UNICODE);
}, 3600);
$data = json_decode($data, true);
if($version){
return app('json')->encode($data);
}
return app('json')->success('ok',$data['data']);
}
/**
* 是否关注
* @return mixed
*/
public function subscribe()
{
if ($this->request->isLogin()) {
$user = $this->request->userInfo();
if ($user && $user['wechat_user_id']) {
$wechatUserService = app()->make(WechatUserRepository::class);
$subscribe = $wechatUserService->getWhereCount([
'wechat_user_id' => $user['wechat_user_id'],
'subscribe' => 1
]) > 0;
return app('json')->success(['subscribe' => $subscribe]);
}
}
return app('json')->success(['subscribe' => false, 'qrcode' => systemConfig('wechat_qrcode')]);
}
public function open_screen()
{
$key = ['open_screen_advertising'];
$group = app()->make(GroupRepository::class)->getSearch([])->where('group_key','in',$key)->find();
$data= app()->make(GroupDataRepository::class)->getGroupDataLst($this->request->merId(),$group->group_id,1, 10);
$data['config'] = systemConfig(['open_screen_switch','open_screen_time','open_screen_space']);
return app('json')->success($data);
}
}