diff --git a/Laravel/app/Http/Controllers/API/ApiMapController.php b/Laravel/app/Http/Controllers/API/ApiMapController.php index 8a369eb..15dbcfe 100644 --- a/Laravel/app/Http/Controllers/API/ApiMapController.php +++ b/Laravel/app/Http/Controllers/API/ApiMapController.php @@ -98,6 +98,7 @@ class ApiMapController extends Controller 'HeXiaoSanFangCode' => $base_url . '/api/H5/HeXiaoSanFangCode', // 核销三方机构code 'GetHomeNotice' => $base_url . '/api/H5/GetHomeNotice', // 首页消息通知 'GetPersonOrderList' => $base_url . '/api/H5/GetPersonOrderList', // 获取个人订单列表 + 'ZhongKangGetHexiaoCode' => $base_url . '/api/H5/ZhongKangGetHexiaoCode', // 中康查询核销码 ]; } diff --git a/Laravel/app/Http/Controllers/API/H5/OrderController.php b/Laravel/app/Http/Controllers/API/H5/OrderController.php index ca5c9d1..34ca7b7 100644 --- a/Laravel/app/Http/Controllers/API/H5/OrderController.php +++ b/Laravel/app/Http/Controllers/API/H5/OrderController.php @@ -238,14 +238,26 @@ class OrderController extends Controller if(isset($sanfang_code) and isset($sanfang_code['code_num'])){ if($sanfang_code['combo_id']<>$combo_id) return \Yz::echoError1("转赠码与套餐不匹配"); //校验有效性,临时抵消套餐价格 - if($sanfang_code['qudao_type']==1){ - $cha_sanfang_code = DB::table('transfer_code')->where(['code' => $sanfang_code['code_num'], 'status' => 1, 'is_del' => 0])->first(); - if (!$cha_sanfang_code) return \Yz::echoError1("此转赠码不可用"); - $price=$price-$cha_sanfang_code->price; + $sanfang_service = new SanFangCodeService(); + $cha_sanfang_code = $sanfang_service->GetSanFangCode($sanfang_code['code_num'], $person_id, $sanfang_code['qudao_type']); + if ($cha_sanfang_code['status'] == true) { + $price=$price-$cha_sanfang_code['data']['price']; if($price<0){ $price=0; } + }else{ + return \Yz::echoError1($cha_sanfang_code['msg']); } +// if($sanfang_code['combo_id']<>$combo_id) return \Yz::echoError1("转赠码与套餐不匹配"); +// //校验有效性,临时抵消套餐价格 +// if($sanfang_code['qudao_type']==1){ +// $cha_sanfang_code = DB::table('transfer_code')->where(['code' => $sanfang_code['code_num'], 'status' => 1, 'is_del' => 0])->first(); +// if (!$cha_sanfang_code) return \Yz::echoError1("此转赠码不可用"); +// $price=$price-$cha_sanfang_code->price; +// if($price<0){ +// $price=0; +// } +// } } $title = $combo_info->name; $buy_info['combo'] = [ @@ -607,9 +619,9 @@ class OrderController extends Controller $youhuiquan_dikou_status = $AspNet::YouHuiQuan($data); } //核销三方券码(转赠码等) - if(!!$cha_sanfang_code){ + if(!!$cha_sanfang_code and $cha_sanfang_code['status']==true){ $s= new SanFangCodeService(); - $hexiao=$s->HeXiaoSanFangCode($sanfang_code['qudao_type'],$cha_sanfang_code->code,$insert); + $hexiao=$s->HeXiaoSanFangCode($sanfang_code['qudao_type'],$cha_sanfang_code['data']['code_num'],$insert); if($hexiao['status']===false) return \Yz::echoError1($hexiao['msg']); } } diff --git a/Laravel/app/Http/Controllers/API/H5/OrderNewController.php b/Laravel/app/Http/Controllers/API/H5/OrderNewController.php index 2ffb39e..93248ac 100644 --- a/Laravel/app/Http/Controllers/API/H5/OrderNewController.php +++ b/Laravel/app/Http/Controllers/API/H5/OrderNewController.php @@ -136,14 +136,24 @@ class OrderNewController extends Controller if(isset($sanfang_code) and isset($sanfang_code['code_num'])){ if($sanfang_code['combo_id']<>$combo_id) return \Yz::echoError1("转赠码与套餐不匹配"); //校验有效性,临时抵消套餐价格 - if($sanfang_code['qudao_type']==1){ - $cha_sanfang_code = DB::table('transfer_code')->where(['code' => $sanfang_code['code_num'], 'status' => 1, 'is_del' => 0])->first(); - if (!$cha_sanfang_code) return \Yz::echoError1("此转赠码不可用"); - $price=$price-$cha_sanfang_code->price; + $sanfang_service = new SanFangCodeService(); + $cha_sanfang_code = $sanfang_service->GetSanFangCode($sanfang_code['code_num'], $person_id, $sanfang_code['qudao_type']); + if ($cha_sanfang_code['status'] == true) { + $price=$price-$cha_sanfang_code['data']['price']; if($price<0){ $price=0; } + }else{ + return \Yz::echoError1($cha_sanfang_code['msg']); } +// if($sanfang_code['qudao_type']==1){ +// $cha_sanfang_code = DB::table('transfer_code')->where(['code' => $sanfang_code['code_num'], 'status' => 1, 'is_del' => 0])->first(); +// if (!$cha_sanfang_code) return \Yz::echoError1("此转赠码不可用"); +// $price=$price-$cha_sanfang_code->price; +// if($price<0){ +// $price=0; +// } +// } } $title = $combo_info->name; $buy_info['combo'] = [ @@ -388,9 +398,9 @@ class OrderNewController extends Controller $youhuiquan_dikou_status = $AspNet::YouHuiQuan($data); } //核销三方券码(转赠码等) - if(!!$cha_sanfang_code){ + if(!!$cha_sanfang_code and $cha_sanfang_code['status']==true){ $s= new SanFangCodeService(); - $hexiao=$s->HeXiaoSanFangCode($sanfang_code['qudao_type'],$cha_sanfang_code->code,$insert); + $hexiao=$s->HeXiaoSanFangCode($sanfang_code['qudao_type'],$cha_sanfang_code['data']['code_num'],$insert); if($hexiao['status']===false) return \Yz::echoError1($hexiao['msg']); } diff --git a/Laravel/app/Http/Controllers/API/H5/SanFangController.php b/Laravel/app/Http/Controllers/API/H5/SanFangController.php index 9319a12..a0839bb 100644 --- a/Laravel/app/Http/Controllers/API/H5/SanFangController.php +++ b/Laravel/app/Http/Controllers/API/H5/SanFangController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\API\H5; use App\Http\Controllers\Controller; +use App\Services\SanFangCodeService; +use App\Services\ZhongKangService; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -18,23 +20,56 @@ class SanFangController extends Controller public function GetSanFangCode(Request $request) { $code = request('code'); - $qudao_type = request('qudao_type');//1H5转赠码2有赞 - if ($qudao_type == 1) { - - $code = DB::table('transfer_code')->where(['code' => $code, 'status' => 1, 'is_del' => 0])->first(); - if (!$code) return \Yz::echoError1("此转赠码不可用"); + $person_id = request('person_id'); + $qudao_type = request('qudao_type');//1H5转赠码2有赞3中康 + if(!isset($person_id)) return \Yz::echoError1("person_id不能为空"); + $person = DB::table('web_user_person')->where(['id' => $person_id, 'is_del' => 0])->first(); +// if ($qudao_type == 1) { +// +// $code = DB::table('transfer_code')->where(['code' => $code, 'status' => 1, 'is_del' => 0])->first(); +// if (!$code) return \Yz::echoError1("此转赠码不可用"); +// $data = [ +// 'code_num' => $code->code, +// 'status' => $code->status, +// 'price' => $code->price, +// 'combo_id' => $code->combo_id, +// 'qudao_type' => $qudao_type, +// ]; +// return \Yz::Return(true, "查询成功", $data); +// } +// if ($qudao_type == 3) { +// $service = new ZhongKangService(); +// $res= $service->GetHexiaoCode($code,$person->name,$person->id_number); +// if($res['status']==true && $res['data']['status']==1){ +// $data = [ +// 'code_num' => $res['data']['code_num'], +// 'status' => $res['data']['status'], +// 'price' => $res['data']['price'], +// 'combo_id' => $res['data']['combo_id'], +// 'qudao_type' => $qudao_type, +// ]; +// return \Yz::Return(true, "查询成功", $data); +// }else{ +// return \Yz::echoError1("此转赠码不可用(中康)"); +// } +// } + $service = new SanFangCodeService(); + $result = $service->GetSanFangCode($code, $person_id, $qudao_type); + if ($result['status'] == true) { $data = [ - 'code_num' => $code->code, - 'status' => $code->status, - 'price' => $code->price, - 'combo_id' => $code->combo_id, - 'qudao_type' => $qudao_type, - ]; - return \Yz::Return(true, "查询成功", $data); + 'code_num' => $result['data']['code_num'], + 'status' => $result['data']['status'], + 'price' => $result['data']['price'], + 'combo_id' => $result['data']['combo_id'], + 'qudao_type' => $qudao_type, + ]; + return \Yz::Return(true, "查询成功", $data); + }else{ + return \Yz::echoError1($result['msg']); } } - //操作三方码 + //操作三方码(应该是无用) public function HeXiaoSanFangCode(Request $request) { $qudao_type = request('qudao_type');//1H5转赠码2有赞 diff --git a/Laravel/app/Http/Controllers/API/H5/ZhongKangController.php b/Laravel/app/Http/Controllers/API/H5/ZhongKangController.php new file mode 100644 index 0000000..61a842b --- /dev/null +++ b/Laravel/app/Http/Controllers/API/H5/ZhongKangController.php @@ -0,0 +1,27 @@ +GetHexiaoCode($code_num,$user_name,$user_id_number); + dd($service->HandleTransferCode($type,$code_num,$user_name,$user_id_number)); + } + + +} diff --git a/Laravel/app/Http/Controllers/API/Internal/TransferCodeController.php b/Laravel/app/Http/Controllers/API/Internal/TransferCodeController.php index 4ef3c53..6bc05ee 100644 --- a/Laravel/app/Http/Controllers/API/Internal/TransferCodeController.php +++ b/Laravel/app/Http/Controllers/API/Internal/TransferCodeController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\API\Internal; use App\Http\Controllers\Controller; +use App\Services\SanFangCodeService; +use App\Services\ZhongKangService; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -14,8 +16,22 @@ class TransferCodeController extends Controller $code_num = request('code_num'); $user_name = request('user_name'); $user_id_number = request('user_id_number'); - $code=DB::table('transfer_code')->where(['code'=>$code_num,'status'=>1,'is_del'=>0])->first(); - if(!$code) return \Yz::echoError1("此转赠码不可用"); + $qudao = request('qudao'); + + $code=DB::table('transfer_code'); + if(isset($qudao)){ + if($qudao==3){ + $service=new ZhongKangService(); + $res=$service->GetHexiaoCode($code_num,$user_name,$user_id_number); + if ($res['status'] == true && $res['data']['status'] == 1) { + }else{ + return \Yz::echoError1("此转赠码不可用。码号为:".$code_num."请核对后再试"); + } + } + $code=$code->where('sanfang_qudao',$qudao); + } + $code=$code->where(['code'=>$code_num,'status'=>1,'is_del'=>0])->first(); + if(!$code) return \Yz::echoError1("此转赠码不可用。码号为:".$code_num."请核对后再试"); $u=DB::table('transfer_code')->where(['code'=>$code_num])->update([ 'user_name'=>$user_name, 'user_id_number'=>$user_id_number, @@ -35,28 +51,42 @@ class TransferCodeController extends Controller { $validatedData = $request->validate([ 'type' => 'required', - 'code_num' => 'required' + 'code_num' => 'required', + 'qudao' => 'required' ]); $type = $validatedData['type']; //1使用2撤销使用 $code_num = $validatedData['code_num']; + $qudao = $validatedData['qudao']; $tj_num = request('tj_num'); + $code_info=DB::table('transfer_code')->where(['code'=>$code_num,'is_del'=>0,'sanfang_qudao'=>$qudao])->first(); + if(!$code_info) return \Yz::echoError1("此转赠码不存在"); $data=[]; $u=false; + $where=['code'=>$code_num,'is_del'=>0,'sanfang_qudao'=>$qudao]; if($type==1){ + $data=[ 'status'=>2, 'tj_num'=>isset($tj_num)?$tj_num:null, ]; - $u=DB::table('transfer_code')->where(['code'=>$code_num,'status'=>1,'is_del'=>0])->update($data); + $where['status']=1; } if($type==2){ $data=[ 'status'=>1, 'tj_num'=>null, ]; - $u=DB::table('transfer_code')->where(['code'=>$code_num,'status'=>2,'is_del'=>0])->update($data); + $where['status']=2; + } + if($qudao==3){ + $service=new ZhongKangService(); + $res=$service->HandleTransferCode($type,$code_num,$code_info->user_name,$code_info->user_id_number); + if (!$res['status']) { + return \Yz::echoError1( $res['msg']); + } } - $cha=DB::table('transfer_code')->where(['code'=>$code_num])->first(); + $u=DB::table('transfer_code')->where($where)->update($data); + $cha=DB::table('transfer_code')->where(['code'=>$code_num,'sanfang_qudao'=>$qudao])->first(); if($u){ return \Yz::Return(true,"操作成功",['code_num'=>$code_num,'status'=>$cha->status]); }else{ diff --git a/Laravel/app/Lib/Tools.php b/Laravel/app/Lib/Tools.php index 0428293..41262c3 100644 --- a/Laravel/app/Lib/Tools.php +++ b/Laravel/app/Lib/Tools.php @@ -3,8 +3,12 @@ namespace App\Lib; use DateTime; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Http\Exceptions\HttpResponseException; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Schema; class Tools { @@ -80,4 +84,72 @@ class Tools } return $randomString; } + + //请求三方接口日志记录 + public static $request; + public static function Post($url,$data,$mark,$big_title) + { + self::RequestLog($url, $data, $mark, $big_title); + $response = Http::post($url,$data); + if ($response->successful()) { + $res = $response->json(); + $res_string=json_encode($res, JSON_UNESCAPED_UNICODE); + $str_len = mb_strlen($res_string, 'utf-8'); + $str_size = $str_len / 1024; + $save_res = $res_string; + if ($str_size > 10) $save_res = '{"data":"Row size too large"}'; + self::$request->response_data = $save_res; + self::$request->save(); + return $res; + + } else { + $status = $response->status(); + // 获取响应体作为字符串 + $body = $response->body(); + + self::$request->response_data = $body; + self::$request->save(); + + throw new HttpResponseException(\Yz::echoError1("调用".$mark."接口失败:" . $status . "body:" . $body)); + } + } + + public static function RequestLog($url, $post_data, $mark, $code = 0) + { + self::CheckTableName(); + foreach ($post_data as $key => $post_datum) { + $str_len = mb_strlen(json_encode($post_datum, JSON_UNESCAPED_UNICODE), 'utf-8'); + $str_size = $str_len / 1024; + if ($str_size > 10) { + $post_data["$key"] = 'Row size too large'; + } + } + $post_data = json_encode($post_data, JSON_UNESCAPED_UNICODE); + self::$request->code = $code; + self::$request->mark = $mark; + self::$request->post_data = $post_data == '[]' ? '{}' : $post_data; + self::$request->request_url = $url; + self::$request->save(); + } + + public static function CheckTableName() + { + $table_name = 'zz_peis_log_' . date('ym'); + $table_count = DB::select('select count(1) as c from information_schema.TABLES where table_schema = ? and table_name = ?', [env('DB_DATABASE'), $table_name])[0]; + if ($table_count->c === 0) { + Schema::create($table_name, function (Blueprint $table) { + $table->id(); + $table->string('code', 50)->index(); + $table->string('mark', 50)->index(); + $table->text('post_data'); + $table->text('response_data')->nullable(); + $table->string('request_url', 2000); + $table->timestamps(); + }); + } + self::$request = new \App\Models\PEISLog(); + self::$request->setTable($table_name); + } + + } diff --git a/Laravel/app/Services/SanFangCodeService.php b/Laravel/app/Services/SanFangCodeService.php index f3d3d64..d33f366 100644 --- a/Laravel/app/Services/SanFangCodeService.php +++ b/Laravel/app/Services/SanFangCodeService.php @@ -1,4 +1,5 @@ where(['id' => $person_id, 'is_del' => 0])->first(); + if (!$person) return ['status' => false, 'msg' => '体检人不存在']; + $return_data = [ + 'code_num' => '', + 'price' => 0, + 'combo_id' => 0, + 'status' => 0, + ]; if ($qudao_type == 1) { - $u = false; + $code = DB::table('transfer_code')->where(['sanfang_qudao' => 1, 'code' => $code, 'status' => 1, 'is_del' => 0])->first(); + if (!$code) return ['status' => false, 'msg' => '此转赠码不可用']; + $return_data['code_num'] = $code->code; + $return_data['price'] = $code->price; + $return_data['combo_id'] = $code->combo_id; + $return_data['status'] = $code->status; + return ['status' => true, 'data' => $return_data]; + } + if ($qudao_type == 3) { + $service = new ZhongKangService(); + $res = $service->GetHexiaoCode($code, $person->name, $person->id_number); + if ($res['status'] == true && $res['data']['status'] == 1) { + $return_data['code_num'] = $res['data']['code_num']; + $return_data['price'] = $res['data']['price'] / 100; + $return_data['combo_id'] = $res['data']['combo_id']; + $return_data['status'] = $res['data']['status']; + //查询本地库是否有记录,进行相应的更新 + $db_zk_code = DB::table('transfer_code')->where(['sanfang_qudao' => 3, 'code' => $code, 'is_del' => 0])->first(); + if (!!$db_zk_code && $db_zk_code->status <> $res['data']['status']) { + return ['status' => false, 'msg' => '此转赠码状态不正确,暂不可用(中康)']; + } + if (!$db_zk_code) { + $data = [ + 'code' => $code, + 'price' => $res['data']['price'] / 100, + 'combo_id' => $res['data']['combo_id'], + 'sanfang_qudao' => 3, + 'status' => 1, + ]; + $u = DB::table('transfer_code')->insert($data); + } + return ['status' => true, 'data' => $return_data]; + } else { + return ['status' => false, 'msg' => '此转赠码不可用(中康)']; + } + } + } + + //核销三方code + public function HeXiaoSanFangCode($qudao_type, $code, $orderid) + { + $orderinfo = DB::table('orders')->where(['id' => $orderid])->first(); + $sanfang_status = false; + $u = false; + if ($qudao_type == 1) {//H5转赠码 + $sanfang_status=true; + } + if ($qudao_type == 2) { //有赞 + + } + if ($qudao_type == 3) { //中康 + $service = new ZhongKangService(); + $res = $service->HandleTransferCode(1, $code, $orderinfo->name, $orderinfo->id_number); + if ($res['status'] == true) { + $sanfang_status=true; + } else { + return ['status' => false,'msg' => $res['msg']]; + } + } + if($sanfang_status) { $data = [ 'status' => 2, 'pay_order_id' => $orderid, ]; - $u = DB::table('transfer_code')->where(['code' => $code, 'status' => 1, 'is_del' => 0])->update($data); - $data2=[ + $u = DB::table('transfer_code')->where(['sanfang_qudao' => $qudao_type, 'code' => $code, 'status' => 1, 'is_del' => 0])->update($data); + $data2 = [ 'qudao_type' => $qudao_type, 'code' => $code, ]; - DB::table('orders')->where(['id'=>$orderid])->update(['sanfang_code'=>json_encode($data2,JSON_UNESCAPED_UNICODE)]); + DB::table('orders')->where(['id' => $orderid])->update(['sanfang_code' => json_encode($data2, JSON_UNESCAPED_UNICODE)]); if ($u) { - return ['status'=>true,'msg'=>'操作成功']; + return ['status' => true, 'msg' => '操作成功']; } else { - return ['status'=>false,'msg'=>'核销失败']; + return ['status' => false, 'msg' => '核销失败']; } + }else{ + return ['status' => false,'msg' => '三方code核销失败']; } + } + //撤销核销 - public function CancelSanFangCode($qudao_type, $code,$orderid){ - if ($qudao_type == 1) { - $u = false; + public function CancelSanFangCode($qudao_type, $code, $orderid) + { + $orderinfo = DB::table('orders')->where(['id' => $orderid])->first(); + $sanfang_status = false; + $u = false; + if ($qudao_type == 1) {//H5转赠码 + $sanfang_status=true; + } + if ($qudao_type == 3) { //中康 + $service = new ZhongKangService(); + $res = $service->HandleTransferCode(2, $code, $orderinfo->name, $orderinfo->id_number); + if ($res['status'] == true) { + $sanfang_status=true; + } else { + return ['status' => false,'msg' => $res['msg']]; + } + } + if($sanfang_status) { $data = [ 'status' => 1, 'pay_order_id' => null, ]; $u = DB::table('transfer_code')->where(['code' => $code, 'status' => 2, 'is_del' => 0])->update($data); if ($u) { - return ['status'=>true,'msg'=>'操作成功']; + return ['status' => true, 'msg' => '操作成功']; } else { - return ['status'=>false,'msg'=>'撤销失败']; + return ['status' => false, 'msg' => '撤销失败']; } + }else{ + return ['status' => false,'msg' => '三方code撤销失败']; } + } } diff --git a/Laravel/app/Services/ZhongKangService.php b/Laravel/app/Services/ZhongKangService.php new file mode 100644 index 0000000..8801846 --- /dev/null +++ b/Laravel/app/Services/ZhongKangService.php @@ -0,0 +1,73 @@ +$code_num, + 'timestamp'=> round(microtime(true) * 1000), + ]; + $sign=$this->sign($data,$this->channelSecret); + $data['sign']=$sign; + $query_string = http_build_query($data); + $send_data=[ + 'code_num'=>$code_num, + 'user_name'=>$user_name, + 'user_id_number'=>$user_id_number, + ]; + $Tools=new Tools(); + return $Tools->Post($this->BaseUrl.'order/getVerifyCode?'.$query_string,$send_data,'查询核销码','中康'); + } + public function HandleTransferCode($type,$code_num,$user_name,$user_id_number){ + $data=[ + 'code_num'=>$code_num, + 'timestamp'=> round(microtime(true) * 1000), + ]; + $sign=$this->sign($data,$this->channelSecret); + $data['sign']=$sign; + $query_string = http_build_query($data); + $send_data=[ + 'type'=>$type, + 'code_num'=>$code_num, + 'user_name'=>$user_name, + 'user_id_number'=>$user_id_number, + ]; + $Tools=new Tools(); + return $Tools->Post($this->BaseUrl.'order/completeVerify?'.$query_string,$send_data,'操作核销码','中康'); + } + function sign($params, $channelSecret) { + // 移除可能存在的sign参数 + unset($params['sign']); + + // 对参数键名进行字典顺序排序 + ksort($params); + + // 拼接排序后的参数 + $paramStr = ''; + foreach ($params as $key => $value) { + if ($key != 'sign') { + $paramStr .= $key . $value; + } + } + + // 生成签名 + try { + $calcSign = hash_hmac('sha256', $paramStr, $channelSecret, false); + return strtoupper($calcSign); + } catch (Exception $ex) { + error_log("加密失败: " . $ex->getMessage()); + return ''; + } + } +} diff --git a/Laravel/routes/web.php b/Laravel/routes/web.php index 50cb26d..7b11630 100644 --- a/Laravel/routes/web.php +++ b/Laravel/routes/web.php @@ -90,6 +90,7 @@ Route::group(['middleware' => ['log'],'prefix' => 'api/H5'], function () { Route::post('/HeXiaoSanFangCode', 'App\Http\Controllers\API\H5\SanFangController@HeXiaoSanFangCode');//核销三方code Route::post('/GetHomeNotice', 'App\Http\Controllers\API\H5\HomeController@GetHomeNotice');//首页消息通知 Route::post('/GetPersonOrderList', 'App\Http\Controllers\API\H5\OrderController@GetPersonOrderList');//获取个人订单列表 + Route::post('/ZhongKangGetHexiaoCode', 'App\Http\Controllers\API\H5\ZhongKangController@GetHexiaoCode');//中康查询核销码