1
0

提交代码

This commit is contained in:
2020-08-06 14:45:56 +08:00
commit 9d0d5f4be9
361 changed files with 36445 additions and 0 deletions

View File

@@ -0,0 +1,146 @@
<?php
namespace App\Http\Controllers;
use App\Rules\Checkmobile;
use Auth;
use Illuminate\Http\Request;
use RuLong\Area\Models\Area;
use RuLong\Area\Models\UserAddress;
use Validator;
class AddressController extends Controller
{
public function __construct(Request $request)
{
$this->middleware('auth');
view()->share('nav', 4);
}
public function index()
{
$addresses = Auth::user()->addresses()->orderBy('is_default', 'desc')->orderBy('id', 'desc')->get();
if ($addresses->isEmpty()) {
return redirect()->route('addresses.create');
}
$provinces = Area::where('type', '省级')->pluck('name', 'sn');
return view('address.index', compact('addresses', 'provinces'));
}
public function create()
{
$provinces = \Area::index(0);
return view('address.create', compact('provinces'));
}
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|max:4',
'mobile' => ['required', new Checkmobile],
'province_sn' => 'required',
'city_sn' => 'required',
'area_sn' => 'required',
'address' => 'required',
], [
'name.required' => '收货人必须填写',
'name.max' => '收货人最多:max字符',
'mobile.required' => '手机号必须填写',
'province_sn.required' => '省份必须选择',
'city_sn.required' => '城市必须选择',
'area_sn.required' => '地区必须选择',
'address.required' => '详细地址必须填写',
]);
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
$data = [
'user_id' => Auth::id(),
'name' => $request->name,
'mobile' => $request->mobile,
'province_sn' => $request->province_sn,
'city_sn' => $request->city_sn,
'area_sn' => $request->area_sn,
'address' => $request->address,
];
if ($request->has('def')) {
$data['is_default'] = 1;
}
$info = \Address::store($data);
if ($request->callback) {
$callback = $request->callback . '?address=' . $info->id;
} else {
$callback = route('addresses.index');
}
return $this->success('地址创建成功', $callback);
}
public function show(UserAddress $address)
{
# code...
}
public function edit(UserAddress $address)
{
$provinces = \Area::index(0);
$cities = \Area::index($address->province_sn);
$areas = \Area::index($address->city_sn);
return view('address.edit', compact('address', 'provinces', 'cities', 'areas'));
}
public function update(Request $request, UserAddress $address)
{
if (\Address::update($address, $request->all())) {
return $this->success('修改成功', route('addresses.index'));
} else {
return $this->error('修改失败');
}
}
public function destroy($id)
{
if (\Address::destroy($id)) {
return $this->success('删除成功', route('addresses.index'));
} else {
return $this->error();
}
}
public function select(Request $request)
{
$callback = $request->has('callback') && $request->callback == route('orders.create') ? route('orders.create') : route('orders.create');
$addresses = Auth::user()->addresses()->orderBy('is_default', 'desc')->orderBy('id', 'desc')->get();
return view('address.change', compact('addresses', 'callback'));
}
public function areas(Request $request)
{
if (empty($request->psn)) {
return ['msg' => '请选择省份', 'code' => 0];
}
$areas = \Area::index($request->psn);
if ($areas) {
return response()->json(['msg' => '', 'code' => 1, 'data' => $areas]);
} else {
return ['msg' => '请选择省份/城市', 'code' => 0];
}
}
public function setdef($id)
{
if (\Address::setDefault(UserAddress::find($id))) {
return $this->success('设置成功', route('addresses.index'));
} else {
return $this->error();
}
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
trait AjaxResponse
{
public function success($message = '', $redirect = null)
{
return [
'status' => 'SUCCESS',
'statusCode' => 200,
'message' => $message,
'redirect' => $redirect,
];
}
public function error($message = '', $redirect = null)
{
return [
'status' => 'ERROR',
'statusCode' => 400,
'message' => $message,
'redirect' => $redirect,
];
}
}

View File

@@ -0,0 +1,60 @@
<?php
namespace App\Http\Controllers;
use App\Models\Advert;
use App\Models\Article;
use App\Models\Category;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
class ArticleController extends Controller
{
public function __construct(Request $request)
{
view()->share('nav', 3);
view()->share('app_title', '教程资讯');
}
public function index(Request $request)
{
$category_id = $request->category_id;
$page = $request->page ?? '';
$lists = Article::where('hot', 0)->when($category_id, function ($q) use ($category_id) {
$q->where('category_id', $category_id);
})->orderBy('created_at', 'desc')->paginate();
if ($page > 1) {
if ($lists->isNotEmpty()) {
$html = response(view('articles.more', compact('lists')))->getContent();
return $this->success($html);
} else {
return $this->error('没有数据了');
}
} else {
$categorys = Category::where('type', 'article')->where('parent_id', 0)->get();
$adverts = Advert::where('channel', 'article')->orderBy('sort', 'asc')->take(5)->get(); //banner
$hot = Article::where('hot', 1)->orderBy('id', 'desc')->first();
return view('articles.index', compact('lists', 'categorys', 'adverts', 'category_id', 'hot'));
}
}
public function show(Article $article)
{
$article->increment('clicks');
$lists = Article::where('category_id', $article->category_id)->inRandomOrder()->take(2)->get();
return view('articles.show', compact('article', 'lists'));
}
public function more(Request $request)
{
$category_id = $request->category_id;
$lists = Article::when($category_id, function ($q) use ($category_id) {
$q->where('category_id', $category_id);
})->orderBy('created_at', 'desc')->paginate();
}
}

View File

@@ -0,0 +1,263 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Rules\Checkmobile;
use Auth;
use Illuminate\Auth\Events\Login;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\View;
use RuLong\Sms\Models\Sms as SmsModel;
use Validator;
class AuthController extends Controller
{
public function __construct()
{
$this->middleware('auth')->except(['login', 'wechat', 'wechatCallback']);
}
public function register(Request $request)
{
$user = Auth::user();
if ($request->isMethod('post')) {
$request->validate([
'username' => ['required', 'unique:users', new Checkmobile],
'password' => 'required|between:6,32|confirmed',
'password_confirmation' => 'required|between:6,32',
'code' => ['required', 'size:4', function ($attribute, $value, $fail) use ($request) {
if ($value != SmsModel::where('mobile', $request->username)->where('used', 0)->latest()->value('code')) {
return $fail('验证码不正确');
}
}],
], [
'username.required' => '手机号码必须填写',
'username.unique' => '手机号已经注册',
'code.required' => '验证码必须填写',
'code.size' => '验证码长度为:size位',
'password.required' => '登录密码必须填写',
'password.between' => '登录密码有误',
'password.confirmed' => '确认密码与登录密码不一致',
'password_confirmation.required' => '确认密码必须填写',
'password_confirmation.between' => '确认密码有误',
]);
$user->username = $request->username;
$user->password = $request->password;
$user->save();
return $this->success('设置成功', route('index'));
} else {
return view('auth.register');
}
}
/**
* 用户登录 *
* @Author:<C.Jason>
* @Date:2018-11-07T13:47:02+0800
* @param Request $request
*/
public function login(Request $request)
{
if ($request->isMethod('POST')) {
$validator = Validator::make($request->all(), [
'username' => 'required|mobile|exists:users',
'password' => 'required|between:6,32',
], [
'username.required' => '手机号码必须填写',
'username.mobile' => '手机号码格式不正确',
'username.exists' => '手机号码不存在',
'password.required' => '登录密码必须填写',
'password.between' => '登录密码应在:min-:max位之间',
]);
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
$cert = [
'username' => $request->username,
'password' => $request->password,
];
if (Auth::attempt($cert, true)) {
return $this->success('登录成功', route('index'));
} else {
return $this->error('用户名或密码不存在');
}
} else {
return view('auth.login');
}
}
/**
* 微信登录 、微信快速注册 *
* 注册完之后,在这里没有办法判断推荐关系
*
* @Author:<C.Jason>
* @Date:2018-11-07T13:44:34+0800
* @param Request $request
*/
public function wechat(Request $request)
{
if (strpos($request->server('HTTP_USER_AGENT'), 'MicroMessenger') !== false) {
if ($request['share_uid']) {
session(['parent_id' => $request['share_uid']]);
}
if ($request['r']) {
session(['r' => $request['r']]);
}
$app = app('wechat.official_account');
$app['config']->set('oauth.callback', 'login/wechatCallback');
return $app->oauth->redirect();
} else {
return redirect()->route('authlogin');
}
}
public function wechatCallback(Request $request)
{
try {
$app = app('wechat.official_account');
$weUser = $app->oauth->user();
$callback = $request['callback'] ?? '';
$openUser = $app->user->get($weUser->id);
$oldUser = User::where('openid', $weUser->id)->first();
if ($oldUser) {
$oldUser->info()->update([
'headimgurl' => $weUser->getOriginal()['headimgurl'],
'sex' => $weUser->getOriginal()['sex'],
'country' => $weUser->getOriginal()['country'],
'province' => $weUser->getOriginal()['province'],
'city' => $weUser->getOriginal()['city'],
'subscribe_at' => isset($openUser['subscribe_time']) ? date('Y-m-d H:i:s', $openUser['subscribe_time']) : null,
'subscribe_scene' => isset($openUser['subscribe_scene']) ? $openUser['subscribe_scene'] : '',
]);
Auth::login($oldUser, true);
if (!$oldUser->username) {
return redirect()->route('register');
} else {
$r = session('r', '');
if ($r) {
return redirect($r);
} else {
return redirect()->route('index');
}
}
} else {
$parent_id = session('parent_id', 0);
$user = User::create(
[
'openid' => $weUser->id,
'parent_id' => $parent_id,
]
);
$user->info()->create([
'nickname' => $weUser->getOriginal()['nickname'],
'headimgurl' => $weUser->getOriginal()['headimgurl'],
'sex' => $weUser->getOriginal()['sex'],
'country' => $weUser->getOriginal()['country'],
'province' => $weUser->getOriginal()['province'],
'city' => $weUser->getOriginal()['city'],
'subscribe_at' => isset($openUser['subscribe_time']) ? date('Y-m-d H:i:s', $openUser['subscribe_time']) : null,
'subscribe_scene' => isset($openUser['subscribe_scene']) ? $openUser['subscribe_scene'] : '',
]);
Session::forget('parent_id');
event(new Registered($user));
Auth::login($user, true);
return redirect()->route('register');
}
/**
* 这个注册完成事件,只能把 updateOrCreate 这个方法拆分开来使用了
*/
} catch (\Exception $e) {
return redirect()->route('login');
}
}
/**
* 退出登录
* @Author:<C.Jason>
* @Date:2018-11-07T13:46:45+0800
*/
public function logout()
{
Auth::logout();
session()->flush();
return redirect()->route('login');
}
/**
* 发送验证码
* @Author:<C.Jason>
* @Date:2018-11-07T13:49:55+0800
* @return
*/
public function smsCode(Request $request)
{
$channel = $request->channel;
$mobile = $request->username;
switch ($channel) {
case 'FORGOT':
$validator = Validator::make($request->all(), [
'username' => ['required', new Checkmobile],
], [
'username.required' => '手机号码必须填写',
'username.mobile' => '手机号码格式不正确',
'username.exists' => '手机号码不存在',
]);
break;
case 'BIND':
// 绑定手机号,要不存在才可以
$channel = 'DEFAULT';
$validator = Validator::make($request->all(), [
'username' => ['required', 'unique:users', new Checkmobile],
], [
'username.required' => '手机号码必须填写',
'username.mobile' => '手机号码格式不正确',
'username.unique' => '手机号码已经绑定',
]);
break;
default:
$validator = Validator::make($request->all(), [
'username' => ['required', new Checkmobile],
], [
'username.required' => '手机号码必须填写',
]);
break;
}
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
$res = SmsModel::verify_code($mobile);
if ($res !== true) {
return $this->error($res);
}
try {
$code = \Sms::send($mobile, $channel);
$config = config('rulong_sms');
if ($config['debug'] != true) {
return $this->success('验证码发送成功');
} else {
return $this->success('验证码发送成功' . $code);
}
} catch (\Exception $e) {
return $this->error($e->getMessage());
}
}
}

View File

@@ -0,0 +1,108 @@
<?php
namespace App\Http\Controllers;
use App\Models\Cart;
use App\Models\Goods;
use App\Models\GoodsParams;
use Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
class CartController extends Controller
{
public function __construct(Request $request)
{
$this->middleware('auth');
View::share('nav', 1);
}
public function index(Request $request)
{
$lists = Cart::mine()->orderBy('id', 'desc')->get();
$carts = [];
foreach ($lists as $cart) {
if ($cart->params->stock < 1) {
$cart->delete();
} else {
if ($cart->number > $cart->params->stock) {
$cart->number = $cart->params->stock;
$cart->save();
}
$carts[] = $cart;
}
}
$recommends = Goods::where('status', 1)->where('is_recommend', 1)->take(6)->orderBy('created_at', 'desc')->get();
return view('cart.index', compact('carts', 'recommends'));
}
public function setnum(Request $request)
{
$cart = Cart::find($request->id);
$cart->number = $request->number;
$cart->save();
}
public function sure(Request $request)
{
$data = array();
foreach (explode(',', $request->cart_id) as $key => $value) {
$cart = Cart::find($value);
if ($cart) {
$data['details'][0][$value]['cart_id'] = $value;
$data['details'][0][$value]['params_id'] = $cart->params_id;
$data['details'][0][$value]['number'] = $cart->number;
}
}
$data['item']['id'] = 0;
$data['item']['type'] = 'MEMBER';
return redirect()->route('orders.create', $data);
}
public function delete(Request $request)
{
$id = $request->id;
$cart = Cart::find($id);
if ($cart->delete()) {
return $this->success('删除成功');
} else {
return $this->error('删除失败');
}
}
//加入购物车
public function store(Request $request)
{
if (Cart::where('user_id', Auth::id())->count() == 99) {
return ['code' => 0, 'msg' => '您的购物车商品数量已达上限99个'];
}
foreach ($request->details as $key => $details) {
foreach ($details as $detail) {
$user_id = Auth::id();
$result = Cart::where(['user_id' => $user_id, 'params_id' => $detail['params_id']])->first();
$params = GoodsParams::find($detail['params_id']);
if ($result) {
$result->number += $detail['number'];
$result->save();
} else {
$result = Cart::create([
'user_id' => Auth::id(),
'params_id' => $detail['params_id'],
'goods_id' => $params->goods_id, //保存goods_id是为了下架商品时删除购物车
'number' => $detail['number'],
]);
}
}
}
if ($result) {
return $this->success('成功加入购物车');
} else {
return $this->error('加入购物车失败');
}
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use RuLong\Area\Models\Area;
use Session;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests, AjaxResponse;
//获取当前定位数组
public function getDefaultLocation()
{
$lat = session('lat', '45.76021');
$lng = session('lng', '126.66835');
$area = session('area', '');
$real_area = session('real_area', '');
if (!$area) {
$area = Area::where('sn', '230100')->first();
}
if (!$real_area) {
session::put('real_area', $area);
$real_area = $area;
}
$location = [
'lat' => $lat,
'lng' => $lng,
'area' => $area,
'real_area' => $real_area,
];
return $location;
}
public function getDefault($value)
{
$location = $this->getDefaultLocation();
return $location[$value] ?? '';
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers;
use App\Models\Goods;
use Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
class FavoriteController extends Controller
{
public function __construct(Request $request)
{
$this->middleware('auth');
View::share('nav', 4);
}
public function index(Request $request)
{
$user = Auth::user();
$lists = $user->favorites(Goods::class)->paginate();
return view('favorite.index', compact('lists'));
}
public function more(Request $request)
{
$user = Auth::user();
$lists = $user->favorites(Goods::class)->paginate();
if ($lists->isNotEmpty()) {
$html = response(view('favorite.more', compact('lists')))->getContent();
return $this->success($html);
} else {
return $this->error('没有数据了');
}
}
}

View File

@@ -0,0 +1,113 @@
<?php
namespace App\Http\Controllers;
use App\Models\Category;
use App\Models\Goods;
use Auth;
use Illuminate\Http\Request;
class GoodsController extends Controller
{
public function __construct(Request $request)
{
view()->share('nav', 1);
}
public function show(Goods $good)
{
$params = $good->params()->where('stock', '>', 0)->orderBy('price', 'asc')->get();
$first = $good->params()->orderBy('original', 'asc')->first();
$user = Auth::user();
return view('goods.show', compact('good', 'params', 'user', 'first'));
}
public function category(Request $request)
{
$category_id = $request->category_id ?? '';
if ($category_id) {
$category = Category::find($category_id);
} else {
$category = '';
}
$categorys = Category::where('parent_id', 0)->where('type', 'goods')->get();
return view('goods.category', compact('categorys', 'category', 'category_id'));
}
public function lists(Request $request)
{
$category_id = $request->get('category_id', '');
$title = $request->get('title', '');
$page = $request->get('page', '');
$price = $request->get('price', '');
$sold = $request->get('sold', '');
$goods = Goods::where('status', 1)
->when($category_id, function ($query) use ($category_id) {
$ids = Category::where('id', $category_id)->orWhere('parent_id', $category_id)->pluck('id');
return $query->whereIn('category_id', $ids);
})
->when($title, function ($query) use ($title) {
return $query->where('title', 'like', "%$title%");
})
->when($price, function ($q) use ($price) {return $q->orderBy('price', $price);})
->when($sold, function ($q) use ($sold) {return $q->orderBy('sold', $sold);})
->orderBy('sort', 'asc')
->orderBy('created_at', 'desc')
->paginate(10);
if ($page > 1) {
if ($goods->count() > 0) {
$html = response(view('goods.more', compact('goods')))->getContent();
return $this->success($html);
} else {
return $this->error('已经到最后一页');
}
}
$parent_id = 0;
$category = '';
$app_title = '商品列表';
$parent_cate = '';
if ($category_id) {
$parent_cate = $category = Category::find($category_id);
if ($category->parent_id) {
$app_title = $category->parent->title . '--' . $category->title;
$parent_cate = $category->parent;
$parent_id = $parent_cate->id;
} else {
$parent_id = $category->id;
$app_title = $category->title;
}
}
$categorys = Category::where('parent_id', $parent_id)->where('type', 'goods')->get();
view()->share('app_title', $app_title);
return view('goods.lists', compact('goods', 'categorys', 'sold', 'price', 'category_id', 'title', 'parent_cate'));
}
//收藏
public function favorite(Goods $goods)
{
$user = Auth::user();
if (!$user) {
return $this->error('请登录后在进行此操作', route('login'));
}
if ($user->hasFavorited($goods)) {
$result = $user->unfavorite($goods);
$text = '取消收藏';
} else {
$result = $user->favorite($goods);
$text = '收藏';
}
if ($result) {
return $this->success($text . '成功', route('goods.show', $goods));
} else {
return $this->error($text . '失败');
}
}
}

View File

@@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers;
use App\Models\Advert;
use App\Models\Category;
use App\Models\Goods;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
class IndexController extends Controller
{
public function __construct(Request $request)
{
View::share('nav', 1);
view()->share('app_title', '会员商城');
}
public function index(Request $request)
{
$title = $request->title;
$adverts = Advert::where('channel', 'member')->orderBy('sort', 'asc')->take(5)->get(); //banner
$c_lists = Category::where('type', 'goods')->where('parent_id', 0)->orderBy('order', 'asc')->take(4)->get();
$lists = Goods::where('status', 1)
->when($title, function ($q) use ($title) {
$q->where('title', 'like', "%{$title}%");
})
->where('type', 'member')
->where('is_hot_sell', 1)
->orderBy('sort', 'asc')
->orderBy('created_at', 'desc')
->paginate(10);
return view('index.index', compact('c_lists', 'adverts', 'lists', 'title'));
}
public function more(Request $request)
{
$category_id = $request->category;
$title = $request->title;
$lists = Goods::where('status', 1)
->when($title, function ($q) use ($title) {
$q->where('title', 'like', "%{$title}%");
})
->where('type', 'member')
->where('is_hot_sell', 1)
->orderBy('sort', 'asc')
->orderBy('created_at', 'desc')
->paginate(10);
if ($lists->isNotEmpty()) {
$html = response(view('index.more', compact('lists')))->getContent();
return $this->success($html);
} else {
return $this->error('没有数据了');
}
}
}

View File

@@ -0,0 +1,114 @@
<?php
namespace App\Http\Controllers;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use RuLong\Area\Models\Area;
use Session;
class LocationController extends Controller
{
public function __construct(Request $request)
{
view()->share('nav', 2);
}
//自动设置默认地区
public function setLocation(Request $request)
{
$lat = $request->lat;
$lng = $request->lng;
if (!$lat || !$lng) {
return $this->error('设置失败');
}
$location = $this->getDefaultLocation();
if (!$location['real_area']) {
$url = "http://api.map.baidu.com/geocoder";
$client = new Client();
$response = $client->request('GET', $url, [
'timeout' => 30,
'query' => [
'location' => $lat . "," . $lng,
'output' => 'json',
],
]);
if ($response->getStatusCode() == 200) {
$data = json_decode($response->getBody()->getContents(), true);
$city = $data['result']['addressComponent']['city'];
} else {
return $this->location($url);
}
$area = Area::where('name', $city)->first();
//如果地址没有开通,默认哈尔滨
if ($area->status != 1) {
$area = Area::where('sn', '230100')->first();
$lat = $area->lat;
$lng = $area->lng;
}
Session::put('lat', $lat);
Session::put('lng', $lng);
Session::put('area', $area);
Session::put('real_area', $area);
return $this->success($city);
} else {
Session::put('lat', $lat);
Session::put('lng', $lng);
return $this->error(json_encode($location));
}
}
//设置地区
public function setArea(Request $request)
{
$area_id = $request->area_id;
if ($area_id) {
$area = Area::find($area_id);
} else {
$area = [
"id" => 0,
"sn" => 0,
"psn" => 0,
"province" => "全国",
"city" => "全国",
"area" => "",
"name" => "全国",
];
$area = (object) $area;
}
session(['area' => $area]);
$url = route('pick.lists');
$callback = session('address_callback', '');
if ($callback) {
$url = $callback;
}
return $this->success('设置成功', $url);
}
//设置城市
public function address(Request $request)
{
$name = $request->name ?? '';
$callback = $request->callback ?? '';
if ($callback) {
session(['address_callback' => $callback]);
}
$location = $this->getDefaultLocation();
if (empty($name)) {
$addresses = Area::where('psn', 0)->get();
} else {
$addresses = Area::where('name', 'like', "%{$name}%")->where('type', '地级')->get();
}
$hots = Area::where('hot', 1)->get();
return view('location.address', compact('addresses', 'location', 'hots', 'name'));
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers;
use App\Events\UpgradePaid;
use App\Models\Payment;
use App\Models\UpgradePayment;
use Illuminate\Http\Request;
class NotifyController extends Controller
{
public function __construct()
{
}
public function payment(Request $request)
{
$app = app('wechat.payment');
return $app->handlePaidNotify(function ($message, $fail) {
$payment = Payment::where('trade_no', $message['out_trade_no'])->first();
if ($payment->state != 'SUCCESS') {
$payment->state = 'SUCCESS';
$payment->transaction_id = $message['transaction_id'];
$payment->paid_at = $message['time_end'];
$payment->save();
$payment->order->paid();
}
return true;
});
}
public function upgrade(Request $request)
{
$app = app('wechat.payment');
return $app->handlePaidNotify(function ($message, $fail) {
$UpgradePayment = UpgradePayment::where('trade_no', $message['out_trade_no'])->first();
$UpgradePayment->state = 'SUCCESS';
$UpgradePayment->transaction_id = $message['transaction_id'];
$UpgradePayment->paid_at = $message['time_end'];
$UpgradePayment->save();
event(new UpgradePaid($UpgradePayment));
return true;
});
}
}

View File

@@ -0,0 +1,215 @@
<?php
namespace App\Http\Controllers;
use App\Models\Cart;
use App\Models\GoodsParams;
use Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
use RuLong\Area\Models\UserAddress;
use RuLong\Order\Models\Order;
use RuLong\Order\Models\OrderDetail;
class OrderController extends Controller
{
public $orderid;
public function __construct(Request $request)
{
view()->share('nav', 4);
$this->middleware('auth');
}
public function index()
{
$orders = Order::where('user_id', Auth::id())
->where('state', '<>', Order::ORDER_CLOSED)
->orderBy('id', 'desc')
->get();
return view('orders.index', compact('orders'));
}
public function unpay()
{
$orders = Order::Unpaid()
->where('user_id', Auth::id())
->orderBy('id', 'desc')
->get();
return view('orders.index', compact('orders'));
}
public function paid()
{
$orders = Order::UnDeliver()
->where('user_id', Auth::id())
->orderBy('id', 'desc')
->get();
return view('orders.index', compact('orders'));
}
public function delivered()
{
$orders = Order::Delivered()
->where('user_id', Auth::id())
->orderBy('id', 'desc')
->get();
return view('orders.index', compact('orders'));
}
public function signed()
{
$orders = Order::Signed()
->where('user_id', Auth::id())
->orderBy('id', 'desc')
->get();
return view('orders.index', compact('orders'));
}
public function show($orderid)
{
$order = Order::where('orderid', $orderid)->firstOrFail();
return view('orders.show', compact('order'));
}
//确认订单
public function create(Request $request)
{
$user = Auth::user();
$address_id = $request->get('address', '');
$address = $address_id ? UserAddress::find($address_id) : UserAddress::where('user_id', Auth::id())->orderBy('is_default', 'desc')->first() ?? '';
if (!($request->has('details'))) {
$items = Session::get('items_store');
} else {
$items = $request->details;
Session::put(['items_store' => $items]);
}
//为存储到order表中区分普通商品or套餐商品item_id>0套餐商品
if (!($request->has('item'))) {
$item = Session::get('item');
} else {
$item = $request->item;
Session::put(['item' => $item]);
}
if (empty($items)) {
return redirect()->route('user.index');
}
$sellers_score = 0;
$sellers_total = 0;
$sellers_freight = 0;
$sellers_count = 0;
//按照商户分单,一个商户一个订单,一个订单可多个商品
foreach ($items as $key => $seller_item) {
$detail[$key]['seller_id'] = $key;
$detail[$key]['amount'] = 0;
$detail[$key]['freight'] = 0;
$detail[$key]['heavy'] = 0;
$detail[$key]['score'] = 0;
foreach ($seller_item as $kk => $value) {
$params = GoodsParams::find($value['params_id']);
if ($params) {
if ($item['type'] == 'MEMBER') {
$price = $user->identity_id > 0 ? $params->price : $params->original;
} else {
$price = $params->price;
}
$detail[$key]['items'][] = [
'params_id' => $params->id,
'params_cover' => $params->storage,
'params_title' => $params->getTitle(),
'params_price' => $price,
'params_score' => $params->score,
'number' => $value['number'],
'cart_id' => isset($value['cart_id']) ? $value['cart_id'] : 0, //是否从购物车下单的商品
];
}
$detail[$key]['amount'] += $value['number'] * $price;
$detail[$key]['score'] += $value['number'] * $params->score;
}
$sellers_score += $detail[$key]['score'];
$sellers_total += $detail[$key]['amount'];
$detail[$key]['freight'] = 0; //包邮
$detail[$key]['item']['id'] = $item['id']; //0普通商品订单一单支持多商品
$detail[$key]['item']['type'] = $item['type']; //0普通商品订单一单支持多商品
$card_id = $item['card_id'] ?? 0;
$sellers_total += $detail[$key]['freight'];
$sellers_freight += $detail[$key]['freight'];
$sellers_count += 1;
}
return view('orders.create', compact('detail', 'address', 'sellers_total', 'sellers_score', 'sellers_freight', 'sellers_count', 'card_id'));
}
public function store(Request $request)
{
$user = Auth::user();
try {
DB::transaction(function () use ($request, $user) {
$address = UserAddress::find($request->address_id);
$card_id = $request->card_id ?? 0;
foreach ($request->details as $kk => $seller_detail) {
$items[$kk] = array();
$score[$kk] = 0;
$score_order[$kk] = 0;
foreach ($seller_detail['items'] as $key => $value) {
if ($value['cart_id'] != 0 && $cart = Cart::find($value['cart_id'])) {
$cart->delete();
}
$params = GoodsParams::find($value['params_id']);
if ($seller_detail['type'] == 'MEMBER' && $user->identity_id < 1) {
$params->price = $params->original;
}
array_push($items[$kk], new OrderDetail(['goods' => $params, 'number' => $value['number']]));
}
$express_type[$kk] = isset($seller_detail['express_type']) ? $seller_detail['express_type'] : 1;
$seller_detail['freight'] = 0;
$this->orderid = \Orders::create(Auth::id(), $seller_detail['seller_id'], $seller_detail['type'], $items[$kk], $express_type[$kk], $address, $request->remark, null, $score_order[$kk], $seller_detail['freight'], $card_id);
}
});
Session::forget('items_store');
Session::forget('item');
return $this->success('订单创建成功', route('pay.order', $this->orderid));
} catch (\Exception $e) {
return $this->error('订单创建失败' . $e->getmessage());
}
}
public function sign($orderid)
{
$order = Order::where('orderid', $orderid)->firstOrFail();
try {
$order->signin();
return $this->success('签收成功', route('orders.signed'));
} catch (\Exception $e) {
return $this->error('签收失败' . $e->getmessage());
}
}
public function delete($orderid)
{
$order = Order::where('orderid', $orderid)->firstOrFail();
try {
$order->close();
return $this->success('取消订单成功');
} catch (\Exception $e) {
return $this->error('取消订单失败' . $e->getmessage());
}
}
}

View File

@@ -0,0 +1,81 @@
<?php
namespace App\Http\Controllers;
use App\Models\Card;
use App\Models\Payment;
use Illuminate\Http\Request;
use RuLong\Order\Models\Order;
class PayController extends Controller
{
public function __construct(Request $request)
{
$this->middleware('auth');
}
private function getpayOrder(Order $order, $type)
{
$payOrder = Payment::create([
'order_id' => $order->id,
'type' => $type,
'amount' => $order->total - $order->score,
]);
return $payOrder;
}
public function order(Request $request, $orderid)
{
$order = Order::where('orderid', $orderid)->findOrFail();
return view('pay.order', compact('order'));
}
/**
* 微信支付
* @param Request $request [description]
* @param [type] $orderid [description]
* @return [type] [description]
*/
public function wechat(Request $request, $orderid)
{
$order = Order::where('orderid', $orderid)->firstOrFail();
$openid = $order->user->openid;
$amount = $order->amount - $order->score;
$payOrder = $this->getpayOrder($order, 'WECHAT');
if ($amount != $payOrder->amount) {
$payOrder->amount = $amount;
$payOrder->save();
}
if ($order->card_id) {
$card = Card::find($order->card_id);
if ($card && in_array($card->status, [0, 5])) {
return $this->error('提货卡被禁用或被使用');
}
}
$app = app('wechat.payment');
$amount = $payOrder->amount;
if (config('pick.DEBUG')) {
$amount = 0.01;
}
$result = $app->order->unify([
'body' => '商城订单',
'out_trade_no' => $payOrder->trade_no,
'total_fee' => $amount * 100,
'notify_url' => route('notify.payment'),
'trade_type' => 'JSAPI',
'openid' => $openid,
]);
if ($result['return_code'] == 'SUCCESS' && isset($result['prepay_id'])) {
$json = $app->jssdk->bridgeConfig($result['prepay_id']);
return $this->success($json);
} else {
return $this->error($result['return_msg']);
}
}
}

View File

@@ -0,0 +1,213 @@
<?php
namespace App\Http\Controllers;
use App\Models\Advert;
use App\Models\Card;
use App\Models\Goods;
use App\Models\Mobile;
use Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use RuLong\Order\Models\OrderDetail;
/**
* 提货商城
*/
class PickController extends Controller
{
public $orderid;
public function __construct()
{
view()->share('nav', 2);
view()->share('app_title', '提货商城');
}
public function index(Request $request)
{
$area = $this->getDefault('area');
$this->setSearchValue($request);
$pick_search = session('pick_search');
$number = $pick_search['number'];
$operator = $pick_search['operator'];
$begin = $pick_search['begin'];
$type = $pick_search['type'];
$adverts = Advert::where('channel', 'pick')->orderBy('sort', 'asc')->take(5)->get(); //banner
$lists = Mobile::where('status', 1)
->when($number, function ($q) use ($number) {
$q->where('number', 'like', "%{$number}");
})
->when($operator, function ($q) use ($operator) {
$q->where('operator', $operator);
})
->when($area->sn, function ($q) use ($area) {
$q->where('city_sn', $area->sn);
})
->when($begin, function ($q) use ($begin) {
$q->where('begin', $begin);
})
->when($type, function ($q) use ($type) {
$q->where('type', $type);
})
->inRandomOrder()
->take(6)
->get();
if ($request->isMethod('POST')) {
if ($lists->isNotEmpty()) {
$html = response(view('pick.mobile', compact('lists')))->getContent();
return $this->success($html);
} else {
return $this->error('没有数据了');
}
} else {
view()->share('user', Auth::user());
return view('pick.index', compact('lists', 'adverts', 'area', 'number'));
}
}
public function setSearchValue($request)
{
$pick_search = [
'number' => '',
'operator' => [],
'begin' => [],
'type' => [],
];
foreach ($request->all() as $key => $value) {
$pick_search[$key] = $value;
}
session(['pick_search' => $pick_search]);
}
//更多
public function lists(Request $request)
{
$adverts = Advert::where('channel', 'pick')->orderBy('sort', 'asc')->take(5)->get(); //banner
$area = $this->getDefault('area');
$this->setSearchValue($request);
$pick_search = session('pick_search');
$number = $pick_search['number'];
$operator = $pick_search['operator'];
$begin = $pick_search['begin'];
$type = $pick_search['type'];
$lists = Mobile::where('status', 1)
->when($number, function ($q) use ($number) {
$q->where('number', 'like', "%{$number}");
})
->when($area->sn, function ($q) use ($area) {
$q->where('city_sn', $area->sn);
})
->when($operator, function ($q) use ($operator) {
$q->whereIn('operator', $operator);
})
->when($begin, function ($q) use ($begin) {
$q->whereIn('begin', $begin);
})
->when($type, function ($q) use ($type) {
$q->whereIn('type', $type);
})
->paginate();
if ($request->isMethod('AJAX')) {
$html = response(view('pick.mobile', compact('lists')))->getContent();
return $this->success($html);
} else {
return view('pick.lists', compact('lists', 'adverts', 'number', 'area'));
}
}
//领取手机号
public function receiveMobile(Request $request)
{
$id = $request->mobile_id;
$mobile = Mobile::find($id);
$res = $this->checkCard($request);
if ($res['status'] != 'ERROR') {
$card = $res['card'];
} else {
$url = $res['redirect'] ?? '';
return $this->error($res['message'], $url);
}
try {
DB::transaction(function () use ($mobile, $card) {
$data = new OrderDetail(['goods' => $mobile, 'number' => 1]);
$this->orderid = \Orders::create(Auth::id(), 0, 'PICK', [0 => $data], 0, null, '', null, 0, 0, $card->id);
});
return $this->success('订单创建成功', route('pay.order', $this->orderid));
} catch (\Exception $e) {
return $this->error('订单创建失败' . $e->getmessage());
}
}
//领取商品
public function receiveGoods(Request $request)
{
$params_id = $request->params_id;
$params = Mobile::find($params_id);
$res = $this->checkCard($request);
if ($res['status'] != 'ERROR') {
$card = $res['card'];
} else {
return $this->error($res['message'], $res['redirect']);
}
$data['details'][0][1]['params_id'] = $params_id;
$data['details'][0][1]['number'] = 1;
$data['item']['id'] = 0;
$data['item']['type'] = 'PICK';
$data['item']['card_id'] = $card->id;
return $this->success('领取成功', route('orders.create', $data));
}
//校验提货卡
public function checkCard($request)
{
if (!Auth::user()) {
return $this->error('请登录后进行此操作', route('login', ['callback' => url()->current()]));
}
if (count(array_filter($request->pass)) != 4) {
return $this->error('卡密必须输入完整');
}
$pass = implode('-', $request->pass);
$card = Card::where('pass', $pass)->first();
if (!$card) {
return ['status' => 'ERROR', 'message' => '卡密不正确'];
} elseif ($card->status == 5 || empty($card->user_id)) {
return ['status' => 'ERROR', 'message' => '卡号状态不对'];
}
return ['status' => 'SUCCESS', 'card' => $card];
}
//提货商品详情
public function detail(Goods $good)
{
$params = $good->params()->where('stock', '>', 0)->orderBy('price', 'asc')->get();
$first = $good->params()->orderBy('original', 'asc')->first();
$user = Auth::user();
return view('pick.detail', compact('good', 'params', 'user', 'first'));
}
public function search()
{
$pick_search = session('pick_search');
return view('pick.search', compact('pick_search'));
}
}

View File

@@ -0,0 +1,160 @@
<?php
namespace App\Http\Controllers;
use App\Models\Param;
use App\User;
use Auth;
use Hash;
use Illuminate\Http\Request;
use RuLong\Sms\Models\Sms as SmsModel;
use Session;
use Validator;
use \Illuminate\Support\Facades\URL;
class SettingsController extends Controller
{
public function __construct(Request $request)
{
$this->middleware('auth');
view()->share('nav', 4);
}
public function index(Request $request)
{
$user = Auth::user();
return view('settings.index', compact('user'));
}
public function mobile(Request $request)
{
if ($request->isMethod('POST')) {
$validator = Validator::make($request->all(), [
'username' => 'required|mobile|unique:users',
'code' => ['required', 'size:4', function ($attribute, $value, $fail) use ($request) {
if ($value != SmsModel::where('mobile', $request->username)->where('used', 0)->latest()->value('code')) {
return $fail('验证码不正确');
}
}],
], [
'username.required' => '手机号码必须填写',
'username.mobile' => '手机号码格式不正确',
'username.unique' => '手机号码已经绑定',
'code.required' => '验证码必须填写',
'code.size' => '验证码长度为:size位',
]);
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
$username = $request->username;
$user = Auth::user();
$user->username = $username;
$user->save();
return $this->success('手机号修改成功', route('user.index'));
} else {
return view('settings.mobile');
}
}
public function password(Request $request)
{
if ($request->isMethod('post')) {
$validator = Validator::make($request->all(), [
'oldpassword' => ['required', function ($attribute, $value, $fail) {
if (!Hash::check($value, Auth::user()->password)) {
return $fail('原密码不正确');
}
}],
'password' => 'required|between:6,32|confirmed',
'password_confirmation' => 'required|between:6,32',
], [
'oldpassword.required' => '原密码必须填写',
'password.required' => '新密码必须填写',
'password.between' => '新密码有误',
'password.confirmed' => '确认密码与新密码不一致',
'password_confirmation.required' => '确认密码必须填写',
'password_confirmation.between' => '确认密码有误',
]);
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
$user = Auth::user();
$user->password = $request->password;
if ($user->save()) {
return $this->success('密码修改成功', route('user.index'));
} else {
return $this->error('密码修改失败');
}
} else {
return view('settings.password');
}
}
/**
* 找回支付密码
* @Author:<C.Jason>
* @Date:2018-11-07T13:46:34+0800
* @param Request $request
*/
public function forgot(Request $request)
{
if ($request->isMethod('POST')) {
$validator = Validator::make($request->all(), [
'mobile' => 'required|mobile|exists:users',
'code' => 'required|sms_check:mobile,FORGOT',
], [
'mobile.required' => '手机号码必须填写',
'mobile.mobile' => '手机号码格式不正确',
'mobile.exists' => '手机号码不存在',
'code.required' => '验证码必须填写',
'code.sms_check' => '验证码不正确',
]);
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
$request->session()->put('reset_mobile', $request->mobile);
return $this->success('身份验证成功', Url::temporarySignedRoute('setting.forgot.reset', now()->addHour()));
} else {
return view('settings.forgot');
}
}
//修改昵称
public function nickname(Request $request)
{
$user = Auth::user();
if ($request->isMethod('POST')) {
$validator = Validator::make($request->all(), [
'nickname' => 'required',
], [
'nickname.required' => '昵称必须填写',
]);
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
$result = $user->info()->update([
'nickname' => $request->nickname,
]);
if ($result) {
return $this->success('信息更新成功', route('user.index'));
} else {
return $this->error('信息更新失败');
}
} else {
return view('settings.nickname', compact('user'));
}
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers;
use App\Models\UpgradePayment;
use App\Models\User;
class TestController extends Controller
{
public function index()
{
$user = User::find(3);
$data = [
'username' => '15663876871',
'password' => '161723',
];
$res = $user->fill($data);
$user->save();
dd($res);
die();
$upgradepayment = UpgradePayment::find(16);
$user = $upgradepayment->user;
$user->activationd_at = now();
$user->save();
die();
$upgradepayment->user->activationd_at = now();
$upgradepayment->save();
}
}

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Http\Controllers;
use App\Models\UpgradePayment;
use App\User;
use Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
use RuLong\Order\Models\Order;
/**
* 用户升级
*/
class UpgradeController extends Controller
{
public function __construct(Request $request)
{
$this->middleware('auth');
View::share('nav', 4);
}
// 升级vip
public function vip(Request $request)
{
if (Auth::user()->identity->identity_id > 0) {
// return redirect()->route('user.index');
}
return view('upgrade.vip');
}
//升级代理商
public function agent(Request $request)
{
if (!Auth::user()->username) {
return redirect()->route('login');
}
if (Auth::user()->identity->identity_id > 1) {
return redirect()->route('Agent.login');
}
return view('upgrade.agent');
}
public function wechat(Request $request)
{
$user = Auth::user();
$type = $request->type ?? 'vip';
$upgradeOrder = UpgradePayment::where(['user_id' => $user->id, 'type' => $type, 'state' => 'SUCCESS'])->first();
if ($upgradeOrder) {
$url = route('user.index');
if ($type == 'agent') {
$url = route('Agent.login');
}
return $this->error('您已经升级成功', $url);
}
$upgradeOrder = $this->getpayOrder($type);
$app = app('wechat.payment');
$amount = $upgradeOrder->amount;
if (config('pick.DEBUG')) {
$amount = 0.01;
}
$result = $app->order->unify([
'body' => $type == 'vip' ? '开通会员' : '开通代理商',
'out_trade_no' => $upgradeOrder->trade_no,
'total_fee' => $amount * 100,
'notify_url' => route('notify.upgrade'),
'trade_type' => 'JSAPI',
'openid' => $user->openid,
]);
if ($result['return_code'] == 'SUCCESS' && isset($result['prepay_id'])) {
$json = $app->jssdk->bridgeConfig($result['prepay_id']);
return $this->success($json);
} else {
return $this->error($result['return_msg'] . ($result['err_code_des'] ?? ''));
}
}
private function getpayOrder($type)
{
$amount = 399;
if ($type == 'vip') {
$amount = config('vip_price');
}
if ($type == 'agent') {
$amount = config('agent_price');
}
$upgradeOrder = UpgradePayment::create([
'user_id' => Auth::id(),
'type' => $type,
'pay_type' => 'WECHAT',
'amount' => $amount,
'total' => $amount,
]);
return $upgradeOrder;
}
public function hasAgent()
{
return view('upgrade.hasagent');
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers;
use App\User;
use Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
use RuLong\Order\Models\Order;
class UserController extends Controller
{
public function __construct(Request $request)
{
$this->middleware('auth');
view()->share('nav', 4);
view()->share('app_title', '个人中心');
}
public function index()
{
$user = Auth::user();
if (!$user->username) {
return redirect()->route('logout');
}
$orderCount = [
'unpay' => Order::Unpaid()->where('user_id', $user->id)->count(),
'paid' => Order::UnDeliver()->where('user_id', $user->id)->count(),
'delivered' => Order::Delivered()->where('user_id', $user->id)->count(),
];
return view('user.index', compact('user', 'orderCount'));
}
}

View File

@@ -0,0 +1,69 @@
<?php
namespace App\Http\Controllers;
use App\Http\WechatHandlers\EventMessageHandler;
use App\Http\WechatHandlers\FileMessageHandler;
use App\Http\WechatHandlers\ImageMessageHandler;
use App\Http\WechatHandlers\LinkMessageHandler;
use App\Http\WechatHandlers\LocationMessageHandler;
use App\Http\WechatHandlers\ShortVideoMessageHandler;
use App\Http\WechatHandlers\TextMessageHandler;
use App\Http\WechatHandlers\TransferMessageHandler;
use App\Http\WechatHandlers\VideoMessageHandler;
use App\Http\WechatHandlers\VoiceMessageHandler;
use EasyWeChat\Kernel\Messages\Message;
use Overtrue\LaravelWeChat\Controllers\Controller;
class WeChatController extends Controller
{
public function serve()
{
$app = app('wechat.official_account');
$app->server->push(TextMessageHandler::class, Message::TEXT);
$app->server->push(ImageMessageHandler::class, Message::IMAGE);
$app->server->push(VoiceMessageHandler::class, Message::VOICE);
$app->server->push(VideoMessageHandler::class, Message::VIDEO);
$app->server->push(ShortVideoMessageHandler::class, Message::SHORT_VIDEO);
$app->server->push(LocationMessageHandler::class, Message::LOCATION);
$app->server->push(LinkMessageHandler::class, Message::LINK);
$app->server->push(FileMessageHandler::class, Message::FILE);
$app->server->push(EventMessageHandler::class, Message::EVENT);
$app->server->push(TransferMessageHandler::class, Message::TRANSFER);
return $app->server->serve();
}
public function publish()
{
$app = app('wechat.official_account');
$buttons = [
[
"name" => '会员商城',
"type" => "view",
"url" => route('index'),
],
[
"name" => '提货专区',
"type" => "view",
"url" => route('pick.index'),
],
[
"name" => "代理商入口",
"sub_button" => [
[
"type" => "view",
"name" => "成为代理商",
"url" => route('upgrade.agent'),
],
[
"type" => "view",
"name" => "代理商登录平台",
"url" => route('Agent.login'),
],
],
],
];
$res = $app->menu->create($buttons);
return $res;
}
}

79
app/Http/Kernel.php Normal file
View File

@@ -0,0 +1,79 @@
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
/**
* The priority-sorted list of middleware.
*
* This forces non-global middleware to always be in the given order.
*
* @var array
*/
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\Authenticate::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Support\Facades\Auth;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function redirectTo($request)
{
if (!$request->expectsJson()) {
return route('login', ['r' => $request->url()]);
}
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode as Middleware;
class CheckForMaintenanceMode extends Middleware
{
/**
* The URIs that should be reachable while maintenance mode is enabled.
*
* @var array
*/
protected $except = [
//
];
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
class EncryptCookies extends Middleware
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array
*/
protected $except = [
//
];
}

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/');
}
return $next($request);
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
class TrimStrings extends Middleware
{
/**
* The names of the attributes that should not be trimmed.
*
* @var array
*/
protected $except = [
'password',
'password_confirmation',
];
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array|string
*/
protected $proxies;
/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* Indicates whether the XSRF-TOKEN cookie should be set on the response.
*
* @var bool
*/
protected $addHttpCookie = true;
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'wechat', 'notify/payment', 'payments/wechat', 'notify/upgrade', 'agent/notify/payment', 'agent/payments/wechat',
];
}

View File

@@ -0,0 +1,109 @@
<?php
namespace App\Http\WechatHandlers;
use App\Models\User;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
use EasyWeChat\Kernel\Messages\Text;
class EventMessageHandler implements EventHandlerInterface
{
private $payload;
public function handle($payload = null)
{
if (method_exists($this, $payload['Event'])) {
$this->payload = $payload;
return call_user_func_array([$this, $payload['Event']], []);
} else {
return '暂不支持的消息类型';
}
}
/**
* 扫码事件
* @Author:<C.Jason>
* @Date:2018-11-12T16:28:19+0800
*/
private function SCAN()
{
}
/**
* 主菜单点击
* @Author:<C.Jason>
* @Date:2018-11-12T16:28:06+0800
*/
private function CLICK()
{
return false;
}
/**
* 关注事件
* @Author:<C.Jason>
* @Date:2018-11-12T16:27:51+0800
*/
private function subscribe()
{
$app = app('wechat.official_account');
$user = $app->user->get($this->payload['FromUserName']);
// 先查找用户是否存在,不存在再注册
$existUser = User::where('openid', $this->payload['FromUserName'])->first();
if ($existUser) {
$existUser->update([
'info' => [
'headimgurl' => $user['headimgurl'],
'sex' => $user['sex'],
'country' => $user['country'],
'province' => $user['province'],
'city' => $user['city'],
'subscribe_at' => $user['subscribe_time'],
'subscribe_scene' => $user['subscribe_scene'],
// 'qr_scene' => $user['qr_scene'],
// 'qr_scene_str' => $user['qr_scene_str'],
],
]);
return $this->firstSubscribeMessage($existUser);
}
}
public function VIEW()
{
#Todo..
}
public function LOCATION()
{
#Todo..
}
/**
* 取消关注事件
* @Author:<Leady>
* @Date:2018-12-12T13:44:54+0800
* @return [type] [description]
*/
private function unsubscribe()
{
$existUser = User::where('openid', $this->payload['FromUserName'])->first();
if ($existUser) {
$existUser->update([
'info' => [
'subscribe_at' => null,
// 'subscribe_scene' => null,
],
]);
}
}
private function firstSubscribeMessage($user)
{
$text = new Text('您好,欢迎关注连卡蝠');
return $text;
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace App\Http\WechatHandlers;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class FileMessageHandler implements EventHandlerInterface
{
public function handle($payload = null)
{
$payload->ToUserName;
$payload->FromUserName;
$payload->CreateTime;
$payload->MsgId;
$payload->Title;
$payload->Description;
$payload->FileKey;
$payload->FileMd5;
$payload->FileTotalLen;
return '文件消息';
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\WechatHandlers;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class ImageMessageHandler implements EventHandlerInterface
{
public function handle($payload = null)
{
$payload->ToUserName;
$payload->FromUserName;
$payload->CreateTime;
$payload->MsgId;
$payload->MediaId;
$payload->PicUrl;
return '图片消息';
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\WechatHandlers;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class LinkMessageHandler implements EventHandlerInterface
{
public function handle($payload = null)
{
$payload->ToUserName;
$payload->FromUserName;
$payload->CreateTime;
$payload->MsgId;
$payload->Title;
$payload->Description;
$payload->Url;
return '链接消息';
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\WechatHandlers;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class LocationMessageHandler implements EventHandlerInterface
{
public function handle($payload = null)
{
$payload->ToUserName;
$payload->FromUserName;
$payload->CreateTime;
$payload->MsgId;
$payload->Latitude;
$payload->Longitude;
$payload->Precision;
return '上报位置消息';
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\WechatHandlers;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class ShortVideoMessageHandler implements EventHandlerInterface
{
public function handle($payload = null)
{
$payload->ToUserName;
$payload->FromUserName;
$payload->CreateTime;
$payload->MsgId;
$payload->MediaId;
$payload->ThumbMediaId;
return '短视频消息';
}
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Http\WechatHandlers;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class TextMessageHandler implements EventHandlerInterface
{
public function handle($payload = null)
{
return '您的留言已经收到';
return $payload->Content;
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace App\Http\WechatHandlers;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class TransferMessageHandler implements EventHandlerInterface
{
public function handle($payload = null)
{
return '客服消息' . json_encode($payload);
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\WechatHandlers;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class VideoMessageHandler implements EventHandlerInterface
{
public function handle($payload = null)
{
$payload->ToUserName;
$payload->FromUserName;
$payload->CreateTime;
$payload->MsgId;
$payload->MediaId;
$payload->ThumbMediaId;
return '视频消息';
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\WechatHandlers;
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class VoiceMessageHandler implements EventHandlerInterface
{
public function handle($payload = null)
{
$payload->ToUserName;
$payload->FromUserName;
$payload->CreateTime;
$payload->MsgId;
$payload->MediaId;
$payload->Format;
$payload->Recognition;
return '语音消息';
}
}