3258 lines
134 KiB
PHP
3258 lines
134 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers;
|
||
|
||
use App\Jobs\SendEarningMessage;
|
||
use App\Models\CommunityActivity;
|
||
use App\Models\Live\Anchor;
|
||
use App\Models\MerchantUsers;
|
||
use App\Models\Server\TouristOrder;
|
||
use App\Models\Wechat;
|
||
use App\Models\User;
|
||
use App\Models\Rank;
|
||
use App\Models\RankHistory;
|
||
use App\Models\Order;
|
||
use App\Models\PayLog;
|
||
use App\Models\PayOrder;
|
||
use App\Models\Live\Viewer;
|
||
use App\Services\WechatService;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Illuminate\Support\Facades\Log;
|
||
use Illuminate\Support\Facades\Redis;
|
||
use App\Models\Score;
|
||
use App\Models\ScoreHistory;
|
||
use App\Models\Gift;
|
||
use App\Models\GiftHistory;
|
||
use App\Models\Goods;
|
||
use App\Models\InviteOrder;
|
||
use App\Models\UserGift;
|
||
use App\Models\Notice;
|
||
use App\Jobs\SendSmsBatch;
|
||
use App\Jobs\SendRankNotice;
|
||
use App\Models\RefundOrder;
|
||
use EasyWechat;
|
||
use Illuminate\Http\Request;
|
||
use App\Utils\Messenger;
|
||
use App\Repositories\Eloquent\SmsRepository as Sms;
|
||
use App\Repositories\Eloquent\DynamicRepository as Dynamic;
|
||
use App\Models\Appointment;
|
||
use App\Models\Message;
|
||
use App\Jobs\SyncScore;
|
||
use App\Jobs\ReferreAward;
|
||
use App\Models\AppointmentHistory;
|
||
use App\Models\Activity;
|
||
use App\Models\ActivityMember;
|
||
use App\Models\SubRank;
|
||
use App\Contracts\OrderContract;
|
||
use App\Services\PaasService;
|
||
use App\Models\ProfileCourtship;
|
||
use App\Models\Paas;
|
||
use App\Models\PaasActivity;
|
||
use App\Models\PaasUser;
|
||
use App\Models\SingleService;
|
||
use App\Jobs\MakeShareConsumeCash;
|
||
use App\Http\Response\ResponseJson;
|
||
use App\Jobs\StoreOrderWorthShare;
|
||
use App\Models\FamilyOrder;
|
||
use App\Services\CommonUtilsService;
|
||
use App\Models\WorthShare;
|
||
use App\Models\WorthChannel;
|
||
use App\Models\CoinLog;
|
||
use App\Models\Server\CollageGroup;
|
||
use App\Models\Server\CollageGroupHistories;
|
||
|
||
class OrderController extends Controller
|
||
{
|
||
use ResponseJson;
|
||
protected $sms;
|
||
protected $dynamic;
|
||
protected $orderCon;
|
||
public function __construct(Sms $sms, Dynamic $dynamic, OrderContract $orderCon){
|
||
$this->sms = $sms;
|
||
$this->dynamic = $dynamic;
|
||
$this->orderCon = $orderCon;
|
||
}
|
||
/**
|
||
* 等级购买
|
||
*/
|
||
public function memberCharge(Request $request)
|
||
{
|
||
$user = auth()->user();
|
||
$user_id = $user->id;
|
||
if (empty($user_id)) {
|
||
return $this->failure('no user_id');
|
||
}
|
||
$rank_id = $request->input('rank_id', 0);
|
||
if (empty($rank_id)) {
|
||
return $this->failure('请选择会员');
|
||
}
|
||
$rank = Rank::find($rank_id);
|
||
if (empty($rank)) {
|
||
return $this->failure('请选择会员');
|
||
}
|
||
$trade_no = $this->getTradeNO();
|
||
$type = $request->input('type', 'rank');//rank:自己充值 rank_other:替别人充值
|
||
$score = $this->getAccountScore($user_id);
|
||
$invite_order = null;
|
||
//当前会员等级
|
||
if ($type == 'other_rank') {
|
||
$openid = $this->getOpenid();
|
||
$invite_order = InviteOrder::create([
|
||
'openid'=>$openid,
|
||
'trade_no'=>$trade_no,
|
||
]);
|
||
$price = $rank->price;
|
||
$goods = '替人升级'.$rank->name;
|
||
}else{
|
||
$user_rank_id = User::where('id', $user_id)->value('rank_id');
|
||
if (empty($user_rank_id) /*&& $user_rank_id == 1*/) {
|
||
$price = $rank->price;
|
||
}else{
|
||
$user_rank = Rank::find($user_rank_id);
|
||
if ($rank_id <= $user_rank_id) {
|
||
return $this->failure('您的会员等级已是'.$user_rank->name);
|
||
}
|
||
$price = ($rank->price * 100 - $user_rank->price * 100) / 100;
|
||
}
|
||
$goods = '升级'.$rank->name;
|
||
}
|
||
|
||
$num = $request->input('num', 1);
|
||
|
||
if ($score->remain_amount >= $price) {
|
||
$cash = 0;
|
||
$score = $price;
|
||
}else{
|
||
$cash = $price - $score->remain_amount;
|
||
$score = $score->remain_amount;
|
||
}
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $cash,
|
||
'score' => $score,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>$rank_id,
|
||
'goods'=>$goods,
|
||
'price'=>$price,
|
||
'num'=>$num,
|
||
'type'=>$type,
|
||
'trade_no'=>$trade_no,
|
||
);
|
||
$wx_pay = [];
|
||
if ($cash>0) {
|
||
$wx_pay = $this->constructWXPay($pay_order, $user_id);
|
||
}else{
|
||
$pay_order['pay_status'] = "PAID";
|
||
$order['pay_status'] = "PAID";
|
||
//修改会员
|
||
$user->rank_id = $rank_id;
|
||
$user->save();
|
||
$h = RankHistory::where('user_id', $user_id)->where('rank_id', $rank_id)->whereNotNull('deadline')->first();
|
||
if ($rank_id == 1) {
|
||
if (empty($h)) {//没有会员
|
||
RankHistory::create([
|
||
'user_id'=>$user_id,
|
||
'rank_id'=>$rank_id,
|
||
]);
|
||
}
|
||
}else{
|
||
RankHistory::create([
|
||
'user_id'=>$user_id,
|
||
'rank_id'=>$rank_id,
|
||
'deadline'=>date('Y-m-d H:i:s', strtotime( '+1 month')),
|
||
]);
|
||
}
|
||
|
||
|
||
}
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', compact('order_pay', 'invite_order'));
|
||
}
|
||
|
||
/**
|
||
* 升级会员
|
||
* @param Request $request [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function memberChargeV2(Request $request)
|
||
{
|
||
try {
|
||
$user = auth()->user();
|
||
//购买的会员等级
|
||
$sub_rank_id = $request->input('sub_rank_id');
|
||
$sub_rank = SubRank::find($sub_rank_id);
|
||
if (empty($sub_rank)) {
|
||
return $this->failure('没有该会员');
|
||
}
|
||
$rank = Rank::find($sub_rank->rank_id);
|
||
$goods = '购买'.$sub_rank->month.'个月'.$rank->name.'VIP';
|
||
//判断会员等级
|
||
if ($user->rank_id > $sub_rank->rank_id) {
|
||
return $this->failure('当前会员等级高于购买会员等级');
|
||
}
|
||
//订单号
|
||
$trade_no = $this->getTradeNO();
|
||
$cash = $price = $sub_rank->discount_price;
|
||
$score = 0;
|
||
|
||
//支付类型
|
||
$remark = '';
|
||
$pay_type = $request->pay_type;
|
||
if($pay_type=='coin'&&$rank->pay_type=='coin'&&$rank->can_cash_amount>0&&$rank->can_coin_amount){
|
||
//当前福币
|
||
$total_coin = $user->totalCoin();
|
||
if($total_coin){
|
||
if($total_coin>=$rank->can_coin_amount){
|
||
$cash = $cash-$rank->can_cash_amount;
|
||
$remark = '花费福币'.$rank->can_coin_amount.'个,抵扣金额'.$rank->can_cash_amount.'元';
|
||
$score = $rank->can_coin_amount;
|
||
}else{
|
||
$cash = $cash- ($total_coin/10);
|
||
$remark = '花费福币'.($total_coin).'个,抵扣金额'.($total_coin/10).'元';
|
||
$score = $total_coin;
|
||
}
|
||
|
||
}
|
||
}
|
||
//订单
|
||
$pay_order = array(
|
||
'user_id' => $user->id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $cash,
|
||
'score' => $score,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user->id,
|
||
'type_id'=>$sub_rank_id,
|
||
'goods'=>$goods,
|
||
'price'=>$price,
|
||
'num'=>1,
|
||
'type'=>'rank',
|
||
'trade_no'=>$trade_no,
|
||
'from_openid'=>$request->input('from_openid'),
|
||
'from_user_id'=>$request->input('from_user_id'),
|
||
'chat_user_id'=>$request->input('chat_user_id'),
|
||
'share_type'=>$request->input('share_type')??'normal',
|
||
|
||
'remark'=>$remark,
|
||
|
||
);
|
||
\DB::beginTransaction();
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$wx_pay = [];
|
||
if ($cash>0) {
|
||
$wx_pay = $this->constructWXPay($pay_order, $user->id,$rank->name);
|
||
}else{
|
||
$order_pay->pay_status = 'PAID';
|
||
$order_pay->is_hooked = 1;
|
||
$order->pay_status = 'PAID';
|
||
$order_pay->save();
|
||
$order->save();
|
||
$result = $this->markRankOrder($order->id);
|
||
}
|
||
$order_pay->wx_pay = $wx_pay;
|
||
\DB::commit();
|
||
return $this->success('ok', $order_pay);
|
||
} catch (\Exception $e) {
|
||
\DB::rollBack();
|
||
$this->getError($e);
|
||
return $this->failure('支付失败,请稍后再试');
|
||
}
|
||
|
||
|
||
}
|
||
|
||
/**
|
||
* 生成分享图片
|
||
*/
|
||
public function makeSharePicture(Request $request, $invite_order_id)
|
||
{
|
||
$invite_order = InviteOrder::where('id', $invite_order_id)->first();
|
||
$app = EasyWechat::miniProgram();
|
||
$data = [];
|
||
$data['is_hyaline'] = true;
|
||
$response = $app->app_code->get('/pages/home/sharing?from_openid='.$invite_order->openid.'&id='.$invite_order_id, $data);
|
||
$time = time();
|
||
$path = $time.'qrcode.png';
|
||
$filename = $response->saveAs(storage_path('qrcode'), $path);
|
||
//http://images.ufutx.com/201807/14/697f5a2e6e6f5348a07eb6e4d966a026.jpeg
|
||
$image1 = 'http://images.ufutx.com/201807/16/4b07337a30b8b1bb311c1944dc0169cb.jpeg';
|
||
$image2 = storage_path().'/qrcode/'.$path;
|
||
$new_image = $this->imageAddImage($image1, $image2, 371, 371, 208, 818, 'top-leftt');
|
||
$order = Order::where('trade_no', $invite_order->trade_no)->first();
|
||
$rank_name = Rank::where('id', $order->type_id)->value('name');
|
||
$openid = $invite_order->openid;
|
||
$wechat = Wechat::where('openid', $openid)->first();
|
||
if (!empty($wechat)) {
|
||
if (!empty($wechat->avatar) || !empty($wechat->avatar2)) {
|
||
$avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar;
|
||
$new_image = $this->imageAddImage($new_image, $avatar, 183, 183, 302, 75, 'top-left');
|
||
}
|
||
}
|
||
$name = '';
|
||
if ($wechat->user_id) {
|
||
$name = User::where('id', $wechat->user_id)->value('name');
|
||
}
|
||
|
||
// $new_image = $this->textAddImage($new_image, $rank_name, 15, 70, 550, '#000000', 'right');
|
||
$file_path = storage_path()."/qrcode/".$time."invite_qrcode.png";
|
||
$new_image->save($file_path);
|
||
$pic = '';
|
||
if(file_exists($file_path)){
|
||
$pic = $this->uploadFile($file_path);
|
||
|
||
try{
|
||
unlink($file_path);
|
||
|
||
}catch(Exception $e) {
|
||
return $this->failure($e->getMessage());
|
||
exit();
|
||
}
|
||
}
|
||
$invite_order->invite_pic = $pic;
|
||
$invite_order->save();
|
||
return $this->success('ok', compact('pic'));
|
||
}
|
||
|
||
public function constructWXPay($pay_order, $user_id, $detail='福恋')
|
||
{
|
||
$openid = $this->getOpenid();
|
||
$attributes = array(
|
||
'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP...
|
||
'body' => $detail,
|
||
'detail' => $detail,
|
||
'out_trade_no' => $pay_order['trade_no'],
|
||
'total_fee' => ($pay_order['cash']*100),
|
||
'notify_url' => config('app.url').'/api/mark/order/pay/'.$pay_order['trade_no'], // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
||
'openid' => $openid,
|
||
);
|
||
$result = \WechatService::pay($attributes);
|
||
return $result;
|
||
}
|
||
|
||
public function compareTime($time1, $time2)
|
||
{
|
||
$str_time1 = strtotime($time1);
|
||
$str_time2 = strtotime($time2) + 30 * 24 * 3600;
|
||
if ($str_time1 >= $str_time2) {//已過期
|
||
return false;
|
||
}else{
|
||
return true;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 支付回调
|
||
*/
|
||
public function markOrderPay(Request $request, $trade_no)
|
||
{
|
||
if ($trade_no) {
|
||
$pay_order = PayOrder::where('trade_no', $trade_no)->first();
|
||
if (empty($pay_order)) {
|
||
$message = '订单不存在,订单号:'.$trade_no;
|
||
return $this->failure('订单不存在');
|
||
}
|
||
if ($pay_order->is_hooked) {
|
||
return $this->success('ok');
|
||
}
|
||
$order = Order::where('trade_no', $trade_no)->first();
|
||
if ($pay_order->cash > 0 ) {
|
||
//当前时间大于订单时间30天不能查询
|
||
$now_time = date('Y-m-d H:i:s');
|
||
$order_time = $pay_order->created_at->toDateTimeString();
|
||
$compare_result = $this->compareTime($now_time, $order_time);
|
||
if ($compare_result) {
|
||
$result = \WechatService::orderPaid($trade_no);
|
||
}else{
|
||
$result = false;
|
||
}
|
||
}elseif ($pay_order->score > 0 && $pay_order->cash == 0 ) {
|
||
$result = true;
|
||
}else{
|
||
$result = false;
|
||
}
|
||
if ($result) {
|
||
if ($order->type == 'rank') {
|
||
$result = $this->markRankOrder($order->id);
|
||
if (empty($result)) {
|
||
return;
|
||
}
|
||
//添加平台订单收益
|
||
$this->addPaasAccountHistoriy($order->id, $trade_no, 'RANK', $order->user_id);
|
||
// MakeShareConsumeCash::dispatch($pay_order)->onQueue('love');
|
||
}elseif ($order->type == 'score') {
|
||
$result = $this->changeScore($order->user_id, $pay_order->cash, 'gained', '福分充值');
|
||
}elseif ($order->type == 'gift') {
|
||
if ($pay_order->cash > 0) {
|
||
$this->changeScore($order->user_id, $pay_order->cash, 'gained', '福分充值');
|
||
}
|
||
$gift = Gift::find($order->type_id);
|
||
//收礼物user_id
|
||
$other_user_id = GiftHistory::where('trade_no', $order->trade_no)->where('type', 'GIVEN')->value('other_user_id');
|
||
$result = $this->changeScore($order->user_id, $pay_order->cash + $pay_order->score, 'used', '送礼物['.$gift->name.']', $other_user_id);
|
||
if (!$result) {
|
||
$this->sms->sentMessage('15872844805', '订单号:'.$order->trade_no.' 福分溢出');
|
||
// return $this->failure('支付失败福分溢出');
|
||
PayOrder::where('trade_no', $trade_no)->update(['is_hooked'=>1,'pay_status'=>'PAID']);
|
||
return;
|
||
}
|
||
$this->changeScore($other_user_id, $pay_order->cash + $pay_order->score, 'gained', '收礼物['.$gift->name.']', $order->user_id);
|
||
GiftHistory::where('trade_no', $order->trade_no)->update(['status'=>1]);
|
||
//更新礼物库
|
||
$user_gift = UserGift::where('user_id', $other_user_id)->where('gift_id', $order->type_id)->first();
|
||
if (empty($user_gift)) {
|
||
$user_gift = UserGift::create([
|
||
'user_id'=>$other_user_id,
|
||
'gift_id'=>$order->type_id,
|
||
'num'=>0,
|
||
]);
|
||
}
|
||
$user_gift->num += $order->num;
|
||
$user_gift->save();
|
||
$content = '送了'.$order->num.$gift->unit.$gift->name.'给你!';
|
||
$this->sendNotice($other_user_id, $order->user_id, 'gift', $content);
|
||
//短信通知
|
||
$user_name = User::where('id', $order->user_id)->value('name');
|
||
$mobile = User::where('id', $other_user_id)->value('mobile');
|
||
if ($mobile) {
|
||
$message = '用户【'.$user_name.'】送给你一'.$gift->unit.$gift->name.'!请访问小程序查看';
|
||
$this->sms->sentMessage($mobile, $message);
|
||
}
|
||
}elseif ($order->type == 'other_rank') {
|
||
if ($pay_order->score > 0) {
|
||
$result = $this->changeScore($order->user_id, $pay_order->score, 'used', $message='替Ta支付');
|
||
if (!$result) {
|
||
$this->sms->sentMessage('15872844805', '订单号:'.$order->trade_no.' 福分溢出');
|
||
return $this->failure('支付失败福分溢出');
|
||
}
|
||
}
|
||
InviteOrder::where('trade_no', $order->trade_no)->where('status', 0)->update(['status'=>1]);
|
||
}elseif ($order->type == 'meet') {
|
||
//约见记录
|
||
$appointment = Appointment::find($order->type_id);
|
||
$history = new AppointmentHistory();
|
||
$history->user_id = $order->user_id;
|
||
$history->point_id = $appointment->id;
|
||
$history->price = $appointment->price;
|
||
$history->num = $appointment->num;
|
||
$history->type = $appointment->type;
|
||
$history->save();
|
||
$user = User::find($order->user_id);
|
||
$user_name = $user->name;
|
||
if ($appointment->type == 'active' || $appointment->type == 'passive') {
|
||
$message = '用户'.$user_name.'购买了'.$appointment->name.'服务';
|
||
$this->sms->sentMessage('13377553550', $message);
|
||
}
|
||
//订阅消息通知用户
|
||
// $user = User::find($order->user_id);
|
||
// $this->orderSuccessNoticeToUser($order, $user);
|
||
}elseif ($order->type == 'approve') {
|
||
//赠送一个月市级会员
|
||
$this->addUserRank($order->user_id, 1, 1);
|
||
User::where('id', $order->user_id)->update(['approve_time'=>3]);
|
||
//分享注册认证 获得奖励
|
||
$from_openid = User::where('id', $order->user_id)->value('from_openid');
|
||
if ($from_openid) {
|
||
$array['from_openid'] = $from_openid;
|
||
$array['user_id'] = $order->user_id;
|
||
$array['type'] = 'approve';
|
||
$array['num'] = 2;
|
||
ReferreAward::dispatch($array)->onQueue('love');
|
||
}
|
||
//分享认证退认证费
|
||
// $this->refundApprove($from_openid);
|
||
//订阅信息通知用户
|
||
// $user = User::find($order->user_id);
|
||
// $this->orderSuccessNoticeToUser($order, $user);
|
||
}elseif ($order->type == 'activity') {
|
||
$key = Redis::setnx('activity'.$trade_no,1);
|
||
if($key!=1){
|
||
$PayLog = new PayLog;
|
||
$PayLog->type = 'activity';
|
||
$PayLog->user_id = $order->user_id??0;
|
||
$PayLog->trade_no = $trade_no;
|
||
$PayLog->remark = '回调异常';
|
||
$PayLog->save();
|
||
return ;
|
||
}
|
||
$user = User::where('id', $order->user_id)->first();
|
||
$wechat = wechat::where('user_id', $order->user_id)->first();
|
||
$avatar = '';
|
||
if (!empty($wechat)) {
|
||
$avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar;
|
||
}
|
||
$sex = $user->sex;
|
||
if (empty($sex)) {
|
||
$sex = $wechat->gender;
|
||
}
|
||
$member = new ActivityMember;
|
||
$member->is_joined = 1;
|
||
$member->user_id = $order->user_id;
|
||
$member->activity_id = $order->type_id;
|
||
$member->name = $member->name?$member->name:$user->name;
|
||
$member->mobile = $member->mobile?$member->mobile:$user->mobile;
|
||
$member->avatar = $member->avatar?$member->avatar:$avatar;
|
||
$member->linkmen = $order->linkmen;
|
||
$member->from_openid = $order->from_openid;
|
||
$member->save();
|
||
//添加平台订单收益
|
||
$this->addPaasAccountHistoriy($order->id, $trade_no, 'ACTIVITY', $order->user_id);
|
||
//通知给管理员
|
||
$activity = Activity::findOrFail($order->type_id);
|
||
$this->sendActivityNotice($activity, $user);
|
||
// 两人同行
|
||
$linkmen = json_decode($order->linkmen,true);
|
||
if($activity&&$activity->id==554&&count($linkmen)>=2){
|
||
$result = $this->friendOrder($linkmen,$activity,$user->mobile);
|
||
}
|
||
//发送短信通知
|
||
// if($activity&&$activity->id==555||$activity->id ==554){
|
||
// $result = $this->sendSmsNotice($activity->id,$order->user_id);
|
||
// }
|
||
//发送订阅通知给用户
|
||
// $this->sendActivityNoticeToUser($activity, $user);
|
||
}elseif ($order->type == 'single_service') {//单身服务
|
||
$result = $this->markSingleServiceOrder($order);
|
||
if (empty($result)) throw new \Exception("单身服务订单回调失败", 1);
|
||
MakeShareConsumeCash::dispatch($pay_order)->onQueue('love');
|
||
}
|
||
PayOrder::where('trade_no', $trade_no)->update(['is_hooked'=>1,'pay_status'=>'PAID']);
|
||
Order::where('trade_no', $trade_no)->update(['pay_status'=>'PAID']);
|
||
// StoreOrderWorthShare::dispatch($order, $pay_order)->onQueue('love');
|
||
//订单分享人条件
|
||
$redis = Redis::connection('big_data');
|
||
$redis->lpush('love:earning:order:ids', $order->id);
|
||
SendEarningMessage::dispatch($order->id)->onQueue('love')->delay(now()->addMinutes(1));
|
||
|
||
$replyxml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
|
||
echo $replyxml;
|
||
}else{
|
||
return $this->failure('支付失败', $result);
|
||
}
|
||
}else{
|
||
return $this->failure('no order');
|
||
}
|
||
}
|
||
/**
|
||
* 赠送认证资格
|
||
* @param [type] $user_id [description]
|
||
*/
|
||
public function sendApproveTime($user_id)
|
||
{
|
||
$user = User::find($user_id);
|
||
if (!$user->is_approved) {
|
||
$user->approve_time = 3;
|
||
$user->save();
|
||
}
|
||
return;
|
||
}
|
||
|
||
/**
|
||
* 退认证费
|
||
* @return [type] [description]
|
||
*/
|
||
public function refundApprove($from_openid)
|
||
{
|
||
$user_id = Wechat::where('openid', $from_openid)->value('user_id');
|
||
if (empty($user_id)) {
|
||
return ;
|
||
}
|
||
//是否交认证费
|
||
$approve_order = Order::where('user_id', $user_id)->where('type', 'approve')->where('pay_status', 'PAID')->first();
|
||
if (empty($approve_order)) {
|
||
return ;
|
||
}
|
||
$approve_pay_order = PayOrder::where('user_id', $user_id)->where('trade_no', $approve_order->trade_no)->where('is_hooked', 1)->first();
|
||
//是否有被邀请人认证
|
||
//是否有已邀请认证
|
||
$invite_user_ids = User::where('from_openid', $from_openid)->pluck('id');
|
||
$count = Order::where('type', 'approve')->where('pay_status', 'PAID')->whereIn('user_id', $invite_user_ids)->count();
|
||
if (empty($count)) {
|
||
return ;
|
||
}
|
||
//是否已退
|
||
$refund_order = RefundOrder::where('user_id', $user_id)->where('type','approve')->first();
|
||
//生成退款记录
|
||
if (empty($refund_order)) {
|
||
$refund_order = RefundOrder::create([
|
||
'user_id'=>$user_id,
|
||
'type'=>'approve',
|
||
'trade_no'=>$approve_order->trade_no,
|
||
'refund_trade_no'=>$this->getRefundTradeNo(),
|
||
'total_fee'=>$approve_pay_order->cash,
|
||
'refund_fee'=>$approve_pay_order->cash,
|
||
]);
|
||
}else{
|
||
return ;
|
||
}
|
||
$total = $refund_order->total_fee * 100;
|
||
$desc = '用户实名认证费退款';
|
||
//退款
|
||
$result = \WechatService::userTransfer($refund_order->refund_trade_no, $from_openid, $total, $desc);
|
||
if ($result) {
|
||
}
|
||
return ;
|
||
}
|
||
|
||
/**
|
||
* 支付回调
|
||
*/
|
||
public function markOrderPayV2(Request $request, $trade_no)
|
||
{
|
||
if ($trade_no) {
|
||
$pay_order = PayOrder::where('trade_no', $trade_no)->first();
|
||
if ($pay_order->is_hooked) {
|
||
return $this->success('ok');
|
||
}
|
||
$order = Order::where('trade_no', $trade_no)->first();
|
||
if ($pay_order->cash > 0 ) {
|
||
//当前时间大于订单时间30天不能查询
|
||
$now_time = date('Y-m-d H:i:s');
|
||
$order_time = $pay_order->created_at->toDateTimeString();
|
||
$compare_result = $this->compareTime($now_time, $order_time);
|
||
if ($compare_result) {
|
||
$result = \WechatService::orderPaid($trade_no);
|
||
}else{
|
||
$result = false;
|
||
}
|
||
}elseif ($pay_order->score > 0 && $pay_order->cash == 0 ) {
|
||
$result = true;
|
||
}else{
|
||
$result = false;
|
||
}
|
||
if ($result) {
|
||
if ($order->type == 'rank') {
|
||
$result = $this->markRankOrder($order->id);
|
||
if (empty($result)) {
|
||
return;
|
||
}
|
||
$this->addPaasAccountHistoriy($order->id, $trade_no, 'RANK', $order->user_id);
|
||
}
|
||
PayOrder::where('trade_no', $trade_no)->update(['is_hooked'=>1,'pay_status'=>'PAID']);
|
||
Order::where('trade_no', $trade_no)->update(['pay_status'=>'PAID']);
|
||
StoreOrderWorthShare::dispatch($order, $pay_order)->onQueue('love');
|
||
$redis = Redis::connection('big_data');
|
||
$redis->lpush('love:earning:order:ids', $order->id);
|
||
SendEarningMessage::dispatch($order->id)->onQueue('love')->delay(now()->addMinutes(1));
|
||
|
||
return $this->success('mark ok');
|
||
}else{
|
||
return $this->failure('支付失败', $result);
|
||
}
|
||
}else{
|
||
return $this->failure('no order');
|
||
}
|
||
}
|
||
|
||
// 双人同行订单将生成衍生订单和用户
|
||
|
||
public function friendOrder($linkmen,$activity,$mobile)
|
||
{
|
||
|
||
foreach ($linkmen as $key => $value) {
|
||
if($value['mobile']==$mobile)
|
||
continue;
|
||
$user = User::where('mobile',$value['mobile'])->first();
|
||
if(!$user){
|
||
$user = new User();
|
||
$user->name = $value['name'];
|
||
$user->nickname = $value['name'];
|
||
$user->mobile = $value['mobile'];
|
||
$user->email = $value['mobile'].'@ufutx.com';
|
||
$user->save();
|
||
}
|
||
ProfileCourtship::firstOrCreate(['user_id' => $user->id]);
|
||
$member = new ActivityMember;
|
||
$member->is_joined = 1;
|
||
$member->user_id = $user->id;
|
||
$member->activity_id = $activity->id;
|
||
$member->name = $value['name'];
|
||
$member->mobile = $value['mobile'];
|
||
$member->avatar = User::DefaultAvatar;
|
||
$member->linkmen = $linkmen;
|
||
$member->desc = '两人同行,同行人:'.$mobile;
|
||
$member->save();
|
||
}
|
||
}
|
||
|
||
public function sendSmsNotice($activity_id,$user_id){
|
||
$member = ActivityMember::where('activity_id',$activity_id)->where('user_id',$user_id)->first();
|
||
$member->linkmen = json_decode($member->linkmen);
|
||
$mobiles = [];
|
||
if(!empty($member->linkmen)){
|
||
foreach ($member->linkmen as $men) {
|
||
$mobiles[] = $men['mobile'];
|
||
}
|
||
}
|
||
$array = [
|
||
'mobile' => $mobiles,
|
||
'message' => "您好!您已报名福恋平台9月16日的5+1线上深度了解,线下约会的活动,请添加客服微信18922809346(电话同号),提醒您届时参加!谢谢!",
|
||
];
|
||
SendSmsBatch::dispatch($array)->onQueue('love');
|
||
}
|
||
|
||
/**
|
||
* 添加平台收益
|
||
* @param [type] $order_id [description]
|
||
*/
|
||
public function addPaasAccountHistoriy($order_id, $trade_no, $type, $user_id)
|
||
{
|
||
if ($type == 'RANK') {
|
||
//用户所属平台
|
||
$paas_user = PaasUser::where('user_id', $user_id)->where('type', 'MAIN')->first();
|
||
if (empty($paas_user)) {
|
||
return;
|
||
}
|
||
$paas = Paas::where('id', $paas_user->paas_id)->value("name");
|
||
$amount = PayOrder::where('trade_no', $trade_no)->value('cash');
|
||
if (empty($amount)) {
|
||
return;
|
||
}
|
||
//百分之五十
|
||
$remain_amount = number_format($amount/2, 2);
|
||
$paas_service = new PaasService;
|
||
$paas_service->addAccountHistory($paas, $type, $order_id, $remain_amount);
|
||
|
||
}elseif ($type == 'ACTIVITY') {
|
||
$activity_id = Order::where('id', $order_id)->value('type_id');
|
||
$paas_id = PaasActivity::where('activity_id', $activity_id)->value('paas_id');
|
||
if (empty($paas_id)) {
|
||
return;
|
||
}
|
||
$paas = Paas::where('id', $paas_id)->value("name");
|
||
$amount = PayOrder::where('trade_no', $trade_no)->value('cash');
|
||
if (empty($amount)) {
|
||
return;
|
||
}
|
||
$paas_service = new PaasService;
|
||
$paas_service->addAccountHistory($paas, $type, $order_id, $amount);
|
||
}
|
||
return;
|
||
}
|
||
|
||
public function markRankOrder($order_id)
|
||
{
|
||
try {
|
||
\DB::beginTransaction();
|
||
$order = Order::find($order_id);
|
||
$pay_order = PayOrder::where('trade_no', $order->trade_no)->first();
|
||
$user = User::with('wechat')->find($order->user_id);
|
||
//检测福币
|
||
if ($pay_order->score > 0) {
|
||
$result = $user->addCoinLog('RANK', $order->type_id, $pay_order->score, $remark='小程序购买超级会员');
|
||
if (empty($result)) throw new \Exception("增加福币记录失败", 1);
|
||
$result = $user->updateCoinInfo('sub', $pay_order->score);
|
||
if (empty($result)) throw new \Exception("修改福币信息失败", 1);
|
||
}
|
||
$this->changeRank($order->user_id, $order->type_id);
|
||
\DB::commit();
|
||
//微信通知
|
||
$sub_rank = SubRank::find($order->type_id);
|
||
$array['openid'] = $user->wechat->openid;
|
||
$array['rank_id'] = $sub_rank->rank_id;
|
||
SendRankNotice::dispatch($array)->onQueue('love');
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
\DB::rollBack();
|
||
$this->getError($e);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
//活动福币支付回调
|
||
public function payment_change($order,$trade_no)
|
||
{
|
||
$user = User::where('id', $order->user_id)->first();
|
||
$wechat = wechat::where('user_id', $order->user_id)->first();
|
||
$avatar = '';
|
||
if (!empty($wechat)) {
|
||
$avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar;
|
||
}
|
||
$sex = $user->sex;
|
||
if (empty($sex)) {
|
||
$sex = $wechat->gender;
|
||
}
|
||
$member = new ActivityMember;
|
||
$member->is_joined = 1;
|
||
$member->user_id = $order->user_id;
|
||
$member->activity_id = $order->type_id;
|
||
$member->name = $member->name?$member->name:$user->name;
|
||
$member->mobile = $member->mobile?$member->mobile:$user->mobile;
|
||
$member->avatar = $member->avatar?$member->avatar:$avatar;
|
||
$member->linkmen = $order->linkmen;
|
||
$member->from_openid = $order->from_openid;
|
||
$member->save();
|
||
//添加平台订单收益
|
||
$this->addPaasAccountHistoriy($order->id, $trade_no, 'ACTIVITY', $order->user_id);
|
||
//通知给管理员
|
||
$activity = Activity::findOrFail($order->type_id);
|
||
$this->sendActivityNotice($activity, $user);
|
||
}
|
||
|
||
/**
|
||
* 修改会员
|
||
* @return [type] [description]
|
||
*/
|
||
public function changeRank($user_id, $sub_rank_id)
|
||
{
|
||
$sub_rank = SubRank::find($sub_rank_id);
|
||
$rank_id = $sub_rank->rank_id;
|
||
$month = $sub_rank->month;
|
||
$user = User::find($user_id);
|
||
$user->addSuperRank(0, $month, $type='mini_rank');
|
||
return ;
|
||
}
|
||
|
||
/**
|
||
* 积分修改
|
||
* @param int $user_id 用户ID
|
||
* @param decimal $score 更改积分
|
||
* @param string $type 类型
|
||
* @param string $message 备注
|
||
* @param inte $other_user_id 其他人ID
|
||
* @return bool 是否成功
|
||
*/
|
||
public function changeScore($user_id, $score, $type, $message='', $other_user_id=null)
|
||
{
|
||
//本地积分
|
||
$score_obj = Score::where('user_id', $user_id)->first();
|
||
if (empty($score_obj)) {
|
||
$score_obj = Score::create([
|
||
'user_id'=>$user_id,
|
||
]);
|
||
}
|
||
if ($type == 'gained') {
|
||
//更新积分
|
||
$score_obj->increment('remain_amount', $score);
|
||
}else{
|
||
if ($score_obj->remain_amount >= $score) {
|
||
$score_obj->decrement('remain_amount', $score);
|
||
// 优先使用不可提现的福分
|
||
// 不可提现的福分不够,从可提现的福分扣除
|
||
$extraScore = $score_obj->remain_amount - $score_obj->cash_score;
|
||
$deductCash = $extraScore - $score;
|
||
if($deductCash){
|
||
$score_obj->decrement('cash_amount', $deductCash);
|
||
}
|
||
}else{
|
||
$this->sms->sentMessage('15872844805', '用户id:'.$user_id.', 福分超额.'.$message);
|
||
throw new \Exception('用户id:'.$user_id.', 福分超额.'.$message, 1);
|
||
|
||
}
|
||
$score_obj->increment('used_amount', $score);
|
||
}
|
||
//生成积分记录
|
||
ScoreHistory::create([
|
||
'user_id'=>$user_id,
|
||
'other_user_id'=>$other_user_id,
|
||
'type'=>$type,
|
||
'amount'=>$score,
|
||
'value'=>$score_obj->remain_amount,
|
||
'message'=>$message,
|
||
]);
|
||
//同步积分
|
||
// $array['message'] = $message;
|
||
// $array['user_id'] = $user_id;
|
||
// $array['other_user_id'] = $other_user_id;
|
||
// $array['type'] = $type;
|
||
// $array['score'] = $score;
|
||
// SyncScore::dispatch($array)->onQueue('love');
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 给邀请人添加福分
|
||
*/
|
||
public function addInviteScore($openid ,$price)
|
||
{
|
||
//第最近个人的openid
|
||
$invite_user_id = Wechat::where('openid', $openid)->value('user_id');
|
||
if (empty($invite_user_id)) {
|
||
return ;
|
||
}
|
||
$add_score = $price * 0.1;
|
||
if ($add_score > 0) {
|
||
$this->changeScore($invite_user_id, $add_score, 'gained', '推荐赢福分');
|
||
}
|
||
return ;
|
||
}
|
||
// 家的味道
|
||
|
||
public function familyActivity(Request $request)
|
||
{
|
||
# code...
|
||
$goods_id = $request->goods_id??7;
|
||
$goods = Goods::where('id',$goods_id)->first();
|
||
if($request->price<=0) return $this->failure('支付价格有误。');
|
||
if(!$goods) return $this->failure('未查询到该商品信息');
|
||
if(!$goods->discount_price) return $this->failure('商品价格获取失败');
|
||
// 上架当天
|
||
$start = date('2021-08-07 00:00:00');
|
||
$end = date('2021-08-07 23:59:59');
|
||
if($start<now()&&now()<$end){
|
||
$goods->discount_price = 109;
|
||
}
|
||
$pay_price = $goods->discount_price*$request->num;
|
||
if($pay_price!=$request->price) return $this->failure('支付价格与商品价格不一致。');
|
||
$trade_no = $this->getRefundTradeNo();
|
||
$family['goods_id'] = $goods_id;
|
||
$family['num'] = $request->num;
|
||
$family['name'] = $request->name;
|
||
$family['mobile'] = $request->mobile;
|
||
$family['address'] = $request->address;
|
||
$family['from_openid'] = $request->from_openid;
|
||
$family['from_user_id'] = $request->from_user_id;
|
||
$family['trade_no'] = $trade_no;
|
||
$family['open_id'] = $request->openid;
|
||
$family['price'] = $request->price;
|
||
$family['from_platform'] = $request->from_platform;
|
||
|
||
FamilyOrder::create($family);
|
||
$openid = $request->openid;
|
||
$callback = config('app.url').'/api/app/callback/family/'.$trade_no;
|
||
$attributes = array(
|
||
'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP...
|
||
'body' => '"家的味道,有爱中秋"中秋礼盒',
|
||
'detail' => $goods->name,
|
||
'out_trade_no' => $trade_no,
|
||
'total_fee' => round($request->price*100),
|
||
'notify_url' => $callback, // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
||
'openid' => $openid,
|
||
);
|
||
$result = \WechatService::officialPay($attributes);
|
||
return $this->success('ok',$result);
|
||
}
|
||
|
||
//我的订单
|
||
|
||
public function familyOrderList(Request $request)
|
||
{
|
||
$openid = $request->openid;
|
||
usleep(500000);
|
||
$mobile = Viewer::where('openid',$openid)->value('mobile')??0;
|
||
$result = FamilyOrder::where(function ($query) use($openid,$mobile) {
|
||
$query->where('open_id', $openid)
|
||
->orWhere('mobile', $mobile);
|
||
})->where('pay_status',1)->orderby('id','desc')->paginate();
|
||
foreach ($result as $value) {
|
||
$goods = Goods::where('id',$value->goods_id)->first();
|
||
$value->goods_name = $goods->name;
|
||
$value->icon = $goods->icon;
|
||
$value->introduction = $goods->introduction;
|
||
}
|
||
return $this->success('ok',$result);
|
||
}
|
||
|
||
//商品详情
|
||
|
||
public function goods(Request $request)
|
||
{
|
||
$id = $request->id??7;
|
||
$result = Goods::select('id','name','icon','price','introduction','discount_price')->where('id',$id)->where('status',1)->first();
|
||
if($result){
|
||
$result->price = floatval($result->price);
|
||
$result->discount_price = floatval($result->discount_price);
|
||
// 8.7活动当天
|
||
$start = date('2021-08-07 00:00:00');
|
||
$end = date('2021-08-07 23:59:59');
|
||
$result->preferential = 0;
|
||
if($start<now()&&now()<$end){
|
||
$result->preferential = 1;
|
||
$result->discount_price = 109;
|
||
}
|
||
$openid = $request->openid;
|
||
$result->unsigned_order = FamilyOrder::where('open_id',$openid)->where('pay_status',1)->where('order_status','<>',2)->count();
|
||
}
|
||
return $this->success('ok',$result);
|
||
|
||
}
|
||
|
||
//确认收货
|
||
public function confirmReceipt(Request $request)
|
||
{
|
||
$id = $request->id;
|
||
$openid = $request->openid;
|
||
$order = FamilyOrder::where('id',$id)->where('open_id',$openid)->first();
|
||
if(!$order) return $this->failure('未查询到该订单信息.');
|
||
if($order->order_status==2){
|
||
return $this->failure('该订单已签收。');
|
||
}
|
||
$order->order_status = 2;
|
||
$order->save();
|
||
return $this->success('操作成功');
|
||
|
||
}
|
||
|
||
/**
|
||
* 送礼物
|
||
*/
|
||
public function sendGift(Request $request, $id, $gift_id)
|
||
{
|
||
$user_id = auth()->id();
|
||
$gift = Gift::find($gift_id);
|
||
$num = $request->input('num', 1);
|
||
$price = $gift->price * $num;
|
||
//积分
|
||
$score = $this->getAccountScore($user_id);
|
||
$total = $score->remain_amount - $price;
|
||
if ($total >= 0) {
|
||
$cash = 0;
|
||
$score = $price;
|
||
}else{
|
||
$cash = $price - $score->remain_amount;
|
||
$score = $score->remain_amount;
|
||
}
|
||
//购买积分
|
||
$trade_no = $this->getTradeNO();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $cash,
|
||
'score' => $score,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>$gift_id,
|
||
'goods'=>'购买'.$gift->name,
|
||
'price'=>$price,
|
||
'num'=>1,
|
||
'type'=>'gift',
|
||
'trade_no'=>$trade_no,
|
||
'pay_status'=>'UNPAID',
|
||
);
|
||
$wx_pay = [];
|
||
if ($cash > 0) {
|
||
$wx_pay = $this->constructWXPay($pay_order, $user_id);
|
||
}else{
|
||
$order['pay_status'] = 'PAID';
|
||
$pay_order['pay_status'] = 'PAID';
|
||
}
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
$this->addGiftHistory($user_id, $id, $gift_id, 0, $num, $trade_no);
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
|
||
/**
|
||
* 添加礼物记录
|
||
*/
|
||
public function addGiftHistory($user_id, $other_user_id, $gift_id, $status, $num, $trade_no)
|
||
{
|
||
//礼物记录
|
||
GiftHistory::create([
|
||
'user_id'=>$user_id,
|
||
'other_user_id'=>$other_user_id,
|
||
'gift_id'=>$gift_id,
|
||
'type'=>'GIVEN',
|
||
'num'=>$num,
|
||
'status'=>$status,
|
||
'trade_no'=>$trade_no,
|
||
]);
|
||
GiftHistory::create([
|
||
'user_id'=>$other_user_id,
|
||
'other_user_id'=>$user_id,
|
||
'gift_id'=>$gift_id,
|
||
'type'=>'RECEVIED',
|
||
'num'=>$num,
|
||
'status'=>$status,
|
||
'trade_no'=>$trade_no,
|
||
]);
|
||
if ($status == 1) {
|
||
//更新礼物库
|
||
$user_gift = UserGift::where('user_id', $other_user_id)->where('gift_id', $gift_id)->first();
|
||
if (empty($user_gift)) {
|
||
$user_gift = UserGift::create([
|
||
'user_id'=>$other_user_id,
|
||
'gift_id'=>$gift_id,
|
||
'num'=>0,
|
||
]);
|
||
}
|
||
$user_gift->num += $num;
|
||
$user_gift->save();
|
||
}
|
||
return ;
|
||
}
|
||
|
||
/**
|
||
* 商品列表
|
||
*/
|
||
public function goodses(Request $request)
|
||
{
|
||
$user_id = auth()->id();
|
||
$goodses = Goods::all();
|
||
//我的福分
|
||
$score = $this->getAccountScore($user_id);
|
||
return $this->success('ok', compact('score', 'goodses'));
|
||
}
|
||
|
||
|
||
//
|
||
|
||
/**
|
||
* 兑换商品
|
||
*/
|
||
public function exchangeGoods(Request $request, $id)
|
||
{
|
||
$user_id = auth()->id();
|
||
$user = auth()->user();
|
||
$goods = Goods::find($id);
|
||
if (empty($goods)) {
|
||
return $this->failure('no goods');
|
||
}
|
||
$num = $request->input('num', 1);
|
||
$total = $num * $goods->price;
|
||
$score = $this->getAccountScore($user_id);
|
||
$remain_amount = $score->remain_amount;
|
||
if ($remain_amount < $total) {
|
||
return $this->failure('福分不足');
|
||
}
|
||
$trade_no = $this->getTradeNO();
|
||
$name = $request->input('name');
|
||
if (empty($name)) {
|
||
return $this->failure('请输入姓名');
|
||
}
|
||
$mobile = $request->input('mobile');
|
||
if (empty($mobile)) {
|
||
return $this->failure('请输入电话');
|
||
}
|
||
$address = $request->input('address');
|
||
if (empty($address)) {
|
||
return $this->failure('请输入地址');
|
||
}
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'PAID',
|
||
'score' => $total,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>0,
|
||
'goods'=>'兑换'.$goods->name,
|
||
'price'=>$goods->price,
|
||
'num'=>$num,
|
||
'type'=>'goods',
|
||
'trade_no'=>$trade_no,
|
||
'pay_status' => 'PAID',
|
||
'name'=>$name,
|
||
'address'=>$address,
|
||
'mobile'=>$mobile,
|
||
);
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$this->changeScore($user_id, $total, 'used', $order['goods']);
|
||
//通知
|
||
$message = '您已经使用'.$total.'福分兑换商品['.$goods->name.'],我们将尽快为您发货';
|
||
$this->sms->sentMessage($user->mobile, $message);
|
||
return $this->success('ok', $order);
|
||
}
|
||
|
||
/**
|
||
* 积分充值
|
||
*/
|
||
public function rechargeScore(Request $request)
|
||
{
|
||
$user_id = auth()->id();
|
||
$price = $request->input('price');
|
||
if (empty($price)) {
|
||
return $this->failure('请输入金额');
|
||
}
|
||
if($price < 0.01 || $price > 100000) {
|
||
return $this->failure('充值金额范围:0.01-100000');
|
||
}
|
||
$trade_no = $this->getTradeNO();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $price,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>0,
|
||
'goods'=>'账户充值',
|
||
'price'=>$price,
|
||
'num'=>1,
|
||
'type'=>'score',
|
||
'trade_no'=>$trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
);
|
||
$wx_pay = $this->constructWXPay($pay_order, $user_id);
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
|
||
/**
|
||
* 绑定别人支付
|
||
*/
|
||
public function useInviteOrder(Request $request, $id)
|
||
{
|
||
$is_register = 0;
|
||
$invited = 0;
|
||
$is_ok = true;
|
||
$other_openid = $request->input('other_openid');
|
||
if (empty($other_openid)) {
|
||
return $this->failure('no openid');
|
||
}
|
||
$invite_order = InviteOrder::findOrFail($id);
|
||
if ($invite_order->other_openid) {
|
||
if ($invite_order->other_openid != $other_openid) {
|
||
$invited = 1;
|
||
$wechat = Wechat::where('openid', $other_openid)->whereNotNull('user_id')->first();
|
||
if ($wechat) {
|
||
$user = User::find($wechat->user_id);
|
||
if ($user) {
|
||
$is_register = 1;
|
||
}
|
||
}
|
||
$is_ok = false;
|
||
return $this->success('邀请已被抢注', compact('is_ok', 'invited', 'is_register'));
|
||
}else{
|
||
$is_register = 1;
|
||
return $this->success('ok', compact('is_ok', 'invited', 'is_register'));
|
||
}
|
||
}
|
||
if (!$invite_order->status) {
|
||
return $this->failure('该订单未支付');
|
||
}
|
||
$order = Order::with('user')->where('trade_no', $invite_order->trade_no)->first();
|
||
$rank = Rank::find($order->type_id);
|
||
//已注册用户绑定
|
||
$wechat = Wechat::where('openid', $other_openid)->whereNotNull('user_id')->first();
|
||
//分享VIP多出金额
|
||
$amount = 0;
|
||
//接收人名称
|
||
$user_name = '';
|
||
$user_mobile = '';
|
||
$user_rank_name = '';
|
||
$invite_score = $order->price;
|
||
if ($wechat) {
|
||
$user = User::find($wechat->user_id);
|
||
if ($user) {
|
||
$is_register = 1;
|
||
$user_name = $user->name;
|
||
$user_mobile = $user->mobile;
|
||
if ($user->type != 'single') {
|
||
return $this->failure('不是单身不需要充值会员');
|
||
}
|
||
if (empty($user->rank_id)) {
|
||
$user->rank_id = $rank->id;
|
||
}else{
|
||
$user_rank = Rank::find($user->rank_id);
|
||
$user_rank_name = $user_rank->name;
|
||
if ($user_rank->price >= $rank->price) {
|
||
$is_ok = false;
|
||
return $this->success('false', compact('is_ok', 'invited', 'is_register'));
|
||
}
|
||
$user->rank_id = $rank->id;
|
||
//分享VIP多出金额
|
||
$amount = $user_rank->price;
|
||
$invite_score = $rank->price - $user_rank->price;
|
||
}
|
||
RankHistory::create([
|
||
'user_id'=>$user->id,
|
||
'rank_id'=>$rank->id,
|
||
]);
|
||
$user->save();
|
||
}
|
||
}
|
||
$invite_order->other_openid = $other_openid;
|
||
$invite_order->save();
|
||
//生成分享记录
|
||
// $this->addInviteHistory($invite_order->other_openid, $invite_order->openid);
|
||
//分享收益
|
||
$this->addInviteScore($invite_order->openid,$invite_score);
|
||
//短信通知
|
||
$invite_wechat = Wechat::where('openid', $invite_order->openid)->first();
|
||
$invite_user = User::where('id', $invite_wechat->user_id)->select('id', 'name', 'mobile')->first();
|
||
if ($user_mobile) {
|
||
$message = '尊敬的用户, 您成功的接受了用户【'.$user_name.'】的'.$rank->name.'会员邀请';
|
||
$this->sms->sentMessage($user_mobile, $message);
|
||
}
|
||
$pay_order = PayOrder::where('trade_no', $invite_order->trade_no)->where('pay_status', 'PAID')->first();
|
||
$refund_trade_no = $this->getRefundTradeNo();
|
||
//多出金额退款
|
||
if ($amount > 0) {
|
||
$this->changeScore($invite_user->id, $amount, 'gained', '替人支付会员福分返回');
|
||
//通知用户
|
||
$message = '亲爱的用户您好,用户['.$user_name.']接受了您的福恋'.$rank->name.'会员邀请,由于用户['.$user_name.']本是'.$user_rank_name.'会员,多出的部分将返回您的福分中.';
|
||
$this->sms->sentMessage($invite_user->mobile, $message);
|
||
}
|
||
// $score = 0;
|
||
// $cash = 0;
|
||
// if ($amount > 0) {
|
||
// //判断是微信支付还是福分支付
|
||
// if ($pay_order->score) {//福分支付
|
||
// if ($pay_order->score >= $amount) {//福分大于可退金额
|
||
// $score = $amount;
|
||
// }else{
|
||
// $score = $pay_order->score;
|
||
// $cash = $amount - $pay_order->score;
|
||
// }
|
||
// }else{
|
||
// $cash = $pay_order->cash - $amount;
|
||
// }
|
||
// }
|
||
// $user_id = Wechat::where('openid', $invite_order->openid)->value('user_id');
|
||
// if ($score > 0) {
|
||
// $this->changeScore($user_id, $score, 'gained', '替人支付会员积分返回');
|
||
// }
|
||
// //退款订单号
|
||
// $refund_trade_no = $this->getRefundTradeNo();
|
||
// if ($cash > 0) {
|
||
// $array = [];
|
||
// $array['refund_desc'] = '替人会员返回';
|
||
// WechatService::orderRefund($invite_order->trade_no, $refund_trade_no, $pay_order->cash * 100, $cash *100, $array);
|
||
// }
|
||
// if ($score > 0 || $cash > 0) {
|
||
// RefundOrder::create([
|
||
// 'user_id'=>$user_id,
|
||
// 'trade_no'=>$invite_order->trade_no,
|
||
// 'refund_trade_no'=>$refund_trade_no,
|
||
// 'total_fee'=>$pay_order->cash,
|
||
// 'refund_fee'=>$cash,
|
||
// 'refund_score'=>$score
|
||
// ]);
|
||
// }
|
||
|
||
return $this->success('ok', compact('is_ok', 'invited', 'is_register'));
|
||
}
|
||
|
||
/**
|
||
* 绑定页面
|
||
*/
|
||
public function inviteOrder(Request $request, $id)
|
||
{
|
||
$session = $this->getWechatSession($request->code);
|
||
$openid = '';
|
||
if ($session) {
|
||
if(!isset($session['session_key'])){
|
||
return $this->failure('failure', $session);
|
||
}
|
||
$openid = $session['openid'];
|
||
}
|
||
$invite_order = InviteOrder::find($id);
|
||
if (empty($invite_order)) {
|
||
return $this->failure('未检测到有vip卡');
|
||
}
|
||
$order = Order::with('user')->where('trade_no', $invite_order->trade_no)->first();
|
||
if (empty($order)) {
|
||
return $this->failure('邀请不存在');
|
||
}
|
||
$rank = Rank::find($order->type_id);
|
||
$order->rank = $rank;
|
||
$wechat = Wechat::where('user_id', $order->user_id)->select('avatar', 'avatar2')->first();
|
||
if (empty($wechat)) {
|
||
if ($order->user->sex == 1) {
|
||
$avatar = 'http://images.ufutx.com/201811/12/0e8b72aae6fa640d9e73ed312edeebf3.png';
|
||
}else {
|
||
$avatar = 'http://images.ufutx.com/201811/12/dddd79aa2c2fc6a6f35e641f6b8fb8f5.png';
|
||
}
|
||
}else{
|
||
$avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar;
|
||
}
|
||
|
||
$order->avatar = $avatar;
|
||
return $this->success('ok', compact('order', 'openid'));
|
||
|
||
}
|
||
|
||
public function getWechatSession($code)
|
||
{
|
||
$session = null;
|
||
$mp = \EasyWechat::miniProgram();
|
||
|
||
try{
|
||
if(config('app.debug') && $code == 'the code is a mock one'){
|
||
//simulate
|
||
$session = [
|
||
'openid' => 'oyBj70MRExrrzYH7K8F_VE75XeoE',
|
||
'session_key' => 'oyBj70MRExrrzYH7K8F_VE75XeoE',
|
||
'unionid' => 'oVMWoswKQA2ToVHyLzcc6t19N4zE',
|
||
];
|
||
}else{
|
||
$session = $mp->auth->session($code);
|
||
}
|
||
}catch(\Exeception $e){
|
||
$failure = $e->getMessage;
|
||
}
|
||
return $session;
|
||
|
||
}
|
||
|
||
/**
|
||
* 购买约见
|
||
* @param Request $request [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function buyAppointment(Request $request, $point_id)
|
||
{
|
||
$user = auth()->user();
|
||
if (empty($user)) {
|
||
return $this->failure('no user');
|
||
}
|
||
if ($user->type != 'single') {
|
||
return $this->failure('暂只支持单身购买');
|
||
}
|
||
$user_id = $user->id;
|
||
$appointment = Appointment::findOrFail($point_id);
|
||
$price = $appointment->price;
|
||
$trade_no = $this->getTradeNO();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $price,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>$point_id,
|
||
'goods'=>$appointment->name,
|
||
'price'=>$price,
|
||
'num'=>1,
|
||
'type'=>'meet',
|
||
'trade_no'=>$trade_no,
|
||
);
|
||
$wx_pay = $this->constructWXPay($pay_order, $user_id, '福恋约见');
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
|
||
/**
|
||
* 购买认证
|
||
* @param Request $request [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function officialBuyAppointment(Request $request, $point_id)
|
||
{
|
||
$user = auth()->user();
|
||
if (empty($user)) {
|
||
return $this->failure('no user');
|
||
}
|
||
if ($user->type != 'single') {
|
||
return $this->failure('暂只支持单身购买');
|
||
}
|
||
$user_id = $user->id;
|
||
$appointment = Appointment::findOrFail($point_id);
|
||
$price = $appointment->price;
|
||
$trade_no = $this->getTradeNO();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $price,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>$point_id,
|
||
'goods'=>$appointment->name,
|
||
'price'=>$price,
|
||
'num'=>1,
|
||
'type'=>'meet',
|
||
'trade_no'=>$trade_no,
|
||
);
|
||
if (strstr($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) {
|
||
$wx_pay = \WechatService::constructWXPay($pay_order, $user_id, '福恋约见');
|
||
}else{
|
||
$wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '福恋约见');
|
||
}
|
||
// $wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '购买认证');
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
|
||
/**
|
||
* 奉献
|
||
* @param Request $request [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function donation(Request $request)
|
||
{
|
||
$user_id = auth()->id();
|
||
if (empty($user_id)) {
|
||
return $this->failure('no user_id');
|
||
}
|
||
$price = $request->input('price');
|
||
if (empty($price)) {
|
||
return $this->failure('请输入奉献金额');
|
||
}
|
||
$trade_no = $this->getTradeNO();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $price,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>0,
|
||
'goods'=>'奉献金',
|
||
'price'=>$price,
|
||
'num'=>1,
|
||
'type'=>'donation',
|
||
'trade_no'=>$trade_no,
|
||
);
|
||
$wx_pay = $this->constructWXPay($pay_order, $user_id, '奉献金');
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
|
||
/**
|
||
* 奉献
|
||
* @param Request $request [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function officialAonation(Request $request)
|
||
{
|
||
$user_id = auth()->id();
|
||
if (empty($user_id)) {
|
||
return $this->failure('no user_id');
|
||
}
|
||
$price = $request->input('price');
|
||
if (empty($price)) {
|
||
return $this->failure('请输入奉献金额');
|
||
}
|
||
$trade_no = $this->getTradeNO();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $price,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>0,
|
||
'goods'=>'奉献金',
|
||
'price'=>$price,
|
||
'num'=>1,
|
||
'type'=>'donation',
|
||
'trade_no'=>$trade_no,
|
||
);
|
||
// $wx_pay = $this->constructWXPay($pay_order, $user_id, '奉献金');
|
||
if (strstr($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) {
|
||
$wx_pay = \WechatService::constructWXPay($pay_order, $user_id, '奉献金');
|
||
}else{
|
||
$wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '奉献金');
|
||
}
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
|
||
/**
|
||
* 购买认证
|
||
* @param Request $request [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function buyApprove(Request $request)
|
||
{
|
||
$user_id = auth()->id();
|
||
if (empty($user_id)) {
|
||
return $this->failure('no user_id');
|
||
}
|
||
$price = $request->input('price', 10);
|
||
if (empty($price)) {
|
||
return $this->failure('没有购买金额');
|
||
}
|
||
$trade_no = $this->getTradeNO();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $price,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>0,
|
||
'goods'=>'实名认证',
|
||
'price'=>$price,
|
||
'num'=>1,
|
||
'type'=>'approve',
|
||
'trade_no'=>$trade_no,
|
||
);
|
||
$wx_pay = $this->constructWXPay($pay_order, $user_id, '认证');
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
|
||
/**
|
||
* 参加活动
|
||
* @param Request $request [description]
|
||
* @param [type] $activity_id [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function joinActivity(Request $request, $activity_id)
|
||
{
|
||
$activity = Activity::find($activity_id);
|
||
if (empty($activity)) {
|
||
return $this->failure('该活动不存在');
|
||
}
|
||
// if (!empty($activity->is_deadline)) {
|
||
// return $this->failure('该活动已截止报名');
|
||
// }
|
||
$user = auth()->user();
|
||
|
||
$user_id = $user->id;
|
||
if (empty($user_id)) {
|
||
return $this->failure('no user_id');
|
||
}
|
||
$member = ActivityMember::where('user_id', $user_id)->where('activity_id', $activity_id)->where('is_joined', 1)->first();
|
||
if ($member) {
|
||
return $this->failure('已报名');
|
||
}
|
||
if ($activity->fee == 0) {
|
||
$wechat = wechat::where('user_id', $user_id)->first();
|
||
$avatar = '';
|
||
if (!empty($wechat)) {
|
||
$avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar;
|
||
}
|
||
$sex = $user->sex;
|
||
if (empty($sex)) {
|
||
$sex = Wechat::where('user_id', $user->id)->value('gender');
|
||
}
|
||
if (empty($sex)) {
|
||
return $this->failure('请完善性别信息!');
|
||
}
|
||
$activity_member = ActivityMember::create([
|
||
'user_id'=>$user_id,
|
||
'activity_id'=>$activity_id,
|
||
'name'=>$user->name,
|
||
'sex'=>$sex,
|
||
'mobile'=>$user->mobile,
|
||
'avatar'=>$avatar,
|
||
'is_joined'=>1,
|
||
]);
|
||
$activity_member->wx_pay = [];
|
||
//发送模板通知给管理员(公众号)
|
||
$this->sendActivityNotice($activity, $user);
|
||
//发送订阅通知给用户
|
||
// $this->sendActivityNoticeToUser($activity, $user);
|
||
return $this->success('ok', $activity_member);
|
||
}else{
|
||
$trade_no = $this->getTradeNO();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $activity->fee,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>$activity_id,
|
||
'goods'=>$activity->theme,
|
||
'price'=>$activity->fee,
|
||
'num'=>1,
|
||
'type'=>'activity',
|
||
'trade_no'=>$trade_no,
|
||
'from_openid'=>$request->input('from_openid'),
|
||
'share_type'=>$request->input('share_type', 'normal'),
|
||
);
|
||
$wx_pay = $this->constructWXPay($pay_order, $user_id, $activity->theme);
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 用户参加活动V2
|
||
*/
|
||
public function joinActivityV2(Request $request, Activity $activity)
|
||
{
|
||
$trade_no = $this->getTradeNO();
|
||
//用户信息
|
||
$user = auth()->user();
|
||
if (empty($user)) {
|
||
return $this->failure('未登录');
|
||
}
|
||
$user_id = $user->id;
|
||
$member = $user->activityMember()->where('activity_id', $activity->id)->where('is_joined', 1)->first();
|
||
if ($member) {
|
||
return $this->failure('已报名');
|
||
}
|
||
$wechat = $user->wechat;
|
||
$avatar = '';
|
||
if (!empty($wechat)) {
|
||
$avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar;
|
||
}
|
||
$sex = $user->sex;
|
||
if (empty($sex)) {
|
||
$sex = $wechat->gender?:0;
|
||
}
|
||
//生成订单
|
||
$order = array(
|
||
'type_id'=>$activity->id,
|
||
'goods'=>$activity->theme,
|
||
'price'=>$activity->fee,
|
||
'num'=>1,
|
||
'type'=>'activity',
|
||
'trade_no'=>$trade_no,
|
||
'name'=>$request->input('name'),
|
||
'mobile'=>$request->input('mobile'),
|
||
'wechat_id'=>$request->input('wechat_id'),
|
||
'remark'=>$request->input('remark'),
|
||
'pay_status'=>'UNPAID',
|
||
'from_openid'=>$request->input('from_openid'),
|
||
);
|
||
if ($activity->fee == 0) {//免费活动
|
||
$user->activityMember()->create([
|
||
'activity_id'=>$activity->id,
|
||
'name'=>$user->name,
|
||
'sex'=>$sex,
|
||
'mobile'=>$user->mobile,
|
||
'avatar'=>$avatar,
|
||
'is_joined'=>1,
|
||
]);
|
||
$order['pay_status'] = 'PAID';
|
||
$order = $user->orders()->create($order);
|
||
$order->wx_pay = [];
|
||
//发送模板通知给管理员(公众号)
|
||
$this->sendActivityNotice($activity, $user);
|
||
//发送订阅通知给用户
|
||
// $this->sendActivityNoticeToUser($activity, $user);
|
||
return $this->success('ok', $order);
|
||
}else{//收费活动
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $activity->fee,
|
||
);
|
||
$wx_pay = $this->constructWXPay($pay_order, $user_id, $activity->theme);
|
||
$order = $user->orders()->create($order);
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 用户参加活动V3
|
||
* 增加sku
|
||
*/
|
||
public function joinActivityV3(Request $request, Activity $activity, $sku_id=0)
|
||
{
|
||
try {
|
||
$trade_no = $this->getTradeNO();
|
||
//用户信息
|
||
$user = auth()->user();
|
||
$rule_name = $request->path();
|
||
$h5 = strstr($rule_name,'official');
|
||
if($h5) $type='h5';
|
||
$user_id = $user->id;
|
||
$member = $user->activityMember()->where('activity_id', $activity->id)->where('is_joined', 1)->first();
|
||
|
||
|
||
if ($member&&$activity->can_repeat_sign!=1) {
|
||
return $this->failure('已报名');
|
||
}
|
||
|
||
// if(!empty($activity->apply_deadline)){
|
||
// $apply_deadline = strtotime($activity->apply_deadline);
|
||
// if($apply_deadline<time()){
|
||
// return $this->failure('当前活动,已截止报名');
|
||
// }
|
||
// }
|
||
|
||
|
||
$wechat = $user->wechat;
|
||
$avatar = $user->avatar;
|
||
if (!empty($wechat)) {
|
||
$avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar;
|
||
}
|
||
$sex = $user->sex;
|
||
if (empty($sex)) {
|
||
$sex = $wechat->gender?:0;
|
||
}
|
||
//sku
|
||
$sub_sku = $this->getActivitySku($activity, $sku_id);
|
||
if (empty(count($sub_sku))) {
|
||
return $this->failure('暂无活动规格');
|
||
}
|
||
$price = $sub_sku['price'];
|
||
|
||
$goods = $activity->theme.'【'.$sub_sku['name'].'】';
|
||
$linkmen = $request->input('linkmen', []);
|
||
if (empty(count($linkmen))) {
|
||
return $this->failure("请输入至少填写一位联系人");
|
||
}
|
||
//生成订单
|
||
$order = array(
|
||
'type_id'=>$activity->id,
|
||
'goods'=>$goods,
|
||
'price'=>$price?:0,
|
||
'num'=>1,
|
||
'type'=>'activity',
|
||
'trade_no'=>$trade_no,
|
||
'name'=>$request->input('name'),
|
||
'mobile'=>$request->input('mobile'),
|
||
'wechat_id'=>$request->input('wechat_id'),
|
||
'remark'=>$request->input('remark'),
|
||
'linkmen'=>json_encode($linkmen),
|
||
'pay_type' => 'wechat',
|
||
'pay_status'=>'UNPAID',
|
||
'from_openid'=>$request->input('from_openid',''),
|
||
'from_user_id'=>$request->input("from_user_id"),
|
||
'share_type'=> $request->input('share_type')?:'normal',
|
||
);
|
||
if ($price == 0) {//免费活动
|
||
\DB::beginTransaction();
|
||
$user->activityMember()->create([
|
||
'activity_id'=>$activity->id,
|
||
'name'=>$user->name,
|
||
'sex'=>$sex,
|
||
'mobile'=>$user->mobile,
|
||
'linkmen'=>json_encode($linkmen),
|
||
'avatar'=>$avatar,
|
||
'is_joined'=>1,
|
||
'from_openid'=>$request->input('from_openid',''),
|
||
]);
|
||
$order['pay_type'] = 'free';
|
||
$order['pay_status'] = 'PAID';
|
||
$order = $user->orders()->create($order);
|
||
$order->wx_pay = [];
|
||
if($request->channel&&$request->channel ='app'){
|
||
$order->pay_config = null;
|
||
$order->order_id = $order->id;
|
||
}
|
||
//发送模板通知给管理员(公众号)
|
||
if(!isset($type)){
|
||
$this->sendActivityNotice($activity, $user);
|
||
// //发送订阅通知给用户
|
||
// $this->sendActivityNoticeToUser($activity, $user);
|
||
}
|
||
\DB::commit();
|
||
return $this->success('ok', $order);
|
||
}else{//收费活动
|
||
\DB::beginTransaction();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'pay_type' => 'wechat',
|
||
'cash' => $price,
|
||
);
|
||
$order['pay_type'] = 'wechat';
|
||
$pay_type = $request->pay_type;
|
||
$cash = $price;
|
||
if($pay_type=='coin'&&$activity->pay_type=='coin'&&$activity->can_cash_amount>0&&$activity->can_coin_amount){
|
||
//当前福币
|
||
$total_coin = $user->totalCoin();
|
||
if($total_coin){
|
||
if($total_coin>=$activity->can_coin_amount){
|
||
$cash = $price-$activity->can_cash_amount;
|
||
if($cash<=0)
|
||
return $this->failure('报名失败,请稍后再试~');
|
||
$remark = '花费福币'.$activity->can_coin_amount.'个,抵扣金额'.$activity->can_cash_amount.'元';
|
||
$score = $activity->can_coin_amount;
|
||
$order['pay_type'] = 'free';
|
||
}else{
|
||
$cash = $price - ($total_coin/10);
|
||
$remark = '花费福币'.($total_coin).'个,抵扣金额'.($total_coin/10).'元';
|
||
$score = $total_coin;
|
||
$order['pay_type'] = 'wechat';
|
||
}
|
||
$order['price']= $cash;
|
||
$order['remark']= $remark;
|
||
$pay_order['cash']= $cash;
|
||
$pay_order['score']= $score;
|
||
}
|
||
}
|
||
$order = $user->orders()->create($order);
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order_pay->pay_type = 'wechat';
|
||
if((isset($cash)&&$cash>0)||$price){
|
||
if(isset($type)){//H5支付
|
||
$callback = config('app.url').'/api/mark/order/pay/'.$trade_no;
|
||
$openid = Viewer::where('user_id', $user_id)->value('openid');
|
||
$attributes = array(
|
||
'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP...
|
||
'body' => $goods,
|
||
'detail' => $goods,
|
||
'out_trade_no' => $trade_no,
|
||
'total_fee' => $cash*100,
|
||
'notify_url' => $callback, // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
||
'openid' => $openid,
|
||
);
|
||
if($request->channel&&$request->channel ='app'){
|
||
$ios_version = request()->header('app-version');
|
||
$and_version = request()->header('version-name');
|
||
$callback = config('app.url').'/api/app/callback/orders/'.$pay_order['trade_no'].'?ios_version='.$ios_version.'&and_version='.$and_version;
|
||
$pay_config = \WechatService::constructWXAppPay($pay_order, auth()->id(),$goods, $callback,true);
|
||
$order_pay->pay_config = $pay_config;
|
||
$order_pay->order_id = $order->id;
|
||
\DB::commit();
|
||
return $this->success('ok', $order_pay);
|
||
}else{//小程序支付
|
||
$wx_pay = \WechatService::officialPay($attributes);
|
||
}
|
||
}else{
|
||
$wx_pay = $this->constructWXPay($pay_order, $user_id, $goods);
|
||
}
|
||
}else{
|
||
$order->pay_status = 'PAID';
|
||
$order->save();
|
||
$order_pay->pay_status = 'PAID';
|
||
$order_pay->save();
|
||
$this->payment_change($order,$trade_no);
|
||
$wx_pay = null;
|
||
}
|
||
$order_pay->wx_pay = $wx_pay;
|
||
\DB::commit();
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
} catch (\Exception $e) {
|
||
\DB::rollBack();
|
||
$this->getError($e);
|
||
return $this->failure('报名失败');
|
||
}
|
||
}
|
||
|
||
public function getActivitySku($activity, $sku_id)
|
||
{
|
||
$arr = [];
|
||
if ($activity->sku) {
|
||
$skus = $activity->sku->skus;
|
||
if (!is_array($skus)) {
|
||
$skus = json_decode($activity->sku->skus,true);
|
||
}
|
||
$skus = array_column($skus, null,'sku_id');
|
||
$arr = $skus[$sku_id];
|
||
}
|
||
return $arr;
|
||
}
|
||
|
||
//订单详情
|
||
public function orderByNo(Request $request, $trade_no)
|
||
{
|
||
$order = Order::with('payorder')->where('trade_no', $trade_no)->first();
|
||
if(!$order) {
|
||
$order = TouristOrder::where('trade_no', $trade_no)->first();
|
||
}
|
||
|
||
$show_pay_type = '免费';
|
||
if($order['pay_type'] == 'wechat'){
|
||
$show_pay_type = '微信支付';
|
||
}else if($order['pay_type'] == 'alipay'){
|
||
$show_pay_type = '支付宝支付';
|
||
}else if($order['pay_type'] == 'ios'){
|
||
$show_pay_type = 'IOS支付';
|
||
}else if($order['pay_type'] == 'h5'){
|
||
$show_pay_type = 'H5支付';
|
||
}
|
||
$order['show_pay_type'] = $show_pay_type;
|
||
$order['show_type'] = $this->orderCon->orderTypeCodeSwitchChinese($order['type']);
|
||
if($order->type=='course')
|
||
$order->goods = $order->course->title??$order->goods;
|
||
$order->used_coin = 0 ;
|
||
//花费福币50个,抵扣金额5.00元
|
||
if($order->remark){
|
||
$start = strpos($order->remark,'币')/3+1;
|
||
$end = strpos($order->remark,'个')-8;
|
||
$len = $end- $start;
|
||
if($start&&$end&&$len){
|
||
$order->used_coin = intval(mb_substr($order->remark, $start,$len,'utf-8'));
|
||
}
|
||
|
||
}
|
||
|
||
return $this->success('ok', $order);
|
||
}
|
||
|
||
/**
|
||
* 公众号模板消息通知管理员
|
||
*/
|
||
public function sendActivityNotice($activity, $user)
|
||
{
|
||
$openids = ['oPC_2vudkf3stdiNgjA-e2n6t9_M', 'oPC_2vqYw7abAstDCtOO0iNK1kxI', 'oPC_2vg_Eur-Wa_Vwnx9JiyRVn9Q', 'oPC_2vjBtNlqBh0EItCoyRi-vUTg','oPC_2vjDpuCojlVoD9R_VxMHNmEw'];
|
||
$param['title'] = $activity->theme;
|
||
$param['user_name'] = $user->nickname;
|
||
$param['start_time'] = $activity->start_time;
|
||
$param['address'] = $activity->province.$activity->city.$activity->dist.$activity->address;
|
||
$param['activity_id'] = $activity->id;
|
||
$param['user_mobile'] = $user->mobile;
|
||
foreach ($openids as $openid) {
|
||
$param['openid'] = $openid;
|
||
\WechatService::activitySuccessNotice($param);
|
||
}
|
||
|
||
return ;
|
||
}
|
||
|
||
/**
|
||
* 活动退款
|
||
* @param Request $request [description]
|
||
* @param [type] $activity_id [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function activityOrderRefund(Request $request, $activity_id, $user_id)
|
||
{
|
||
//口令
|
||
$token = $request->input('token');
|
||
if ($token != 'fullink_refund') {
|
||
return $this->failure('退款失败, 请输入口令');
|
||
}
|
||
//判断是否有订单
|
||
$order = Order::where('type_id', $activity_id)->where('type', 'activity')->where('user_id', $user_id)->where('pay_status', 'PAID')->first();
|
||
if (empty($order)) {
|
||
return $this->failure('没有该订单');
|
||
}
|
||
$refund_trade_no = $this->getRefundTradeNo();
|
||
$total_fee = $order->price;
|
||
$refund_fee = $request->input('refund_fee');
|
||
if (empty($refund_fee)) {
|
||
return $this->failure('请输入退款金额');
|
||
}
|
||
$remark = $request->input('remark');
|
||
if (empty($remark)) return $this->failure('请输入退款理由');
|
||
$array = ['refund_desc' => '活动退款'];
|
||
$result = \WechatService::orderRefund($order->trade_no, $refund_trade_no, $total_fee, $refund_fee, $array);
|
||
if (is_array($result) && $result['status']===true) {
|
||
RefundOrder::create([
|
||
'user_id'=>$user_id,
|
||
'type'=>'activity',
|
||
'trade_no'=>$order->trade_no,
|
||
'refund_trade_no'=>$refund_trade_no,
|
||
'total_fee'=>$total_fee,
|
||
'refund_fee'=>$refund_fee,
|
||
'is_hook'=>0,
|
||
'remark'=>$remark,
|
||
]);
|
||
return $this->success('退款成功');
|
||
}else{
|
||
return $this->failure('退款失败');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 订单退款(不取消对应权限)
|
||
* @param Request $request [description]
|
||
* @param [type] $activity_id [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function orderRefund(Request $request, $order_id)
|
||
{
|
||
$user = auth()->user();
|
||
if (!($user->is_admin)) {
|
||
return $this->failure('请开通管理员权限');
|
||
}
|
||
// $code = $request->input('code');
|
||
// if ($code != 'ufutx_love') {
|
||
// return $this->failure('code错误');
|
||
// }
|
||
$type = $request->input('type');
|
||
if (empty($type)) {
|
||
return $this->failure('请输入订单类型');
|
||
}
|
||
//判断是否有订单
|
||
$order = Order::where('id', $order_id)->where('type', $type)->where('pay_status', 'PAID')->first();
|
||
if (empty($order)) {
|
||
return $this->failure('没有该支付订单');
|
||
}
|
||
$refund_trade_no = $this->getRefundTradeNo();
|
||
$pay_order = PayOrder::where('trade_no', $order->trade_no)->first();
|
||
$total_fee = $pay_order->cash;
|
||
$refund_fee = $pay_order->cash;
|
||
$desc = '活动退款';
|
||
if ($type == 'rank') {
|
||
$desc = 'VIP充值退款';
|
||
}elseif ($type == 'approve') {
|
||
$desc = '实名认证费退款';
|
||
//是否有已邀请认证
|
||
$openid = Wechat::where('user_id', $order->user_id)->value('openid');
|
||
$invite_user_ids = User::where('from_openid', $openid)->pluck('id');
|
||
$count = Order::where('type', 'approve')->where('pay_status', 'PAID')->whereIn('user_id', $invite_user_ids)->count();
|
||
if (empty($count)) {
|
||
return $this->success('暂无邀请用户认证');
|
||
}
|
||
}elseif ($type == 'meet') {
|
||
$desc = '红娘服务退款';
|
||
}elseif ($type == 'single_service') {
|
||
$desc = '单身服务退款';
|
||
}
|
||
$array = ['refund_desc' => $desc];
|
||
$result = \WechatService::orderRefund($order->trade_no, $refund_trade_no, $total_fee, $refund_fee, $array);
|
||
if (is_array($result) && $result['status'] === true) {
|
||
RefundOrder::create([
|
||
'user_id'=>$order->user_id,
|
||
'type'=>$type,
|
||
'trade_no'=>$order->trade_no,
|
||
'refund_trade_no'=>$refund_trade_no,
|
||
'total_fee'=>$total_fee,
|
||
'refund_fee'=>$refund_fee,
|
||
'is_hook'=>0,
|
||
]);
|
||
//修改订单状态
|
||
$order->pay_status = "REFUND";
|
||
$order->save();
|
||
return $this->success('退款成功');
|
||
}else{
|
||
return $this->failure('退款失败');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 升级会员
|
||
* @param Request $request [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function officialMemberCharge(Request $request)
|
||
{
|
||
$user = auth()->user();
|
||
$sub_rank_id = $request->input('sub_rank_id');
|
||
if (empty($sub_rank_id)) {
|
||
return $this->failure('请选择会员');
|
||
}
|
||
$sub_rank = SubRank::find($sub_rank_id);
|
||
$rank = Rank::find($sub_rank->rank_id);
|
||
//判断会员等级
|
||
if ($user->rank_id > $sub_rank->rank_id) {
|
||
return $this->failure('当前会员等级高于购买会员等级');
|
||
}
|
||
$score = $this->getAccountScore($user->id);
|
||
$result = $this->orderCon->officialMemberCharge($request, $rank->name, $sub_rank->month, $sub_rank->discount_price, $score, $trade_type = 'h5');
|
||
return $this->success('ok', $result);
|
||
}
|
||
|
||
/**
|
||
* app 微信支付
|
||
*/
|
||
public function officialAppMemberCharge(Request $request)
|
||
{
|
||
$user = auth()->user();
|
||
$trade_type = $request->input('trade_type', 'wechat_app');
|
||
$sub_rank_id = $request->input('sub_rank_id');
|
||
if (empty($sub_rank_id)) {
|
||
return $this->failure('请选择会员');
|
||
}
|
||
$sub_rank = SubRank::find($sub_rank_id);
|
||
$rank = Rank::find($sub_rank->rank_id);
|
||
//判断会员等级
|
||
if ($user->rank_id > $sub_rank->rank_id) {
|
||
return $this->failure('当前会员等级高于购买会员等级');
|
||
}
|
||
//测试金额
|
||
$score = $this->getAccountScore($user->id);
|
||
$result = $this->orderCon->officialMemberCharge($request, $rank->name, $sub_rank->month, $sub_rank->discount_price, $score, $trade_type);
|
||
return $this->success('ok', $result);
|
||
}
|
||
|
||
/**
|
||
* 购买认证
|
||
* @param Request $request [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public function officialBuyApprove(Request $request)
|
||
{
|
||
$user_id = auth()->id();
|
||
$price = $request->input('price', 10);
|
||
if (empty($price)) {
|
||
return $this->failure('没有购买金额');
|
||
}
|
||
$trade_no = $this->getTradeNO();
|
||
$pay_order = array(
|
||
'user_id' => $user_id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $price,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user_id,
|
||
'type_id'=>0,
|
||
'goods'=>'实名认证',
|
||
'price'=>$price,
|
||
'num'=>1,
|
||
'type'=>'approve',
|
||
'trade_no'=>$trade_no,
|
||
);
|
||
if (strstr($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) {
|
||
$wx_pay = \WechatService::constructWXPay($pay_order, $user_id, '购买认证');
|
||
}else{
|
||
$wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '购买认证');
|
||
}
|
||
// $wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '购买认证');
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
$order_pay->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order_pay);
|
||
}
|
||
|
||
public function singleServices(Request $request, SingleService $single_service)
|
||
{
|
||
$services = $single_service->where('is_show',1)->where('is_show_mini', 1)->orderBy('price', 'asc')->get();
|
||
foreach ($services as $service) {
|
||
$service->desc = json_decode($service->desc);
|
||
}
|
||
return $this->success('ok', $services);
|
||
}
|
||
|
||
/**服务套餐 需要登录 */
|
||
public function singleServicesV2(Request $request, SingleService $single_service)
|
||
{
|
||
$user = auth()->user();
|
||
$type = 'is_show_mini';
|
||
$rule_name = $request->path();
|
||
$h5 = strstr($rule_name,'official');
|
||
if($h5) $type='is_show_web';
|
||
$services = $single_service->with('rank')->where($type,1)->orderBy('id', 'asc')->get();
|
||
//获取520的购买记录
|
||
$repeatPayStatus = null;
|
||
if($user){
|
||
$repeatPayStatus = Order::where(['type_id'=>12,'pay_status'=>'PAID','user_id'=>$user->id])->first();
|
||
}
|
||
|
||
$result = array();
|
||
foreach ($services as $service) {
|
||
if ($service->discount_desc_type == 'json'){
|
||
$service->desc = json_decode($service->desc);
|
||
$service->feature = json_decode($service->feature);
|
||
$service->discount_desc = json_decode($service->discount_desc);
|
||
}else{
|
||
$service->desc = json_decode($service->desc);
|
||
$service->feature = json_decode($service->feature);
|
||
$service->discount_desc = explode('****',$service->discount_desc);
|
||
// $service->discount_desc = json_decode($service->discount_desc);
|
||
}
|
||
|
||
if($service->id == 12 && $repeatPayStatus){
|
||
continue;
|
||
}
|
||
$result[] = $service;
|
||
}
|
||
return $this->success('ok', $result);
|
||
}
|
||
|
||
//**服务套餐展示无需登录 */
|
||
public function singleServicesShow(Request $request, SingleService $single_service){
|
||
$user = auth()->user();
|
||
if(empty($user)){
|
||
$user = $this->authCheck();
|
||
}
|
||
if(empty($user)){
|
||
$SingleService = new SingleService();
|
||
$services = $SingleService->with('rank')
|
||
->where('is_show_mini',1)
|
||
->orderBy('id', 'asc')
|
||
->get();
|
||
$result = array();
|
||
foreach ($services as $service) {
|
||
if ($service->discount_desc_type == 'json'){
|
||
$service->desc = json_decode($service->desc);
|
||
$service->feature = json_decode($service->feature);
|
||
$service->discount_desc = json_decode($service->discount_desc);
|
||
$result[] = $service;
|
||
}else{
|
||
$service->desc = json_decode($service->desc);
|
||
$service->feature = json_decode($service->feature);
|
||
$service->discount_desc = explode('****',$service->discount_desc);
|
||
// $service->discount_desc = json_decode($service->discount_desc);
|
||
$result[] = $service;
|
||
}
|
||
|
||
}
|
||
return $this->success('ok', $result);
|
||
}else{
|
||
$services = $single_service->with('rank')->where('is_show_mini',1)->orderBy('id', 'asc')->get();
|
||
//获取520的购买记录
|
||
$repeatPayStatus = Order::where(['type_id'=>12,'pay_status'=>'PAID','user_id'=>$user->id])->first();
|
||
$result = array();
|
||
foreach ($services as $service) {
|
||
if ($service->discount_desc_type == 'json') {
|
||
$service->desc = json_decode($service->desc);
|
||
$service->feature = json_decode($service->feature);
|
||
$service->discount_desc = json_decode($service->discount_desc);
|
||
}else{
|
||
$service->desc = json_decode($service->desc);
|
||
$service->feature = json_decode($service->feature);
|
||
$service->discount_desc = explode('****',$service->discount_desc);
|
||
}
|
||
|
||
if($service->id == 12 && $repeatPayStatus){
|
||
continue;
|
||
}
|
||
$result[] = $service;
|
||
}
|
||
return $this->success('ok', $result);
|
||
}
|
||
}
|
||
|
||
public function buySingleServices(Request $request, SingleService $single_service)
|
||
{
|
||
try {
|
||
|
||
|
||
//生成订单
|
||
$user = auth()->user();
|
||
$price = $single_service->discount_price;
|
||
$trade_no = $this->getTradeNO();
|
||
$cash = $price;
|
||
$score = 0;
|
||
|
||
if($single_service->id == 12){
|
||
//获取520的购买记录
|
||
$repeatPayStatus = Order::where(['type_id'=>12,'pay_status'=>'PAID','user_id'=>$user->id])->first();
|
||
if($repeatPayStatus){
|
||
return $this->failure('当前套餐只能购买一次,请勿重复购买。');
|
||
}
|
||
$state = 1;
|
||
if(time() > 1621526400){
|
||
return $this->failure('活动已过期,请刷新页面后重试');
|
||
}
|
||
}else{
|
||
$state = 0;
|
||
}
|
||
$pay_type = $request->pay_type;
|
||
|
||
$remark = '';
|
||
if($pay_type=='coin'&&$single_service->pay_type=='coin'&&$single_service->can_cash_amount>0&&$single_service->can_coin_amount){
|
||
//当前福币
|
||
$total_coin = $user->totalCoin();
|
||
if($total_coin){//如果福币充足
|
||
if($total_coin>=$single_service->can_coin_amount){
|
||
$cash = $cash-$single_service->can_cash_amount;
|
||
$remark = '花费福币'.$single_service->can_coin_amount.'个,抵扣金额'.$single_service->can_cash_amount.'元';
|
||
$score = $single_service->can_coin_amount;
|
||
}else{//
|
||
$cash = $cash- ($total_coin/10);
|
||
$remark = '花费福币'.($total_coin).'个,抵扣金额'.($total_coin/10).'元';
|
||
$score = $total_coin;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
$pay_order = array(
|
||
'user_id' => $user->id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $cash,
|
||
'score' => $score,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user->id,
|
||
'type_id'=>$single_service->id,
|
||
'goods'=>$single_service->title,
|
||
'price'=>$price,
|
||
'pay_status'=>'UNPAID',
|
||
'num'=>1,
|
||
'type'=>'single_service',
|
||
'trade_no'=>$trade_no,
|
||
'remark'=>$remark,
|
||
'from_openid'=>$request->input('from_openid'),
|
||
'from_user_id'=>$request->input('from_user_id'),
|
||
'chat_user_id'=>$request->input('chat_user_id'),
|
||
'share_type'=>$request->input('share_type', 'normal'),
|
||
'other_user_id'=>$request->input('other_user_id'),
|
||
);
|
||
\DB::beginTransaction();
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
if ($cash>0) {
|
||
$wx_pay = \WechatService::constructWXPay($pay_order, $user->id, $single_service->title);
|
||
}else{
|
||
//修改订单状态
|
||
$order_pay->pay_status = 'PAID';
|
||
$order_pay->is_hooked = 1;
|
||
$order->pay_status = 'PAID';
|
||
$order->save();
|
||
$order_pay->save();
|
||
//订单回调
|
||
$result = $this->markSingleServiceOrder($order);
|
||
if (empty($result)) throw new \Exception("套餐订单失败", 1);
|
||
$wx_pay = [];
|
||
}
|
||
$order_pay->wx_pay = $wx_pay;
|
||
\DB::commit();
|
||
$order_pay['activity_msg'] = $state;
|
||
return $this->success('ok', $order_pay);
|
||
} catch (\Exception $e) {
|
||
\DB::rollBack();
|
||
$this->getError($e);
|
||
return $this->failure('套餐服务购买失败,请稍后再试');
|
||
}
|
||
|
||
}
|
||
|
||
public function buySingleServicesV2(Request $request)
|
||
{
|
||
try {
|
||
$id = $request->id;
|
||
$single_service = SingleService::where('id',$id)->first();
|
||
//生成订单
|
||
$user = auth()->user();
|
||
$price = $single_service->discount_price;
|
||
$trade_no = $this->getTradeNO();
|
||
$cash = $price;
|
||
$score = 0;
|
||
|
||
if($single_service->id == 13){
|
||
//获取520的购买记录
|
||
$repeatPayStatus = Order::where(['type_id'=>13,'pay_status'=>'PAID','user_id'=>$user->id,'goods'=>'企业臻享会员卡'])->first();
|
||
if($repeatPayStatus){
|
||
return $this->failure('当前套餐只能购买一次,请勿重复购买。');
|
||
}
|
||
$state = 1;
|
||
|
||
}else{
|
||
$state = 0;
|
||
}
|
||
|
||
$pay_order = array(
|
||
'user_id' => $user->id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => $cash,
|
||
'pay_type'=>'wechat',
|
||
'score' => $score,
|
||
);
|
||
$order = array(
|
||
'user_id'=>$user->id,
|
||
'type_id'=>$single_service->id,
|
||
'goods'=>$single_service->title,
|
||
'price'=>$price,
|
||
'pay_status'=>'UNPAID',
|
||
'num'=>1,
|
||
'pay_type'=>'wechat',
|
||
'type'=>'single_service',
|
||
'trade_no'=>$trade_no,
|
||
'from_openid'=>$request->input('from_openid'),
|
||
'share_type'=>$request->input('share_type', 'normal'),
|
||
'other_user_id'=>$request->input('other_user_id'),
|
||
);
|
||
\DB::beginTransaction();
|
||
//支付订单
|
||
$order_pay = PayOrder::create($pay_order);
|
||
$order = Order::create($order);
|
||
if ($cash>0) {
|
||
$callback = config('app.url').'/api/app/callback/orders/'.$trade_no;
|
||
$wx_pay = \WechatService::constructWXPay($pay_order, $user->id, $single_service->title,$callback);
|
||
}else{
|
||
//修改订单状态
|
||
$order_pay->pay_status = 'PAID';
|
||
$order_pay->is_hooked = 1;
|
||
$order->pay_status = 'PAID';
|
||
$order->save();
|
||
$order_pay->save();
|
||
//订单回调
|
||
$result = $this->markSingleServiceOrder($order);
|
||
if (empty($result)) throw new \Exception("套餐订单失败", 1);
|
||
$wx_pay = [];
|
||
}
|
||
$order_pay->wx_pay = $wx_pay;
|
||
\DB::commit();
|
||
$order_pay['activity_msg'] = $state;
|
||
return $this->success('ok', $order_pay);
|
||
} catch (\Exception $e) {
|
||
\DB::rollBack();
|
||
$this->getError($e);
|
||
return $this->failure('套餐服务购买失败,请稍后再试');
|
||
}
|
||
|
||
}
|
||
|
||
|
||
public function getActivityState(){
|
||
$user = auth()->user();
|
||
$repeatPayStatus = Order::where(['type_id'=>12,'pay_status'=>'PAID','user_id'=>$user->id])->first();
|
||
if($repeatPayStatus){
|
||
$repeatPayStatus = 1;
|
||
}else if(time()>1621526400){
|
||
$repeatPayStatus = 2;
|
||
}else{
|
||
$repeatPayStatus = 0;
|
||
}
|
||
$topicSuper = $user->getSuperCount($user->id,'520_topic_give');
|
||
if($topicSuper){
|
||
$topicSuper = 1;
|
||
}else if(time()>1622476800){
|
||
$topicSuper = 2;
|
||
}else{
|
||
$topicSuper = 0;
|
||
}
|
||
return $this->success('ok', ['topicSuper'=>$topicSuper,'repeatPayStatus'=>$repeatPayStatus]);
|
||
}
|
||
|
||
//是否购买企业会员
|
||
public function getStatus(Request $request)
|
||
{
|
||
$user = auth()->user();
|
||
$result = Order::where('user_id',$user->id)->where('type','single_service')->where('goods','企业臻享会员卡')->where('type_id',13)->where('pay_status','PAID')->count()?1:0;
|
||
$data['status'] =$result;
|
||
return $this->success('ok', $data);
|
||
|
||
}
|
||
|
||
/**
|
||
* 回调购买单身服务订单
|
||
*/
|
||
public function markSingleServiceOrder($order)
|
||
{
|
||
try {
|
||
\DB::beginTransaction();
|
||
$user = User::find($order->user_id);
|
||
$pay_order = PayOrder::where('trade_no', $order->trade_no)->first();
|
||
if (empty($pay_order)) throw new \Exception("支付订单不存在", 1);
|
||
//查询服务
|
||
$service = SingleService::where('id', $order->type_id)->first();
|
||
if (empty($service)) throw new \Exception("服务id:".$order->type_id."不存在", 1);
|
||
//检测福币
|
||
if ($pay_order->score > 0) {
|
||
$result = $user->addCoinLog('SERVICE', $order->type_id, $pay_order->score, $remark='小程序购买单身服务');
|
||
if (empty($result)) throw new \Exception("增加福币记录失败", 1);
|
||
$result = $user->updateCoinInfo('sub', $pay_order->score);
|
||
if (empty($result)) throw new \Exception("修改福币信息失败", 1);
|
||
}
|
||
// //生成服务记录
|
||
// $this->addServiceHistory($user->id, $service->type, $service->type_id);
|
||
//添加会员期限
|
||
$user->addSuperRank(0, $service->rank_month, 'mini_service');
|
||
//短信通知艳斌
|
||
if ($service->type == 'active' || $service->type == 'passive') {
|
||
$user_name = User::where('id', $order->user_id)->value('name');
|
||
$message = '用户'.$user_name.'购买了'.$service->title.'服务';
|
||
$this->sms->sentMessage('13377553550', $message);
|
||
//短信通知购买服务用户
|
||
$notice = '您已成功购买【'.$service->title.'】服务套餐,福恋工作人员将尽快联系您为您服务,请耐心等待。如有问题,请联系:18922809346';
|
||
$this->sms->sentMessage($user->mobile,$notice);
|
||
}
|
||
if ($user->from_openid) {
|
||
$array['from_openid'] = $order->user_id;
|
||
$array['user_id'] = $order->user_id;
|
||
$array['type'] = 'love';
|
||
ReferreAward::dispatch($array)->onQueue('love');
|
||
}
|
||
\DB::commit();
|
||
//订阅消息通知用户
|
||
// $this->orderSuccessNoticeToUser($order, $user);
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
\DB::rollBack();
|
||
$this->getError($e);
|
||
return false;
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 添加购买服务记录
|
||
*/
|
||
public function addServiceHistory($user_id, $type, $type_id)
|
||
{
|
||
$appointment = Appointment::where('type', $type)->where('id', $type_id)->first();
|
||
if (empty($appointment)) {
|
||
return;
|
||
}
|
||
AppointmentHistory::create([
|
||
'user_id'=>$user_id,
|
||
'point_id'=>$appointment->id,
|
||
'price'=>$appointment->price,
|
||
'type'=>$type,
|
||
'num'=>$appointment->num,
|
||
]);
|
||
return;
|
||
}
|
||
|
||
/**
|
||
* 单身服务详情
|
||
*/
|
||
public function singleService(Request $request, SingleService $single_service)
|
||
{
|
||
$rank = $single_service->rank;
|
||
$sub_rank = SubRank::where('rank_id', $single_service->rank_id)->where('month', $single_service->rank_month)->first();
|
||
if ($single_service->discount_desc_type == 'json') {
|
||
$single_service->rank->explain = json_decode($rank->explain);
|
||
$single_service->rank->feature = json_decode($rank->feature);
|
||
$single_service->discount_desc = json_decode($single_service->discount_desc);
|
||
}else{
|
||
$single_service->rank->explain = json_decode($rank->explain);
|
||
$single_service->rank->feature = json_decode($rank->feature);
|
||
$single_service->discount_desc = explode('****',$single_service->discount_desc);
|
||
// $single_service->discount_desc = json_decode($single_service->discount_desc);
|
||
}
|
||
|
||
$single_service->sub_rank = $sub_rank;
|
||
return $this->success('ok', $single_service);
|
||
}
|
||
|
||
/**
|
||
* 订单支付成功订阅订单通知用户
|
||
*/
|
||
public function orderSuccessNoticeToUser($order, $user)
|
||
{
|
||
$openid = $user->wechat?$user->wechat->openid:null;
|
||
if (empty($openid)) {
|
||
return;
|
||
}
|
||
$param = [
|
||
"name"=>$order->goods,
|
||
'price'=>$order->price,
|
||
'updated_at'=>date("Y-m-d H:i:s"),
|
||
'openid'=>$openid,
|
||
];
|
||
\WechatService::orderSuccessSubNotice($param);
|
||
return;
|
||
}
|
||
|
||
public function exportOrders()
|
||
{
|
||
try {
|
||
\DB::beginTransaction();
|
||
$start_time = "2021-09-01";
|
||
$end_time = "2021-11-01";
|
||
$orders = Order::with('user', 'fromOpenidUser', 'fromUserIdUser','payorder')->where('pay_status', "PAID")->whereBetween('created_at', [$start_time, $end_time])->get();
|
||
$array = [];
|
||
// foreach ($orders as $order) {
|
||
// $count = CoinLog::where('type', 'SHARE_ORDER')->where('type_id', $order->id)->count();
|
||
// if ($count) continue;
|
||
// $price = $order->payorder?$order->payorder->cash:$order->price;
|
||
// //分享价值规则
|
||
// if ($order->type == 'single_service'){
|
||
// $channel = "service";
|
||
// } else {
|
||
// $channel = $order->type;
|
||
// }
|
||
// $channel_obj = WorthChannel::where('channel', $channel)->first();
|
||
// //每单总分享价值金额
|
||
// $total_value = number_format($channel_obj->amount * $price, 2, '.', '');
|
||
// $arr = [];
|
||
// $arr['order_id'] = $order->id;
|
||
// $arr['user_id'] = $order->user_id;
|
||
// $arr['nickname'] = $order->user->nickname;
|
||
// $arr['price'] = $price;
|
||
// $arr['goods'] = $order->goods;
|
||
// $arr['from_openid'] = $order->from_openid;
|
||
// $arr['from_user_id'] = $order->from_user_id;
|
||
// $from_openid_user_id = $order->fromOpenidUser?$order->fromOpenidUser->user_id:0;
|
||
// $arr['is_from_same'] = $from_openid_user_id == $order->from_user_id?"TRUE":"FALSE";
|
||
// //截止分享金额
|
||
// $arr['direct_value'] = number_format($total_value * $channel_obj->direct_ratio,0, '.', '');
|
||
// //分享人用户
|
||
// $from_user = $order->fromUserIdUser;
|
||
// $from_openid_user = $order->fromOpenidUser;
|
||
// if ($from_user) {
|
||
// $from_nickname = $from_user->nickname;
|
||
// //增加余额
|
||
// //增加记录
|
||
// if ($arr['direct_value'] > 1) {
|
||
// $from_user->updateCoinInfo($type="add", $arr['direct_value']);
|
||
// $from_user->addCoinLog('SHARE_ORDER', $order->id, $arr['direct_value'], $remark='分享用户产生订单');
|
||
// }
|
||
|
||
// } elseif ($from_openid_user && $from_openid_user->user) {
|
||
// $from_nickname = $from_openid_user->nickname;
|
||
// //增加余额
|
||
// //增加记录
|
||
// if ($arr['direct_value'] > 1) {
|
||
// $from_openid_user->user->updateCoinInfo($type="add", $arr['direct_value']);
|
||
// $from_openid_user->user->addCoinLog('SHARE_ORDER', $order->id, $arr['direct_value'], $remark='分享用户产生订单');
|
||
// }
|
||
// } else{
|
||
// $from_nickname = null;
|
||
// }
|
||
// $arr['from_nickname'] = $from_nickname;
|
||
|
||
// //间接分享用户id
|
||
// $indirect_user_ids = WorthShare::where('target_user_id', $order->user_id)->where('channel', $channel)->where('sub_channel', 'indirect')->where('product_id', $order->type_id)->pluck('user_id')->toArray();
|
||
// $indirect_user_id = implode(',', $indirect_user_ids);
|
||
// $arr['indirect_user_id'] = $indirect_user_id;
|
||
// $indirect_mobile = User::whereIn('id', $indirect_user_ids)->pluck('mobile')->toArray();
|
||
// $arr['indirect_mobile'] = implode(',', $indirect_mobile);
|
||
// $arr['indirect_value'] = number_format($total_value * $channel_obj->indirect_ratio, 0, '.', '');
|
||
|
||
// $indirect_users = User::whereIn('id', $indirect_user_ids)->get();
|
||
// foreach ($indirect_users as $indirect_user) {
|
||
// $value = number_format($arr['indirect_value']/ count($indirect_users),0, '.', '');
|
||
// if ($value > 1) {
|
||
// $indirect_user->updateCoinInfo($type="add", $value);
|
||
// $indirect_user->addCoinLog('SHARE_ORDER', $order->id, $value, $remark='间接促成用户产生订单');
|
||
// }
|
||
// }
|
||
|
||
// $register_user_id = WorthShare::where('target_user_id', $order->user_id)->where('channel', 'register')->where('sub_channel', 'direct')->value('user_id');
|
||
// $arr['register_user_id'] = $register_user_id;
|
||
// $register_mobile = User::where('id', $register_user_id)->value('mobile');
|
||
// $arr['register_mobile'] = $register_mobile;
|
||
// $arr['register_value'] = number_format($total_value * $channel_obj->bind_ratio, 0, '.', '');
|
||
// $register_user = User::find($register_user_id);
|
||
// if ($register_user && $arr['register_value'] >1) {
|
||
// $register_user->updateCoinInfo($type="add", $arr['register_value']);
|
||
// $register_user->addCoinLog('SHARE_ORDER', $order->id, $arr['register_value'], $remark='推荐用户产生订单');
|
||
// }
|
||
// $array[] = $arr;
|
||
// }
|
||
|
||
\DB::commit();
|
||
return \Excel::download(new \App\Exports\OrderWorthExport($array), 'worth.xlsx');
|
||
|
||
} catch(\Exception $e) {
|
||
\DB::rollback();
|
||
return $this->failure($e->getMessage());
|
||
}
|
||
}
|
||
|
||
// 小程序端购买活动
|
||
public function buyBusinessActivity(Request $request)
|
||
{
|
||
try {
|
||
$buy_type = $request->buy_type ?? 'normal';//normal:单独购买 group:拼团购买
|
||
$group_id = $request->group_id;
|
||
$time = date('Y-m-d H:i:s');
|
||
$user = $this->authCheck();
|
||
$userId = 0;
|
||
if ($user) {
|
||
$userId = $user->id;
|
||
}
|
||
$merchant_user = MerchantUsers::where('user_id', $userId)->first();
|
||
if(!$merchant_user){
|
||
$merchant_user_id = $this->matchMerchantUser($userId);
|
||
$merchant_user = MerchantUsers::where('id', $merchant_user_id)->first();
|
||
}
|
||
if($buy_type && $buy_type == 'group'){
|
||
$group = CollageGroup::where('type','community')->where('type_id',$request->id)->first();
|
||
if(!$group) return $this->failure('拼团信息不存在');
|
||
$history_id = $request->history_id;
|
||
$history = CollageGroupHistories::where('id',$history_id)->first();
|
||
if($history){
|
||
\Log::info('购买用户id:'.$merchant_user->id);
|
||
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('你已成功拼团参与过该活动,无需重复参与');
|
||
}
|
||
}
|
||
$wechat = Wechat::where('user_id', $userId)->first();
|
||
$openid = $wechat->openid;
|
||
$result = CommunityActivity::where('id', $request->id)/*->where('status', 1)->where('is_mp_show', 1)*/->first();
|
||
if (!$result) return $this->failure('你参与的活动不存在或已下架。');
|
||
if($result->class == 'one'){
|
||
$exists = TouristOrder::where('type','community')->where('type_id',$request->id)->whereIn('pay_status',[1,4])->where('account_id',$merchant_user->id)->first();
|
||
if($exists) return $this->failure('你已成功报名过该活动,无需重复参与');
|
||
}
|
||
$sku_id = $request->sku_id;
|
||
//if(!$sku_id&&$result->pay_type =='wechat') return $this->failure('规格参数不存在,请稍后再试。');
|
||
if ($sku_id && $buy_type == 'normal') {
|
||
$skus = json_decode($result->sku, true);
|
||
$skus = array_column($skus, null, 'sku_id');
|
||
$sku = $skus[$sku_id];
|
||
if (isset($sku['num']) && $sku['num'] == 0) {
|
||
$member_num = count($request->linkmen);
|
||
$price = number_format($sku['price'] * $member_num, 2,'.','');
|
||
}else {
|
||
$price = $sku['price'];
|
||
}
|
||
$goods = $sku['name'];
|
||
$desc = $result->title . '-' . $sku['name'] . '';
|
||
if ($result->class == 'one' && $result->apply_deadline) {
|
||
if ($result->apply_deadline <= $time) return $this->failure('该活动已截止报名,看看其他活动吧');
|
||
}
|
||
}elseif($sku_id && $buy_type == 'group'){
|
||
$group = CollageGroup::where('id',$group_id)->first();
|
||
$skus = json_decode($group->sku, true);
|
||
$skus = array_column($skus, null, 'sku_id');
|
||
$sku = $skus[$sku_id];
|
||
// $price = $sku['discount_price'];//拼团折扣价
|
||
if (isset($sku['num']) && $sku['num'] == 0) {
|
||
$member_num = count($request->linkmen);
|
||
$price = number_format($sku['discount_price'] * $member_num, 2,'.','');
|
||
}else {
|
||
$price = $sku['discount_price'];
|
||
}
|
||
$goods = $sku['name'];
|
||
$desc = $result->title . '-' . $sku['name'] . '';
|
||
} else {
|
||
$price = $result->price;
|
||
$goods = null;
|
||
$desc = $result->title;
|
||
}
|
||
if(isset($sku)){
|
||
$total_limit_num = $sku['total_limit_num'] ?? 0;
|
||
$sku_buy_num = (new TouristOrder)->getSkuBuyNum($request->id,$result->merchant_id,$sku_id);
|
||
$num = 1;
|
||
if (is_array($request->linkmen)) {
|
||
$num = count($request->linkmen);
|
||
}
|
||
if($total_limit_num && $total_limit_num < ($sku_buy_num + $num)){
|
||
return $this->failure('报名人数已超限制');
|
||
}
|
||
}
|
||
$anchor = Anchor::where('id', $result->anchor_id)->first();
|
||
$trade_no = $this->getTradeNo();
|
||
$TouristOrder = new \App\Models\Server\TouristOrder();
|
||
$TouristOrder->open_id = $openid;
|
||
$TouristOrder->price = floatval($price);
|
||
$TouristOrder->pay_type = $result->pay_type;
|
||
$TouristOrder->type = 'community';
|
||
$TouristOrder->type_id = $request->id;
|
||
$TouristOrder->trade_no = $trade_no;
|
||
$TouristOrder->goods = $goods;
|
||
$TouristOrder->desc = $desc;
|
||
$TouristOrder->group_id = isset($group) ? $group->id : null;
|
||
$TouristOrder->from_openid = $request->from_openid;
|
||
$TouristOrder->share_channel_id = $request->share_channel_id;
|
||
$TouristOrder->merchant_id = $result->merchant_id;
|
||
$TouristOrder->account_id = $merchant_user->id ?: 0;
|
||
$TouristOrder->name = $request->name ?? ($wechat->nickname ?: ($request->linkmen[0]['name'] ?? ''));
|
||
$TouristOrder->mobile = $request->mobile ?? ($request->linkmen[0]['mobile'] ?? '');
|
||
$TouristOrder->area_code = $request->area_code;
|
||
$TouristOrder->channel = 3;
|
||
$TouristOrder->linkmen = isset($request->linkmen) ? json_encode($request->linkmen) : '';
|
||
$TouristOrder->insurance = isset($request->insurance) ? $request->insurance : 0;
|
||
if (empty($TouristOrder->name) || empty($TouristOrder->mobile)) return $this->failure("未获取到联系人/手机号");
|
||
if (isset($request->insurance) && $request->insurance == 1) {
|
||
$TouristOrder->insurance_info = json_encode($request->insurance_info);
|
||
}
|
||
$TouristOrder->withdrawal_radio = $anchor->withdrawal_radio ?? 100;
|
||
$TouristOrder->sku_id = $sku_id;
|
||
if ($price == 0) {
|
||
$TouristOrder->pay_status = 1;
|
||
$TouristOrder->save();
|
||
//$TouristOrder->pay_config = null;
|
||
$TouristOrder->save();
|
||
$result->pay_status = 1;
|
||
$TouristOrder->wx_pay = [];
|
||
return $this->success('ok', $TouristOrder);
|
||
}
|
||
//如果from_openid没传 根据分享人id拿from_openid
|
||
if(!$TouristOrder->from_openid && $request->from_user_id){
|
||
$TouristOrder->from_openid = Wechat::where('user_id',$request->from_user_id)->value('openid');
|
||
}
|
||
$callback = config('app.url') . '/api/app/callback/Community/' . $trade_no;
|
||
$score = 0;
|
||
$pay_order = array(
|
||
'user_id' => $userId,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => floatval($price),
|
||
'pay_type' => 'wechat',
|
||
'score' => $score,
|
||
);
|
||
$wx_pay = \WechatService::constructWXPay($pay_order, $userId, $result->title, $callback);
|
||
$TouristOrder->save();
|
||
if($buy_type == 'group'){
|
||
if($request->history_id){
|
||
$history = CollageGroupHistories::find($request->history_id);
|
||
$deadline = $history->deadline;
|
||
$is_initiator = 0;
|
||
}else{
|
||
//分享不带history_id 就是团长
|
||
$deadline = date('Y-m-d H:i:s',strtotime('+'.$group->expire_in.'hours'));
|
||
$is_initiator = 1;
|
||
}
|
||
$collageGroupHistories = CollageGroupHistories::create([
|
||
'm_user_id'=>$TouristOrder->account_id,
|
||
'group_id'=>$TouristOrder->group_id,
|
||
'm_order_id'=>$TouristOrder->id,
|
||
'is_initiator'=>$is_initiator,
|
||
'status'=>0,
|
||
'deadline'=>$deadline,
|
||
]);
|
||
$collageGroupHistories->group_master_id = $collageGroupHistories->id;
|
||
$collageGroupHistories->save();
|
||
}
|
||
|
||
$TouristOrder->wx_pay = $wx_pay;
|
||
|
||
//同步订单相关的用户
|
||
\App\Jobs\SyncSaasUserByOrder::dispatch($TouristOrder)->onQueue('love');
|
||
return $this->success('ok', $TouristOrder);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure("服务器休息,请稍后再试");
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取我的商户订单
|
||
* @param Request $request
|
||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
|
||
*/
|
||
public function businesssActivityOrders(Request $request)
|
||
{
|
||
$class = $request->class ?: 'one';
|
||
$user = $this->authCheck();
|
||
$userId = 0;
|
||
$merchant_user_id = 0;
|
||
if($user){
|
||
$userId = $user->id;
|
||
$merchant_user_id = $this->matchMerchantUser($userId);
|
||
}
|
||
$merchant_user = MerchantUsers::where('id',$merchant_user_id)->first();
|
||
$pay_status = $request->input('pay_status', 0);
|
||
switch ($pay_status) {
|
||
case 0:
|
||
$pay_status = [$pay_status];//未支付
|
||
break;
|
||
case 1:
|
||
$pay_status = [$pay_status, 4];//已支付
|
||
break;
|
||
}
|
||
if($class == 'one') {
|
||
if($merchant_user) {
|
||
$business_order = DB::table('tourist_orders')
|
||
->join('community_activities','tourist_orders.type_id','community_activities.id')
|
||
->where('community_activities.class','one')->where('channel',3)
|
||
// ->where('tourist_orders.type','community')->where('account_id',$merchant_user->id)->whereIn('pay_status',[1,4])
|
||
->where('tourist_orders.type','community')->where('account_id',$merchant_user->id)->whereIn('pay_status',$pay_status)
|
||
->select('tourist_orders.type','type_id',DB::raw("'business_order' as order_type"),'tourist_orders.price','tourist_orders.pay_type','pay_status','trade_no','goods','tourist_orders.created_at','group_id');
|
||
$order = DB::table('orders')->where('user_id', $user->id)->where('type', 'activity')->where('pay_status', 'PAID')
|
||
->select('type','type_id',DB::raw("'fulllin_order' as order_type"),'price','pay_type','pay_status','trade_no','goods','created_at','meid as group_id');
|
||
$query = $business_order->union($order);
|
||
$sql = $query->toSql();
|
||
$result = DB::table(DB::raw("($sql) as a"))->mergeBindings($query)
|
||
->orderBy('created_at','desc')->paginate();
|
||
} else {
|
||
$result = DB::table('orders')->where('user_id', $user->id)->where('type', 'activity')->where('pay_status', 'PAID')
|
||
->select('type','type_id',DB::raw("'fulllin_order' as order_type"),'price','pay_type','pay_status','trade_no','goods','created_at','meid as group_id')
|
||
->orderBy('created_at','desc')->paginate();
|
||
}
|
||
} else {
|
||
if($merchant_user) {
|
||
$business_order = DB::table('tourist_orders')
|
||
->join('community_activities','tourist_orders.type_id','community_activities.id')
|
||
->where('community_activities.class','many')->where('channel',3)
|
||
// ->where('tourist_orders.type','community')->where('account_id',$merchant_user->id)->whereIn('pay_status',[1,4])
|
||
->where('tourist_orders.type','community')->where('account_id',$merchant_user->id)->whereIn('pay_status',$pay_status)
|
||
->select('tourist_orders.type','type_id',DB::raw("'business_order' as order_type"),'tourist_orders.price','tourist_orders.pay_type','pay_status','trade_no','desc as goods','tourist_orders.created_at','group_id');
|
||
//$result = $business_order->orderBy('created_at','desc')->paginate();
|
||
$order = DB::table('orders')->where('user_id', $user->id)->where('type', 'single_service')->where('pay_status', 'PAID')
|
||
->select('type','type_id',DB::raw("'fulllin_order' as order_type"),'price','pay_type','pay_status','trade_no','goods','created_at','meid as group_id');
|
||
$query = $business_order->union($order);
|
||
$sql = $query->toSql();
|
||
$result = DB::table(DB::raw("($sql) as a"))->mergeBindings($query)
|
||
->orderBy('created_at','desc')->paginate();
|
||
} else {
|
||
$result = DB::table('orders')->where('user_id', $user->id)->where('type', 'single_service')->where('pay_status', 'PAID')
|
||
->select('type','type_id',DB::raw("'fulllin_order' as order_type"),'price','pay_type','pay_status','trade_no','goods','created_at','meid as group_id')
|
||
->orderBy('created_at','desc')->paginate();
|
||
}
|
||
}
|
||
|
||
|
||
// $result = TouristOrder::where('open_id',$openid)->where('type','community')->whereIn('pay_status',[1,4])->orderBy('id','desc')->paginate();
|
||
foreach ($result as $key => $value) {
|
||
if($value->order_type == 'business_order') {
|
||
$activity = CommunityActivity::withTrashed()->where('id',$value->type_id)->first();
|
||
$value->title = $activity->title;
|
||
$value->pic = $activity->pic;
|
||
$value->Subtitle = $activity->Subtitle;
|
||
$value->pay_type = $activity->pay_type;
|
||
if($activity->class == 'one') $value->type = 'activity';
|
||
if($activity->class == 'many') $value->type = 'service';
|
||
$value->is_expire = strtotime('-1 day') > strtotime($value->created_at) ? 1 : 0;//订单是否过期 该字段判断是否可以继续支付
|
||
} else {
|
||
if($value->type == 'activity'){
|
||
$activity = Activity::withTrashed()->where('id',$value->type_id)->first();
|
||
$value->title = $activity->theme;
|
||
$value->pic = $activity->poster;
|
||
$value->Subtitle = $activity->theme;
|
||
$value->pay_type = $activity->pay_type;
|
||
}elseif($value->type == 'single_service'){
|
||
$single_service = SingleService::withTrashed()->where('id',$value->type_id)->first();
|
||
$value->title = $single_service ? $single_service->title : $value->goods;
|
||
$value->pic = $single_service ? $single_service->pic : '';
|
||
$value->Subtitle = $single_service ? $single_service->title : $value->goods;
|
||
$value->pay_type = 'wechat';
|
||
}
|
||
}
|
||
//是否是拼团订单
|
||
$value->is_group_order = 0;
|
||
if($value->group_id){
|
||
$value->is_group_order = 1;
|
||
}
|
||
|
||
# code...
|
||
}
|
||
// if ($userId == 130163 || $userId == 119488 || $userId == 134494){
|
||
$result = $result->toArray();
|
||
$date_time = date('Y-m-d H:i:s');
|
||
$result['can_pay_count'] = DB::table('tourist_orders')
|
||
->join('community_activities', 'tourist_orders.type_id', 'community_activities.id')
|
||
->where('community_activities.class', $class)
|
||
->where('channel', 3)
|
||
->where('tourist_orders.type', 'community')
|
||
->where('account_id', $merchant_user_id)
|
||
->where('pay_status', 0)
|
||
->whereRaw("DATE_ADD(ufutx_tourist_orders.created_at, INTERVAL 1 DAY) > '{$date_time}'")
|
||
->count();
|
||
// }
|
||
return $this->success('ok',$result);
|
||
}
|
||
|
||
//订单详情
|
||
public function activityOrder(Request $request, $trade_no)
|
||
{
|
||
try {
|
||
$order_type = $request->input('order_type','fulllin_order');
|
||
if($order_type == 'business_order') {
|
||
$order = TouristOrder::where('trade_no', $trade_no)->first();
|
||
if(empty($order)) return $this->failure('未查询到该订单');
|
||
$order->pic = $order->activityService->pic;
|
||
$order->title = $order->activityService->title;
|
||
$order->sku = $order->goods;
|
||
unset($order->activityService);
|
||
} elseif ($order_type == 'fulllin_order') {
|
||
$order = Order::where('trade_no', $trade_no)->first();
|
||
if(empty($order)) return $this->failure('未查询到该订单');
|
||
if($order->type == 'rank'){
|
||
$order->pic = $order->subRank ? $order->subRank->pic : '';
|
||
$order->title = $order->goods;
|
||
$order->sku = $order->subRank ? $order->subRank->name : '';
|
||
unset($order->subRank);
|
||
}elseif($order->type == 'single_service'){
|
||
$order->pic = $order->singleService ? $order->singleService->pic : '';
|
||
$order->title = $order->goods;
|
||
$order->sku = $order->singleService ? $order->singleService->title : '';
|
||
unset($order->singleService);
|
||
}elseif($order->type == 'activity'){
|
||
$order->pic = $order->activity ? $order->activity->poster : '';
|
||
$order->title = $order->goods;
|
||
$order->sku = $order->activity ? $order->activity->theme : '';
|
||
unset($order->activity);
|
||
}
|
||
} else {
|
||
$order = Order::where('trade_no', $trade_no)->first();
|
||
if(empty($order)) return $this->failure('未查询到该订单');
|
||
if($order->type == 'rank'){
|
||
$order->pic = $order->subRank ? $order->subRank->pic : '';
|
||
$order->title = $order->goods;
|
||
$order->sku = $order->subRank ? $order->subRank->name : '';
|
||
unset($order->subRank);
|
||
}elseif($order->type == 'single_service'){
|
||
$order->pic = $order->singleService ? $order->singleService->pic : '';
|
||
$order->title = $order->goods;
|
||
$order->sku = $order->singleService ? $order->singleService->title : '';
|
||
unset($order->singleService);
|
||
}elseif($order->type == 'activity'){
|
||
$order->pic = $order->activity ? $order->activity->poster : '';
|
||
$order->title = $order->goods;
|
||
$order->sku = $order->activity ? $order->activity->theme : '';
|
||
unset($order->activity);
|
||
}
|
||
}
|
||
|
||
//是否是拼团订单
|
||
$order->is_group_order = 0;
|
||
if($order->group_id){
|
||
$order->is_group_order = 1;
|
||
}
|
||
$show_pay_type = '免费';
|
||
if($order['pay_type'] == 'wechat'){
|
||
$show_pay_type = '微信支付';
|
||
}else if($order['pay_type'] == 'alipay'){
|
||
$show_pay_type = '支付宝支付';
|
||
}else if($order['pay_type'] == 'ios'){
|
||
$show_pay_type = 'IOS支付';
|
||
}else if($order['pay_type'] == 'h5'){
|
||
$show_pay_type = 'H5支付';
|
||
}
|
||
if(is_int($order['pay_status'])) {
|
||
$order['pay_status'] = $order['pay_status'] == 0 ? 'UNPAID':'PAID';
|
||
}
|
||
$order['show_pay_type'] = $show_pay_type;
|
||
$activity = CommunityActivity::find($order->type_id);
|
||
// $order['show_type'] = $this->orderCon->orderTypeCodeSwitchChinese($order['type']);
|
||
$order['show_type'] = $activity->class == 'one' ? '活动报名' : '服务报名';
|
||
$order['is_expire'] = strtotime('-1 day') > strtotime($order->created_at) ? 1 : 0;//订单是否过期 该字段判断是否可以继续支付
|
||
return $this->success('ok', $order);
|
||
} catch (\Exception $e) {
|
||
Log::error($e->getMessage());
|
||
return $this->failure('数据不存在');
|
||
}
|
||
|
||
}
|
||
|
||
public function placeOrder($trade_no)
|
||
{
|
||
try {
|
||
$user = auth()->user();
|
||
$order = TouristOrder::where('trade_no', $trade_no)->first();
|
||
if (empty($order)) throw new \Exception("未找到对应订单信息");
|
||
$openid = $user->wechat?$user->wechat->openid:null;
|
||
if (empty($openid)) throw new \Exception("未找到下单用户信息");
|
||
$callback = env('app.url').'/api/app/callback/business/orders/'.$trade_no;
|
||
$result = \WechatService::constructMiniPay($trade_no, $openid, $order->price, $order->desc, $order->desc, $callback);
|
||
return $this->success('ok', $result);
|
||
}catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 活动/服务订单 重新支付
|
||
* @param Request $request
|
||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
|
||
*/
|
||
public function activityRepayment(Request $request)
|
||
{
|
||
try {
|
||
$trade_no = $request->input('trade_no');
|
||
if (!$trade_no) {
|
||
return $this->failure('订单号不能为空');
|
||
}
|
||
|
||
$order = TouristOrder::query()->where('trade_no', $trade_no)->first();
|
||
if (!$order) {
|
||
return $this->failure('订单不存在');
|
||
}
|
||
|
||
if ($order->pay_status != 0) {
|
||
return $this->failure('该订单已支付');
|
||
}
|
||
|
||
if (strtotime('-1 day') > strtotime($order->created_at)) {
|
||
return $this->failure('订单已过期');
|
||
}
|
||
|
||
if ($order->type != 'community') {
|
||
return $this->failure('订单类型异常');
|
||
}
|
||
|
||
$user = auth()->user();
|
||
// $merchant_user_id = $this->matchMerchantUser($user->id);
|
||
$merchant_user = MerchantUsers::where('id', $order->account_id)->first();
|
||
|
||
$time = date('Y-m-d H:i:s');
|
||
if ($order->group_id){
|
||
$group = CollageGroup::where('type','community')->where('type_id',$order->type_id)->first();
|
||
if(!$group) return $this->failure('拼团信息不存在');
|
||
// $history_id = $request->history_id;
|
||
// $history = CollageGroupHistories::where('id',$history_id)->first();
|
||
$history = CollageGroupHistories::where('group_id',$order->group_id)
|
||
->where('m_user_id',$order->account_id)
|
||
->where('m_order_id',$order->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 = \App\Models\Server\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('你已成功拼团参与过该活动,无需重复参与');
|
||
}
|
||
}
|
||
|
||
$result = CommunityActivity::where('id', $order->type_id)->first();
|
||
if (!$result) return $this->failure('你参与的活动不存在或已下架。');
|
||
if ($result->class == 'one') {
|
||
$exists = TouristOrder::where('type', 'community')->where('type_id', $order->type_id)->whereIn('pay_status', [1, 4])->where('account_id', $merchant_user->id)->first();
|
||
if ($exists) return $this->failure('你已成功报名过该活动,无需重复参与');
|
||
}
|
||
|
||
$sku_id = $order->sku_id;
|
||
$skus = json_decode($result->sku, true);
|
||
$skus = array_column($skus, null, 'sku_id');
|
||
$sku = $skus[$sku_id];
|
||
|
||
if (!$order->group_id) {
|
||
if ($result->class == 'one' && $result->apply_deadline) {
|
||
if ($result->apply_deadline <= $time) return $this->failure('该活动已截止报名,看看其他活动吧');
|
||
}
|
||
$total_limit_num = $sku['total_limit_num'] ?? 0;
|
||
$sku_buy_num = (new TouristOrder)->getSkuBuyNum($order->type_id, $result->merchant_id, $sku_id);
|
||
if ($total_limit_num && $total_limit_num < ($sku_buy_num + count(json_decode($order->linkmen, true)))) {
|
||
return $this->failure('报名人数已超限制');
|
||
}
|
||
}
|
||
|
||
$callback = config('app.url') . '/api/app/callback/Community/' . $trade_no;
|
||
$score = 0;
|
||
$pay_order = array(
|
||
'user_id' => $user->id,
|
||
'trade_no' => $trade_no,
|
||
'pay_status' => 'UNPAID',
|
||
'cash' => floatval($order->price),
|
||
'pay_type' => 'wechat',
|
||
'score' => $score,
|
||
);
|
||
$wx_pay = \WechatService::constructWXPay($pay_order, $user->id, $result->title, $callback);
|
||
$order->wx_pay = $wx_pay;
|
||
return $this->success('ok', $order);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 取消活动/服务订单
|
||
* @param Request $request
|
||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
|
||
*/
|
||
public function cancelActivityOrder(Request $request)
|
||
{
|
||
try {
|
||
$trade_no = $request->input('trade_no');
|
||
if (!$trade_no) {
|
||
return $this->failure('订单号不能为空');
|
||
}
|
||
|
||
$user_id = auth()->id();
|
||
$merchant_user_id = $this->matchMerchantUser($user_id);
|
||
|
||
$order = TouristOrder::query()
|
||
->where('account_id', $merchant_user_id)
|
||
->where('type', 'community')
|
||
->where('trade_no', $trade_no)
|
||
->where('pay_status', 0)
|
||
->first();
|
||
if (!$order) {
|
||
return $this->failure('订单不存在');
|
||
}
|
||
|
||
$order->delete();
|
||
|
||
return $this->success('ok');
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure();
|
||
}
|
||
}
|
||
|
||
}
|