id, 6, 0, STR_PAD_LEFT) . random_int(11111111, 99999999); $result = $facade->payment()->order->unify([ 'body' => $body, 'out_trade_no' => $nu, 'notify_url' => 'https://api.app.jiuweiyun.cn/api/pay/message', 'trade_type' => 'JSAPI', // 必须为JSAPI 'openid' => $user->openid, // 这里的openid为付款人的openid 'total_fee' => $cost * 100, // 总价, 'time_start' => date('YmdHis', time()), 'time_expire' => date('YmdHis', time() + 130), ]); if ($result['return_code'] === 'SUCCESS') { $enroll=new Enroll(); $enroll->user_id = $user->id; $enroll->season = 55; // $enroll->season = $season['season']; $enroll->type = 0; $enroll->enroll_no = $nu; $enroll->money = $cost; $enroll->is_pay = 0; $enroll->save(); Log::error(json_encode($enroll)); $params = [ 'appId' => env('WECHAT_MINI_PROGRAM_APPID'), 'timeStamp' => (string)time(), 'nonceStr' => $result['nonce_str'], 'package' => 'prepay_id=' . $result['prepay_id'], 'signType' => 'MD5', ]; $params['paySign'] = generate_sign($params, config('wechat.payment.default.key')); return $this->response()->array([ 'code' => 200, 'message' => 'ok', 'data' => $params ]); } else { return $result; } }catch (\Exception $exception){ Log::error('调起支付失败'.$exception); return $this->error(50002,'','调起支付失败,请重新尝试'); } } public function GetStatus(){ $id=Auth::user()->id; $re=Enroll::where('is_pay',1)->where('user_id',$id)->where('season',55)->first(); if($re){ $phone=User::where('id',$id)->value('mobile'); $express=EnrollUserExpress::query()->where('phone',$phone)->where('season',$re->season)->first(); $info=[]; if($express){ if($express->express_code && $express->express_company){ $info['enroll_id']=$re->id; $info['express_code']=$express->express_code; $info['express_company']=$express->express_company; } } return $this->success(['status'=>true,'info'=>$info]); } return $this->success(['status'=>false]); } public function pays(Request $request) { $now=Carbon::now()->timestamp; $time=strtotime('2022-02-16 10:00:00'); $time2=strtotime('2022-02-22 11:00:00'); if ($now<$time){ return $this->error(50214,'','报名还未开始,请等待政委通知!'); } if ($now>$time2){ return $this->error(50214,'','报名时间已过!'); } $enroll=Enroll::where('season',55)->where('user_id',Auth::user()->id)->where('is_pay',1)->first(); if ($enroll){ return $this->error(50213,'','你已经报名成功,请重新进入'); } \Log::error('11'); DB::beginTransaction(); try{ $options = $this->options(); $payment = Factory::payment($options); $jssdk = $payment->jssdk; $cost=199; $user=Auth::user(); $expire=date('YmdHis', time() + 130); $nu = time() . str_pad($user->id, 6, 0, STR_PAD_LEFT) . random_int(11111111, 99999999); $attributes = [ 'time_expire' => $expire, 'trade_type' => 'JSAPI', // 支付方式,小程序支付使用JSAPI 'body' => '55届线上实战营直播报名', // 订单说明 'detail' => '55届线上实战营直播报名订单支付', // 订单说明 'out_trade_no' => $nu, // 自定义订单号 'total_fee' =>$cost*100, // 单位:分 'openid' => $user->openid, // 当前用户的openId // 'notify_url' =>'http://api.app.jiuweiyun.cn/api/pay/message', ]; $result = $payment->order->unify($attributes); if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') { $enroll=new Enroll(); $enroll->user_id = $user->id; $enroll->season = 55; $enroll->type = 0; $enroll->enroll_no = $nu; $enroll->cost = $cost; $enroll->is_pay = 0; if (!$enroll->save()){ throw new \Exception('1'); } $prepayId = $result['prepay_id']; $config = $jssdk->sdkConfig($prepayId); DB::commit(); return response()->json([ 'error_code'=>200, 'msg'=>'成功', 'data'=>$config ]); } }catch (\Exception $exception){ DB::rollBack(); Log::error($exception->getMessage()); return $this->error(500214,'','调起支付失败'); } } public function SearchStatus(){ $options = $this->options(); $payment = Factory::payment($options); $id=Auth::user()->id; $res = Enroll::where('user_id', $id)->where('season', 55)->where('is_refund', 0)->where('is_pay', 0)->orderByDesc('created_at')->get(); $s = false; foreach ($res as $k => $v) { $re = $payment->order->queryByOutTradeNumber($v->enroll_no); if (isset($re['transaction_id'])) { $enroll = Enroll::find($v->id); $enroll->is_pay = 1; $enroll->trade_no = $re['transaction_id']; $enroll->save(); $s = true; } } if ($s) { Log::error('测试测试'); return $this->success(['status'=>true]); } else { return $this->error(40056, '', '暂无支付信息,请重新进入'); } } public function message(Request $request) { Log::error('支付回调111'); $options = $this->options(); $payment = Factory::payment($options); $response = $payment->handlePaidNotify(function ($message, $fail) { $out_trade_no = $message['out_trade_no']; // 商户订单号 $trade_no = $message['transaction_id']; // 微信支付订单号 $order = Enroll::where('enroll_no', '=', $out_trade_no)->first(); if (empty($order)) { return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了 } $r = Cache::get(md5('codes' . $order->user_id)); if (!$r) { if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态 // 用户是否支付成功 if ($message['result_code'] === 'SUCCESS') { $enroll = Enroll::where('enroll_no', '=', $out_trade_no)->first(); $enroll->is_pay = 1; $enroll->trade_no = $trade_no; $enroll->save(); } } else { return $fail('通信失败,请稍后再通知我'); } } return true; }); return $response; } protected function options(){ return [ 'app_id' => config('wechat.payment.gzh.app_id'),//config('wechat.payment.default.app_id'), 'mch_id' => config('wechat.payment.gzh.mch_id'), 'sub_mch_id' => '', 'key' => config('wechat.payment.gzh.key'), 'notify_url' =>url('api/pay/message'), 'cert_path' =>config('wechat.payment.gzh.cert_path'), 'key_path' =>config('wechat.payment.gzh.key_path'), ]; } /* * 获取报名人的收货地址 * **/ public function GetEnrollUserAddress(){ $re=EnrollUser::where('user_id',Auth::user()->id)->first(); return $this->success($re); } /* * 提交地址信息 * */ public function UpdateAddAddress(Request $request){ $address=EnrollUser::where('user_id',Auth::user()->id)->first(); if (!$address){ $address=new EnrollUser(); $address->user_id=Auth::user()->id; } $address->name=$request->input('name'); $address->mobile=$request->input('mobile'); $address->province=$request->input('province'); $address->city=$request->input('city'); $address->town=$request->input('town'); $address->address=$request->input('address'); $address->save(); return $this->success([]); } public function GetEnrollInfo(){ $live_start_time='2022-02-23 08:00:00'; $live_end_time='2022-02-25 14:00:00'; $enroll_start_time='2022-02-16 10:00:00'; $enroll_end_time='2022-02-22 11:00:00'; $season=55; $cost=199; return $this->success(['live_start_time'=>$live_start_time,'live_end_time'=>$live_end_time,'enroll_start_time'=>$enroll_start_time,'enroll_end_time'=>$enroll_end_time,'season'=>$season,'cost'=>$cost]); } public function getSzyExpress(Request $request){ $id=$request->input('id'); $enroll=Enroll::with('user:id,mobile')->where('id',$id)->first(); if (!$enroll){ return $this->error(40011,'','该报名信息有误'); } $userExpress=EnrollUserExpress::where('phone',$enroll->user->mobile)->where('season',$enroll->season)->first(); if($userExpress->express_state==3){ //已签收 $express=json_decode($userExpress->express_info,true); }else{ //未签收 $CustomerName = null; if($userExpress->express_code =='SF'){ $mobile=EnrollUser::where('user_id',$enroll->user_id)->value('mobile'); $CustomerName = substr($mobile,-4); } $expressHandler=new ExpressHandler(); $express_company_code=array_search($userExpress->express_company,$expressHandler->getExpressCode()); $express=$expressHandler->search($userExpress->express_code, $express_company_code, null, $CustomerName); $express=json_decode(json_encode($express),'true'); if(isset($express['Traces']) && !empty($express['Traces'])){ foreach ($express['Traces'] as $key=>$val){ $express['Traces'][$key]['AcceptTime']=date("Y-m-d H:i:s",substr($val['AcceptTime'],0,strlen($val['AcceptTime'])-3)); } $userExpress->express_info=json_encode($express); $userExpress->express_state=$express['State']; $userExpress->save(); } } // $expressHandler=new ExpressHandler(); // $express_company_code=array_search($express->express_company,$expressHandler->getExpressCode()); // $re=$expressHandler->search($express->express_code,$express_company_code); // $re=(array)$re; // if ($re['State']==3){ // DB::beginTransaction(); // try{ // $express->data=json_encode($re); // $express->status=1; // $express->save(); // DB::commit(); // }catch (\Exception $exception){ // Log::error('-------物流信息保存出错--------'.$exception); // DB::rollBack(); // } // // } return $this->success($express); // } } public function uploadGiftExpress(Request $request){ $info=json_decode($request->input('data'),true); $data=$info['data']; Log::info($data); $all_phones=array_column($data,'手机号'); $unique_phones=array_unique($all_phones); $phones=array_diff_assoc($all_phones,$unique_phones); if($phones){ return $this->error(50024,'','手机号'.array_shift($phones).'重复出现'); } $all_codes=array_column($data,'快递单号'); $unique_codes=array_unique($all_codes); $codes=array_diff_assoc($all_codes,$unique_codes); if($codes){ return $this->error(50024,'','快递单号'.array_shift($codes).'重复出现'); } $seasons=array_column($data,'届数'); $unique_seasons=array_unique($seasons); $season=$seasons[0]; if(count($unique_seasons) > 1){ return $this->error(50024,'','届数不一致'); } $ExpressHandler=new ExpressHandler(); $express_company=$ExpressHandler->getExpressCode(); DB::beginTransaction(); try{ log::info('查数据库1--'.microtime()); $phone_ids=User::whereIn('mobile',$unique_phones)->pluck('id','mobile')->toArray(); log::info('查数据库1--'.microtime()); // $enroll_phones=EnrollUserExpress::where('season',$seasons)->pluck('phone')->toArray(); log::info('查数据库1--'.microtime()); foreach($data as $key=>$val){ if ($key==0){ if (!isset($val['手机号']) || !isset($val['快递公司']) || !isset($val['快递单号']) || !isset($val['届数'])){ throw new \Exception('表格的表头设置有误'); } }else{ if (empty($val['手机号']) || empty($val['快递单号']) || empty($val['快递公司']) || empty($val['届数'])){ throw new \Exception('第'.($key+1).'行,数据缺失'); } $express_company_code=array_search($val['快递公司'],$express_company); if(!$express_company_code){ throw new \Exception('第'.($key+1).'行快递公司:'.$val['快递公司'].'不存在'); // return $this->error(50024,'','第'.($key+1).'行快递公司:'.$val['快递公司'].'不存在'); } // if(array_search($val['手机号'],$enroll_phones)){ // throw new \Exception('第'.($key+1).'行,数据已提交'); // } if (!array_key_exists($val['手机号'],$phone_ids)) { throw new \Exception('手机号' . $val['手机号'] . '在代理商系统中不存在,请确认手机号'); }else{ $user_id=$phone_ids[$val['手机号']]; Log::info($val['手机号'].'--'.$user_id.'--'.$season); $enroll=Enroll::where('user_id',$user_id)->where('season',$season)->first(); if(!$enroll){ throw new \Exception('手机号'.$val['手机号'].'未报名'.$season.'届实战营'); } if ($enroll->express_code || $enroll->express_company){ throw new \Exception('手机号'.$val['手机号'].'已提交物流信息'); // return $this->error(50024,'','手机号'.$val['手机号'].'已提交物流信息'); } $enroll->express_code=$val['快递单号']; $enroll->express_company_code=$express_company_code; $enroll->express_company=$val['快递公司']; $enroll->save(); } } // $info[$key]['phone']=$val['手机号']; // $info[$key]['express_company']=$val['快递公司']; // $info[$key]['express_code']=$val['快递单号']; // $info[$key]['season']=$val['届数']; } // EnrollUserExpress::insert($info); DB::commit(); return [true]; }catch (\Exception $e){ DB::rollBack(); return [false,$e->getMessage()]; } } }