| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- namespace app\modules\admin\models\order;
- use app\models\AccountLog;
- use app\models\Goods;
- use app\models\GoodsBook;
- use app\models\HangingOrder;
- use app\models\HangingOrderDetail;
- use app\models\Order;
- use app\models\OrderDetail;
- use app\models\User;
- use app\models\VerifyCardLog;
- use app\models\VerifyCardSale;
- use app\modules\admin\models\order\MchOrderForm;
- use app\modules\client\models\OrderComplete;
- use app\modules\client\models\v1\LoginForm;
- use app\modules\client\models\v1\ShareMoneyForm;
- use app\modules\common\models\AlipayNotifyForm;
- use app\modules\common\models\NotifyForm;
- use app\utils\Alipay\Alipay;
- use app\utils\Alipay\AlipayProfit;
- use app\utils\CloudPrint;
- use app\utils\Delivery\Delivery;
- use app\utils\OrderNo;
- use app\utils\Wechat\WechatNewPay;
- use app\utils\Wechat\WechatPay;
- use ByteDance\ByteDance;
- use yii\helpers\Json;
- class MchOrderPayDataForm extends MchOrderForm
- {
- public $store_id;
- public $order_id;
- public $order_id_list;
- public $pay_type;
- public $user;
- public $form_id;
- public $parent_user_id;
- public $condition;
- public $_from;
- public $is_combine;
- public $auth_code;
- /** @var Wechat $wechat */
- private $wechat;
- private $wechatPay;
- private $order;
- const PAY_FROM_APP = 'app';
- const PAY_FROM_MINI = 'mini';
- const PAY_FROM_H5 = 'h5';
- const PAY_FROM_OFFICIAL = 'official';
- public function rules()
- {
- return [
- [['pay_type', '_from'], 'required'],//用户收银下单报错Auth Code不能为空 移除auth_code必填
- [['_from'], 'in', 'range' => ['app', 'mini', 'h5', 'official','cashier']],
- [['pay_type'], 'in', 'range' => [1, 2, 3, 4, 5, 6]], // 'WECHAT_PAY', 'HUODAO_PAY', 'BALANCE_PAY' 'ALIPAY','现金'
- [['form_id', 'order_id_list', '_from','auth_code'], 'string'],
- ['is_combine', 'default', 'value' => 0],
- [['parent_user_id', 'condition', 'order_id', 'is_combine'], 'integer'],
- ];
- }
- public function search()
- {
- $this->wechatPay = \Yii::$app->controller->wechatPay;
- if (!$this->validate()) {
- return [
- 'code' => 1,
- 'msg' => $this->getErrorSummary(false)[0],
- ];
- }
- 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();
- $this->order = Order::findOne([
- 'store_id' => $this->store_id,
- 'id' => $this->order_id,
- ]);
- if ($this->order->pay_price == 0) {
- $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 = $this->order->is_offline == 1 ? Order::ORDER_FLOW_CONFIRM : 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 = get_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();
- }
- $t->commit();
- // 支付完成后,相关操作
- (new NotifyForm())->videoGoodsShare($this->order);
- $form = new OrderComplete();
- $form->order_id = $this->order->id;
- $form->order_type = 0;
- $form->store_id = get_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) {
- $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');
- $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->is_combine) {
- $this->user->money = doubleval($this->user->money);
- 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;
- }
- } else {
- $this->order->combine_money = 0;
- $this->order->is_combine_pay = Order::NOT_COMBINE_PAY;
- }
- $this->order->save();
- if (in_array($this->pay_type, [1, 2, 3, 4, 6])) {
- if ($this->order->pay_price == 0) {
- $this->order->is_pay = 1;
- $this->order->pay_type = 1;
- $this->order->pay_time = time();
- // 已发货状态
- $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
- $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
- if (!$this->order->save()) {
- $t->rollBack();
- return [
- 'code' => 1,
- 'msg' => '支付失败'
- ];
- }
- CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
- // 支付完成后,相关操作
- $form = new OrderComplete();
- $form->order_id = $this->order->id;
- $form->order_type = 0;
- $form->store_id = get_store_id();
- $form->notify();
- $t->commit();
- if($this->order->is_offline == 1){
- $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
- $this->order->confirm_time = time();
- }
- $this->order->save();
- // if($this->order->hanging_order_id > 0){
- // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
- // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
- // }
- return [
- 'code' => 0,
- 'msg' => '0元支付'
- ];
- }
- // 微信支付
- if ($this->pay_type == 1) {
- if (is_profit_pay()) {
- $result = WechatNewPay::micropay($this->order,OrderNo::ORDER_MALL, $goods_names, $this->order->pay_price, $balance_price, $this->auth_code);
- }else{
- $result = WechatPay::micropay($this->order,OrderNo::ORDER_MALL, $goods_names, $this->order->pay_price, $balance_price, $this->auth_code);
- }
- if($result['return_code'] == 'SUCCESS' ){
- if($result['result_code'] === 'FAIL'){
- // 如果返回结果不是 等待用户输入密码 则直接返回
- if($result['err_code'] == 'USERPAYING'){
- $result = $this->checkOrderPay($this->order,0);
- }else{
- return [
- 'code' => 1,
- 'msg' => '微信支付参数错误',
- 'data' => $result
- ];
- }
- }
- if($result['result_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS' && $result['trade_type'] == 'MICROPAY'){
- $this->order->transaction_id = $result['transaction_id'];
- $this->order->is_pay = 1;
- $this->order->pay_time = time();
- $this->order->pay_type = 1;
- // 已发货状态
- $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
- $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
- $this->order->save();
- CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
- // 支付完成后,相关操作
- $form = new OrderComplete();
- $form->order_id = $this->order->id;
- $form->order_type = 0;
- $form->store_id = get_store_id();
- $form->notify();
- $t->commit();
- if($this->order->is_offline == 1){
- $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
- $this->order->confirm_time = time();
- }
- $this->order->save();
- // if($this->order->hanging_order_id > 0){
- // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
- // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
- // }
- //添加分账接收方
- $notifyForm = new NotifyForm();
- $notifyForm->addReceiver($this->order);
- return [
- 'code' => 0,
- 'msg' => '支付成功',
- ];
- }else{
- return [
- 'code' => 1,
- 'msg' => '支付失败',
- 'data' => $result
- ];
- }
- }else{
- return ['code'=>1,'msg'=>'支付失败','data'=>$result];
- }
- }
- // 纯余额支付
- if($this->pay_type == 3){
- $user = User::findOne(['id' => $this->order->user_id]);
- if ($user->money < $this->order->pay_price) {
- $t->rollBack();
- return [
- 'code' => 1,
- 'msg' => '支付失败,余额不足',
- ];
- }
- $res = AccountLog::saveLog($user->id, floatval($this->order->pay_price), AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, 1, $this->order->id, "商城余额支付,订单号为:{$this->order->order_no}。");
- if (!$res) {
- $t->rollBack();
- return [
- 'code' => 1,
- 'msg' => '支付失败'
- ];
- }
- $this->order->is_pay = 1;
- $this->order->pay_type = 3;
- $this->order->pay_time = time();
- $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
- $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
- $this->order->save();
- CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
- $form = new OrderComplete();
- $form->order_id = $this->order->id;
- $form->order_type = 0;
- $form->store_id = get_store_id();
- $form->notify();
- $t->commit();
- if($this->order->is_offline == 1){
- $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
- $this->order->confirm_time = time();
- }
- $this->order->save();
- // if($this->order->hanging_order_id > 0){
- // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
- // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
- // }
- return [
- 'code' => 0,
- 'msg' => '订单支付成功',
- ];
- }
- // 支付宝支付
- if ($this->pay_type == 4) {
- if (is_profit_pay()) {
- $result = AlipayProfit::scanNew($this->order, $goods_names, '', $this->auth_code,$this->order->pay_price,$balance_price);
- }else{
- $result = Alipay::scanNew($this->order, $goods_names, '', $this->auth_code,$this->order->pay_price,$balance_price);
- }
- // 支付成功
- if($result['code'] == 0){
- $this->order->alipay_trade_no = $result['data']['trade_no'];
- $this->order->is_pay = 1;
- $this->order->pay_time = time();
- $this->order->pay_type = 4;
- // 已发货状态
- $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
- $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
- $this->order->save();
- // if($this->order->hanging_order_id > 0){
- // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
- // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
- // }
- CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
- // 支付完成后,相关操作
- $form = new OrderComplete();
- $form->order_id = $this->order->id;
- $form->order_type = 0;
- $form->store_id = get_store_id();
- $form->notify();
- $t->commit();
- // 确认收获
- if($this->order->is_offline == 1){
- $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
- $this->order->confirm_time = time();
- }
- $this->order->save();
- $notifyForm = new AlipayNotifyForm();
- $notifyForm->addReceiver($this->order);
- return [
- 'code' => 0,
- 'msg' => '订单支付成功',
- ];
- }else{
- // todo 再去查询是否支付成功
- }
- }
- // 现金
- if($this->pay_type == 6){
- // 现金支付 直接完成订单
- $this->order->is_pay = 1;
- $this->order->pay_time = time();
- $this->order->pay_type = 6;
- // 已发货状态
- $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
- $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
- if(!$this->order->save()){
- $t->rollBack();
- return ['code' =>1 ,' msg' => '订单支付失败'];
- }
- CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
- $form = new OrderComplete();
- $form->order_id = $this->order->id;
- $form->order_type = 0;
- $form->store_id = get_store_id();
- $form->notify();
- if($this->order->is_offline == 1){
- $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
- $this->order->confirm_time = time();
- }
- $this->order->save();
- $t->commit();
- // 如果有挂单ID 将挂单信息删除
- // if($this->order->hanging_order_id > 0){
- // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
- // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
- // }
- return ['code' => 0,'msg' => '订单支付成功'];
- }
- //货到付款
- if ($this->pay_type == 2) {
- // 现金支付 直接完成订单
- $this->order->pay_type = 2;
- // 已发货状态
- $this->order->trade_status = ORDER::ORDER_FLOW_NO_SEND;
- $this->order->send_time = time();
- if(!$this->order->save()){
- $t->rollBack();
- return ['code' =>1 ,' msg' => '订单支付失败'];
- }
- CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
- $form = new OrderComplete();
- $form->order_id = $this->order->id;
- $form->order_type = 0;
- $form->store_id = get_store_id();
- $form->notify();
- // $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
- // $this->order->confirm_time = time();
- // $this->order->save();
- $t->commit();
- // 如果有挂单ID 将挂单信息删除
- // if($this->order->hanging_order_id > 0){
- // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
- // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
- // }
- return ['code' => 0,'msg' => '订单支付成功'];
- }
- }
- }
- // 查询付款码支付后订单状态
- private function checkOrderPay($order,$num = 0){
- sleep(5);
- if($num >= 45){
- return ['result_code'=>'FAIL','data' => '支付超时'];
- }
- $num += 5;
- if (is_profit_pay()) {
- $result = WechatNewPay::orderQuery($order);
- }else{
- $result = WechatPay::orderQuery($order);
- }
- if($result['return_code'] == 'SUCCESS'){
- if($result['trade_state'] == 'USERPAYING'){
- return $this->checkOrderPay($order,$num);
- }else{
- return $result;
- }
- }
- }
- /**
- * 设置佣金
- * @param Order $order
- * @return mixed
- */
- private function setReturnData($order)
- {
- $form = new ShareMoneyForm();
- $form->order = $order;
- $form->order_type = 0;
- 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) {
- $goodsNum = Goods::getBuyNum($this->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 (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;
- }
- }
|