[1,2]], [['cx_mch_id', 'user_id', 'scene'], 'required'], [['money', 'type', 'remark', 'operator_name'], 'required', 'on' => 'recharge'], [['money', 'pay_type'], 'required', 'on' => 'auto_recharge'], ]; } public function attributeLabels(){ return [ 'operator_name' => '操作用户', 'type' => '类型', 'money' => '金额', 'remark' => '备注', 'receipt' => '回执', 'rule_id' => '充值方案' ]; } //后台充值 public function recharge() { if(!$this->validate()){ return $this->getModelError(); } if($this->type == 1 && $this->money <= 0){ return $this->apiReturnError('充值金额必须大于0'); } $res = Balance::initBalance($this->user_id, $this->scene, $this->cx_mch_id); if($res['code'] != 0) return $res; $balance = Balance::findOne(['user_id' => $this->user_id, 'scene' => $this->scene, 'cx_mch_id' => $this->cx_mch_id, 'is_delete' => 0]); if($balance == null){ return $this->apiReturnError('系统内部错误'); } if($this->type == 2 && $this->money > $balance->account_balance){ return $this->apiReturnError('账户余额不足'); } $type_cn = $this->type == 1 ? '充值' : '扣除'; $desc = $this->operator_name . "操作后台" . $type_cn . $this->money."元"; $order_no = UniqueOrderNo::generate(UniqueOrderNo::ORDER_TYPE_AUTO_RECHARGE_ORDER,"\\app\\models\\RechargeOrder"); $order_type = UniqueOrderNo::getOrderTypeByOrderNo($order_no); $ext = [ 'remark' => $this->remark, 'receipt' => $this->receipt ]; $ext = json_encode($ext,JSON_UNESCAPED_UNICODE); $t = \Yii::$app->db->beginTransaction(); $res = Balance::logger($this->user_id, $this->type, $this->money, $desc, $order_type, $order_no, $this->scene, $ext, $this->cx_mch_id); if($res['code'] != 0){ $t->rollBack(); return $res; } $t->commit(); return $this->apiReturnSuccess("操作成功"); } //充值设置 public function setting() { if(!$this->validate()){ return $this->getModelError(); } $data = []; //充值方案 $form = new CommonRechargeRuleListForm(); $form->cx_mch_id = $this->cx_mch_id; $res = $form->searchAll(); $recharge_rules = $res['code'] == 0 ? $res['data'] : []; $data['recharge_rules'] = $recharge_rules; //支持支付方式 $data['pay_types'] = $this->getPayType($this->cx_mch_id); return $this->apiReturnSuccess('ok', $data); } private function getPayType($cx_mch_id, $platform = 'wxmp') { $form = new CommonPaymentSettingForm(); $form->cx_mch_id = $cx_mch_id; $res = $form->search(); $pay_type_list = $res['pay_types']; $pay_types = []; foreach($pay_type_list as $index => $item){ if(!$item['is_show'] || !$item['is_open']) continue; //排除 if(in_array($item['short_name'], [SysConst::$cxPayTypeEnBalance, SysConst::$cxPayTypeEnBank])) continue; //@TODO 根据平台来源显示支付方式 $pay_types[] = $item; } return $pay_types; } //用户发起充值 public function autoRecharge() { if(!$this->validate()){ return $this->getModelError(); } if($this->money <= 0 ){ return $this->apiReturnError('充值金额需大于0'); } //支付方式检查 $pay_types = $this->getPayType($this->cx_mch_id); if(!in_array($this->pay_type, array_column($pay_types, 'short_name'))){ return $this->apiReturnError('不支持此充值方式'); } $this->money = sprintf('%.2f', $this->money); $t = \Yii::$app->db->beginTransaction(); $order = new RechargeOrder(); $order->cx_mch_id = $this->cx_mch_id; $order->order_no = UniqueOrderNo::generate(UniqueOrderNo::ORDER_TYPE_AUTO_RECHARGE_ORDER, "\\app\\models\\RechargeOrder"); $order->user_id = $this->user_id; $order->pay_price = $this->money; $order->pay_type = PaymentTypes::payTypeKeyToId($this->pay_type); $order->is_pay = 0; //充值方案 if($this->rule_id != 0){ $recharge_rule = RechargeRule::findOne(['id' => $this->rule_id, 'cx_mch_id' => $this->cx_mch_id, 'is_delete' => 0]); if($recharge_rule == null){ return $this->apiReturnError('无效充值方案'); } $order->send_price = $recharge_rule->send_price; } else { $recharge_rule = RechargeRule::find() ->where([ 'cx_mch_id' => $this->cx_mch_id, 'is_delete' => 0 ]) ->andWhere([ '<=', 'pay_price', $this->money ]) ->orderBy(['pay_price' => SORT_DESC])->one(); if($recharge_rule != null){ $order->send_price = $recharge_rule->send_price; } } if(!$order->save()){ return $this->getModelError($order); } $scene_cn = Balance::getBalanceScene($this->scene); $paymentOrder = new PaymentOrder([ 'orderNo' => $order->order_no, 'amount' => (float)$this->money, 'title' => $scene_cn.'余额充值', 'notifyClass' => '\\app\\models\\common\\notify\\payment\\BalanceRechargePaymentNotify', 'supportPayTypes' => array_column($pay_types, 'short_name'), 'payType' => PaymentTypes::payTypeKeyToId($this->pay_type) ]); $payment = new Payment(); $paymentOrders[] = $paymentOrder; $res = $payment->createOrder($paymentOrders); if($res['code'] != 0){ $t->rollBack(); return $res; } $t->commit(); return $res; } }