['app', 'mini', 'h5', 'official', 'yunst']], [['pay_type'], 'in', 'range' => [ -1, 1, 2, 3, 4, 5, Order::PAY_TYPE_OFFLINE, Order::PAY_TYPE_MONTH, Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX, Order::PAY_TYPE_WX_B2B, Order::PAY_TYPE_ALLINPAY_WX, Order::PAY_TYPE_ALLINPAY_ALIPAY, Order::PAY_TYPE_YUNST_WECHAT_PAY ]], // 'WECHAT_PAY', 'HUODAO_PAY', 'BALANCE_PAY' 'ALIPAY', [['form_id', 'order_id_list', '_from'], 'string'], ['is_combine', 'default', 'value' => 0], [['parent_user_id', 'condition', 'order_id', 'is_combine'], 'integer'], [['ali_requireOrder', 'ali_sourceId', 'pay_offline'], 'safe'], [['session_key'], 'safe'], ]; } public function search() { if($this->pay_type == -1){ $this->pay_type = Order::PAY_TYPE_BALANCE_PAID; } $this->wechatPay = \Yii::$app->controller->wechatPay; if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } $this->user->money = doubleval($this->user->money); if ($this->order_id_list) { $order_id_list = json_decode($this->order_id_list, true); if (is_array($order_id_list) && count($order_id_list) == 1) { $this->order_id = $order_id_list[0]; $this->order_id_list = ''; } } $t = \Yii::$app->db->beginTransaction(); try { User::find()->where('id = ' . $this->user->id . ' for update')->one(); if ($this->order_id) { //单个订单付款 $this->order = Order::findOne([ // 'store_id' => $this->store_id, 'id' => $this->order_id, ]); //感觉$this->pay_type == 2条件可以不用加 因为货到付款支付时候不走这个方法 走meetOrderPay() if (intval($this->order->is_pay) || (intval($this->order->pay_type) === 2 && $this->pay_type == 2)) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单已支付', ]; } if($this->order->integral_price > 0){ if($this->order->integral_price > $this->user->integral){ $t->rollBack(); return [ 'code' => 1, 'msg' => '积分不足,请重新下单', ]; } } // 供应链系统下单时是否使用平台商户号,1使用,0未使用 if (\Yii::$app->prod_is_dandianpu() && !is_h5() && ( ( !Store::hasIncoming($this->order->store_id) && $this->pay_type == 1) || ($this->pay_type == 1 && $this->_from == self::PAY_FROM_APP) ) && self_mini() === false ) { $is_use_platform_mch = 1; if ($this->is_combine) { if ($this->user->money >= $this->order->pay_price) { $this->pay_type = 3; $is_use_platform_mch = 0; } } $this->order->is_use_platform_mch = $is_use_platform_mch; $this->order->save(); } if ($this->order->pay_price == 0) { // 这里要判断订单之前是不是货到付款的订单 如果是货到付款的订单 if($this->order->pay_type == 2 && $this->order->trade_status == Order::ORDER_FLOW_SEND){ $this->order->is_pay = 1; // 如果是货到付款已发货 用户选择支付的话 订单修改为确认收货 $this->order->trade_status = Order::ORDER_FLOW_CONFIRM; $this->order->confirm_time = time(); $this->order->save(); return [ 'code' => 0, 'msg' => '支付成功' ]; }else{ $this->order->pay_time = time(); $this->order->is_pay = 1; if($this->order->order_type == 7){ $this->order->pay_type = 7; //积分兑换 }else{ $this->order->pay_type = 3; } $this->order->trade_status = Order::ORDER_FLOW_NO_SEND; $this->order->save(); } if ($this->order->verify_card_id > 0) { VerifyCardSale::updateAll(['status' => 1], ['id' => $this->order->verify_card_id]); $verifylog = new VerifyCardLog(); $verifylog->store_id = $this->order->store_id; $verifylog->sale_id = $this->order->verify_card_id; $verifylog->shop_id = 0; $verifylog->use_time = time(); $verifylog->user_id = get_user_id(); $verifylog->type = VerifyCardLog::WRITE_TYPE_EXCHANGE; $verifylog->describe = '使用卡券礼品卡兑换商品'; $verifylog->save(); } $this->setReturnData($this->order); $t->commit(); // 支付完成后,相关操作 (new NotifyForm())->videoGoodsShare($this->order); $form = new OrderComplete(); $form->order_id = $this->order->id; $form->order_type = 0; $form->store_id = $this->order->store_id; $form->notify(); return [ 'code' => 0, 'msg' => '支付成功' ]; } if (!$this->order) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单不存在', ]; } if ($this->order->is_delete == 1 || $this->order->trade_status == Order::ORDER_FLOW_CANCEL) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单已取消', ]; } if ($this->order->is_pay == 1 || ($this->order->trade_status > -1 && $this->order->pay_type != 2)) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单状态异常', ]; } try { $this->checkGoodsConfine($this->order); } catch (\Exception $e) { $t->rollBack(); return [ 'code' => 1, 'msg' => $e->getMessage() ]; } // 存储parent_id // if ($this->user && $this->user->parent_user_id) { // CommonOrder::saveParentId($this->user->parent_user_id); // } $goods_names = ''; $goods_list = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()], 'g.id=od.goods_id')->where(['od.order_id' => $this->order->id, 'od.is_delete' => 0, ])->select('g.name,g.verify_card_id')->asArray()->all(); foreach ($goods_list as $goods) { $goods_names .= $goods['name'] . ';'; } $goods_names = mb_substr($goods_names, 0, 32, 'utf-8'); // 去除非utf8字符 if (function_exists('iconv')) { // 使用iconv函数去除非UTF-8字符 $goods_names = iconv('UTF-8', 'UTF-8//IGNORE', $goods_names); } else { // 如果iconv不可用,则使用正则表达式尝试去除非UTF-8字符 $goods_names = preg_replace('/[^\x{0000}-\x{FFFF}]/u', '', $goods_names); } $this->setReturnData($this->order); $this->order->order_union_id = 0; if (!$this->order->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单保存失败' ]; } // 余额抵扣支付 $balance_price = 0; if ($this->pay_type == 2) { $this->is_combine = 0; } if ($this->is_combine) { if ($this->user->money >= $this->order->pay_price) { $this->pay_type = 3; } else { $balance_price = $this->user->money; $this->order->combine_money = $this->user->money; $this->order->is_combine_pay = Order::IS_COMBINE_PAY; $this->order->save(); } } else { $this->order->combine_money = 0; $this->order->is_combine_pay = Order::NOT_COMBINE_PAY; $this->order->save(); } if ($this->pay_type == 1 || $this->pay_type == 4 || $this->pay_type == 5 || in_array($this->pay_type, [Order::PAY_TYPE_WX_B2B, Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX]) || in_array($this->pay_type, [Order::PAY_TYPE_ALLINPAY_WX, Order::PAY_TYPE_ALLINPAY_ALIPAY]) || $this->pay_type == Order::PAY_TYPE_YUNST_WECHAT_PAY) { if ($this->order->pay_price == 0) { $this->order->is_pay = 1; $this->order->pay_type = 1; if ($this->pay_type == 4) { $this->order->pay_type = 4; } $this->order->pay_time = time(); if (!$this->order->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => '支付失败' ]; } // 支付完成后,相关操作 (new NotifyForm())->videoGoodsShare($this->order); $form = new OrderComplete(); $form->order_id = $this->order->id; $form->order_type = 0; $form->store_id = $this->order->store_id; $form->notify(); $t->commit(); return [ 'code' => 0, 'msg' => '0元支付' ]; } //供应链系统h5支付以及公众号支付 只能使用供应链平台配置的商户信息 不能自己配置 所以给这加is_use_platform_mch 让商城自己提现 if (\Yii::$app->prod_is_dandianpu() && ((is_h5() || $this->_from == self::PAY_FROM_OFFICIAL) && ( ((!Store::hasIncoming($this->order->store_id, 'wechat', is_h5())) && $this->pay_type == Order::PAY_TYPE_WECHAT) || ((!Store::hasIncoming($this->order->store_id, 'alipay', is_h5())) && $this->pay_type == Order::PAY_TYPE_ALI) )) ) { $this->order->is_use_platform_mch = 1; $this->order->save(); } // if ($this->order->store_id == 74 && in_array($this->pay_type, [1])){ // $this->pay_type = Order::PAY_TYPE_HUIFU_V2_JSPAY_WX; // } if ($this->pay_type == 1) { // \Yii::error($this->_from); if ($this->_from == self::PAY_FROM_APP) { if (\Yii::$app->prod_is_dandianpu() && self_mini() === false) { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price); } else { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price); } else { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price); } } } else if ($this->_from == self::PAY_FROM_H5) { if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id) && self_mini() === false) { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true); } else { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true); } else { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true); } } } else if ($this->_from == self::PAY_FROM_OFFICIAL) { $self_mini = intval(\app\models\Option::get('self_mini', get_store_id(), 'store', 0)['value']); if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id) && !$self_mini) { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true); } else { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true); } else { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true); } } } else { if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id) && self_mini() === false) { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price); } else { if (is_profit_pay() && Store::hasIncoming($this->order->store_id)) { $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price); } else { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price); } if (\app\modules\admin\models\WastoreForm::$test && get_mini_id() == 88) { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price); } } } if (isset($result['code']) && $result['code'] == 1) { if ($this->_from == self::PAY_FROM_OFFICIAL) { $result['wechat_platform_open_id'] = get_user()->wechat_platform_open_id; $result['h5_auth_link'] = LoginForm::getAuthLink(); } return $result; } CloudPrint::doPrint($this->order->id, 0, $this->order->store_id); $t->commit(); \app\modules\admin\models\WastoreForm::afterOrderPrepay($this->order, $result['res']); return [ 'code' => 0, 'msg' => 'success', 'data' => (object)$result['data'], 'res' => $result['res'], 'body' => $goods_names ]; } if ($this->pay_type == Order::PAY_TYPE_WX_B2B) { // \Yii::error($this->_from); $result = UserAuditForm::pay($this->session_key, $this->order, OrderNo::ORDER_MALL, $goods_names, $balance_price); CloudPrint::doPrint($this->order->id, 0, $this->order->store_id); $t->commit(); // \app\modules\admin\models\WastoreForm::afterOrderPrepay($this->order, $result['res']); return $result; } if ($this->pay_type == Order::PAY_TYPE_YUNST_WECHAT_PAY) { // if (!Store::hasIncoming($this->order->store_id, 'yunst')) { // return [ // 'code' => 1, // 'msg' => '商家未配置通联支付' // ]; // } //是非独立部署 进件流程//通联支付 start $store = Store::findOne(['id' => $this->order->store_id]); $OrderYunst = new OrderYunst(); $result2 = $OrderYunst->payYunst($this->order->store_id, $this->order->order_no, $store->cusid, $this->order->pay_price * 100); if ($result2['subCode'] == 'SUCCESS') { $payInfo = json_decode($result2['data']['payinfo'], true); if (!empty($payInfo)) { if (is_array($payInfo)) { return [ 'code' => 0, 'data' => $payInfo, 'msg' => 'success', 'res' => $payInfo ]; } return [ 'code' => 1, 'msg' => $result2['data']['errmsg'] ]; } return [ 'code' => 1, 'msg' => $result2['subMsg'] ]; } return $result2; //通联支付 end } if (in_array($this->pay_type, [Order::PAY_TYPE_ALLINPAY_WX, Order::PAY_TYPE_ALLINPAY_ALIPAY])) { $is_official = $this->_from == self::PAY_FROM_OFFICIAL; $result = Allinpay::pay($this->pay_type, $this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, is_h5(), $is_official); $t->commit(); return $result; } if (in_array($this->pay_type, [Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY])) { $is_official = $this->_from == self::PAY_FROM_OFFICIAL; $result = Adapay::create($this->pay_type, $this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, $is_official); $t->commit(); return $result; } if (in_array($this->pay_type, [Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX])) { $is_official = $this->_from == self::PAY_FROM_OFFICIAL; $result = AdapayV2::create($this->pay_type, $this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, $is_official); $t->commit(); return $result; } if ($this->pay_type == 4) { if ($this->_from == self::PAY_FROM_MINI) { if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id) && self_mini() === false) { $result = Alipay::mini($this->order, $goods_names, $this->user, '', '', 0, $balance_price, $this); } else { if (is_profit_pay('ali')) { $result = AlipayProfit::mini($this->order, $goods_names, $this->user, '', '', false, 0, $balance_price, $this); } else { $result = Alipay::mini($this->order, $goods_names, $this->user, '', '', 0, $balance_price, $this); } } if (isset($result['code']) && $result['code'] == 1) { return $result; } $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data']['trade_no'], 'body' => $goods_names ]; } else if ($this->_from == self::PAY_FROM_H5) { if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming($this->order->store_id, 'alipay', is_h5())) { $result = Alipay::wap($this->order,$goods_names); } else { if (is_profit_pay()) { $result = AlipayProfit::wap($this->order, $goods_names); } else { $result = Alipay::wap($this->order, $goods_names); } } $t->commit(); if($result['code']){ return $result; } return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data'], 'body' => $goods_names ]; } else { if (is_profit_pay('ali')) { $result = AlipayProfit::app($this->order, $goods_names, $this->user, '', $balance_price); } else { $result = Alipay::app($this->order, $goods_names, $this->user, '', $balance_price); } if (isset($result['code']) && $result['code'] == 1) { $t->commit(); return $result; } $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data'], 'body' => $goods_names ]; } } // 抖音小程序 if ($this->pay_type == 5) { $result = ByteDance::pay($this->order, '', $goods_names, 0 , $balance_price); if (isset($result['code']) && $result['code'] == 1) { return $result; } $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data'], ]; } } //货到付款和余额支付数据处理 if ($this->pay_type == 2 || $this->pay_type == 3) { $order = $this->order; // 中间页选择货到付款,需要存入支付类型 if ($this->pay_type == 2) { $order->is_pay = 0; $order->pay_type = 2; $order->save(); } //余额支付 用户余额变动 if ($this->pay_type == 3) { $user_id = $order->user_id; //判断好友代付 if ((int)get_user_id() !== (int)$order->user_id) { $user = User::findOne(['binding' => get_user()->binding, 'is_delete' => 0, 'store_id' => $order->store_id]);//查询当前商城的用户id $user_id = $user->id; if (empty($user)) { $store = Store::findOne($order->store_id); return [ 'code' => 1, 'msg' => '支付失败,用户在商城:' . $store->name . '未注册用户。', ]; } } $user = User::findOne(['id' => $user_id]); if ($user->money < $order->pay_price) { $t->rollBack(); return [ 'code' => 1, 'msg' => '支付失败,余额不足', ]; } // $user->money -= floatval($order->pay_price); $res = AccountLog::saveLog($user->id, floatval($order->pay_price), AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, 1, $order->id, "商城余额支付,订单号为:{$order->order_no}。"); if (!$res) { $t->rollBack(); return [ 'code' => 1, 'msg' => '支付失败' ]; } $order->is_pay = 1; $order->pay_type = 3; $order->trade_status = Order::ORDER_FLOW_NO_SEND; $order->pay_time = time(); $order->is_combine_pay = 0; $order->combine_money = 0; if ($order->user_id != $user->id) { $order->pay_user_id = $user->id; } if (!$order->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => '支付失败' ]; } } // 同城配送订单下单 // if ($order->is_delivery == 1) { // $detail_goods = OrderDetail::find()->where(['order_id' => $order->id])->select('goods_name as name, pic, num, total_price as price')->asArray()->all(); // Delivery::addOrder($detail_goods, $order->order_no); // } // 支付完成后,相关操作 (new NotifyForm())->videoGoodsShare($order); $form = new OrderComplete(); $form->order_id = $order->id; $form->order_type = 0; $form->store_id = $order->store_id; $form->notify(); CloudPrint::doPrint($this->order->id, 0, $this->order->store_id); $t->commit(); return [ 'code' => 0, 'msg' => '支付成功', 'data' => '' ]; } if($this->pay_type == Order::PAY_TYPE_OFFLINE){ $order = $this->order; $order->is_pay = 0; $order->pay_type = Order::PAY_TYPE_OFFLINE; $order->save(); if(is_string($this->pay_offline)){ $this->pay_offline = json_decode($this->pay_offline, true); } $payOffline = \app\models\OrderPayOffline::addPay(get_store_id(), get_user_id(), $this->order->id, $this->pay_offline['type'], $this->pay_offline['desc'], $this->pay_offline['pic_list']); if($payOffline['code'] != 0){ $t->rollBack(); return $payOffline; } $t->commit(); return [ 'code' => 0, 'msg' => '操作成功,请等待审核', 'data' => '' ]; } if($this->pay_type == Order::PAY_TYPE_MONTH){ $order = $this->order; $order->is_pay = 1; $order->pay_type = Order::PAY_TYPE_MONTH; $order->trade_status = Order::ORDER_FLOW_NO_SEND; $order->pay_time = time(); $order->save(); $payMonth = UserPayMonth::addPay(get_user_id(), $order); if($payMonth['code']){ $t->rollBack(); return $payMonth; } // 支付完成后,相关操作 (new NotifyForm())->videoGoodsShare($order); $form = new OrderComplete(); $form->order_id = $order->id; $form->order_type = 0; $form->store_id = $order->store_id; $form->notify(); CloudPrint::doPrint($this->order->id, 0, $this->order->store_id); $t->commit(); return [ 'code' => 0, 'msg' => '支付成功', 'data' => $payMonth, ]; } } elseif ($this->order_id_list) { //多个订单合并付款 $order_id_list = json_decode($this->order_id_list, true); if (!$order_id_list) { $order_id_list = explode(',', $this->order_id_list); } if (!$order_id_list) { $t->rollBack(); return [ 'code' => 1, 'msg' => '数据错误:订单格式不正确。', ]; } $order_list = []; $total_pay_price = 0; foreach ($order_id_list as $order_id) { $order = Order::findOne([ 'store_id' => $this->store_id, 'id' => $order_id, 'is_delete' => 0, ]); if (!$order) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单不存在', ]; } if ($order->is_pay == 1) { $t->rollBack(); return [ 'code' => 1, 'msg' => '存在已付款的订单,订单合并支付失败,请到我的订单重新支付。', ]; } try { $this->checkGoodsConfine($order); } catch (\Exception $e) { $t->rollBack(); return [ 'code' =>1, 'msg' => $e->getMessage() ]; } $order_list[] = $order; $total_pay_price += doubleval($order->pay_price); $this->setReturnData($order); } // 余额抵扣支付 $balance_price = 0; if ($this->is_combine) { // todo 合并订单支付 不能使用混合支付 if($this->user->money < $total_pay_price){ $t->rollBack(); return ['code'=>1,'msg' => '余额不足']; } $this->pay_type = 3; // if ($this->user->money >= $total_pay_price) { // $this->pay_type = 3; // } else { // $balance_price = $this->user->money; // $this->order->combine_money = $this->user->money; // $this->order->is_combine_pay = Order::IS_COMBINE_PAY; // $this->order->save(); // } } else { foreach($order_id_list as $order_id){ $order = Order::findOne([ 'store_id' => $this->store_id, 'id' => $order_id, 'is_delete' => 0, ]); $order->combine_money = 0; $order->is_combine_pay = Order::NOT_COMBINE_PAY; $order->save(); } } // 微信支付 if ($this->pay_type == 1) { // \Yii::error($this->_from); if ($this->_from == self::PAY_FROM_APP) { if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) { $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price); } else { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price); } else { $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price); } } } else if ($this->_from == self::PAY_FROM_H5) { if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) { $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, true); } else { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, true); } else { $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, true); } } } else if ($this->_from == self::PAY_FROM_OFFICIAL) { $self_mini = intval(\app\models\Option::get('self_mini', get_store_id(), 'store', 0)['value']); if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && !$self_mini) { $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, false, true); } else { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, false, true); } else { $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price, false, true); } } } else { if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) { $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price); } else { if (is_profit_pay() && Store::hasIncoming(get_store_id())) { $result = WechatNewPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price); } else { $result = WechatPay::orderUnify($order_list,OrderNo::ORDER_UNION, null, $total_pay_price, false, $balance_price); } } } if (isset($result['code']) && $result['code'] == 1) { $t->rollBack(); return $result; } CloudPrint::doPrint($this->order->id, 0, $this->order->store_id); $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => (object)$result['data'], 'res' => $result['res'], 'body' => $result['body'], ]; } if ($this->pay_type == 4) { if ($this->_from == self::PAY_FROM_MINI) { if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) { $result = Alipay::mini($order_list, '', $this->user, '', OrderNo::ORDER_UNION, $total_pay_price, $balance_price, $this); } else { if (is_profit_pay('ali')) { $result = AlipayProfit::mini($order_list, '', $this->user, '', OrderNo::ORDER_UNION, false, $total_pay_price, $balance_price, $this); } else { $result = Alipay::mini($order_list, '', $this->user, '', OrderNo::ORDER_UNION, $total_pay_price, $balance_price, $this); } } if (isset($result['code']) && $result['code'] == 1) { return $result; } $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data']['trade_no'], 'body' => '订单合并支付' ]; } else if ($this->_from == self::PAY_FROM_H5) { if (\Yii::$app->prod_is_dandianpu() && !Store::hasIncoming(get_store_id()) && self_mini() === false) { $result = Alipay::wap($order_list,'','',OrderNo::ORDER_UNION,$total_pay_price,$balance_price, $this); } else { if (is_profit_pay()) { $result = AlipayProfit::wap($order_list, '','',OrderNo::ORDER_UNION,$total_pay_price,$balance_price, $this); } else { $result = Alipay::wap($order_list, '','',OrderNo::ORDER_UNION,$total_pay_price,$balance_price, $this); } } $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data'], 'body' => '订单合并支付' ]; } else { if (is_profit_pay('ali')) { $result = AlipayProfit::app($this->order, '', $this->user,OrderNo::ORDER_UNION,$total_pay_price,$this->user, $balance_price); } else { $result = Alipay::app($this->order, '', $this->user,OrderNo::ORDER_UNION,$total_pay_price, $balance_price); } if (isset($result['code']) && $result['code'] == 1) { $t->commit(); return $result; } $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data'], 'body' => '订单合并支付' ]; } // if (is_profit_pay('ali')) { // $result = AlipayProfit::mini($this->order, '', $this->user, '', OrderNo::ORDER_UNION, false, $total_pay_price, $balance_price); // } else { // $result = Alipay::mini($this->order, '', $this->user, '', OrderNo::ORDER_UNION, $total_pay_price, $balance_price); // } // if (isset($result['code']) && $result['code'] == 1) { // return $result; // } // $t->commit(); // return [ // 'code' => 0, // 'msg' => 'success', // 'data' => $result['data']['trade_no'], // ]; } // 抖音 if ($this->pay_type == 5) { $result = ByteDance::pay($this->order, OrderNo::ORDER_UNION, '', $total_pay_price , $balance_price); if (isset($result['code']) && $result['code'] == 1) { return $result; } $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data']['trade_no'], ]; } //货到付款和余额支付数据处理 if ($this->pay_type == 2 || $this->pay_type == 3) { //余额支付 用户余额变动 if ($this->pay_type == 3) { if ($this->user->money < $total_pay_price) { $t->rollBack(); return [ 'code' => 1, 'msg' => '支付失败,余额不足', ]; } $this->user->money = $this->user->money - $total_pay_price; if (!$this->user->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => '支付失败' ]; } else { AccountLog::saveLog($this->user->id, floatval($total_pay_price), AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, 1, 0, '合并订单支付'); } foreach ($order_list as $order) { $order->is_pay = 1; $order->pay_type = 3; $order->pay_time = time(); // 合并订单支付后修改订单状态为未发货 $order->trade_status = Order::ORDER_FLOW_NO_SEND; $order->save(); } } foreach ($order_list as $order) { (new NotifyForm())->videoGoodsShare($order); // 支付完成后,相关操作 $form = new OrderComplete(); $form->order_id = $order->id; $form->order_type = 0; $form->store_id = get_store_id(); $form->notify(); } CloudPrint::doPrint($this->order->id, 0, $this->order->store_id); //查询订单信息 //var_dump($is_on); $t->commit(); return [ 'code' => 0, 'msg' => '订单提交成功' ]; } } } catch (\Throwable $e) { \Yii::error($e); $t->rollBack(); return [ 'code' => 1, 'msg' => $e->getMessage(), 'data' => $e->getTrace(), ]; } } public function meetOrderPay() { $this->wechatPay = \Yii::$app->controller->wechatPay; if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } if(empty($this->order_id)){ return ['code'=>1,'msg'=>'订单ID错误']; } $this->order = Order::find()->where(['id'=>$this->order_id,'pay_type'=>2])->one(); if(!$this->order){ return ['code' => 1, 'msg' => '订单不存在']; } if($this->order->is_pay == Order::IS_PAY_TRUE){ return ['code' => 1, 'msg' => '订单已支付,请勿重复支付']; } $goods_names = ''; $goods_list = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()], 'g.id=od.goods_id')->where(['od.order_id' => $this->order->id, 'od.is_delete' => 0, ])->select('g.name,g.verify_card_id')->asArray()->all(); foreach ($goods_list as $goods) { $goods_names .= $goods['name'] . ';'; } $goods_names = mb_substr($goods_names, 0, 32, 'utf-8'); // 不会存在余额混合支付 $balance_price = 0; $t = \Yii::$app->db->beginTransaction(); // 微信支付 if($this->pay_type == 1){ if ($this->_from == self::PAY_FROM_APP) { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price); } else { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, true, $balance_price); } } else if ($this->_from == self::PAY_FROM_H5) { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true); } else { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, true); } } else if ($this->_from == self::PAY_FROM_OFFICIAL) { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true); } else { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price, false, true); } } else { if (is_profit_pay()) { $result = WechatNewPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price); } else { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_MALL, $goods_names, 0, false, $balance_price); } } if (isset($result['code']) && $result['code'] == 1) { if ($this->_from == self::PAY_FROM_OFFICIAL) { $result['wechat_platform_open_id'] = get_user()->wechat_platform_open_id; $result['h5_auth_link'] = LoginForm::getAuthLink(); } return $result; } CloudPrint::doPrint($this->order->id, 0, $this->order->store_id); $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => (object)$result['data'], 'res' => $result['res'], 'body' => $goods_names ]; } // 支付宝支付 if($this->pay_type == 4){ if ($this->_from == self::PAY_FROM_MINI) { if (is_profit_pay('ali')) { $result = AlipayProfit::mini($this->order, $goods_names, $this->user, '', '', false, 0, $balance_price); } else { $result = Alipay::mini($this->order, $goods_names, $this->user, '', '', 0, $balance_price); } if (isset($result['code']) && $result['code'] == 1) { return $result; } $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data']['trade_no'], 'body' => $goods_names ]; } else { if (is_profit_pay('ali')) { $result = AlipayProfit::app($this->order, $goods_names, $this->user, $balance_price); } else { $result = Alipay::app($this->order, $goods_names, $this->user, $balance_price); } if (isset($result['code']) && $result['code'] == 1) { $t->commit(); return $result; } $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data'], 'body' => $goods_names ]; } } return ['code' => 1,'msg' => '货到付款支付错误']; } /** * 设置佣金 * @param Order $order * @return mixed */ public function setReturnData($order) { $form = new ShareMoneyForm(); $form->order = $order; $form->order_type = 0; //处理联盟券 用户减少 if($order->take_price > 0){ $user = User::findOne($order->user_id); $saas_user = SaasUser::findOne(['mobile' => $user->binding]); if($saas_user){ $take_price = $order->take_price; $before = $saas_user->league_price; $saas_user->updateCounters(['league_price' => -floatval($take_price)]); \app\models\SaaSLeaguePriceLog::setLeaguePriceLog( $order->store_id, $saas_user->id, $take_price, $before, \app\models\SaaSLeaguePriceLog::TYPE_DEDUCTION, \app\models\SaaSLeaguePriceLog::TAKE_TYPE, \app\models\SaaSLeaguePriceLog::ROLE_USER, $order->id ); } } return $form->setData(); } /** * @param Order $order * @throws \Exception */ private function checkGoodsConfine($order) { foreach ($order->detail as $detail) { /* @var Goods $goods*/ /* @var OrderDetail $detail*/ $goods = $detail->goods; if ($goods->confine_count && $goods->confine_count > 0) { $user = User::findOne($order->user_id); $goodsNum = Goods::getBuyNum($user, $goods->id); if ($goodsNum) { } else { $goodsNum = 0; } $goodsTotalNum = intval($goodsNum + $detail->num); if ($goodsTotalNum > $goods->confine_count) { throw new \Exception('商品:' . $goods->name . ' 超出购买数量', 1); } } //起订数量 if (($goods['order_min_count'] && $goods['order_min_count'] > 0)) { if ($detail->num < $goods['order_min_count']) { throw new \Exception('商品:' . $goods->name . ' 起订数量' . $goods['order_min_count'], 1); } } if (in_array($order->order_type, [1, 2])) { $res = $this->bookCheckGoodsNum($goods, $detail, $order); if ($res['code'] > 0) { throw new \Exception($res['msg'], 1); } } } } /** * @param Goods $goods * @param OrderDetail $detail * @param Order $order */ private function bookCheckGoodsNum($goods, $detail, $order) { // 判断时间 if (time() - $order->created_at > 15 * 60) { return [ 'code' => 1, 'msg' => '订单已过支付时间,将自动取消' ]; } $attr = Json::decode($detail->attr); // 酒店预约 if ($order->order_type == 1) { // $date_book = GoodsBook::findOne(['goods_id' => $goods->id])->date_book; // $date_book = Json::decode($date_book); // if (!$date_book) { // return [ // 'code' => 1, // 'msg' => '数据异常' // ]; // } // $data_config = array_combine(array_column($date_book, 'date'), array_column($date_book, 'num')); // foreach ($attr as $value) { // if (isset($data_config[$value['date']])) { // if ($data_config[$value['date']] < $detail->num) { // return [ // 'code' => 1, // 'msg' => '选中日期' . $value['date'] . '内暂无房源' // ]; // } // } else { // return [ // 'code' => 1, // 'msg' => '未找到预约时间下相关商品数据' // ]; // } // } } // 服务预约 if ($order->order_type == 2) { $service_book = GoodsBook::findOne(['goods_id' => $goods->id])->service_book; $service_book = Json::decode($service_book); if (!$service_book) { return [ 'code' => 1, 'msg' => '数据异常' ]; } $date_data = $this->getDateByInterval(7); $count = 0; $new_arr = [ 'data' => [] ]; $order = Order::find()->alias('o') ->leftJoin(['od' => OrderDetail::tableName()], 'o.id = od.order_id') ->where(['o.trade_status' => [0, 2, 3], 'o.is_delete' => 0, 'o.order_type' => 2, 'goods_id' => $goods['id']]) ->andWhere(['>', 'o.created_at', strtotime(date("Y-m-d"))]) ->select('od.attr, od.num')->asArray()->all(); foreach ($date_data as $index => $datum) { $new_arr['data'][$index]['date'] = $datum; $new_arr['data'][$index]['time'] = $service_book['data'][0]['time']; } if (!$new_arr) { return [ 'code' => 1, 'msg' => '数据异常' ]; } $service_book = $new_arr['data']; $service_book_date = array_column($service_book, NULL, 'date'); $service_book_time = $service_book_date[$attr['date']]['time']; $num = 0; $is = false; foreach ($order as $item) { $item['attr'] = json_decode($item['attr'], true); if ($item['attr']['date'] === $attr['date']) { if ($attr['time'] == $item['attr']['time']) { $num += $item['num']; } } } foreach ($service_book_time as $m) { foreach ($m['times'] as $n) { $is = true; if ($n['time'] == $attr['time']) { if (($detail->num + $num) > $n['num']) { return [ 'code' => 1, 'msg' => $n['time'] . '时间段内暂不可预约' ]; } } } } if ($is === false) { return [ 'code' => 1, 'msg' => '未找到预约时间下相关商品数据' ]; } } return [ 'code' => 0, 'msg' => 'success' ]; } public function getDateByInterval(int $num) :array { //var_dump($st, $et);die; $returnData = []; $i = 0; do { $temp = date('Y-m-d', strtotime('+' . $i . ' day', strtotime(date('Y-m-d')))); $returnData[] = $temp; $i++; } while ($i < $num); return $returnData; } }