where(['order_number' => $order_num])->first(); if (!$order) return \Yz::echoError1("订单不存在"); if ($status == 'SUCCESS') { $u = DB::table('orders')->where(['order_number' => $order_num])->update([ 'status' => 2 ]); if ($u) { return \Yz::Return(true, "更新成功", ['order_num' => $order_num]); } } } //对参数进行签名,返回前端需要的参数,前端携带参数跳转小程序支付 public function StartPay() { $openid = request('openid'); $id = request('id'); if(!isset($id)) return \Yz::echoError1("id不能为空"); $orderInfo = DB::table('orders')->where(['id' => $id,])->first(); if (!$orderInfo) return \Yz::echoError1("未找到有效订单"); if ($orderInfo->status !== 1) return \Yz::echoError1("订单不是待支付状态不能支付。当前状态:" . $orderInfo->status); $personInfo = DB::table('web_user_person')->where(['id' => $orderInfo->person_id, 'is_del' => 0])->first(); if (!$personInfo) return \Yz::echoError1("就诊人异常"); $sub_org_code = 0; //小程序端医院代码 if ($orderInfo->hospital_id == 1) { $sub_org_code = 6; } if ($orderInfo->hospital_id == 2) { $sub_org_code = 2; } if ($sub_org_code == 0) return \Yz::echoError1("医院id异常"); //每次支付前更新订单号为1个新订单号码 $randomPart = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 6); $new_ordernumber=substr($orderInfo->order_number, 0, -6); $new_ordernumber=$new_ordernumber.$randomPart; $u=DB::table('orders')->where(['id' => $id,])->update(['order_number'=>$new_ordernumber]); if(!$u) return \Yz::echoError1("更新订单号失败"); $XCXApi = new XCXApiController(); $params = [ 'appid' => $XCXApi::$appid, 'sub_org_code' => $sub_org_code, 'ghzid' => $personInfo->ghzid, 'orderid' => $new_ordernumber, 'order_desc' => $orderInfo->title, 'amount' => (int)($orderInfo->true_price * 100), 'notify_url' => config('app.globals.PayNotifyUrl') ]; $nonce = self::nonce(); $timestamp = (string)time(); //签名 $pay_path = "/jeecg-boot/hospital/openapi/order/create"; $base64Signature = $XCXApi::Sign($pay_path, $params, $nonce, $timestamp, true); $params['timestamp'] = $timestamp; $params['nonce'] = $nonce; $params['signature'] = $base64Signature; return \Yz::Return(true, "操作完成", ['info' => $params]); } //订单支付查询 public function CheckPay() { $openid = request('openid'); $order_number = request('order_number'); $XCX = new XCXApiController(); $res = $XCX::Post('订单查询', ['orderid' => $order_number]); //判断如果支付成功,更改订单状态 if ($res['data']['trade_state'] === 'SUCCESS') { $order = DB::table('orders')->where(['order_number' => $order_number])->first(); DB::table('orders')->where(['id' => $order->id])->update([ 'status' => 2, 'pay_time' => date('Y-m-d H:i:s'), ]); $Finish = new OrderController();//预约体检 $Finish->Finish($order_number); return \Yz::Return(true, "支付成功", ['id' => $order->id]); } else { return \Yz::echoError1("支付失败" . $res['data']['trade_state']); } } //退款 public function Refund() { //先调用思信取消,恢复号源,然后再退款 //判断订单状态是否是已经支付,判断是否到检, $openid = request('openid'); $id = request('id'); $orderInfo = DB::table('orders')->where(['id' => $id])->first(); if (!$orderInfo) return \Yz::echoError1("未找到有效订单"); if ($orderInfo->status !== 2) return \Yz::echoError1("订单状态异常。当前状态:" . $orderInfo->status); if ($orderInfo->check_status == 2) return \Yz::echoError1("已登记体检,禁止退款"); $person=DB::table('web_user_person')->where(['id' => $orderInfo->person_id])->first(); if(!$person) return \Yz::echoError1("用户不存在"); //调用思信取消,恢复号源 $ap = new OrderController(); $cancel = $ap->cancel_appointment($orderInfo->hospital_id, [ 'type' => $orderInfo->type, '预约Id' => $orderInfo->appointment_number ]); if ($cancel['code'] != 0) return \Yz::echoError1("取消预约失败," . $cancel['message']); //如果真实支付大于0 则调用小程序退款 if ($orderInfo->true_price > 0) { $data = [ 'orderid' => $orderInfo->order_number, 'refund_order_id' => 'T' . $orderInfo->order_number, 'refund_amount' => (int)($orderInfo->true_price * 100), 'refund_reason' => "体检H5订单退款", ]; $XCX = new XCXApiController(); $res = $XCX::Post('订单退款', $data); if ($res['data']['refund_state'] != 'SUCCESS') { return \Yz::echoError1("退款失败" . $res['data']['refund_state']); } } $now_datetime=date('Y-m-d H:i:s'); //调用接口恢复积分和预存款 $env=config('app.globals.Env'); $AspNet=new AspNetZhuanController(); $jifen_huifu_status=true; $yucunkuan_huifu_status=true; $yyid=$orderInfo->hospital_id; if($yyid==1) $yyid=6; if($env=='pro') { //如果是正式环境 if($orderInfo->jifen>0 and $orderInfo->is_refund_jifen==0) { $jifen_huifu_status=false; $jifen_huifu_status= $AspNet::UseJiFen($person->ghzid,$orderInfo->jifen,$yyid,$orderInfo->id,'tj_h5','抵扣体检H5订单',$now_datetime); if( $jifen_huifu_status===true){ DB::table('orders')->where('id',$orderInfo->id)->update(['is_refund_jifen'=>1]); } } if($orderInfo->yucunkuan>0 and $orderInfo->is_refund_yucunkuan==0) { $yucunkuan_huifu_status=false; $yucunkuan_huifu_status= $AspNet::UseYuCunKuan($person->ghzid,$orderInfo->yucunkuan,$yyid,0,$orderInfo->id,'tj_h5','抵扣体检H5订单',$now_datetime); if($yucunkuan_huifu_status===true){ DB::table('orders')->where('id',$orderInfo->id)->update(['is_refund_yucunkuan'=>1]); } } } DB::table('orders')->where(['id' => $id])->update([ 'status' => 5 ]); //恢复号源 $up_plan = DB::table('plans')->where(['id' => $orderInfo->plan_id, 'status' => 2])->update([ 'status' => 1 ]); return \Yz::Return(true, "退款成功", []); } public static function nonce($l = 16) { $charts = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz0123456789"; $max = strlen($charts) - 1; $noncestr = ""; for ($i = 0; $i < $l; $i++) { $noncestr .= $charts[rand(0, $max)]; } return $noncestr; } }