EnrollController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Handlers\ExpressHandler;
  4. use App\Models\Enroll;
  5. use App\Models\EnrollUser;
  6. use App\Models\EnrollUserExpress;
  7. use App\Models\User;
  8. use App\Models\Express;
  9. use App\Models\OrderW;
  10. use Carbon\Carbon;
  11. use EasyWeChat\Factory;
  12. use EasyWeChatComposer\EasyWeChat;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Facades\Auth;
  15. use Illuminate\Support\Facades\Cache;
  16. use Illuminate\Support\Facades\DB;
  17. use Illuminate\Support\Facades\Log;
  18. use Overtrue\EasySms\EasySms;
  19. class EnrollController extends Controller{
  20. public function Pay(Request $request){
  21. $facade=EasyWeChat::config('wechat.payment.gzh');
  22. $user=Auth::user();
  23. try{
  24. $cost = 199;
  25. $body = '大卫博士创业实训营报名费';
  26. $nu = time() . str_pad($user->id, 6, 0, STR_PAD_LEFT) . random_int(11111111, 99999999);
  27. $result = $facade->payment()->order->unify([
  28. 'body' => $body,
  29. 'out_trade_no' => $nu,
  30. 'notify_url' => 'https://api.app.jiuweiyun.cn/api/pay/message',
  31. 'trade_type' => 'JSAPI', // 必须为JSAPI
  32. 'openid' => $user->openid, // 这里的openid为付款人的openid
  33. 'total_fee' => $cost * 100, // 总价,
  34. 'time_start' => date('YmdHis', time()),
  35. 'time_expire' => date('YmdHis', time() + 130),
  36. ]);
  37. if ($result['return_code'] === 'SUCCESS') {
  38. $enroll=new Enroll();
  39. $enroll->user_id = $user->id;
  40. $enroll->season = 55;
  41. // $enroll->season = $season['season'];
  42. $enroll->type = 0;
  43. $enroll->enroll_no = $nu;
  44. $enroll->money = $cost;
  45. $enroll->is_pay = 0;
  46. $enroll->save();
  47. Log::error(json_encode($enroll));
  48. $params = [
  49. 'appId' => env('WECHAT_MINI_PROGRAM_APPID'),
  50. 'timeStamp' => (string)time(),
  51. 'nonceStr' => $result['nonce_str'],
  52. 'package' => 'prepay_id=' . $result['prepay_id'],
  53. 'signType' => 'MD5',
  54. ];
  55. $params['paySign'] = generate_sign($params, config('wechat.payment.default.key'));
  56. return $this->response()->array([
  57. 'code' => 200,
  58. 'message' => 'ok',
  59. 'data' => $params
  60. ]);
  61. } else {
  62. return $result;
  63. }
  64. }catch (\Exception $exception){
  65. Log::error('调起支付失败'.$exception);
  66. return $this->error(50002,'','调起支付失败,请重新尝试');
  67. }
  68. }
  69. public function GetStatus(){
  70. $id=Auth::user()->id;
  71. $re=Enroll::where('is_pay',1)->where('user_id',$id)->where('season',55)->first();
  72. if($re){
  73. $phone=User::where('id',$id)->value('mobile');
  74. $express=EnrollUserExpress::query()->where('phone',$phone)->where('season',$re->season)->first();
  75. $info=[];
  76. if($express){
  77. if($express->express_code && $express->express_company){
  78. $info['enroll_id']=$re->id;
  79. $info['express_code']=$express->express_code;
  80. $info['express_company']=$express->express_company;
  81. }
  82. }
  83. return $this->success(['status'=>true,'info'=>$info]);
  84. }
  85. return $this->success(['status'=>false]);
  86. }
  87. public function pays(Request $request)
  88. {
  89. $now=Carbon::now()->timestamp;
  90. $time=strtotime('2022-02-16 10:00:00');
  91. $time2=strtotime('2022-02-22 11:00:00');
  92. if ($now<$time){
  93. return $this->error(50214,'','报名还未开始,请等待政委通知!');
  94. }
  95. if ($now>$time2){
  96. return $this->error(50214,'','报名时间已过!');
  97. }
  98. $enroll=Enroll::where('season',55)->where('user_id',Auth::user()->id)->where('is_pay',1)->first();
  99. if ($enroll){
  100. return $this->error(50213,'','你已经报名成功,请重新进入');
  101. }
  102. \Log::error('11');
  103. DB::beginTransaction();
  104. try{
  105. $options = $this->options();
  106. $payment = Factory::payment($options);
  107. $jssdk = $payment->jssdk;
  108. $cost=199;
  109. $user=Auth::user();
  110. $expire=date('YmdHis', time() + 130);
  111. $nu = time() . str_pad($user->id, 6, 0, STR_PAD_LEFT) . random_int(11111111, 99999999);
  112. $attributes = [
  113. 'time_expire' => $expire,
  114. 'trade_type' => 'JSAPI', // 支付方式,小程序支付使用JSAPI
  115. 'body' => '55届线上实战营直播报名', // 订单说明
  116. 'detail' => '55届线上实战营直播报名订单支付', // 订单说明
  117. 'out_trade_no' => $nu, // 自定义订单号
  118. 'total_fee' =>$cost*100, // 单位:分
  119. 'openid' => $user->openid, // 当前用户的openId
  120. // 'notify_url' =>'http://api.app.jiuweiyun.cn/api/pay/message',
  121. ];
  122. $result = $payment->order->unify($attributes);
  123. if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
  124. $enroll=new Enroll();
  125. $enroll->user_id = $user->id;
  126. $enroll->season = 55;
  127. $enroll->type = 0;
  128. $enroll->enroll_no = $nu;
  129. $enroll->cost = $cost;
  130. $enroll->is_pay = 0;
  131. if (!$enroll->save()){
  132. throw new \Exception('1');
  133. }
  134. $prepayId = $result['prepay_id'];
  135. $config = $jssdk->sdkConfig($prepayId);
  136. DB::commit();
  137. return response()->json([
  138. 'error_code'=>200,
  139. 'msg'=>'成功',
  140. 'data'=>$config
  141. ]);
  142. }
  143. }catch (\Exception $exception){
  144. DB::rollBack();
  145. Log::error($exception->getMessage());
  146. return $this->error(500214,'','调起支付失败');
  147. }
  148. }
  149. public function SearchStatus(){
  150. $options = $this->options();
  151. $payment = Factory::payment($options);
  152. $id=Auth::user()->id;
  153. $res = Enroll::where('user_id', $id)->where('season', 55)->where('is_refund', 0)->where('is_pay', 0)->orderByDesc('created_at')->get();
  154. $s = false;
  155. foreach ($res as $k => $v) {
  156. $re = $payment->order->queryByOutTradeNumber($v->enroll_no);
  157. if (isset($re['transaction_id'])) {
  158. $enroll = Enroll::find($v->id);
  159. $enroll->is_pay = 1;
  160. $enroll->trade_no = $re['transaction_id'];
  161. $enroll->save();
  162. $s = true;
  163. }
  164. }
  165. if ($s) {
  166. Log::error('测试测试');
  167. return $this->success(['status'=>true]);
  168. } else {
  169. return $this->error(40056, '', '暂无支付信息,请重新进入');
  170. }
  171. }
  172. public function message(Request $request)
  173. {
  174. Log::error('支付回调111');
  175. $options = $this->options();
  176. $payment = Factory::payment($options);
  177. $response = $payment->handlePaidNotify(function ($message, $fail) {
  178. $out_trade_no = $message['out_trade_no']; // 商户订单号
  179. $trade_no = $message['transaction_id']; // 微信支付订单号
  180. $order = Enroll::where('enroll_no', '=', $out_trade_no)->first();
  181. if (empty($order)) {
  182. return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
  183. }
  184. $r = Cache::get(md5('codes' . $order->user_id));
  185. if (!$r) {
  186. if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
  187. // 用户是否支付成功
  188. if ($message['result_code'] === 'SUCCESS') {
  189. $enroll = Enroll::where('enroll_no', '=', $out_trade_no)->first();
  190. $enroll->is_pay = 1;
  191. $enroll->trade_no = $trade_no;
  192. $enroll->save();
  193. }
  194. } else {
  195. return $fail('通信失败,请稍后再通知我');
  196. }
  197. }
  198. return true;
  199. });
  200. return $response;
  201. }
  202. protected function options(){
  203. return [
  204. 'app_id' => config('wechat.payment.gzh.app_id'),//config('wechat.payment.default.app_id'),
  205. 'mch_id' => config('wechat.payment.gzh.mch_id'),
  206. 'sub_mch_id' => '',
  207. 'key' => config('wechat.payment.gzh.key'),
  208. 'notify_url' =>url('api/pay/message'),
  209. 'cert_path' =>config('wechat.payment.gzh.cert_path'),
  210. 'key_path' =>config('wechat.payment.gzh.key_path'),
  211. ];
  212. }
  213. /*
  214. * 获取报名人的收货地址
  215. * **/
  216. public function GetEnrollUserAddress(){
  217. $re=EnrollUser::where('user_id',Auth::user()->id)->first();
  218. return $this->success($re);
  219. }
  220. /*
  221. * 提交地址信息
  222. * */
  223. public function UpdateAddAddress(Request $request){
  224. $address=EnrollUser::where('user_id',Auth::user()->id)->first();
  225. if (!$address){
  226. $address=new EnrollUser();
  227. $address->user_id=Auth::user()->id;
  228. }
  229. $address->name=$request->input('name');
  230. $address->mobile=$request->input('mobile');
  231. $address->province=$request->input('province');
  232. $address->city=$request->input('city');
  233. $address->town=$request->input('town');
  234. $address->address=$request->input('address');
  235. $address->save();
  236. return $this->success([]);
  237. }
  238. public function GetEnrollInfo(){
  239. $live_start_time='2022-02-23 08:00:00';
  240. $live_end_time='2022-02-25 14:00:00';
  241. $enroll_start_time='2022-02-16 10:00:00';
  242. $enroll_end_time='2022-02-22 11:00:00';
  243. $season=55;
  244. $cost=199;
  245. 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]);
  246. }
  247. public function getSzyExpress(Request $request){
  248. $id=$request->input('id');
  249. $enroll=Enroll::with('user:id,mobile')->where('id',$id)->first();
  250. if (!$enroll){
  251. return $this->error(40011,'','该报名信息有误');
  252. }
  253. $userExpress=EnrollUserExpress::where('phone',$enroll->user->mobile)->where('season',$enroll->season)->first();
  254. if($userExpress->express_state==3){ //已签收
  255. $express=json_decode($userExpress->express_info,true);
  256. }else{ //未签收
  257. $CustomerName = null;
  258. if($userExpress->express_code =='SF'){
  259. $mobile=EnrollUser::where('user_id',$enroll->user_id)->value('mobile');
  260. $CustomerName = substr($mobile,-4);
  261. }
  262. $expressHandler=new ExpressHandler();
  263. $express_company_code=array_search($userExpress->express_company,$expressHandler->getExpressCode());
  264. $express=$expressHandler->search($userExpress->express_code, $express_company_code, null, $CustomerName);
  265. $express=json_decode(json_encode($express),'true');
  266. if(isset($express['Traces']) && !empty($express['Traces'])){
  267. foreach ($express['Traces'] as $key=>$val){
  268. $express['Traces'][$key]['AcceptTime']=date("Y-m-d H:i:s",substr($val['AcceptTime'],0,strlen($val['AcceptTime'])-3));
  269. }
  270. $userExpress->express_info=json_encode($express);
  271. $userExpress->express_state=$express['State'];
  272. $userExpress->save();
  273. }
  274. }
  275. // $expressHandler=new ExpressHandler();
  276. // $express_company_code=array_search($express->express_company,$expressHandler->getExpressCode());
  277. // $re=$expressHandler->search($express->express_code,$express_company_code);
  278. // $re=(array)$re;
  279. // if ($re['State']==3){
  280. // DB::beginTransaction();
  281. // try{
  282. // $express->data=json_encode($re);
  283. // $express->status=1;
  284. // $express->save();
  285. // DB::commit();
  286. // }catch (\Exception $exception){
  287. // Log::error('-------物流信息保存出错--------'.$exception);
  288. // DB::rollBack();
  289. // }
  290. //
  291. // }
  292. return $this->success($express);
  293. // }
  294. }
  295. public function uploadGiftExpress(Request $request){
  296. $info=json_decode($request->input('data'),true);
  297. $data=$info['data'];
  298. Log::info($data);
  299. $all_phones=array_column($data,'手机号');
  300. $unique_phones=array_unique($all_phones);
  301. $phones=array_diff_assoc($all_phones,$unique_phones);
  302. if($phones){
  303. return $this->error(50024,'','手机号'.array_shift($phones).'重复出现');
  304. }
  305. $all_codes=array_column($data,'快递单号');
  306. $unique_codes=array_unique($all_codes);
  307. $codes=array_diff_assoc($all_codes,$unique_codes);
  308. if($codes){
  309. return $this->error(50024,'','快递单号'.array_shift($codes).'重复出现');
  310. }
  311. $seasons=array_column($data,'届数');
  312. $unique_seasons=array_unique($seasons);
  313. $season=$seasons[0];
  314. if(count($unique_seasons) > 1){
  315. return $this->error(50024,'','届数不一致');
  316. }
  317. $ExpressHandler=new ExpressHandler();
  318. $express_company=$ExpressHandler->getExpressCode();
  319. DB::beginTransaction();
  320. try{
  321. log::info('查数据库1--'.microtime());
  322. $phone_ids=User::whereIn('mobile',$unique_phones)->pluck('id','mobile')->toArray();
  323. log::info('查数据库1--'.microtime());
  324. // $enroll_phones=EnrollUserExpress::where('season',$seasons)->pluck('phone')->toArray();
  325. log::info('查数据库1--'.microtime());
  326. foreach($data as $key=>$val){
  327. if ($key==0){
  328. if (!isset($val['手机号']) || !isset($val['快递公司']) || !isset($val['快递单号']) || !isset($val['届数'])){
  329. throw new \Exception('表格的表头设置有误');
  330. }
  331. }else{
  332. if (empty($val['手机号']) || empty($val['快递单号']) || empty($val['快递公司']) || empty($val['届数'])){
  333. throw new \Exception('第'.($key+1).'行,数据缺失');
  334. }
  335. $express_company_code=array_search($val['快递公司'],$express_company);
  336. if(!$express_company_code){
  337. throw new \Exception('第'.($key+1).'行快递公司:'.$val['快递公司'].'不存在');
  338. // return $this->error(50024,'','第'.($key+1).'行快递公司:'.$val['快递公司'].'不存在');
  339. }
  340. // if(array_search($val['手机号'],$enroll_phones)){
  341. // throw new \Exception('第'.($key+1).'行,数据已提交');
  342. // }
  343. if (!array_key_exists($val['手机号'],$phone_ids)) {
  344. throw new \Exception('手机号' . $val['手机号'] . '在代理商系统中不存在,请确认手机号');
  345. }else{
  346. $user_id=$phone_ids[$val['手机号']];
  347. Log::info($val['手机号'].'--'.$user_id.'--'.$season);
  348. $enroll=Enroll::where('user_id',$user_id)->where('season',$season)->first();
  349. if(!$enroll){
  350. throw new \Exception('手机号'.$val['手机号'].'未报名'.$season.'届实战营');
  351. }
  352. if ($enroll->express_code || $enroll->express_company){
  353. throw new \Exception('手机号'.$val['手机号'].'已提交物流信息');
  354. // return $this->error(50024,'','手机号'.$val['手机号'].'已提交物流信息');
  355. }
  356. $enroll->express_code=$val['快递单号'];
  357. $enroll->express_company_code=$express_company_code;
  358. $enroll->express_company=$val['快递公司'];
  359. $enroll->save();
  360. }
  361. }
  362. // $info[$key]['phone']=$val['手机号'];
  363. // $info[$key]['express_company']=$val['快递公司'];
  364. // $info[$key]['express_code']=$val['快递单号'];
  365. // $info[$key]['season']=$val['届数'];
  366. }
  367. // EnrollUserExpress::insert($info);
  368. DB::commit();
  369. return [true];
  370. }catch (\Exception $e){
  371. DB::rollBack();
  372. return [false,$e->getMessage()];
  373. }
  374. }
  375. }