123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- <?php
- namespace App\Http\Controllers;
- use App\Handlers\ExpressHandler;
- use App\Models\Enroll;
- use App\Models\EnrollUser;
- use App\Models\EnrollUserExpress;
- use App\Models\User;
- use App\Models\Express;
- use App\Models\OrderW;
- use Carbon\Carbon;
- use EasyWeChat\Factory;
- use EasyWeChatComposer\EasyWeChat;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Auth;
- use Illuminate\Support\Facades\Cache;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- use Overtrue\EasySms\EasySms;
- class EnrollController extends Controller{
- public function Pay(Request $request){
- $facade=EasyWeChat::config('wechat.payment.gzh');
- $user=Auth::user();
- try{
- $cost = 199;
- $body = '大卫博士创业实训营报名费';
- $nu = time() . str_pad($user->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()];
- }
- }
- }
|