love_php/app/Http/Controllers/OrderController.php
2026-04-02 09:20:51 +08:00

3258 lines
134 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

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

<?php
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', // JSAPINATIVEAPP...
'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', // JSAPINATIVEAPP...
'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', // JSAPINATIVEAPP...
'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();
}
}
}