1608 lines
72 KiB
PHP
1608 lines
72 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Server\H5;
|
||
|
||
use App\Facades\WechatService;
|
||
use App\Jobs\AddVirtualMember;
|
||
use App\Models\Consultation;
|
||
use App\Models\Coupon;
|
||
use App\Models\Course\Course;
|
||
use App\Models\Course\CourseVideo;
|
||
use App\Models\Course\UserCourses;
|
||
use App\Models\Server\CollageGroup;
|
||
use App\Models\Server\CollageGroupHistories;
|
||
use App\Models\Server\EvaluateDetail;
|
||
use App\Models\Server\EvaluateList;
|
||
use App\Models\Server\MerchantApplyment;
|
||
use App\Models\Server\MerchantEvaluate;
|
||
use App\Models\Server\WechatSubMerchant;
|
||
use App\Models\UserCoupon;
|
||
use App\Models\UserMember;
|
||
use App\Services\EvaluateService;
|
||
use App\Services\OrderService;
|
||
use Illuminate\Contracts\View\Factory;
|
||
use Illuminate\Foundation\Application;
|
||
use Illuminate\Http\JsonResponse;
|
||
use Illuminate\Http\Request;
|
||
use App\Http\Controllers\Controller;
|
||
use App\Models\ConsultationRecords;
|
||
use App\Models\MerchantShop;
|
||
use App\Models\MerchantUsers;
|
||
use App\Http\Response\ResponseJson;
|
||
use App\Models\CommunityActivity;
|
||
use App\Models\Live\Anchor;
|
||
use App\Models\Message;
|
||
use App\Models\Server\MerchantAccount;
|
||
use App\Models\Server\MerchantInformation;
|
||
use App\Models\Server\MerchantUser;
|
||
use App\Models\Server\SaasNotice;
|
||
use App\Models\Server\TouristOrder as Order;
|
||
use App\Models\Server\TouristOrder;
|
||
use App\Models\ShopRecive;
|
||
use App\Models\User;
|
||
use App\Utils\Messenger;
|
||
use Illuminate\Support\Facades\Log;
|
||
use Illuminate\View\View;
|
||
|
||
class OrderController extends Controller
|
||
{
|
||
use ResponseJson;
|
||
|
||
/**
|
||
* 订单详情 --商城
|
||
* @param $id
|
||
* @return Factory|Application|JsonResponse|View
|
||
*/
|
||
public function order_detail($id)
|
||
{
|
||
try {
|
||
$order = Order::where('id', $id)->first();
|
||
$recive = ShopRecive::where('order_id', $order->id)->first();
|
||
$shop = MerchantShop::withTrashed()->where('id', $order->type_id)->first();
|
||
|
||
$recive = ShopRecive::where('order_id', $id)->first();
|
||
if ($recive->is_recived == 0) {
|
||
$state = 1; //确认收货
|
||
} elseif (!$order->comment && !$order->Praise) {
|
||
$state = 2;//去评价
|
||
} else {
|
||
$state = 3;//查看评价
|
||
}
|
||
|
||
$order->address = $recive->address;
|
||
$order->title = $shop->title;
|
||
$order->icon = $shop->icon;
|
||
if ($order->banners && $order->banners != 'null')
|
||
$order->banners = json_decode($shop->banners) ?? [];
|
||
if ($order->remark && $order->remark != 'null')
|
||
$order->remark = json_decode($shop->remark) ?? [];
|
||
$order->describe = $shop->describe;
|
||
$order->introduction = $shop->sub_title;
|
||
$order->sku = json_decode($shop->sku, true);
|
||
$order->state = $state;
|
||
$order->goods = $order->goods ?? '默认规格';
|
||
return $this->success('ok', $order);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息中,请稍后再试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 课程 咨询 服务 商城订单 --提交评价
|
||
* @param Request $request
|
||
* @return Factory|Application|JsonResponse|View
|
||
*/
|
||
public function orderComments(Request $request)
|
||
{
|
||
try {
|
||
$id = $request->id;
|
||
$trade_no = $request->trade_no;
|
||
$comment = $request->comment;
|
||
$Praise = $request->Praise;
|
||
$pic = $request->pic;
|
||
$value = Order::where('id', $id)->whereIn('pay_status', [1, 4])->first();
|
||
if ($trade_no)
|
||
$value = Order::where('trade_no', $trade_no)->whereIn('pay_status', [1, 4])->first();
|
||
if (!$value)
|
||
return $this->failure('未查询到该订单。');
|
||
if ($value->comment || $value->Praise)
|
||
return $this->failure('您已经提交过评价啦');
|
||
$value->comment = $comment;
|
||
$value->Praise = $Praise;
|
||
$value->pic = json_encode($pic);
|
||
$record = ConsultationRecords::where('trade_no', $value->trade_no)->first();
|
||
if ($record) {
|
||
$record->comment = $comment;
|
||
$record->Praise = $Praise;
|
||
$record->save();
|
||
}
|
||
$value->save();
|
||
return $this->success('ok');
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息中,请稍后再试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 课程 咨询 服务 商城订单 --修改提交评价
|
||
* @param Request $request
|
||
* @return Factory|Application|JsonResponse|View
|
||
*/
|
||
public function changeorderComments(Request $request)
|
||
{
|
||
try {
|
||
$id = $request->id;
|
||
$comment = $request->comment;
|
||
$Praise = $request->Praise;
|
||
$pic = $request->pic;
|
||
$value = Order::where('id', $id)->whereIn('pay_status', [1, 4])->first();
|
||
|
||
if ($request->comment)
|
||
$value->comment = $comment;
|
||
if ($request->Praise)
|
||
$value->Praise = $Praise;
|
||
if ($request->pic)
|
||
$value->comment = json_encode($pic);
|
||
|
||
$record = ConsultationRecords::where('trade_no', $value->trade_no)->first();
|
||
if ($record) {
|
||
$record->comment = $comment;
|
||
$record->Praise = $Praise;
|
||
$record->save();
|
||
}
|
||
$value->save();
|
||
return $this->success('ok');
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息中,请稍后再试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 更改咨询订单状态
|
||
* *
|
||
* @param Request $request
|
||
* @return Factory|Application|JsonResponse|View
|
||
*/
|
||
public function changeOrderStatus(Request $request)
|
||
{
|
||
try {
|
||
$id = $request->id;
|
||
$result = ConsultationRecords::where('id', $id)->where('pay_status', 1)->first();
|
||
if (!$result)
|
||
return $this->failure('未查到该订单信息~');
|
||
if ($request->status)
|
||
$result->status = $request->status;
|
||
if ($request->record)
|
||
$result->record = $request->record;
|
||
$result->save();
|
||
return $this->success('操作成功');
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息中,请稍后再试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 查看订单状态
|
||
* *
|
||
* @param Request $request
|
||
* @return Factory|Application|JsonResponse|View
|
||
*/
|
||
public function get_order_status(Request $request)
|
||
{
|
||
try {
|
||
$id = $request->id;
|
||
$status = $request->status ?? 0;
|
||
if ($status) {
|
||
ConsultationRecords::where('id', $id)->update(['status' => $status]);
|
||
}
|
||
$result = ConsultationRecords::select('id', 'anchor_id', 'status', 'Remaining_duration')
|
||
->where('id', $id)->first();
|
||
return $this->success('ok', $result);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息中,请稍后再试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 商户 查看订单评价
|
||
* *
|
||
* @param Request $request
|
||
* @return Factory|Application|JsonResponse|View
|
||
*/
|
||
public function orderComment(Request $request)
|
||
{
|
||
try {
|
||
$id = $request->id;
|
||
$order = Order::where('id', $id)->whereIn('pay_status', [1, 4])->first();
|
||
if ($request->trade_no)
|
||
$order = Order::where('trade_no', $request->trade_no)->whereIn('pay_status', [1, 4])
|
||
->first();
|
||
if (!$order)
|
||
return $this->failure('未查询到该订单。');
|
||
$order->pic = json_decode($order->pic, true) ?? [];
|
||
$order->Praise = floatval($order->Praise);
|
||
$order->price = floatval($order->price);
|
||
$order->avatar = MerchantUsers::where('id', $request->merchant_user_id)->value('pic') ?? User::DefaultAvatar;
|
||
if ($order->type == 'consult') {
|
||
$record = ConsultationRecords::where('trade_no', $order->trade_no)->first();
|
||
$order->phone = $record->phone;
|
||
$order->duration = $record->duration;
|
||
$order->expect = $record->expect;
|
||
$order->duration = $record->duration;
|
||
$order->desc = $record->desc;
|
||
}
|
||
return $this->success('ok', $order);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息中,请稍后再试');
|
||
}
|
||
|
||
}
|
||
|
||
/** 打赏订单
|
||
* @param Request $request
|
||
* @param $info_id
|
||
* @return Factory|Application|JsonResponse|View
|
||
*/
|
||
public function payReward(Request $request, $info_id)
|
||
{
|
||
try {
|
||
//用户id
|
||
$user_id = $request->merchant_user_id;
|
||
$merchant_user = MerchantUser::select('nickname', 'mobile', 'openid')->where('id', $user_id)->first();
|
||
$wechatUser = session('wechat.oauth_user.new');
|
||
if ($wechatUser) {
|
||
$openid = $wechatUser->getId();
|
||
} else {
|
||
$openid = $merchant_user->openid;
|
||
}
|
||
if (config('app.debug')) {
|
||
$openid = 'odh7zsgI75iT8FRh0fGlSojc9PWM';
|
||
}
|
||
$type = $request->type ?? 'reward_info';
|
||
if (empty($openid))
|
||
throw new \Exception('打赏失败,未获取用户微信信息');
|
||
$merchant_id = $request->input('merchant_id');
|
||
if (empty($merchant_id))
|
||
throw new \Exception("打赏失败,获取到商家id");
|
||
$amount = $request->input('amount');
|
||
if (empty($amount))
|
||
return $this->failure("请输入打赏金额");
|
||
if (!is_numeric($amount) || (is_numeric($amount) && $amount < 0))
|
||
throw new \Exception('输入打赏金额格式错误');
|
||
$trade_no = \CommonUtilsService::getTradeNO();
|
||
$order = array(
|
||
'open_id' => $openid,
|
||
'price' => $amount,
|
||
'num' => 1,
|
||
'pay_type' => 'wechat',
|
||
'type' => $type,
|
||
'type_id' => $info_id,
|
||
'pay_status' => 0,
|
||
'trade_no' => $trade_no,
|
||
'from_openid' => $request->input('from_openid'),
|
||
'comment' => $request->input('comment'),
|
||
'merchant_id' => $merchant_id,
|
||
'account_id' => $user_id,
|
||
'name' => $merchant_user->nickname,
|
||
'mobile' => $merchant_user->mobile ?? 0,
|
||
'withdrawal_radio' => 100,
|
||
|
||
);
|
||
if ($type == 'reward_info') {
|
||
$title = MerchantInformation::where('id', $info_id)->value('title');
|
||
$title = '文章打赏:' . $title;
|
||
} elseif ($type == 'reward_activity') {
|
||
$title = CommunityActivity::where('id', $info_id)->value('title');
|
||
$title = '活动打赏:' . $title;
|
||
} else {
|
||
$title = '用户打赏';
|
||
}
|
||
$order = Order::create($order);
|
||
$callback = config('app.url') . '/api/s/h5/callback/reward/order/' . $trade_no;
|
||
$wx_pay = \WechatService::constructSWXPay($order, $openid, $title, $callback);
|
||
$order['wx_pay'] = $wx_pay;
|
||
return $this->success('ok', $order);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('ok', $order);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 商户版 --购买商城商品
|
||
* @param Request $request
|
||
* @return Factory|Application|JsonResponse|View
|
||
*/
|
||
public function BusinessMerchantShop(Request $request)
|
||
{
|
||
try {
|
||
$buy_type = $request->buy_type ?? 'normal';//normal:单独购买 group:拼团购买
|
||
$wechatUser = session('wechat.oauth_user.new');
|
||
$history_id = $request->history_id;
|
||
$merchant_user_id = $request->merchant_user_id ?? 0;
|
||
if ($wechatUser) {
|
||
$openid = $wechatUser->getId();
|
||
} else {
|
||
$openid = MerchantUsers::where('id', $merchant_user_id)->value('openid');
|
||
}
|
||
$goods = '默认规格';
|
||
$result = MerchantShop::where('id', $request->id)->where('is_show', 1)->first();
|
||
if (!$result)
|
||
return $this->failure('你购买的商品不存在或已下架。');
|
||
$sku_id = $request->sku_id;
|
||
if (!$sku_id && $result->pay_type == 'wechat')
|
||
return $this->failure('规格参数不存在,请稍后再试。');
|
||
if ($sku_id) {
|
||
$skus = json_decode($result->sku, true);
|
||
$skus = array_column($skus, null, 'sku_id');
|
||
$sku = $skus[$sku_id];
|
||
$price = $sku['price'];
|
||
$goods = $sku['name'];
|
||
$desc = $result->title . '-' . $sku['name'];
|
||
} else {
|
||
$price = $result->price;
|
||
$desc = $result->title;
|
||
$goods = $result->describe;
|
||
;
|
||
}
|
||
$group_id = null;
|
||
if ($buy_type && $buy_type == 'group') {
|
||
$time = date('Y-m-d H:i:s');
|
||
$group = CollageGroup::where('type', 'shop')->where('type_id', $request->id)->first();
|
||
if (!$group)
|
||
return $this->failure('拼团信息不存在');
|
||
$group_sku = json_decode($group->sku, true) ?? null;
|
||
if ($group_sku && sizeof($group_sku) > 0) {
|
||
$group_skus = array_column($group_sku, null, 'sku_id');
|
||
$sku = $group_skus[$sku_id];
|
||
$price = $sku['discount_price'];
|
||
} else {
|
||
$price = $group->price;
|
||
}
|
||
$group_id = $group->id;
|
||
$history = CollageGroupHistories::where('id', $history_id)->first();
|
||
if ($history) {
|
||
if ($history->deadline < $time)
|
||
return $this->failure('你慢了一步,拼团已过有效期');
|
||
if ($history->status == 1)
|
||
return $this->failure('你慢了一步,该团已被他人完成');
|
||
$m_order_ids = CollageGroupHistories::where('group_id', $history->group_id)
|
||
->where('m_user_id', $merchant_user_id)->where('status', 0)->where('deadline', '>', $time)
|
||
->pluck('m_order_id')->toArray();
|
||
$exists = TouristOrder::whereIn('id', $m_order_ids)->whereIn('pay_status', [1, 4])->first();
|
||
if ($exists)
|
||
return $this->failure('该活动你有尚未完成的拼团,请耐心等待');
|
||
$exists = CollageGroupHistories::with('tOrder')->whereHas('tOrder', function ($sql) {
|
||
$sql->whereIn('pay_status', [1, 4]);
|
||
})
|
||
->where('group_id', $group->id)->where('m_user_id', $merchant_user_id)
|
||
->where('status', 1)
|
||
->first();
|
||
if ($exists)
|
||
return $this->failure('你已成功拼团参与过该活动,无需重复参与');
|
||
}
|
||
}
|
||
|
||
$pay_price = $request->num * $price;
|
||
// if($pay_price!=$request->price) return $this->failure('支付价格与商品价格不一致。');
|
||
$anchor = Anchor::where('id', $result->anchor_id)->first();
|
||
$trade_no = $this->getTradeNo();
|
||
list($pay_type, $sub_mch_id) = MerchantAccount::payType($request->merchant_id);
|
||
$TouristOrder = new Order();
|
||
$TouristOrder->open_id = $openid;
|
||
$TouristOrder->price = floatval($pay_price);
|
||
$TouristOrder->pay_type = $pay_type == 'partner' ?: $result->pay_type;
|
||
$TouristOrder->type = 'shop';
|
||
$TouristOrder->num = $request->num;
|
||
$TouristOrder->type_id = $request->id;
|
||
$TouristOrder->trade_no = $trade_no;
|
||
$TouristOrder->group_id = $group_id;
|
||
$TouristOrder->desc = $desc;
|
||
$TouristOrder->from_openid = $request->from_openid;
|
||
$TouristOrder->share_channel_id = $request->share_channel_id;
|
||
$TouristOrder->merchant_id = $request->merchant_id ?? 0;
|
||
$TouristOrder->account_id = $merchant_user_id;
|
||
$TouristOrder->name = $request->name;
|
||
$TouristOrder->mobile = $request->mobile;
|
||
$TouristOrder->withdrawal_radio = $anchor->withdrawal_radio ?? 100;
|
||
$TouristOrder->goods = $goods;
|
||
$TouristOrder->alliance_id = $request->alliance_id ?? null;
|
||
$ShopRecive = new ShopRecive();
|
||
$ShopRecive->name = $request->name;
|
||
$ShopRecive->mobile = $request->mobile;
|
||
$ShopRecive->address = $request->address;
|
||
$ShopRecive->order_status = $request->order_status ?? 0;
|
||
$ShopRecive->account_id = $request->merchant_user_id ?? 0;
|
||
$ShopRecive->merchant_id = $request->merchant_id ?? 0;
|
||
if ($price == 0) {
|
||
$TouristOrder->pay_status = 1;
|
||
$TouristOrder->save();
|
||
$ShopRecive->order_id = $TouristOrder->id;
|
||
$ShopRecive->save();
|
||
$TouristOrder->pay_config = null;
|
||
$TouristOrder->wx_pay = [];
|
||
$TouristOrder->address = $request->address;
|
||
//发送通知
|
||
$way = 'merchant';
|
||
$res = MerchantShop::where('id', $TouristOrder->type_id)->first();
|
||
//给用户
|
||
\CommonUtilsService::sendBuySuccessNoticeToUser(
|
||
$res,
|
||
$TouristOrder->open_id,
|
||
$TouristOrder->type,
|
||
$TouristOrder->trade_no,
|
||
$TouristOrder->price
|
||
);
|
||
//给商户
|
||
$merchant = MerchantAccount::where('id', $TouristOrder->merchant_id)->first();
|
||
$merchant_openid = $merchant->openid ?? '';
|
||
if (!$merchant_openid) {
|
||
$merchant_openid = Anchor::where('m_id', $res->merchant_id)->value('openid');
|
||
}
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$res,
|
||
$merchant_openid,
|
||
$way,
|
||
$TouristOrder->price,
|
||
$TouristOrder->mobile,
|
||
$TouristOrder->name
|
||
);
|
||
if ($TouristOrder->merchant_id == 491) {
|
||
//给客服脱单姐 管理员
|
||
$openids = [
|
||
"oPC_2vn6Q3M5jQpw9xAS7NNCMfjs",
|
||
"oPC_2vudkf3stdiNgjA-e2n6t9_M",
|
||
"oPC_2vtrwOLgWHLwVEFTFsJ7N7fw",
|
||
"oPC_2vt7nGwKk_OFzJL70SlVuTiU",
|
||
"oPC_2vg_Eur-Wa_Vwnx9JiyRVn9Q
|
||
"
|
||
];
|
||
foreach ($openids as $openid) {
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$res,
|
||
$openid,
|
||
'merchant',
|
||
$TouristOrder->price,
|
||
$TouristOrder->mobile,
|
||
$TouristOrder->namee
|
||
);
|
||
}
|
||
|
||
}
|
||
//发送推荐人
|
||
if ($TouristOrder->from_openid && $TouristOrder->from_openid != 'null') {
|
||
$way = 'recommend';
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$res,
|
||
$TouristOrder->from_openid,
|
||
$way,
|
||
$TouristOrder->price,
|
||
$TouristOrder->mobile,
|
||
$TouristOrder->name
|
||
);
|
||
}
|
||
//短信通知商家
|
||
$jump_url = env('APP_URL') . '/pu_m/#/earningsRecord?merchant_id=' . $merchant->id;
|
||
$short_url = \CommonUtilsService::shortUrl(env('APP_URL') . '/h5/#/jump_url?url=' . $jump_url);
|
||
$title = $res->title;
|
||
if (mb_strlen($title) > 5) {
|
||
$title = mb_substr($title, 0, 5, 'utf-8') . '...';
|
||
}
|
||
$message = '有用户下单了~ ' . $TouristOrder->name . '购买了平台的《' . $title . '》' . $TouristOrder->price .
|
||
'元,点击' . $short_url['url'] . ' 查看详情';
|
||
Messenger::sendSMS($merchant->mobile, $message);
|
||
//增加记录
|
||
Message::create([
|
||
'phone' => $merchant->mobile,
|
||
'message' => $message,
|
||
'confirmed' => 1,
|
||
'code' => '购买通知',
|
||
'ip' => request() ? request()->ip() : '127.0.0.1',
|
||
]);
|
||
//插入购买通知
|
||
$content = $TouristOrder->name . '购买了【' . $res->title . '】查看订单详情>>';
|
||
SaasNotice::addRecord(
|
||
$TouristOrder->merchant_id,
|
||
$TouristOrder->account_id,
|
||
'order',
|
||
$TouristOrder->id,
|
||
$content,
|
||
0
|
||
);
|
||
return $this->success('ok', $TouristOrder);
|
||
}
|
||
$TouristOrder->save();
|
||
$ShopRecive->order_id = $TouristOrder->id;
|
||
$ShopRecive->save();
|
||
if ($buy_type == 'group') {
|
||
if ($request->history_id) {
|
||
$history = CollageGroupHistories::find($request->history_id);
|
||
$deadline = $history->deadline;
|
||
$is_initiator = 0;
|
||
$CollageGroupHistories = new CollageGroupHistories();
|
||
$CollageGroupHistories->m_user_id = $TouristOrder->account_id;
|
||
$CollageGroupHistories->group_id = $TouristOrder->group_id;
|
||
$CollageGroupHistories->m_order_id = $TouristOrder->id;
|
||
$CollageGroupHistories->group_master_id = $request->history_id;
|
||
$CollageGroupHistories->is_initiator = $is_initiator;
|
||
$CollageGroupHistories->status = 0;
|
||
$CollageGroupHistories->deadline = $deadline;
|
||
$CollageGroupHistories->save();
|
||
} else {
|
||
//分享不带history_id 就是团长
|
||
$deadline = date('Y-m-d H:i:s', strtotime('+' . $group->expire_in . 'hours'));
|
||
$is_initiator = 1;
|
||
$CollageGroupHistories = new CollageGroupHistories();
|
||
$CollageGroupHistories->m_user_id = $TouristOrder->account_id;
|
||
$CollageGroupHistories->group_id = $TouristOrder->group_id;
|
||
$CollageGroupHistories->m_order_id = $TouristOrder->id;
|
||
$CollageGroupHistories->is_initiator = $is_initiator;
|
||
$CollageGroupHistories->status = 0;
|
||
$CollageGroupHistories->deadline = $deadline;
|
||
$CollageGroupHistories->save();
|
||
$CollageGroupHistories->group_master_id = $CollageGroupHistories->id;
|
||
$CollageGroupHistories->save();
|
||
}
|
||
}
|
||
$callback = config('app.url') . '/api/app/callback/Community/' . $trade_no;
|
||
$attributes = array(
|
||
'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP...
|
||
'body' => $desc,
|
||
'detail' => $result->title,
|
||
'out_trade_no' => $trade_no,
|
||
'total_fee' => round($price * 100) * $request->num,
|
||
'notify_url' => $callback, // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
||
'openid' => $openid,
|
||
'order_id' => $TouristOrder->id,
|
||
);
|
||
if ($pay_type == 'partner') {
|
||
$result = WechatService::partnerPay($TouristOrder->id, $sub_mch_id, $price * $request->num, $openid, $trade_no, $callback, $desc);
|
||
} else {
|
||
$result = WechatService::officialPay($attributes);
|
||
}
|
||
//$result = \WechatService::officialPay($attributes);
|
||
return $this->success('ok', $result);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息中,请稍后再试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 商户版- 购买社区活动
|
||
* @param Request $request
|
||
* @return Factory|Application|JsonResponse|View
|
||
*/
|
||
public function BusinessCommunityPayOrder(Request $request)
|
||
{
|
||
try {
|
||
$time = date('Y-m-d H:i:s');
|
||
$history_id = $request->history_id;
|
||
$buy_type = $request->buy_type ?? 'normal';//normal:单独购买 group:拼团购买
|
||
$wechatUser = session('wechat.oauth_user.new');
|
||
$merchant_user_id = $request->merchant_user_id ?? 0;
|
||
$sign_buy = $request->sign_buy;
|
||
$user_coupon_id = $request->user_coupons_id;
|
||
$MerchantUser = MerchantUsers::select('openid', 'mobile', 'nickname')->where('id', $merchant_user_id)
|
||
->first();
|
||
if ($wechatUser) {
|
||
$openid = $wechatUser->getId();
|
||
} else {
|
||
$openid = $MerchantUser->openid;
|
||
}
|
||
if ($user_coupon_id && $buy_type == 'group') {
|
||
return $this->failure('优惠券与团购不能同时使用');
|
||
}
|
||
$result = CommunityActivity::where('id', $request->id)->first();
|
||
if (!$result)
|
||
return $this->failure('你参与的活动不存在或已下架。');
|
||
// if (empty($result->status)) return $this->failure("该活动已下架");
|
||
//活动不能重复参与
|
||
if ($result->class == 'one' && $result->merchant_id != 44) {
|
||
$is_join = TouristOrder::where('type', 'community')->where('type_id', $request->id)
|
||
->whereIn('pay_status', [1, 4])->where('account_id', $merchant_user_id)
|
||
->first();
|
||
if ($is_join)
|
||
return $this->failure('已参与,请勿重复报名');
|
||
}
|
||
if ($result->class == 'one' && $result->apply_deadline) {
|
||
if ($result->apply_deadline <= $time) {
|
||
if (!$sign_buy) {
|
||
return $this->failure('该活动已截止报名,看看其他活动吧');
|
||
}
|
||
}
|
||
}
|
||
$sku_id = $request->sku_id;
|
||
if (!$sku_id && $result->pay_type == 'wechat')
|
||
return $this->failure('规格参数不存在,请稍后再试。');
|
||
if ($user_coupon_id) {
|
||
//$result_array = $result->toArray();
|
||
$user_coupon = UserCoupon::where('id', $user_coupon_id)->where('status', 0)
|
||
->where('m_id', $request->merchant_id)->where('m_user_id', $merchant_user_id)
|
||
->first();
|
||
if (!$user_coupon) {
|
||
return $this->failure('用户优惠券不存在');
|
||
}
|
||
$coupon = Coupon::where('id', $user_coupon->coupons_id)->where('type_id', $result['id'])
|
||
->where('type', 'community')
|
||
->where('m_id', $request->merchant_id)
|
||
->first();
|
||
if (!$coupon) {
|
||
return $this->failure('优惠券不存在');
|
||
}
|
||
}
|
||
if ($sku_id) {
|
||
$skus = json_decode($result['sku'], true);
|
||
$skus = array_column($skus, null, 'sku_id');
|
||
$sku = $skus[$sku_id];
|
||
|
||
$total_limit_num = $sku['total_limit_num'] ?? 0;
|
||
$sku_buy_num = (new Order)->getSkuBuyNum($request->id, $request->merchant_id, $sku_id);
|
||
if ($total_limit_num && $total_limit_num < ($sku_buy_num + count($request->linkmen))) {
|
||
return $this->failure('报名人数已超限制');
|
||
}
|
||
$member_num = count($request->linkmen);
|
||
$member_num = $request->num ?: $member_num;
|
||
if ($user_coupon_id) {
|
||
switch ($coupon->coupon_type) {
|
||
case 1:
|
||
$price = 0.00;
|
||
break;
|
||
case 2:
|
||
if (isset($sku['num']) && $sku['num'] == 0) {//不限人数, 通过报名信息判断数量
|
||
$price = number_format($sku['price'] * $member_num * $coupon->discount_rate, 2, '.', '');
|
||
} else {
|
||
$price = number_format($sku['price'] * $coupon->discount_rate, 2, '.', '');
|
||
}
|
||
break;
|
||
case 3:
|
||
if (isset($sku['num']) && $sku['num'] == 0) {
|
||
$price = number_format($sku['price'] * $member_num - $coupon->discount_rate, 2, '.', '');
|
||
} else {
|
||
$price = number_format($sku['price'] - $coupon->discount_rate, 2, '.', '');
|
||
}
|
||
// if ($price <= 0 && $sku['price'] != 0) return $this->failure("优惠券不适合此规格");
|
||
break;
|
||
default:
|
||
$price = $sku['price'];
|
||
break;
|
||
}
|
||
} else {
|
||
if (isset($sku['num']) && $sku['num'] == 0) {//不限人数, 通过报名信息判断数量
|
||
$price = number_format($sku['price'] * $member_num, 2, '.', '');
|
||
} else {
|
||
$price = $sku['price'];
|
||
|
||
}
|
||
}
|
||
$desc = $result['title'] . '-' . $sku['name'] . '';
|
||
$goods = $sku['name'] . '';
|
||
} else {
|
||
if ($user_coupon_id) {
|
||
$user_coupon = UserCoupon::where('id', $user_coupon_id)->with('coupon')
|
||
->first();
|
||
if ($user_coupon && $user_coupon->coupon) {
|
||
switch ($user_coupon->coupon->coupon_type) {
|
||
case 1:
|
||
$price = 0.00;
|
||
break;
|
||
case 2:
|
||
$price = number_format($result['price'] * $user_coupon->coupon->discount_rate, 2);
|
||
break;
|
||
case 3:
|
||
$temp = number_format($result['price'] - $user_coupon->coupon->discount_rate, 2);
|
||
if ($temp < 0) {
|
||
$price = 0.00;
|
||
} else {
|
||
$price = $temp;
|
||
}
|
||
break;
|
||
default:
|
||
$price = $result['price'];
|
||
break;
|
||
}
|
||
}
|
||
} else {
|
||
$price = $result['price'];
|
||
}
|
||
$goods = null;
|
||
$desc = $result['title'];
|
||
}
|
||
$group_id = null;
|
||
if ($buy_type && $buy_type == 'group') {
|
||
$time = date('Y-m-d H:i:s');
|
||
$group = CollageGroup::where('type', 'community')->where('type_id', $request->id)->first();
|
||
if (!$group)
|
||
return $this->failure('拼团信息不存在');
|
||
$sku = json_decode($group->sku, true) ?? null;
|
||
if (sizeof($sku) > 0) {
|
||
foreach ($sku as $key => $value) {
|
||
foreach ($value as $vk => $vv) {
|
||
if ($vk == 'sku_id' && $vv == $sku_id) {
|
||
$price = $value['discount_price'];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
$price = $group->price;
|
||
}
|
||
$group_id = $group->id;
|
||
$history_id = $request->history_id;
|
||
$history = CollageGroupHistories::where('id', $history_id)->first();
|
||
if ($history) {
|
||
if ($history->deadline < $time)
|
||
return $this->failure('你慢了一步,拼团已过有效期');
|
||
if ($history->status == 1)
|
||
return $this->failure('你慢了一步,该团已被他人完成');
|
||
$m_order_ids = CollageGroupHistories::where('group_id', $history->group_id)
|
||
->where('m_user_id', $merchant_user_id)->where('status', 0)->where('deadline', '>', $time)
|
||
->pluck('m_order_id')->toArray();
|
||
$exists = TouristOrder::whereIn('id', $m_order_ids)->whereIn('pay_status', [1, 4])->first();
|
||
if ($exists)
|
||
return $this->failure('该活动你有尚未完成的拼团,请耐心等待');
|
||
$exists = CollageGroupHistories::with('tOrder')->whereHas('tOrder', function ($sql) {
|
||
$sql->whereIn('pay_status', [1, 4]);
|
||
})
|
||
->where('group_id', $group->id)->where('m_user_id', $merchant_user_id)
|
||
->where('status', 1)
|
||
->first();
|
||
if ($exists)
|
||
return $this->failure('你已成功拼团参与过该活动,无需重复参与');
|
||
}
|
||
}
|
||
$anchor = Anchor::where('id', $result->anchor_id)->first();
|
||
if ($request->merchant_id == 44 || $request->merchant_id == 69) {
|
||
$trade_no = "saas_" . $this->getTradeNO();
|
||
} else {
|
||
$trade_no = $this->getTradeNo();
|
||
}
|
||
list($pay_type, $sub_mch_id) = MerchantAccount::payType($request->merchant_id);
|
||
$TouristOrder = new Order();
|
||
$TouristOrder->open_id = $openid;
|
||
$TouristOrder->price = floatval($price);
|
||
$TouristOrder->pay_type = $pay_type == "partner" ? $pay_type : $result->pay_type;
|
||
$TouristOrder->type = 'community';
|
||
$TouristOrder->type_id = $request->id;
|
||
$TouristOrder->trade_no = $trade_no;
|
||
$TouristOrder->desc = $desc;
|
||
$TouristOrder->goods = $goods;
|
||
if ($user_coupon_id) {
|
||
$TouristOrder->user_coupon_id = $user_coupon_id;
|
||
}
|
||
if ($buy_type && $buy_type == 'group') {
|
||
$TouristOrder->group_id = $group_id;
|
||
}
|
||
$TouristOrder->from_openid = $request->from_openid;
|
||
$TouristOrder->share_channel_id = $request->share_channel_id;
|
||
$TouristOrder->merchant_id = $request->merchant_id ?? 0;
|
||
$TouristOrder->account_id = $merchant_user_id;
|
||
$link_name = $request->linkmen['name'] ?? ($request->linkmen[0]['name'] ?? null);
|
||
$link_mobile = $request->linkmen['mobile'] ?? ($request->linkmen[0]['mobile'] ?? '');
|
||
$TouristOrder->name = $request->name ?? ($MerchantUser->nickname ?? $link_name);
|
||
$TouristOrder->mobile = $request->mobile ?? ($MerchantUser->mobile ?? $link_mobile);
|
||
$TouristOrder->area_code = $request->area_code;
|
||
$TouristOrder->insurance = $result->insurance;
|
||
if ($request->insurance_info)
|
||
$TouristOrder->insurance_info = json_encode($request->insurance_info);
|
||
if (is_array($request->linkmen) && count($request->linkmen)) {
|
||
$linkmen = $request->linkmen;
|
||
foreach ($linkmen as &$linkman) {
|
||
if (!$linkman['mobile'])
|
||
$linkman['mobile'] = "18888888888";
|
||
if (!$linkman['name'])
|
||
$linkman['name'] = "嘉宾";
|
||
if (isset($linkman['sex']) && empty($linkman['sex']))
|
||
$linkman['sex'] = "男";
|
||
}
|
||
$TouristOrder->linkmen = json_encode($linkmen);
|
||
} else {
|
||
return $this->failure("请填写报名人信息");
|
||
}
|
||
|
||
|
||
$TouristOrder->withdrawal_radio = $anchor->withdrawal_radio ?? 100;
|
||
$TouristOrder->alliance_id = $request->alliance_id ?? null;
|
||
$TouristOrder->sku_id = $sku_id;
|
||
if ($price == 0) {
|
||
if ($TouristOrder->type == 'community') {
|
||
$TouristOrder->remark = $this->numMember($TouristOrder);
|
||
}
|
||
$way = 'merchant';
|
||
$merchant = MerchantAccount::where('id', $result->merchant_id)->first();
|
||
$TouristOrder->pay_status = 1;
|
||
$TouristOrder->save();
|
||
$TouristOrder->pay_config = null;
|
||
$TouristOrder->wx_pay = [];
|
||
//发送通知
|
||
//判断是服务还是活动
|
||
$res = CommunityActivity::where('id', $TouristOrder->type_id)->first();
|
||
if ($res->class == 'one')
|
||
$class = 'activity';
|
||
if ($res->class == 'many')
|
||
$class = 'service';
|
||
\CommonUtilsService::sendBuySuccessNoticeToUser(
|
||
$res,
|
||
$TouristOrder->open_id,
|
||
$class,
|
||
$trade_no,
|
||
$TouristOrder->price
|
||
);
|
||
//发送商户
|
||
$merchant_openid = $merchant->openid ?? '';
|
||
if (!$merchant_openid) {
|
||
$merchant_openid = Anchor::where('id', $res->anchor_id)->value('openid');
|
||
}
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$res,
|
||
$merchant_openid,
|
||
$way,
|
||
$TouristOrder->price,
|
||
$TouristOrder->mobile,
|
||
$TouristOrder->name
|
||
);
|
||
//发送推荐人
|
||
if ($TouristOrder->from_openid && $TouristOrder->from_openid != 'null') {
|
||
$way = 'recommend';
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$res,
|
||
$TouristOrder->from_openid,
|
||
$way,
|
||
$TouristOrder->price,
|
||
$TouristOrder->mobile,
|
||
$TouristOrder->name
|
||
);
|
||
}
|
||
if ($TouristOrder->merchant_id == 491) {
|
||
//给客服脱单姐 管理员
|
||
$openids = [
|
||
"oPC_2vn6Q3M5jQpw9xAS7NNCMfjs",
|
||
"oPC_2vudkf3stdiNgjA-e2n6t9_M",
|
||
"oPC_2vtrwOLgWHLwVEFTFsJ7N7fw",
|
||
"oPC_2vt7nGwKk_OFzJL70SlVuTiU",
|
||
"oPC_2vg_Eur-Wa_Vwnx9JiyRVn9Q
|
||
"
|
||
];
|
||
foreach ($openids as $openid) {
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness($res, $openid, 'merchant', $TouristOrder->price, $TouristOrder->mobile, $TouristOrder->name);
|
||
}
|
||
|
||
}
|
||
$users = new UserMember();
|
||
$users->type = 'community';
|
||
$users->type_id = $result->id;
|
||
$users->m_id = $request->merchant_id ?? 0;
|
||
$users->m_user_id = $merchant_user_id;
|
||
if ($user_coupon_id) {
|
||
$users->coupons_id = $user_coupon_id;
|
||
$users->pay_type = 'coupon';
|
||
} else {
|
||
$users->pay_type = 'wechat';
|
||
}
|
||
$users->save();
|
||
if ($user_coupon_id) {
|
||
$user_coupon->status = 1;
|
||
$user_coupon->save();
|
||
}
|
||
if (count($request->linkmen) > 1) {
|
||
//多报名人信息 增加手动报名记录
|
||
AddVirtualMember::dispatch($request->linkmen, $res, $TouristOrder)->onQueue('love');
|
||
}
|
||
|
||
//添加购买通知记录
|
||
$content = $result->name . '购买了【' . $res->title . '】查看订单详情>>';
|
||
SaasNotice::addRecord(
|
||
$TouristOrder->merchant_id,
|
||
$TouristOrder->account_id,
|
||
'order',
|
||
$TouristOrder->id,
|
||
$content,
|
||
0
|
||
);
|
||
|
||
// 友福活动将被邀请人添加到客户
|
||
$orderService = new OrderService();
|
||
$orderService->storeUftxCustomer($TouristOrder);
|
||
return $this->success('ok', $TouristOrder);
|
||
} else {
|
||
$TouristOrder->save();
|
||
if ($buy_type == 'group') {
|
||
if ($request->history_id) {
|
||
$history = CollageGroupHistories::find($request->history_id);
|
||
$deadline = $history->deadline;
|
||
$is_initiator = 0;
|
||
$CollageGroupHistories = new CollageGroupHistories();
|
||
$CollageGroupHistories->m_user_id = $TouristOrder->account_id;
|
||
$CollageGroupHistories->group_id = $TouristOrder->group_id;
|
||
$CollageGroupHistories->m_order_id = $TouristOrder->id;
|
||
$CollageGroupHistories->group_master_id = $request->history_id;
|
||
$CollageGroupHistories->is_initiator = $is_initiator;
|
||
$CollageGroupHistories->status = 0;
|
||
$CollageGroupHistories->deadline = $deadline;
|
||
$CollageGroupHistories->save();
|
||
} else {
|
||
//分享不带history_id 就是团长
|
||
$deadline = date('Y-m-d H:i:s', strtotime('+' . $group->expire_in . 'hours'));
|
||
$is_initiator = 1;
|
||
$CollageGroupHistories = new CollageGroupHistories();
|
||
$CollageGroupHistories->m_user_id = $TouristOrder->account_id;
|
||
$CollageGroupHistories->group_id = $TouristOrder->group_id;
|
||
$CollageGroupHistories->m_order_id = $TouristOrder->id;
|
||
$CollageGroupHistories->is_initiator = $is_initiator;
|
||
$CollageGroupHistories->status = 0;
|
||
$CollageGroupHistories->deadline = $deadline;
|
||
$CollageGroupHistories->save();
|
||
$CollageGroupHistories->group_master_id = $CollageGroupHistories->id;
|
||
$CollageGroupHistories->save();
|
||
}
|
||
}
|
||
$callback = config('app.url') . '/api/app/callback/Community/' . $trade_no;
|
||
$attributes = array(
|
||
'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP...
|
||
'body' => $desc,
|
||
'detail' => $result->title,
|
||
'out_trade_no' => $trade_no,
|
||
'total_fee' => round($price * 100),
|
||
'notify_url' => $callback, // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
||
'openid' => $openid,
|
||
'order_id' => $TouristOrder->id,
|
||
);
|
||
if ($pay_type == 'partner') {
|
||
$res = WechatService::partnerPay($TouristOrder->id, $sub_mch_id, $price, $attributes['openid'], $attributes['out_trade_no'], $attributes['notify_url'], $attributes['body']);
|
||
} else {
|
||
$res = WechatService::officialPay($attributes);
|
||
}
|
||
return $this->success('ok', $res);
|
||
}
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息中,请稍后再试');
|
||
}
|
||
}
|
||
|
||
public function payCommunityOrder($request, $id, $user_id, $openid)
|
||
{
|
||
$sign_buy = $request->sign_buy;
|
||
|
||
$result = CommunityActivity::where('id', $id)->where('status', 1)->first();
|
||
if (!$result)
|
||
return ['code' => 1, 'msg' => '你参与的活动不存在或已下架。'];
|
||
//活动不能重复参与
|
||
if ($result->class == 'one' && $result->merchant_id != 44) {
|
||
$is_join = TouristOrder::where('type', 'community')->where('type_id', $id)
|
||
->whereIn('pay_status', [1, 4])->where('account_id', $user_id)
|
||
->first();
|
||
if ($is_join)
|
||
return ['code' => 1, 'msg' => '已参与,请勿重复报名'];
|
||
}
|
||
if ($result->class == 'one' && $result->apply_deadline) {
|
||
if ($result->apply_deadline <= date('Y-m-d H:i:s')) {
|
||
if (!$sign_buy) {
|
||
return ['code' => 1, '该活动已截止报名,看看其他活动吧'];
|
||
}
|
||
}
|
||
}
|
||
$sku_id = $request->sku_id;
|
||
if (!$sku_id && $result->pay_type == 'wechat')
|
||
return ['code' => 1, '规格参数不存在,请稍后再试。'];
|
||
if ($sku_id) {
|
||
$skus = json_decode($result->sku, true);
|
||
$skus = array_column($skus, null, 'sku_id');
|
||
$sku = $skus[$sku_id];
|
||
$price = $sku['price'];
|
||
$desc = $result->title . '-' . $sku['name'] . '';
|
||
$goods = $sku['name'] . '';
|
||
} else {
|
||
$price = $result->price;
|
||
$goods = null;
|
||
$desc = $result->title;
|
||
}
|
||
|
||
$anchor = Anchor::where('id', $result->anchor_id)->first();
|
||
$trade_no = $this->getTradeNo();
|
||
$order = new Order();
|
||
$order->open_id = $openid;
|
||
$order->price = floatval($price);
|
||
$order->pay_type = $result->pay_type;
|
||
$order->type = 'community';
|
||
$order->type_id = $request->id;
|
||
$order->trade_no = $trade_no;
|
||
$order->desc = $desc;
|
||
$order->goods = $goods;
|
||
$order->from_openid = $request->from_openid;
|
||
$order->share_channel_id = $request->share_channel_id;
|
||
$order->merchant_id = $request->merchant_id ?? 0;
|
||
$order->account_id = $user_id;
|
||
$link_name = $request->linkmen['name'] ?? ($request->linkmen[0]['name'] ?? null);
|
||
$link_mobile = $request->linkmen['mobile'] ?? ($request->linkmen[0]['mobile'] ?? '');
|
||
$order->name = $request->name ?? ($MerchantUser->nickname ?? $link_name);
|
||
$order->mobile = $request->mobile ?? ($MerchantUser->mobile ?? $link_mobile);
|
||
$order->area_code = $request->area_code;
|
||
$order->insurance = $result->insurance;
|
||
if ($request->insurance_info)
|
||
$order->insurance_info = json_encode($request->insurance_info);
|
||
if ($request->linkmen)
|
||
$order->linkmen = json_encode($request->linkmen);
|
||
|
||
$order->withdrawal_radio = $anchor->withdrawal_radio ?? 100;
|
||
$order->alliance_id = $request->alliance_id ?? null;
|
||
$order->sku_id = $request->sku_id;
|
||
if ($price == 0) {
|
||
$order->pay_status = 1;
|
||
$way = 'merchant';
|
||
$merchant = MerchantAccount::where('id', $result->merchant_id)->first();
|
||
$order->pay_status = 1;
|
||
$order->save();
|
||
$order->pay_config = null;
|
||
$order->wx_pay = [];
|
||
//发送通知
|
||
//判断是服务还是活动
|
||
$res = CommunityActivity::where('id', $order->type_id)->first();
|
||
if ($res->class == 'one')
|
||
$class = 'activity';
|
||
if ($res->class == 'many')
|
||
$class = 'service';
|
||
\CommonUtilsService::sendBuySuccessNoticeToUser(
|
||
$res,
|
||
$order->open_id,
|
||
$class,
|
||
$trade_no,
|
||
$order->price
|
||
);
|
||
//发送商户
|
||
$merchant_openid = $merchant->openid ?? '';
|
||
if (!$merchant_openid) {
|
||
$merchant_openid = Anchor::where('id', $res->anchor_id)->value('openid');
|
||
}
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$res,
|
||
$merchant_openid,
|
||
$way,
|
||
$order->price,
|
||
$order->mobile,
|
||
$order->name
|
||
);
|
||
//发送推荐人
|
||
if ($order->from_openid && $order->from_openid != 'null') {
|
||
$way = 'recommend';
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$res,
|
||
$order->from_openid,
|
||
$way,
|
||
$order->price,
|
||
$order->mobile,
|
||
$order->name
|
||
);
|
||
}
|
||
//添加购买通知记录
|
||
$content = $result->name . '购买了【' . $res->title . '】查看订单详情>>';
|
||
SaasNotice::addRecord(
|
||
$order->merchant_id,
|
||
$order->account_id,
|
||
'order',
|
||
$order->id,
|
||
$content,
|
||
0
|
||
);
|
||
return ['code' => 0, 'data' => $order];
|
||
}
|
||
$order->save();
|
||
$order->need_pay = $price ? 1 : 0;
|
||
return ['code' => 0, 'data' => $order];
|
||
}
|
||
|
||
public function payCourseOrder($request, $course_id, $user_id, $openid)
|
||
{
|
||
$course = Course::where('id', $course_id)->first();
|
||
if (empty($course))
|
||
return ['code' => 1, 'msg' => "该课程已下线"];
|
||
$trade_no = $this->getTradeNo();
|
||
$merchant_user = MerchantUser::where('id', $user_id)->first();
|
||
$order = new TouristOrder();
|
||
$order->open_id = $openid;
|
||
$order->price = floatval($course->charge);
|
||
$order->pay_type = 'wechat';
|
||
$order->type = 'course';
|
||
$order->type_id = $course_id;
|
||
$order->trade_no = $trade_no;
|
||
$order->desc = $course->title;
|
||
$order->from_openid = $request->from_openid;
|
||
$order->share_channel_id = $request->share_channel_id;
|
||
$order->merchant_id = $request->merchant_id;
|
||
$order->account_id = $request->merchant_user_id;
|
||
$link_name = $request->linkmen['name'] ?? ($request->linkmen[0]['name'] ?? null);
|
||
$link_mobile = $request->linkmen['mobile'] ?? ($request->linkmen[0]['mobile'] ?? '');
|
||
$order->name = $request->name ?? ($MerchantUser->nickname ?? $link_name);
|
||
$order->mobile = $request->mobile ?? ($MerchantUser->mobile ?? $link_mobile);
|
||
$order->area_code = $request->area_code;
|
||
$order->alliance_id = $request->alliance_id ?? null;
|
||
if ($request->has('mobile')) {
|
||
$mobile = $request->mobile;
|
||
} else {
|
||
$mobile = $merchant_user->mobile;
|
||
}
|
||
// if($user_coupon_id){
|
||
// $order->user_coupon_id = $user_coupon_id;
|
||
// }
|
||
$order->mobile = $mobile ?: '匿名用户';
|
||
$order->withdrawal_radio = 100;
|
||
$user_course = new UserCourses();
|
||
$user_course->user_id = 0;
|
||
$user_course->course_id = $course_id;
|
||
$user_course->type = 'business';
|
||
$user_course->trade_no = $trade_no;
|
||
$user_course->status = 0;
|
||
$user_course->open_id = $openid;
|
||
$user_course->merchant_user_id = $user_id;
|
||
if ($course->charge == 0) {
|
||
$way = 'merchant';
|
||
$order->pay_status = 1;
|
||
$order->save();
|
||
$user_course->status = 1;
|
||
$user_course->save();
|
||
if (!empty($user_coupon)) {
|
||
$user_coupon->status = 1;
|
||
$user_coupon->save();
|
||
}
|
||
//发送通知
|
||
//给用户
|
||
\CommonUtilsService::sendBuySuccessNoticeToUser(
|
||
$course,
|
||
$order->open_id,
|
||
$order->type,
|
||
$trade_no,
|
||
$order->price
|
||
);
|
||
//给商户
|
||
$merchant_openid = $course->open_id;
|
||
if (empty($merchant_id))
|
||
$merchant_openid = Anchor::where('m_id', $order->merchant_id)
|
||
->value('openid');
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$course,
|
||
$merchant_openid,
|
||
$way,
|
||
$order->price,
|
||
$order->mobile,
|
||
$order->name
|
||
);
|
||
//发送推荐人
|
||
if ($order->from_openid && $order->from_openid != 'null') {
|
||
$way = 'recommend';
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$course,
|
||
$order->from_openid,
|
||
$way,
|
||
$order->price,
|
||
$order->mobile,
|
||
$order->name
|
||
);
|
||
}
|
||
//短信通知商家
|
||
$jump_url = env('APP_URL') . '/pu_m/#/earningsRecord?merchant_id=' . $order->merchant_id;
|
||
$short_url = \CommonUtilsService::shortUrl(env('APP_URL') . '/h5/#/jump_url?url=' . $jump_url);
|
||
$title = $course->title;
|
||
if (mb_strlen($title) > 5) {
|
||
$title = mb_substr($title, 0, 5, 'utf-8') . '...';
|
||
}
|
||
$message = '有用户下单了~ ' . $order->name . '购买了平台的《' . $title . '》' .
|
||
$order->price . '元,点击' . $short_url['url'] . ' 查看详情';
|
||
$anchor_mobile = Anchor::where('id', $request->merchant_id)->value('mobile');
|
||
$this->sentMessage($anchor_mobile, $message);
|
||
$content = $order->name . '购买了【' . $course->title . '】查看订单详情>>';
|
||
SaasNotice::addRecord(
|
||
$order->merchant_id,
|
||
$order->account_id,
|
||
'order',
|
||
$order->id,
|
||
$content,
|
||
0
|
||
);
|
||
$user_course->save();
|
||
}
|
||
$order->save();
|
||
$order->need_pay = $course->charge ? 1 : 0;
|
||
return ['code' => 0, 'data' => $order];
|
||
|
||
}
|
||
|
||
public function payConsultOrder($request, $consult_id, $user_id, $openid)
|
||
{
|
||
$num = $request->num ?? 1;
|
||
$trade_no = $this->getTradeNO();
|
||
$from_open_id = $request->from_openid ?? null;
|
||
$history_id = $request->history_id;
|
||
$buy_type = $request->buy_type ?? 'normal';//normal:单独购买 group:拼团购买
|
||
$user = MerchantUser::where('id', $user_id)->first();
|
||
if (!$user)
|
||
throw new \Exception("用户信息不存在");
|
||
$config = Consultation::where('id', $consult_id)->first();
|
||
if (empty($config))
|
||
return ['code' => 1, 'msg' => "该咨询已下线"];
|
||
$link_name = $request->linkmen['name'] ?? ($request->linkmen[0]['name'] ?? null);
|
||
$link_mobile = $request->linkmen['mobile'] ?? ($request->linkmen[0]['mobile'] ?? '');
|
||
$group_id = null;
|
||
if ($buy_type && $buy_type == 'group') {
|
||
$time = date('Y-m-d H:i:s');
|
||
$group = CollageGroup::where('type', 'community')->where('type_id', $request->id)->first();
|
||
if (!$group)
|
||
return $this->failure('拼团信息不存在');
|
||
$price = $group->price;
|
||
$group_id = $group->id;
|
||
$history_id = $request->history_id;
|
||
if ($history_id) {
|
||
$history = CollageGroupHistories::where('id', $history_id)->first();
|
||
if ($history) {
|
||
if ($history->deadline < $time)
|
||
return $this->failure('你慢了一步,拼团已过有效期');
|
||
if ($history->status == 1)
|
||
return $this->failure('你慢了一步,该团已被他人完成');
|
||
$m_order_ids = CollageGroupHistories::where('group_id', $history->group_id)
|
||
->where('m_user_id', $user_id)->where('status', 0)->where('deadline', '>', $time)
|
||
->pluck('m_order_id')->toArray();
|
||
$exists = TouristOrder::whereIn('id', $m_order_ids)->whereIn('pay_status', [1, 4])->first();
|
||
if ($exists)
|
||
return $this->failure('该活动你有尚未完成的拼团,请耐心等待');
|
||
$exists = CollageGroupHistories::with('tOrder')->whereHas('tOrder', function ($sql) {
|
||
$sql->whereIn('pay_status', [1, 4]);
|
||
})
|
||
->where('group_id', $group->id)->where('m_user_id', $user_id)
|
||
->where('status', 1)
|
||
->first();
|
||
if ($exists)
|
||
return $this->failure('你已成功拼团参与过该活动,无需重复参与');
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
$consult_record = new ConsultationRecords();
|
||
$consult_record->anchor_id = 0;
|
||
$consult_record->merchant_id = $request->merchant_id;
|
||
$consult_record->merchant_user_id = $request->merchant_user_id;
|
||
$consult_record->consulation_id = $consult_id;
|
||
$consult_record->name = $link_name;
|
||
$consult_record->phone = $link_mobile;
|
||
$consult_record->price = $config->price ?? 0;
|
||
$consult_record->num = $num;
|
||
$consult_record->type = $request->type ?? 'voice';
|
||
$consult_record->class = $request->class;
|
||
$consult_record->expect = $request->expect;
|
||
$consult_record->desc = $request->desc;
|
||
$consult_record->pay_status = 0;
|
||
$consult_record->duration = $config->duration;
|
||
$consult_record->Remaining_duration = $config->duration * 60;
|
||
$consult_record->viewer_id = 0;
|
||
$consult_record->trade_no = $trade_no;
|
||
$consult_record->from_open_id = $from_open_id;
|
||
|
||
$order = new TouristOrder();
|
||
$order->open_id = $openid;
|
||
$order->price = $config->price;
|
||
$order->type_id = $request->consultation_id;
|
||
$order->pay_type = 'wechat';
|
||
$order->type = 'consult';
|
||
if ($buy_type && $buy_type == 'group') {
|
||
$order->group_id = $group_id;
|
||
}
|
||
$order->withdrawal_radio = 100;
|
||
$order->pay_status = 0;
|
||
$order->trade_no = $trade_no;
|
||
$order->from_openid = $from_open_id;
|
||
$order->share_channel_id = $request->share_channel_id;
|
||
$order->desc = $config->title;
|
||
$order->name = $request->name ?? ($MerchantUser->nickname ?? $link_name);
|
||
$order->mobile = $request->mobile ?? ($MerchantUser->mobile ?? $link_mobile);
|
||
$order->merchant_id = $request->merchant_id;
|
||
$order->account_id = $request->merchant_user_id;
|
||
$order->alliance_id = $request->alliance_id ?? null;
|
||
if ($config->price == 0) {
|
||
$consult_record->pay_status = 1;
|
||
$order->pay_status = 1;
|
||
$consult_record->save();
|
||
$order->save();
|
||
$data['status'] = 1;
|
||
$data['id'] = $consult_record->id;
|
||
//通知用户
|
||
$way = 'consulation';
|
||
$type = 'merchant';
|
||
$res = Consultation::where('id', $consult_record->consulation_id)->first();
|
||
\CommonUtilsService::sendBuySuccessNoticeToUser($res, $openid, $way, $trade_no, $consult_record->price);
|
||
$merchant = MerchantAccount::where('id', $consult_record->merchant_id)->first();
|
||
$merchant_openid = $merchant->openid;
|
||
if (empty($merchant_openid))
|
||
$merchant_openid = Anchor::where('m_id', $merchant->id)->value('openid');
|
||
//通知商户
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness($res, $merchant_openid, $type, $order->price, $order->mobile, $order->name);
|
||
//发送推荐人
|
||
if ($order->from_openid && $consult_record->from_openid != 'null') {
|
||
$type = 'recommend';
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness($res, $order->from_openid, $type, $order->price, $order->mobile, $order->name);
|
||
}
|
||
//短信通知商家
|
||
$jump_url = env('APP_URL') . '/pu_m/#/earningsRecord?merchant_id=' . $merchant->id;
|
||
$short_url = \CommonUtilsService::shortUrl(env('APP_URL') . '/h5/#/jump_url?url=' . $jump_url);
|
||
$title = $res->title;
|
||
if (mb_strlen($title) > 5) {
|
||
$title = mb_substr($title, 0, 5, 'utf-8') . '...';
|
||
}
|
||
$message = '有用户下单了~ ' . $order->name . '购买了平台的《' . $title . '》' . $order->price . '元,点击' . $short_url['url'] . ' 查看详情';
|
||
Messenger::sendSMS($merchant->mobile, $message);
|
||
//增加记录
|
||
Message::create([
|
||
'phone' => $merchant->mobile,
|
||
'message' => $message,
|
||
'confirmed' => 1,
|
||
'code' => '购买通知',
|
||
'ip' => request() ? request()->ip() : '127.0.0.1',
|
||
]);
|
||
//插入购买通知
|
||
// $pay_name = $result->user ? $result->user->nickname : '匿名用户';
|
||
$content = $order->name . '购买了【' . $res->title . '】查看订单详情>>';
|
||
SaasNotice::addRecord($order->merchant_id, $order->account_id, 'order', $order->id, $content, 0);
|
||
}
|
||
$order->save();
|
||
$consult_record->save();
|
||
$order->need_pay = $config->price ? 1 : 0;
|
||
return ['code' => 0, 'data' => $order];
|
||
|
||
}
|
||
|
||
public function payEvaluateOrder($request, $evaluate_id, $user_id, $openid)
|
||
{
|
||
$MerchantUser = MerchantUsers::select('openid', 'mobile', 'nickname')->where('id', $user_id)
|
||
->first();
|
||
$test_item_id = $evaluate_id;
|
||
$merchant_id = $request->merchant_id;
|
||
if (!$merchant_id || !$test_item_id)
|
||
throw new \Exception("缺少商户信息或测评信息");
|
||
$trade_no = $this->getTradeNO();
|
||
$merchant_evaluates = MerchantEvaluate::where('merchant_id', $merchant_id)
|
||
->where('test_item_id', $test_item_id)
|
||
->first();
|
||
if (!$merchant_evaluates)
|
||
return ['code' => 1, 'msg' => "该测评已下线"];
|
||
if ($merchant_evaluates->type == 1) {
|
||
//查询一点灵价格
|
||
$result = EvaluateService::testDetails($test_item_id);
|
||
if (!$result)
|
||
return ['code' => 1, 'msg' => "该测评已下线"];
|
||
} else {
|
||
$result = EvaluateDetail::where('test_item_id', $test_item_id)
|
||
->first();
|
||
$result->price = $result->price * 100;
|
||
}
|
||
//写入订单表
|
||
$order = new TouristOrder();
|
||
$order->open_id = $openid;
|
||
$order->price = $result['price'] / 100;
|
||
$order->num = 1;
|
||
$order->pay_type = 'wechat';
|
||
$order->type = 'evaluate';
|
||
$order->type_id = $merchant_evaluates->id;
|
||
$order->pay_status = 0;
|
||
$order->goods = '评测_' . $result['title'];
|
||
$order->trade_no = $trade_no;
|
||
$order->withdrawal_radio = 100; //分成比例
|
||
$order->from_openid = $request->from_openid;
|
||
$order->share_channel_id = $request->share_channel_id;
|
||
$order->alliance_id = $request->alliance_id;
|
||
$link_name = $request->linkmen['name'] ?? ($request->linkmen[0]['name'] ?? null);
|
||
$link_mobile = $request->linkmen['mobile'] ?? ($request->linkmen[0]['mobile'] ?? '');
|
||
$order->name = $request->name ?? ($MerchantUser->nickname ?? $link_name);
|
||
$order->mobile = $request->mobile ?? ($MerchantUser->mobile ?? $link_mobile);
|
||
$order->account_id = $user_id;
|
||
$order->merchant_id = $merchant_id;
|
||
$order->channel = 0;
|
||
$order->desc = $result['subtitle'];
|
||
$order->area_code = null;
|
||
$order->linkmen = json_encode($request->linkmen);
|
||
$order->save();
|
||
$list = EvaluateList::where('test_item_id', $test_item_id)
|
||
->first();
|
||
if ($list->type == 1) {
|
||
//调用一点灵评测下单接口下单
|
||
$evaluate = EvaluateService::testCreate($test_item_id, $result['price'], $trade_no);
|
||
if (!$evaluate)
|
||
throw new \Exception("第三方未返回数据");
|
||
|
||
}
|
||
|
||
if ($result['price'] == 0) {
|
||
$order->pay_status = 1;
|
||
$order->save();
|
||
if ($list->type == 1) {
|
||
EvaluateService::testUpdate($trade_no);
|
||
}
|
||
}
|
||
$order->save();
|
||
$order->need_pay = ($result['price'] > 0) ? 1 : 0;
|
||
return ['code' => 0, 'data' => $order];
|
||
}
|
||
|
||
public function payShopOrder($request, $shop_id, $user_id, $openid)
|
||
{
|
||
$shop = MerchantShop::where('id', $shop_id)->where('is_show', 1)->first();
|
||
if (!$shop)
|
||
return ['code' => 1, 'msg' => '你购买的商品不存在或已下架。'];
|
||
$sku_id = $request->sku_id;
|
||
if (!$sku_id && $shop->pay_type == 'wechat')
|
||
return $this->failure('规格参数不存在,请稍后再试。');
|
||
if ($sku_id) {
|
||
$skus = json_decode($shop->sku, true);
|
||
$skus = array_column($skus, null, 'sku_id');
|
||
$sku = $skus[$sku_id];
|
||
$price = $sku['price'];
|
||
$goods = $sku['name'];
|
||
$desc = $shop->title . '-' . $sku['name'];
|
||
} else {
|
||
$price = $shop->price;
|
||
$desc = $shop->title;
|
||
$goods = null;
|
||
}
|
||
$pay_price = $request->num * $price;
|
||
// if($pay_price!=$request->price) return $this->failure('支付价格与商品价格不一致。');
|
||
$anchor = Anchor::where('id', $shop->anchor_id)->first();
|
||
$trade_no = $this->getTradeNo();
|
||
$order = new Order();
|
||
$order->open_id = $openid;
|
||
$order->price = floatval($pay_price);
|
||
$order->pay_type = $shop->pay_type;
|
||
$order->type = 'shop';
|
||
$order->num = $request->num ?: 1;
|
||
$order->type_id = $request->id;
|
||
$order->trade_no = $trade_no;
|
||
$order->desc = $desc;
|
||
$order->from_openid = $request->from_openid;
|
||
$order->share_channel_id = $request->share_channel_id;
|
||
$order->merchant_id = $request->merchant_id ?? 0;
|
||
$order->account_id = $user_id;
|
||
$link_name = $request->linkmen['name'] ?? ($request->linkmen[0]['name'] ?? null);
|
||
$link_mobile = $request->linkmen['mobile'] ?? ($request->linkmen[0]['mobile'] ?? '');
|
||
$order->name = $request->name ?? ($MerchantUser->nickname ?? $link_name);
|
||
$order->mobile = $request->mobile ?? ($MerchantUser->mobile ?? $link_mobile);
|
||
$order->withdrawal_radio = $anchor->withdrawal_radio ?? 100;
|
||
$order->goods = $goods;
|
||
$order->alliance_id = $request->alliance_id ?? null;
|
||
$shop_recive = new ShopRecive();
|
||
$shop_recive->name = $request->name;
|
||
$shop_recive->mobile = $request->mobile;
|
||
$shop_recive->address = $request->address;
|
||
$shop_recive->order_status = $request->order_status ?? 0;
|
||
$shop_recive->account_id = $request->merchant_user_id ?? 0;
|
||
$shop_recive->merchant_id = $request->merchant_id ?? 0;
|
||
if ($price == 0) {
|
||
$order->pay_status = 1;
|
||
$order->save();
|
||
$shop_recive->order_id = $order->id;
|
||
$shop_recive->save();
|
||
// $order->address = $request->address;
|
||
//发送通知
|
||
$way = 'merchant';
|
||
//给用户
|
||
\CommonUtilsService::sendBuySuccessNoticeToUser(
|
||
$shop,
|
||
$order->open_id,
|
||
$order->type,
|
||
$order->trade_no,
|
||
$order->price
|
||
);
|
||
//给商户
|
||
$merchant = MerchantAccount::where('id', $order->merchant_id)->first();
|
||
$merchant_openid = $merchant->openid ?? '';
|
||
if (!$merchant_openid) {
|
||
$merchant_openid = Anchor::where('m_id', $shop->merchant_id)->value('openid');
|
||
}
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$shop,
|
||
$merchant_openid,
|
||
$way,
|
||
$order->price,
|
||
$order->mobile,
|
||
$order->name
|
||
);
|
||
//发送推荐人
|
||
if ($order->from_openid && $order->from_openid != 'null') {
|
||
$way = 'recommend';
|
||
\CommonUtilsService::sendBuySuccessNoticeToBusiness(
|
||
$shop,
|
||
$order->from_openid,
|
||
$way,
|
||
$order->price,
|
||
$order->mobile,
|
||
$order->name
|
||
);
|
||
}
|
||
//短信通知商家
|
||
$jump_url = env('APP_URL') . '/pu_m/#/earningsRecord?merchant_id=' . $merchant->id;
|
||
$short_url = \CommonUtilsService::shortUrl(env('APP_URL') . '/h5/#/jump_url?url=' . $jump_url);
|
||
$title = $shop->title;
|
||
if (mb_strlen($title) > 5) {
|
||
$title = mb_substr($title, 0, 5, 'utf-8') . '...';
|
||
}
|
||
$message = '有用户下单了~ ' . $order->name . '购买了平台的《' . $title . '》' . $order->price .
|
||
'元,点击' . $short_url['url'] . ' 查看详情';
|
||
Messenger::sendSMS($merchant->mobile, $message);
|
||
//增加记录
|
||
Message::create([
|
||
'phone' => $merchant->mobile,
|
||
'message' => $message,
|
||
'confirmed' => 1,
|
||
'code' => '购买通知',
|
||
'ip' => request() ? request()->ip() : '127.0.0.1',
|
||
]);
|
||
//插入购买通知
|
||
$content = $order->name . '购买了【' . $shop->title . '】查看订单详情>>';
|
||
SaasNotice::addRecord(
|
||
$order->merchant_id,
|
||
$order->account_id,
|
||
'order',
|
||
$order->id,
|
||
$content,
|
||
0
|
||
);
|
||
|
||
}
|
||
$order->save();
|
||
$shop_recive->order_id = $order->id;
|
||
$shop_recive->save();
|
||
$order->need_pay = ($price > 0) ? 1 : 0;
|
||
return ['code' => 0, 'data' => $order];
|
||
}
|
||
|
||
public function BusinessPayOrder(Request $request)
|
||
{
|
||
try {
|
||
$wechatUser = session('wechat.oauth_user.new');
|
||
$user_id = $request->merchant_user_id ?? 0;
|
||
$type = $request->input('type');
|
||
$merchant_user = MerchantUsers::select('openid', 'mobile', 'nickname')->where('id', $user_id)
|
||
->first();
|
||
if ($wechatUser) {
|
||
$openid = $wechatUser->getId();
|
||
} else {
|
||
$openid = $merchant_user->openid;
|
||
}
|
||
//活动下单
|
||
if ($type == 'activity' || $type == 'service') {
|
||
$result = $this->payCommunityOrder($request, $request->type_id, $user_id, $openid);
|
||
} elseif ($type == 'course') {
|
||
$result = $this->payCourseOrder($request, $request->type_id, $user_id, $openid);
|
||
} elseif ($type == 'consult') {
|
||
$result = $this->payConsultOrder($request, $request->type_id, $user_id, $openid);
|
||
} elseif ($type == 'evaluate') {
|
||
$result = $this->payEvaluateOrder($request, $request->test_item_id, $user_id, $openid);
|
||
} elseif ($type == 'shop') {
|
||
$result = $this->payShopOrder($request, $request->type_id, $user_id, $openid);
|
||
}
|
||
if ($result['code'] == 1)
|
||
return $this->failure($result['msg']);
|
||
$order = $result['data'];
|
||
return $this->success('ok', $order);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息中,请稍后再试');
|
||
}
|
||
}
|
||
|
||
public function isOrderPaid(Request $request, $trade_no)
|
||
{
|
||
try {
|
||
$pay_status = Order::where('trade_no', $trade_no)->value('pay_status');
|
||
$is_paid = $pay_status ? 1 : 0;
|
||
return $this->success('ok', compact('is_paid'));
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure();
|
||
}
|
||
}
|
||
|
||
}
|
||
|