where([ // 'user_id' => \Yii::$app->user->identity->id, 'id' => $register_id ])->one(); if (!$Register || $Register->is_cancel==1) { throw new Exception('订单不存在'); } if ($Register->status == 2 || $Register->status == 3 || $Register->status == 5 || $Register->status == 6) { throw new Exception('医生接诊后不能取消挂号!!'); } switch ($Register->is_pay) { case 0://未支付 $t = \Yii::$app->db->beginTransaction(); try { $Register->status = RegisterEnum::CANCEL; $Register->is_cancel = 1; $Register->cancel_time = time(); $Register->cancel_remark = '您已主动取消订单'; $Register->created_at = time(); $Register->updated_at = time(); $Register->saveOrFail(); //生成系统消息 $SystemNotice = new SystemNotice(); $SystemNotice->content = '您已主动取消订单'; $SystemNotice->base_type = SystemNoticeTypeEnum::ORDER_CANCEL; $SystemNotice->scene_type = 1;//用户端 $SystemNotice->user_id = \Yii::$app->user->identity->getId(); $SystemNotice->notice_at = date('Y-m-d H:i:s', time()); $SystemNotice->saveOrFail(); //分账状态更新 $ledgerForm = new LedgerForm(); $ledgerForm->order_id = $Register->id; $ledgerForm->status = 2; $ledgerForm->update('register'); // $event = new RegisterEvent([ // 'register' => $Register, // ]); // \Yii::$app->trigger(Register::EVENT_CANCELED, $event); $t->commit(); return []; } catch (\Exception $exception) { $t->rollBack(); throw $exception; } break; case 1://已支付 $t = \Yii::$app->db->beginTransaction(); try { //生成记录 $RegisterRefund = new RegisterRefund(); $RegisterRefund->user_id = $Register->user_id; $RegisterRefund->register_id = $Register->id; $RegisterRefund->refund_no = FuncHelper::generate_order_no('RF'); $RegisterRefund->refund_price = $Register->price; $RegisterRefund->remark = '主动取消订单'; $RegisterRefund->saveOrFail(); //取消状态 $Register->is_cancel = 1; $Register->cancel_time = time(); $Register->cancel_remark = '您已主动取消订单'; //退款状态 $Register->refund_status = 1; $Register->refund_time = time(); $Register->status = RegisterEnum::CANCEL; $Register->created_at = time(); $Register->updated_at = time(); $Register->saveOrFail(); //生成系统消息 $SystemNotice = new SystemNotice(); $SystemNotice->content = '您已主动取消订单'; $SystemNotice->base_type = SystemNoticeTypeEnum::ORDER_CANCEL; $SystemNotice->scene_type = 1;//用户端 $SystemNotice->user_id = \Yii::$app->user->identity->getId(); $SystemNotice->notice_at = date('Y-m-d H:i:s', time()); $SystemNotice->saveOrFail(); //退款操作 $this->refundMoney($RegisterRefund); //可能报错 无效的订单号 $t->commit(); } catch (Exception $exception) { $t->rollBack(); throw $exception; } break; } } public function refundMoney($RegisterRefund) { $orderNo = $RegisterRefund->register->order_no; $Register = Register::findOne([ 'order_no' => $orderNo, 'is_pay' => 1 ]); $PaymentRegister = PaymentRegister::findOne([ 'order_no' => $orderNo, 'is_pay' => 1 ]); // return [$PaymentRegister->transaction_id]; if (!$Register || !$PaymentRegister) { throw new Exception('无效的订单号'); } $price = $RegisterRefund->refund_price; if (bccomp($PaymentRegister->amount, $price, 2) == -1) { throw new Exception('退款金额大于可退款金额'); } $transaction = \Yii::$app->db->beginTransaction(); try { $PaymentRegisterRefund = new PaymentRegisterRefund(); $PaymentRegisterRefund->refund_no = $RegisterRefund->refund_no; $PaymentRegisterRefund->amount = $price; $PaymentRegisterRefund->is_pay = 0; $PaymentRegisterRefund->pay_type = 0; $PaymentRegisterRefund->created_at = time(); $PaymentRegisterRefund->saveOrFail(); if (bccomp($price, 0, 2) <= 0) { $PaymentRegisterRefund->is_pay = 1; $PaymentRegisterRefund->save(); $RegisterRefund->is_refund = 1; $RegisterRefund->refund_time = time(); $RegisterRefund->save(); } else { switch ($PaymentRegister->pay_type) { case 1://微信退款 if (\Yii::$app instanceof \yii\web\Application) { $notifyUrl = \Yii::$app->request->hostInfo . "/member/v1/callback/refund-notify/"; } else { //如果是job中调用的 $notifyUrl = \Yii::$app->getHostInfo() . "/member/v1/callback/refund-notify/"; } $order_amount = bcmul($PaymentRegister->amount, 100, 0); $refund_amount = bcmul($price, 100, 0); $result = WechatService::getInstance()->payment->refund->byTransactionId($PaymentRegister->transaction_id, $PaymentRegisterRefund->refund_no, $order_amount, $refund_amount, [ 'refund_desc' => '订单申请退款', 'notify_url' => $notifyUrl ]); if ($result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS') { $error = isset($result['err_code_des']) ? $result['err_code_des'] : $result['return_msg']; throw new Exception($error); } break; case 2://易票联退款 $eplResult = EplPayService::getInstance()->refund([ 'refund_no' => $PaymentRegisterRefund->refund_no, 'transaction_id' => $PaymentRegister->transaction_id, 'total_pay_price' => $PaymentRegister->amount, 'refund_price' => $price, ]); if (!isset($eplResult['returnCode']) || $eplResult['returnCode'] != '0000') { throw new Exception($eplResult['returnMsg']); } break; default: throw new Exception('退款失败,请联系客服'); break; } //其他状态变更在回调 } $transaction->commit(); return []; } catch (\Exception $exception) { $transaction->rollBack(); throw $exception; } } }