db->beginTransaction(); try { //获取订单数据 $order = AddonsCourseOrders::getOne([ ['mall_id' => $params['mall_id']], ['id' => $params['order_id']], ['refund_status' => 1], ]); if (empty($order)) throw new Exception('查无此退单订单数据'); if ($order['pay_type'] > 0 && $params['refund_price'] > 0) { //获取trade_order数据 $trade_order = PaymentTradeOrder::getOne([ ['order_type' => 'Course'], ['order_no' => $order['order_no']], ], true, [], 'id desc'); if (empty($trade_order)) throw new Exception('查无此退单订单数据'); //查找流水单号 $payment_trade = PaymentTrade::findOne([ 'id' => $trade_order['trade_id'], 'mall_id' => $params['mall_id'], 'is_pay' => StatusEnum::ENABLED ]); if (empty($payment_trade)) throw new Exception('未查询到支付记录'); //组合支付生成流水支付退款数据 $mallOrder = new Order(); $mallOrder->mall_id = $params['mall_id']; //实例化售后信息 $refund = new OrderRefund(); $refund->mall_id = $params['mall_id']; $refund->id = $order->id; $refund->order_id = $order->id; $refund->order_no = $order->order_no; $refund->refund_price = $params['refund_price']; $refund->reality_refund_price = $params['refund_price']; $insert_wallet = []; $condition = [ 'where'=>[ ['source_table' => [AddonsCourseOrders::tableName(), '%addons_course_orders']], ['source_table_id' => $params['order_id']], ['mall_id' => $params['mall_id']], ], ]; $data = [ 'condition' => $condition, 'params' => $params ]; $insert_wallet = self::getOrderCommissionData($insert_wallet, $data, 'commission', $order); $payment_trade->addRefundItem($refund, $mallOrder, CourseEnum::ADDONS_NAME); //系统、第三方支付方式支付 $list = $payment_trade->getRefundFeeList($order->id, CourseEnum::ADDONS_NAME); foreach ($list as $item) { if (in_array($item->pay_type, [PayTypeEnum::BALANCE, PayTypeEnum::SCORE, PayTypeEnum::JOINPAY, PayTypeEnum::ALI, PayTypeEnum::JOINPAY_FAST_PAY, PayTypeEnum::WECHAT, PayTypeEnum::SANDPAY_FAST_PAY])) { $refund_price = $item->getRefundFee($params, $refund); // 退款金额需要大于0 组合支付金额过小的情况下 分配子订单退款金额可能为0 if ($refund_price > 0) { //原路返回 $originUserId = $order->user_id; // $order->user_id = $orderUserId; $res = \Yii::$app->services->pay->refund( $refund->refund_price, $refund_price, $payment_trade->out_trade_no, $order, '课程订单主动退款', UserWalletEnum::REFUND, UserWalletEnum::REFUND_ORDER, $item->pay_type ); $order->user_id = $originUserId; if ($res === false) throw new \Exception('退款失败'); } } elseif ( // 当res返回为false 说明没有相对于的退款方式 $res = GlobalInvoke::exec(GlobalInvoke::INVOKE_ORDER_REFUND, $params['mall_id'], [ 'id' => $refund->id, 'mall_id' => $refund->mall_id, 'refund' => $refund, 'params' => $params, 'order_no' => $order['order_no'], 'refund_order_no' => $refund['order_no'], 'payment_trade_id' => $item->getTradeId(), 'refund_price' => $item->getRefundFee($params, $refund), 'pay_type' => $item->pay_type, ]) ) { // 当res不为空 进此判断 list($boolean, $msg) = $res; if ($boolean === false) { $this->setError($msg); return false; } } else { } } // 设置为已退款 $payment_trade->setRefund($refund->id, CourseEnum::ADDONS_NAME); } //退款成功 $order->refund_status = 2; $order->refund_at = time(); $order->order_status = -2; if (!$order->save()) throw new Exception('修改售后状态失败'. AddonsCourseOrders::$static_error); //删除用户购买课程记录 AddonsCourseBought::updateAll(['status' => StatusEnum::DELETE, 'is_pay' => 0], ['mall_id' => $params['mall_id'], 'order_id' => $order->id, 'user_id' => $order->user_id]); $trans->commit(); //操作钱包的数据不为空时,发起操作钱包数据的异步 if (!empty($insert_wallet)) { $res = UserWalletService::batchHandleByQueue($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); } return true; } catch (\Exception $e) { $trans->rollBack(); throw new Exception($e->getMessage()); } } public static function getOrderCommissionData($insert_wallet = [], $data = [], $capitalType = 'commission', $order){ // $wallet_type = $params['wallet_type']; CapitalLog::$capitalType = "{$capitalType}"; $list = CapitalLog::getList($data['condition'],0); // print_r($list);exit; if (!empty($list)) { foreach ($list as $k => $val) { $score_refund_price = $val['change_num'] * ($data['params']['balance_pre'] / 100) * -1;//处理为负数 $score_refund_price = bcmul($score_refund_price, 1, 2); //admin_hander_refund 为后台主动退款时 $insert_wallet[] = [ 'mall_id' => $order['mall_id'], 'user_id' => $val['user_id'], 'is_frozen' => false, 'wallet_type' => $capitalType,// 暂定退回积分 'money' => $score_refund_price, 'desc' => '后台主动退款-订单('.$order['id'].')', 'source_table' => AddonsCourseOrders::tableName(), 'source_table_id' => $order['id'], 'from_type' => UserWalletEnum::REFUND, 'capital_type' => UserWalletEnum::REFUND_ORDER, 'order_no' => $order['order_no'], 'not_add_total' => true, 'admin_handler_refund' => UserWalletEnum::ADMIN_HANDLER_REFUND, ];//写入积分操作 } } return $insert_wallet; } }