$id]]); if (empty($order)) throw new Exception($id . ': 订单不存在'); if (empty($trade = $order->trade)) throw new Exception($id . ': 支付流水不存在'); return $this->tradeClose($trade, $order); } /** * 支付流水关闭(钱包退回) * * @param PaymentTrade $trade * @param Order $order * @param integer $type 1:关闭, 2:二次支付 * @return boolean */ public function tradeClose(PaymentTrade $trade, Order $order, $type = 1) { /** * @var PaymentTrade $trade */ if (!$trade->isMixedPay() && $trade->isClose()) return true; if (empty($wallet_item = $trade->getWalletPayItem())) throw new Exception($order->id . ': 钱包支付项不存在'); // 支付钱包关闭 if ($wallet_item->isClose()) return true; /** * @var PaymentTradeItem|null $wallet_item */ // 钱包退回 $desc = '订单【' . $order->order_no . '】关闭, 组合支付钱包退回'; $capital_type = UserWalletEnum::CONSUME_ORDER_CLOSE; if ($type == 2) { $desc = '订单【' . $order->order_no . '】二次支付, 组合支付钱包退回'; $capital_type = UserWalletEnum::SECONDARY_PAYMENT; } if ($wallet_item->pay_type == PayTypeEnum::CONSUMER_CARD) { $insert_wallet = [ 'mall_id' => $trade->mall_id, 'user_id' => $trade->user_id, 'wallet_type' => \addons\ScoreGame\common\enums\ScoreGameEnum::WALLET_TYPE_CONSUMER_CARD, 'change_type' => \common\models\common\CapitalLog::CHANGE_TYPE_ADD, 'change_num' => $wallet_item->pay_fee, 'source_table' => PaymentTradeItem::tableName(), 'source_table_id' => $wallet_item->id, 'from_type' => \addons\ScoreGame\common\enums\ScoreGameEnum::SCORE_CAPITAL_TYPE_CONSUME, 'capital_type' => \addons\ScoreGame\common\enums\ScoreGameEnum::SCORE_CAPITAL_TYPE_CONSUME, 'order_no' => $order->order_no, 'desc' => $desc, 'created_at' => time(), 'updated_at' => time(), ]; \addons\ScoreGame\common\logic\WalletLogic::handle($insert_wallet); } else { $insert_wallet[] = [ 'mall_id' => $trade->mall_id, 'user_id' => $trade->user_id, 'is_frozen' => false, 'wallet_type' => $wallet_item->getWalletType(), 'money' => $wallet_item->pay_fee, 'desc' => $desc, 'source_table' => PaymentTradeItem::tableName(), 'source_table_id' => $wallet_item->id, 'from_type' => UserWalletEnum::CONSUME, 'capital_type' => $capital_type, 'order_no' => $order->order_no, ]; UserWalletService::batchHandle($insert_wallet); } $trade->close(); $wallet_item->close(); return true; } }