From a1b0d6556cabc224122a517fd56e5f2e9a2aa992 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Tue, 1 Aug 2023 11:18:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BE=AE=E4=BF=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E7=B1=BB=EF=BC=8C=E6=96=B0=E5=A2=9E=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=8E=B7=E5=8F=96=E6=94=AF=E4=BB=98=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Services/PatientOrderService.php | 96 +++++++++++++++++++++++----- config/config.php | 2 + extend/Wechat/WechatPay.php | 14 ++-- 3 files changed, 91 insertions(+), 21 deletions(-) diff --git a/app/Services/PatientOrderService.php b/app/Services/PatientOrderService.php index b89c71a..4b9aef4 100644 --- a/app/Services/PatientOrderService.php +++ b/app/Services/PatientOrderService.php @@ -8,6 +8,7 @@ use App\Constants\DoctorTitleCode; use App\Constants\HttpEnumCode; use App\Model\BasicLogisticsCompany; use App\Model\Hospital; +use App\Model\OrderDetection; use App\Model\OrderInquiry; use App\Model\OrderInquiryCase; use App\Model\OrderInquiryCoupon; @@ -683,7 +684,7 @@ class PatientOrderService extends BaseService $result['order_no'] = $order_no; // 订单编号 $result['order_id'] = ""; // 订单主键id(问诊订单:order_inquiry_id 药品订单:order_product_id) $result['created_at'] = ""; // 创建时间 - $result['inquiry_type'] = 0; // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) + $result['inquiry_type'] = 0; // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测) $result['pay_config'] = []; // 小程序支付配置 if ($order_type == 1) { @@ -699,17 +700,18 @@ class PatientOrderService extends BaseService // 验证订单状态 if ($order_inquiry['inquiry_status'] != 1) { $return_result['message'] = "订单状态错误"; - $return_result['data']['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; - $return_result['data']['inquiry_status'] = $order_inquiry['inquiry_status']; - $return_result['data']['inquiry_pay_status'] = $order_inquiry['inquiry_pay_status']; + $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']; + return success($return_result); } // 验证订单支付状态 if ($order_inquiry['inquiry_pay_status'] != 1) { $return_result['message'] = "订单支付状态错误"; - $return_result['data']['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; - $return_result['data']['inquiry_status'] = $order_inquiry['inquiry_status']; - $return_result['data']['inquiry_pay_status'] = $order_inquiry['inquiry_pay_status']; + $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']; return success($return_result); } @@ -717,9 +719,9 @@ class PatientOrderService extends BaseService $diff_time = (strtotime($order_inquiry['created_at']) - time()) / 60; if ($diff_time >= 30){ $return_result['message'] = "订单已过期"; - $return_result['data']['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; - $return_result['data']['inquiry_status'] = $order_inquiry['inquiry_status']; - $return_result['data']['inquiry_pay_status'] = $order_inquiry['inquiry_pay_status']; + $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']; return success($return_result); } @@ -738,7 +740,7 @@ class PatientOrderService extends BaseService // 获取预支付交易会话标识 - $prepay = $WechatPay->getJsapiPrepayId($order_no, (int)round($order_inquiry['payment_amount_total'] * 100), $user_info['open_id']); + $prepay = $WechatPay->getJsapiPrepayId($order_no, (int)round($order_inquiry['payment_amount_total'] * 100), $user_info['open_id'],"问诊服务"); if (empty($prepay)) { return fail(HttpEnumCode::SERVER_ERROR); } @@ -759,9 +761,9 @@ class PatientOrderService extends BaseService // 验证订单状态 if ($order_product['order_product_status'] != 1) { $return_result['message'] = "订单状态错误"; - $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']['pay_status'] = $order_product['pay_status']; + $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']; return success($return_result); } @@ -770,7 +772,7 @@ class PatientOrderService extends BaseService $return_result['message'] = "订单支付状态错误"; $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']['pay_status'] = $order_product['pay_status']; + $return_result['data']['order_pay_status'] = $order_product['pay_status']; return success($return_result); } @@ -780,7 +782,7 @@ class PatientOrderService extends BaseService $return_result['message'] = "订单已过期"; $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']['pay_status'] = $order_product['pay_status']; + $return_result['data']['order_pay_status'] = $order_product['pay_status']; return success($return_result); } @@ -797,7 +799,67 @@ class PatientOrderService extends BaseService $WechatPay = new WechatPay(1,2); // 获取预支付交易会话标识 - $prepay = $WechatPay->getJsapiPrepayId($order_no, (int)round($order_product['payment_amount_total'] * 100), $user_info['open_id']); + $prepay = $WechatPay->getJsapiPrepayId($order_no, (int)round($order_product['payment_amount_total'] * 100), $user_info['open_id'],"问诊服务"); + if (empty($prepay)) { + return fail(HttpEnumCode::SERVER_ERROR); + } + + // 获取小程序支付配置 + $pay_config = $WechatPay->getAppletsPayConfig($prepay['prepay_id']); + } + } elseif ($order_type == 3) { + // 检测订单 + // 获取检测订单数据 + $params = array(); + $params['detection_no'] = $order_no; + $params['patient_id'] = $user_info['client_user_id']; + $order_detection = OrderDetection::getOne($params); + if (empty($order_detection)) { + return fail(HttpEnumCode::HTTP_ERROR, "非法订单"); + } + + // 验证订单状态 + if ($order_detection['detection_status'] != 1) { + $return_result['message'] = "订单状态错误"; + $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']; + return success($return_result); + } + + // 验证订单支付状态 + if ($order_detection['inquiry_pay_status'] != 1) { + $return_result['message'] = "订单支付状态错误"; + $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']; + return success($return_result); + } + + // 验证订单过期支付时间 + $diff_time = (strtotime($order_detection['created_at']) - time()) / 60; + if ($diff_time >= 30){ + $return_result['message'] = "订单已过期"; + $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']; + return success($return_result); + } + + $result['order_id'] = $order_detection['order_detection_id']; + $result['created_at'] = $order_detection['created_at']; + + // 获取订单金额 + $result['amount_total'] = $order_detection['amount_total']; // 订单金额 + $result['payment_amount_total'] = $order_detection['amount_total']; // 实际订单金额 + $result['coupon_amount_total'] = 0; // 优惠金额 + + if ($order_detection['payment_amount_total'] > 0 ){ + // 发起支付 + $WechatPay = new WechatPay(1,3); + + // 获取预支付交易会话标识 + $prepay = $WechatPay->getJsapiPrepayId($order_no, (int)round($order_detection['payment_amount_total'] * 100), $user_info['open_id'],"检测服务"); if (empty($prepay)) { return fail(HttpEnumCode::SERVER_ERROR); } diff --git a/config/config.php b/config/config.php index 8b0ae64..f412388 100644 --- a/config/config.php +++ b/config/config.php @@ -46,6 +46,8 @@ return [ "inquiry_refund_notify_url" => env('PATIENT_WECHAT_INQUIRY_REFUND_NOTIFY_URL', 'callback/wxpay/inquiry/refund'), "product_pay_notify_url" => env('PATIENT_WECHAT_PRODUCT_PAY_NOTIFY_URL', 'callback/wxpay/product/success'), "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'), ], "pharmacist" => [ "app_id" => env('DOCTOR_WECHAT_APP_ID', 'wxc83296720404aa7b'), diff --git a/extend/Wechat/WechatPay.php b/extend/Wechat/WechatPay.php index 0cea2a6..897f07d 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:药品订单) + * @param int $order_type 订单类型(1:问诊订单 2:药品订单 3:检测订单) */ public function __construct(string $user_type,int $order_type) { @@ -46,7 +46,7 @@ class WechatPay throw new BusinessException("系统配置错误", HttpEnumCode::SERVER_ERROR); } - if (!in_array($order_type,[1,2])){ + if (!in_array($order_type,[1,2,3])){ throw new BusinessException("订单类型错误", HttpEnumCode::SERVER_ERROR); } @@ -60,6 +60,11 @@ class WechatPay $this->refund_notify_url = $this->config['product_refund_notify_url']; } + if ($order_type == 3){ + $this->pay_notify_url = $this->config['detection_pay_notify_url']; + $this->refund_notify_url = $this->config['detection_refund_notify_url']; + } + $app_env = config('app_env','dev'); if ($app_env == "prod"){ $this->domain_name = env('DOMAIN_NAME_PROD','https://prod.hospital.applets.igandanyiyuan.com/'); @@ -122,11 +127,12 @@ class WechatPay * @param string $out_trade_no 商户系统内部订单号 * @param int $total 支付金额(实际金额x100) * @param string $openid + * @param string $description 备注 * @return array * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ - public function getJsapiPrepayId(string $out_trade_no,int $total,string $openid): array + public function getJsapiPrepayId(string $out_trade_no,int $total,string $openid,string $description): array { $app = $this->createApp(); @@ -134,7 +140,7 @@ class WechatPay "mchid" => $this->pay_config['mch_id'], // <---- 商户号 "out_trade_no" => $out_trade_no, // 商户系统内部订单号 "appid" => $this->config['app_id'], - "description" => "问诊服务", + "description" => $description, "notify_url" => $this->domain_name . $this->pay_notify_url, "amount" => [ "total" => $total,//订单总金额,单位为分。