diff --git a/app/Request/PatientOrderRequest.php b/app/Request/PatientOrderRequest.php index e862d9a..1c6cace 100644 --- a/app/Request/PatientOrderRequest.php +++ b/app/Request/PatientOrderRequest.php @@ -20,7 +20,7 @@ class PatientOrderRequest extends FormRequest 'family_id',// 家庭成员id(就诊用户) ], 'getPatientOrderPayInfo' => [ // 获取患者订单支付数据 - "order_type", // 订单类型(1:问诊订单 2:药品订单 3:检测订单) + "order_type", // 订单类型(1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单) "order_no"// 订单编号 ], 'addPatientOrderPay' => [ // 模拟支付成功-金额为0时使用 @@ -75,7 +75,7 @@ class PatientOrderRequest extends FormRequest 'inquiry_status' => 'required|integer|min:0|max:4', - 'order_type' => 'required|integer|min:1|max:3', + 'order_type' => 'required|integer|min:1|max:5', 'order_no' => 'required', 'order_prescription_id' => 'required', diff --git a/app/Services/PatientOrderService.php b/app/Services/PatientOrderService.php index aaace47..b989aa6 100644 --- a/app/Services/PatientOrderService.php +++ b/app/Services/PatientOrderService.php @@ -28,6 +28,7 @@ use App\Model\OrderProduct; use App\Model\OrderProductCoupon; use App\Model\OrderProductItem; use App\Model\OrderProductLogistic; +use App\Model\OrderServicePackage; use App\Model\PatientFamily; use App\Model\PatientFamilyHealth; use App\Model\PatientFamilyPersonal; @@ -770,8 +771,8 @@ class PatientOrderService extends BaseService $result['pay_config'] = []; // 小程序支付配置 $result['cannot_use_coupon_reason'] = ""; // 不可使用优惠卷原因 + // 问诊订单 if ($order_type == 1) { - // 问诊订单 $params = array(); $params['inquiry_no'] = $order_no; $params['patient_id'] = $user_info['client_user_id']; @@ -784,6 +785,7 @@ class PatientOrderService extends BaseService if ($order_inquiry['inquiry_status'] != 1) { $return_result['message'] = "订单状态错误"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_id'] = $order_inquiry['order_inquiry_id']; $return_result['data']['order_status'] = $order_inquiry['inquiry_status']; $return_result['data']['order_pay_status'] = $order_inquiry['inquiry_pay_status']; @@ -794,6 +796,7 @@ class PatientOrderService extends BaseService if ($order_inquiry['inquiry_pay_status'] != 1) { $return_result['message'] = "订单支付状态错误"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_id'] = $order_inquiry['order_inquiry_id']; $return_result['data']['order_status'] = $order_inquiry['inquiry_status']; $return_result['data']['order_pay_status'] = $order_inquiry['inquiry_pay_status']; @@ -805,6 +808,7 @@ class PatientOrderService extends BaseService if ($diff_time >= 30) { $return_result['message'] = "订单已过期"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_id'] = $order_inquiry['order_inquiry_id']; $return_result['data']['order_status'] = $order_inquiry['inquiry_status']; $return_result['data']['order_pay_status'] = $order_inquiry['inquiry_pay_status']; @@ -835,8 +839,10 @@ class PatientOrderService extends BaseService // 获取小程序支付配置 $pay_config = $WechatPay->getAppletsPayConfig($prepay['prepay_id']); } - } elseif ($order_type == 2) { - // 药品订单 + } + + // 药品订单 + if ($order_type == 2) { $params = array(); $params['order_product_no'] = $order_no; $params['patient_id'] = $user_info['client_user_id']; @@ -849,6 +855,7 @@ class PatientOrderService extends BaseService if ($order_product['order_product_status'] != 1) { $return_result['message'] = "订单状态错误"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_id'] = $order_product['order_product_id']; $return_result['data']['order_status'] = $order_product['order_product_status']; $return_result['data']['order_pay_status'] = $order_product['pay_status']; @@ -859,6 +866,7 @@ class PatientOrderService extends BaseService if ($order_product['pay_status'] != 1) { $return_result['message'] = "订单支付状态错误"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_product_id'] = $order_product['order_product_id']; $return_result['data']['order_product_status'] = $order_product['order_product_status']; $return_result['data']['order_pay_status'] = $order_product['pay_status']; @@ -870,6 +878,7 @@ class PatientOrderService extends BaseService if ($diff_time >= 30) { $return_result['message'] = "订单已过期"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_product_id'] = $order_product['order_product_id']; $return_result['data']['order_product_status'] = $order_product['order_product_status']; $return_result['data']['order_pay_status'] = $order_product['pay_status']; @@ -896,6 +905,7 @@ class PatientOrderService extends BaseService if (empty($order_prescription_products)) { $return_result['message'] = "优惠卷数据错误"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_product_id'] = $order_product['order_product_id']; $return_result['data']['order_product_status'] = $order_product['order_product_status']; $return_result['data']['order_pay_status'] = $order_product['pay_status']; @@ -909,6 +919,7 @@ class PatientOrderService extends BaseService if (empty($product)) { $return_result['message'] = "优惠卷数据错误"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_product_id'] = $order_product['order_product_id']; $return_result['data']['order_product_status'] = $order_product['order_product_status']; $return_result['data']['order_pay_status'] = $order_product['pay_status']; @@ -943,8 +954,10 @@ class PatientOrderService extends BaseService // 获取小程序支付配置 $pay_config = $WechatPay->getAppletsPayConfig($prepay['prepay_id']); } - } elseif ($order_type == 3) { - // 检测订单 + } + + // 检测订单 + if ($order_type == 3) { // 获取检测订单数据 $params = array(); $params['detection_no'] = $order_no; @@ -958,6 +971,7 @@ class PatientOrderService extends BaseService if ($order_detection['detection_status'] != 1) { $return_result['message'] = "订单状态错误"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_id'] = $order_detection['order_detection_id']; $return_result['data']['order_status'] = $order_detection['detection_status']; $return_result['data']['order_pay_status'] = $order_detection['detection_pay_status']; @@ -968,6 +982,7 @@ class PatientOrderService extends BaseService if ($order_detection['detection_pay_status'] != 1) { $return_result['message'] = "订单支付状态错误"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_id'] = $order_detection['order_detection_id']; $return_result['data']['order_status'] = $order_detection['detection_status']; $return_result['data']['order_pay_status'] = $order_detection['detection_pay_status']; @@ -979,6 +994,7 @@ class PatientOrderService extends BaseService if ($diff_time >= 30) { $return_result['message'] = "订单已过期"; $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; $return_result['data']['order_id'] = $order_detection['order_detection_id']; $return_result['data']['order_status'] = $order_detection['detection_status']; $return_result['data']['order_pay_status'] = $order_detection['detection_pay_status']; @@ -1007,8 +1023,75 @@ class PatientOrderService extends BaseService $pay_config = $WechatPay->getAppletsPayConfig($prepay['prepay_id']); } - } else { - return fail(); + } + + // 服务包订单 + if ($order_type == 4 || $order_type == 5) { + // 获取检测订单数据 + $params = array(); + $params['order_service_no'] = $order_no; + $params['patient_id'] = $user_info['client_user_id']; + $order_service_package = OrderServicePackage::getOne($params); + if (empty($order_service_package)) { + return fail(HttpEnumCode::HTTP_ERROR, "非法订单"); + } + + // 验证订单状态 + if ($order_service_package['order_service_status'] != 1) { + $return_result['message'] = "订单状态错误"; + $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; + $return_result['data']['order_id'] = $order_service_package['order_service_id']; + $return_result['data']['order_status'] = $order_service_package['order_service_status']; + $return_result['data']['order_pay_status'] = $order_service_package['pay_status']; + return success($return_result); + } + + // 验证订单支付状态 + if ($order_detection['pay_status'] != 1) { + $return_result['message'] = "订单支付状态错误"; + $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; + $return_result['data']['order_id'] = $order_service_package['order_service_id']; + $return_result['data']['order_status'] = $order_service_package['order_service_status']; + $return_result['data']['order_pay_status'] = $order_service_package['pay_status']; + return success($return_result); + } + + // 验证订单过期支付时间 + $diff_time = (strtotime($order_service_package['created_at']) - time()) / 60; + if ($diff_time >= 30) { + $return_result['message'] = "订单已过期"; + $return_result['data'] = $result; + $return_result['data']['order_no'] = $order_no; + $return_result['data']['order_id'] = $order_service_package['order_service_id']; + $return_result['data']['order_status'] = $order_service_package['order_service_status']; + $return_result['data']['order_pay_status'] = $order_service_package['pay_status']; + return success($return_result); + } + + $result['order_id'] = $order_service_package['order_service_id']; + $result['created_at'] = $order_service_package['created_at']; + + // 获取订单金额 + $result['amount_total'] = $order_service_package['amount_total']; // 订单金额 + $result['payment_amount_total'] = $order_service_package['amount_total'] - 0; // 实际订单金额 + $result['coupon_amount_total'] = 0; // 优惠金额 + + if ($order_service_package['payment_amount_total'] > 0) { + // 发起支付 + $WechatPay = new WechatPay(1, 3); + + // 获取预支付交易会话标识 + $prepay = $WechatPay->getJsapiPrepayId($order_no, (int)round($order_service_package['payment_amount_total'] * 100), $user_info['open_id'], "检测服务"); + if (empty($prepay)) { + return fail(HttpEnumCode::SERVER_ERROR); + } + + // 获取小程序支付配置 + $pay_config = $WechatPay->getAppletsPayConfig($prepay['prepay_id']); + } + } $result['pay_config'] = $pay_config ?? []; diff --git a/config/config.php b/config/config.php index 0d539ff..9fb07ba 100644 --- a/config/config.php +++ b/config/config.php @@ -48,6 +48,8 @@ return [ "product_refund_notify_url" => env('PATIENT_WECHAT_PRODUCT_REFUND_NOTIFY_URL', 'callback/wxpay/product/refund'), "detection_pay_notify_url" => env('PATIENT_WECHAT_DETECTION_PAY_NOTIFY_URL', 'callback/wxpay/detection/success'), "detection_refund_notify_url" => env('PATIENT_WECHAT_DETECTION_REFUND_NOTIFY_URL', 'callback/wxpay/detection/refund'), + "service_pay_notify_url" => env('PATIENT_WECHAT_SERVICE_PAY_NOTIFY_URL', 'callback/wxpay/service/success'), + "service_refund_notify_url" => env('PATIENT_WECHAT_SERVICE_REFUND_NOTIFY_URL', 'callback/wxpay/service/refund'), ], "pharmacist" => [ "app_id" => env('DOCTOR_WECHAT_APP_ID', 'wxc83296720404aa7b'), diff --git a/extend/Wechat/WechatPay.php b/extend/Wechat/WechatPay.php index e752a49..91dc71a 100644 --- a/extend/Wechat/WechatPay.php +++ b/extend/Wechat/WechatPay.php @@ -28,7 +28,7 @@ class WechatPay /** * @param string $user_type 用户类型(1:患者端 2:专家端 3:药师端) - * @param int $order_type 订单类型(1:问诊订单 2:药品订单 3:检测订单) + * @param int $order_type 订单类型(1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单) */ public function __construct(string $user_type,int $order_type) { @@ -44,7 +44,7 @@ class WechatPay throw new BusinessException("系统配置错误", HttpEnumCode::SERVER_ERROR); } - if (!in_array($order_type,[1,2,3])){ + if (!in_array($order_type,[1,2,3,4,5])){ throw new BusinessException("订单类型错误", HttpEnumCode::SERVER_ERROR); } @@ -69,6 +69,13 @@ class WechatPay $this->pay_config = config("we_chat.applets.pay.1636644248"); } + if ($order_type == 4 || $order_type == 5){ + $this->pay_notify_url = $this->config['service_pay_notify_url']; + $this->refund_notify_url = $this->config['service_refund_notify_url']; + + $this->pay_config = config("we_chat.applets.pay.1659662936"); + } + $app_env = config('app_env','dev'); if ($app_env == "prod"){ $this->domain_name = env('DOMAIN_NAME_PROD','https://prod.hospital.applets.igandanyiyuan.com/');