HuiFuController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <?php
  2. namespace App\Http\Controllers\HuiFu;
  3. use App\Models\User;
  4. use BsPayClassify\QuickbuckleApply;
  5. use BsPayClassify\QuickbuckleConfirm;
  6. use BsPayClassify\V2QuickbuckleUnbind;
  7. use BsPayClassify\V2TradeCardbinQuery;
  8. use BsPayClassify\V2TradeOnlinepaymentQuery;
  9. use BsPayClassify\V2TradeOnlinepaymentQuickpayApply;
  10. use BsPayClassify\V2TradeOnlinepaymentQuickpayConfirm;
  11. use App\Http\Controllers\Controller;
  12. use App\Models\HuiFu\QJBankInfo;
  13. use App\Models\HuiFu\QJEnroll;
  14. use App\Models\HuiFu\QJUser;
  15. use BsPaySdk\core\BsPayTools;
  16. use Carbon\Carbon;
  17. use Illuminate\Http\Request;
  18. use Illuminate\Support\Facades\Auth;
  19. use Illuminate\Support\Facades\Crypt;
  20. use Illuminate\Support\Facades\Log;
  21. class HuiFuController extends Controller{
  22. //检查是否开通
  23. public function check(){
  24. // if (Carbon::now()<'2024-11-13 09:00:00'){
  25. // return $this->error(50016,'','争霸赛报名尚未开始!');
  26. // }
  27. $id=Auth::user()->id;
  28. $re=QJUser::where('user_id',$id)->first();
  29. $user=User::find($id);
  30. if ($user->deleted_at){
  31. return $this->error(50014,'','账号已删除');
  32. }
  33. if (!$re){
  34. if (Carbon::now()>'2024-11-16 00:00:00'){
  35. return $this->error(50015,'','争霸赛报名已结束');
  36. }
  37. return $this->error(50014,'','未开通快捷支付');
  38. }
  39. $res=QJBankInfo::where('qj_user_id',$id)->where('trans_status','S')->first();
  40. if (!$res){
  41. if (Carbon::now()>'2024-11-16 00:00:00'){
  42. return $this->error(50015,'','争霸赛报名已结束');
  43. }
  44. return $this->error(50014,'','未开通快捷支付');
  45. }
  46. if (!$res->token_no){
  47. if (Carbon::now()>'2024-11-16 00:00:00'){
  48. return $this->error(50015,'','争霸赛报名已结束');
  49. }
  50. return $this->error(50014,'','未开通快捷支付');
  51. }
  52. $status=QJEnroll::where('is_pay',1)->where('user_id',$id)->first();
  53. if (!$status){
  54. return $this->success(['id'=>$res->id]);
  55. }
  56. return $this->success(['status'=>1,'info'=>'报名成功','time'=>Carbon::parse($status->created_at)->toDateTimeString(),
  57. 'pay_number'=>$status->pay_number,'money'=>9.9]);
  58. }
  59. //申请快捷支付的绑卡
  60. public function QuickBankApply(Request $request){
  61. // if (Carbon::now()>'2023-12-02 16:00:00'){
  62. // return $this->error(50014,'','争霸赛报名已结束');
  63. // }
  64. $input=$request->all();
  65. $id=Auth::user()->id;
  66. $huifuID=\config('HFConfig.huifu_id');
  67. $publicKey=\config('HFConfig.rsa_huifu_public_key');
  68. $CardID=BsPayTools::encrypt_with_rsa_pubkey($input['CardID'],$publicKey);//银行卡号
  69. $CardName=BsPayTools::encrypt_with_rsa_pubkey($input['CardName'],$publicKey);//姓名
  70. $CertID=BsPayTools::encrypt_with_rsa_pubkey($input['CertID'],$publicKey);//身份证号
  71. $mobile=BsPayTools::encrypt_with_rsa_pubkey($input['mobile'],$publicKey);
  72. $startDate=Carbon::parse($input['startDate'])->format('Ymd');
  73. $endDate=Carbon::parse($input['endDate'])->format('Ymd');
  74. $OutCustId='6668'.str_pad($id, 8, '0', STR_PAD_LEFT);
  75. $ReqSeqId=date("YmdHis") . mt_rand();
  76. $orderID=date('YmdHis').$id.random_int(100,999);
  77. $type=$input['type'];
  78. $data=[
  79. 'ReqSeqId'=>$ReqSeqId,
  80. 'orderID'=>$orderID,
  81. 'startDate'=>$startDate,
  82. 'endDate'=>$endDate,
  83. 'huifuID'=>$huifuID,
  84. 'CardID'=>$CardID,
  85. 'CardName'=>$CardName,
  86. 'CertID'=>$CertID,
  87. 'mobile'=>$mobile,
  88. 'type'=>$type,
  89. 'OutCustId'=>$OutCustId,
  90. ];
  91. $QJUser=QJUser::where('user_id',$id)->first();
  92. if (!$QJUser){
  93. $QJUser=new QJUser();
  94. $QJUser->out_cust_id=$OutCustId;
  95. }else{
  96. // $OutCustId='6668'.str_pad($id, 8, '0', STR_PAD_LEFT).random_int(11111,99999);
  97. // $QJUser->out_cust_id=$OutCustId;
  98. $data['OutCustId']=$QJUser->out_cust_id;
  99. // $data['OutCustId']=$QJUser->out_cust_id;
  100. // Log::error($data);
  101. }
  102. $QJUser->user_id=$id;
  103. $QJUser->cert_validity_type=$input['type'];
  104. $QJUser->cert_begin_date=$input['startDate'];
  105. $QJUser->cert_end_date=$input['endDate'];
  106. $QJUser->cert_id=Crypt::encryptString($input['CertID']);
  107. $QJUser->save();
  108. $QJBank=new QJBankInfo();
  109. $QJBank->req_seq_id=$ReqSeqId;
  110. $QJBank->order_id=$orderID;
  111. $QJBank->order_date=date('Y-m-d');
  112. $QJBank->card_id=Crypt::encryptString($input['CardID']);
  113. $QJBank->card_mp=Crypt::encryptString($mobile);
  114. $QJBank->qj_user_id=$id;
  115. $bankInfo=$this->Bin($CardID);
  116. if (isset($bankInfo['err'])){
  117. return $this->error(500214,'',$bankInfo['err']);
  118. }
  119. $mystring = $bankInfo['bank_name'];
  120. $findme = '招商银行';
  121. $pos = strpos($mystring, $findme);
  122. $protocol_no=null;
  123. if (is_numeric($pos)){
  124. $protocol_no='34463343';
  125. $data['protocol_no']=$protocol_no;
  126. }
  127. $QJBank->card_bin=$bankInfo['card_bin'];
  128. $QJBank->bank_name=$bankInfo['bank_name'];
  129. $QJBank->issuer_id=$bankInfo['issuer_id'];
  130. $QJBank->dc_type=$bankInfo['card_type'];
  131. $QJBank->protocol_no=$protocol_no;
  132. $re=new QuickbuckleApply();
  133. $result=$re->apply($data);
  134. if (!$result || $result->isError()) { //失败处理
  135. return $this->error('400',$result -> getErrorInfo());
  136. }
  137. $result=$this->object_to_array($result);
  138. $rspDatas = $result['rspDatas'];
  139. $res = BsPayTools::verifySign_sort($rspDatas['sign'],$rspDatas['data'],$publicKey);
  140. if($res){
  141. if(isset($rspDatas['data']['trans_status']) ){
  142. if ($rspDatas['data']['trans_status']=='S'){
  143. $QJBank->trans_id=$rspDatas['data']['trans_id'];
  144. $QJBank->save();
  145. //发起快捷绑卡成功,点击发送短信时触发
  146. return $this->success(['order_id'=>$rspDatas['data']['order_id'],'trans_id'=>$rspDatas['data']['trans_id']]);
  147. }
  148. }
  149. }
  150. return $this->error(500214,'',$rspDatas['data']['resp_desc']);
  151. }
  152. //银行卡信息
  153. public function Bin($data){
  154. $ReqId=date("YmdHis") . mt_rand();
  155. $data=[
  156. 'req_seq_id'=>$ReqId,
  157. 'bank_card_no_crypt'=>$data
  158. ];
  159. $re=new V2TradeCardbinQuery();
  160. $result=$re->index($data);
  161. if (!$result || $result->isError()) { //失败处理
  162. return ['err'=>$result -> getErrorInfo()];
  163. }
  164. $res=$this->object_to_array($result);
  165. if (!isset($res['rspDatas']['data']['bank_name'])){
  166. return ['err'=>$res['rspDatas']['data']['resp_desc']];
  167. }
  168. try {
  169. $data = str_replace("\n", " ", trim($res['rspDatas']['data']["bank_name"]));
  170. $Datas=$res['rspDatas']['data'];
  171. $arr=explode(' ',$data);
  172. }catch (\Exception $exception){
  173. $arr[]=$res['rspDatas']['data']["bank_name"];
  174. }
  175. $arrs=[
  176. 'issuer_id'=>$Datas['issuer_id'],
  177. 'bank_name'=>$arr[0],
  178. 'bank_code'=>$Datas['bank_code'],
  179. 'card_bin'=>$Datas['card_bin'],
  180. 'card_type'=>$Datas['card_type'],
  181. ];
  182. return $arrs;
  183. }
  184. //申请绑卡确认
  185. public function QuickBankConfirm(Request $request){
  186. $input=$request->all();
  187. $id=Auth::user()->id;
  188. $huifuID=\config('HFConfig.huifu_id');
  189. $publicKey=\config('HFConfig.rsa_huifu_public_key');
  190. $CardID=BsPayTools::encrypt_with_rsa_pubkey($input['CardID'],$publicKey);//银行卡号
  191. $CardName=BsPayTools::encrypt_with_rsa_pubkey($input['CardName'],$publicKey);//姓名
  192. $CertID=BsPayTools::encrypt_with_rsa_pubkey($input['CertID'],$publicKey);//身份证号
  193. $mobile=BsPayTools::encrypt_with_rsa_pubkey($input['mobile'],$publicKey);
  194. $OutCustId='6668'.str_pad($id, 8, '0', STR_PAD_LEFT);
  195. $ReqSeqId=date("YmdHis") . mt_rand();
  196. $sms_code=$input['sms_code'];
  197. $order_id=$input['order_id'];
  198. $trans_id=$input['trans_id'];
  199. $data=[
  200. 'ReqId'=>$ReqSeqId,
  201. 'orderID'=>$order_id,//和申请接口的order_id一致
  202. 'huifuID'=>$huifuID,
  203. 'CardID'=>$CardID,
  204. 'CardName'=>$CardName,
  205. 'CertID'=>$CertID,
  206. 'trans_id'=>$trans_id,//和申请接口的trans_id一致
  207. 'mobile'=>$mobile,
  208. 'OutId'=>$OutCustId,
  209. 'sms_code'=>$sms_code,
  210. ];
  211. $re=new QuickbuckleConfirm();
  212. $result=$re->confirm($data);
  213. if (!$result || $result->isError()) { //失败处理
  214. return $this->error('400',$result -> getErrorInfo());
  215. }
  216. $result=$this->object_to_array($result);
  217. $rspDatas = $result['rspDatas'];
  218. $res = BsPayTools::verifySign_sort($rspDatas['sign'],$rspDatas['data'],$publicKey);
  219. if($res){
  220. if(isset($rspDatas['data']['trans_status']) ){
  221. if ($rspDatas['data']['trans_status']=='S'){
  222. $QJBank=QJBankInfo::where('order_id',$order_id)->first();
  223. if ($QJBank){
  224. $QJBank->cust_id=$rspDatas['data']['cust_id'];
  225. $QJBank->token_no=$rspDatas['data']['token_no'];
  226. $QJBank->trans_status=$rspDatas['data']['trans_status'];
  227. $QJBank->save();
  228. return $this->success(['id'=>$QJBank->id]);
  229. }
  230. }
  231. }
  232. $QJBank=QJBankInfo::where('order_id',$order_id)->first();
  233. if ($QJBank){
  234. $QJBank->err_info=json_encode($rspDatas['data'],true);
  235. $QJBank->save();
  236. }
  237. return $this->error(500214,'',$rspDatas['data']['resp_desc']);
  238. }
  239. }
  240. //发起支付
  241. public function QuickBankPay(Request $request){
  242. $time='2024-11-13 10:00:00';
  243. if (Carbon::now()<$time){
  244. return $this->error(500214,'','暂未开始报名!');
  245. }
  246. if (Carbon::now()>'2024-11-16 00:00:00'){
  247. return $this->error(50014,'','争霸赛报名已结束');
  248. }
  249. $ReqSeqId=date("YmdHis") . mt_rand();
  250. $ids=Auth::user()->id;
  251. $QJEnroll=QJEnroll::where('user_id',$ids)->where('is_pay',1)->first();
  252. if ($QJEnroll){
  253. return $this->error(500214,'','已报名,请回到首页刷新');
  254. }
  255. $publicKey=\config('HFConfig.rsa_huifu_public_key');
  256. $orderID=date('YmdHis').$ids.random_int(100,999);
  257. $huifuID=\config('HFConfig.huifu_id');
  258. $QJEnroll=new QJEnroll();
  259. $QJEnroll->user_id=$ids;
  260. $QJEnroll->pay_number=$orderID;
  261. $QJEnroll->season=48;
  262. $QJEnroll->req_seq_id=$ReqSeqId;
  263. $QJEnroll->save();
  264. $id=$request->input('id');
  265. $QJBank=QJBankInfo::find($id);
  266. $data=[
  267. 'trans_amt'=>"9.90",
  268. 'req_seq_id'=>$ReqSeqId,
  269. 'card_bind_id'=>$QJBank->token_no,
  270. 'notify_url'=>'http://api.app.cliu.cc/api/text_notify_url',
  271. 'user_huifu_id'=>$QJBank->cust_id,
  272. 'good_desc'=>'第48届争霸赛报名费用',
  273. 'huifu_id'=>$huifuID,
  274. ];
  275. $re=new V2TradeOnlinepaymentQuickpayApply();
  276. $result=$re->index($data);
  277. if (!$result || $result->isError()) { //失败处理
  278. return $this->error('400',$result -> getErrorInfo());
  279. }
  280. $result=$this->object_to_array($result);
  281. $rspDatas = $result['rspDatas'];
  282. $res = BsPayTools::verifySign_sort($rspDatas['sign'],$rspDatas['data'],$publicKey);
  283. if($res){
  284. try {
  285. $QJEnroll->messsage=$rspDatas['data']['sub_resp_desc'];
  286. $QJEnroll->save();
  287. }catch (\Exception $exception){
  288. }
  289. if(isset($rspDatas['data']['resp_code']) && $rspDatas['data']['resp_code']=='00000000'){
  290. return $this->success(['id'=>$QJEnroll->id]);
  291. }
  292. if(isset($rspDatas['data']['resp_code']) && $rspDatas['data']['resp_code']=='00000100'){
  293. return $this->success(['id'=>$QJEnroll->id]);
  294. }
  295. }
  296. return $this->error(500214,'',$rspDatas['data']['resp_desc']);
  297. }
  298. //查询发起支付是否成功
  299. //上传验证码
  300. public function QuickBankSms(Request $request){
  301. $id=$request->input('id');
  302. $QJEnroll=QJEnroll::find($id);
  303. if (!$QJEnroll){
  304. return $this->error(500214,'','请重新获取验证码');
  305. }
  306. $huifuID=\config('HFConfig.huifu_id');
  307. $publicKey=\config('HFConfig.rsa_huifu_public_key');
  308. $sms_code=$request->input('sms_code');
  309. $data=[
  310. 'huifu_id'=>$huifuID,
  311. 'req_seq_id'=>$QJEnroll->req_seq_id,
  312. 'sms_code'=>$sms_code,
  313. 'goods_desc'=>'报名费用',
  314. 'notify_url'=>'http://api.app.cliu.cc/api/text_notify_url',
  315. ];
  316. $re=new V2TradeOnlinepaymentQuickpayConfirm();
  317. $result=$re->index($data);
  318. if (!$result || $result->isError()) { //失败处理
  319. return $this->error('400',$result -> getErrorInfo());
  320. }
  321. $result=$this->object_to_array($result);
  322. $rspDatas = $result['rspDatas'];
  323. $res = BsPayTools::verifySign_sort($rspDatas['sign'],$rspDatas['data'],$publicKey);
  324. if($res){
  325. if(isset($rspDatas['data']['trans_stat']) && $rspDatas['data']['trans_stat']=='P'){
  326. return $this->success(['status'=>0]);
  327. }
  328. if (isset($rspDatas['data']['trans_stat']) && $rspDatas['data']['trans_stat']=='S'){
  329. $QJEnroll->is_pay=1;
  330. $QJEnroll->save();
  331. return $this->success(['status'=>1]);
  332. }
  333. }
  334. return $this->error(50214,'',$rspDatas['data']['resp_desc']);
  335. }
  336. public function CheckStatus(Request $request){
  337. $id=$request->input('id');
  338. $QJEnroll=QJEnroll::find($id);
  339. $huifuID=\config('HFConfig.huifu_id');
  340. $data=[
  341. 'huifu_id'=>$huifuID,
  342. 'org_req_seq_id'=>$QJEnroll->req_seq_id,
  343. 'org_hf_req_id'=>'',
  344. 'org_req_date'=>Carbon::parse($QJEnroll->created_at)->format('Ymd')
  345. ];
  346. $publicKey=\config('HFConfig.rsa_huifu_public_key');
  347. $re=new V2TradeOnlinepaymentQuery();
  348. $result=$re->index($data);
  349. if (!$result || $result->isError()) { //失败处理
  350. return $this->error('400',$result -> getErrorInfo());
  351. }
  352. $result=$this->object_to_array($result);
  353. $rspDatas = $result['rspDatas'];
  354. $res = BsPayTools::verifySign_sort($rspDatas['sign'],$rspDatas['data'],$publicKey);
  355. if($res){
  356. if(isset($rspDatas['data']['trans_stat']) && $rspDatas['data']['trans_stat']=='P'){
  357. return $this->success(['status'=>0]);
  358. }
  359. if (isset($rspDatas['data']['trans_stat']) && $rspDatas['data']['trans_stat']=='S'){
  360. $QJEnroll->is_pay=1;
  361. $QJEnroll->save();
  362. return $this->success(['status'=>1]);
  363. }
  364. }
  365. if (isset($rspDatas['data']['bank_desc'])){
  366. return $this->error(400,'',$rspDatas['data']['bank_desc']);
  367. }
  368. return $this->error(400,'',$rspDatas['data']['resp_desc']);
  369. }
  370. public function UnbindBank(Request $request){
  371. $id=$request->input('id');
  372. $re=QJBankInfo::where('id',$id)->first();
  373. $re->trans_status='P';
  374. $re->is_unbind=1;
  375. $re->save();
  376. $arr=QJUser::where('user_id',$re->qj_user_id)->first();
  377. $ReqId=date("YmdHis") . mt_rand();
  378. $OutId=$arr->out_cust_id;
  379. $token_no=$re->token_no;
  380. $huifuID=\config('HFConfig.huifu_id');
  381. $data=[
  382. 'req_seq_id'=>$ReqId,
  383. 'out_cust_id'=>$OutId,
  384. 'huifu_id'=>$huifuID,
  385. 'token_no'=>$token_no
  386. ];
  387. try {
  388. $result=new V2QuickbuckleUnbind();
  389. $result=$result->index($data);
  390. }catch (\Exception $exception){
  391. }
  392. Log::error('解绑成功!');
  393. return $this->success([]);
  394. }
  395. public function BankInfo(){
  396. $id=Auth::user()->id;
  397. $re=QJBankInfo::where('qj_user_id',$id)->where('trans_status','S')->first();
  398. if (!$re){
  399. return $this->success([]);
  400. }
  401. return $this->success(['id'=>$re->id,'bank_name'=>$re->bank_name,'time'=>$re->created_at->toDateTimeString()]);
  402. }
  403. }