where(['is_del' => CommonModel::$del_normal, 'id' => $data['addr_id'], 'uid' => self::$aid]) ->findOrEmpty() ->isEmpty(); if ($rs) throw new Exception('该地址不存在'); $amount = '0';//支付金额 $num = array_column($data['list'], 'num', 'id');// $date = date('Y-m-d H:i:s'); $masterOrderCode = make_no('MS'); //主订单数据 $insert_master_order = [ 'masterOrderCode' => $masterOrderCode, 'uid' => self::$aid, 'type' => $data['type'], 'createrid' => self::$aid, 'creater' => self::$aname, 'addtime' => $date, 'updaterid' => self::$aid, 'updater' => self::$aname, 'updatetime' => $date, ]; //子订单数据 $insert_order = []; //库存变动记录数据 $insert_inventory_exchange_log = []; //兑换商品 if ($data['type'] == MasterOrderModel::$type_exchange_good) { $rs = GoodModel::alias('a') ->leftJoin('inventory_exchange c', 'c.account_id=' . self::$aid . ' AND c.good_id=a.id') ->whereIn('a.id', array_column($data['list'], 'id')) ->where(['a.is_del' => CommonModel::$del_normal, 'a.status' => CommonModel::$status_normal, 'type' => GoodModel::$type_exchange]) ->column('a.id,a.good_code,a.good_name,a.moq,c.inventory,c.id inventory_id', 'a.id'); if (empty($rs)) throw new Exception('购买的商品不存在或已禁用'); $i = 0; $orderCode = make_no('QR'); $orderCode = substr($orderCode, 0, -2) . str_pad($i, 2, '0', STR_PAD_LEFT); foreach ($rs as $item) { if ($item['moq'] > $num[$item['id']]) throw new Exception($item['good_name'] . '不满足起订量,' . $item['moq']); if ($item['inventory'] < $num[$item['id']]) throw new Exception($item['good_name'] . '的库存数不足'); $insert_order[] = [ 'masterOrderCode' => $masterOrderCode, 'orderCode' => $orderCode, 'company_id' => self::$company_id, 'card_id' => self::$card_id, 'uid' => self::$aid, 'child_id' => $item['id'], 'num' => $num[$item['id']], 'price' => 0, 'total_price' => 0, 'addr_id' => $data['addr_id'], 'type' => $data['type'], 'status' => MasterOrderModel::$order_status_not_deliver, 'is_del' => CommonModel::$del_normal, 'createrid' => self::$aid, 'creater' => self::$aname, 'addtime' => $date, 'updaterid' => self::$aid, 'updater' => self::$aname, 'updatetime' => $date, ]; //扣减库存 $after_inventory = bcsub($item['inventory'], $num[$item['id']]); //添加库存变动记录 $insert_inventory_exchange_log[] = [ 'inventory_exchange_id' => $item['inventory_id'], 'before_inventory' => $item['inventory'], 'after_inventory' => $after_inventory, 'flag' => '-1', 'good_id' => $item['id'], 'good_code' => $item['good_code'], 'good_name' => $item['good_name'], 'source' => CommonModel::$source_account, 'createrid' => self::$aid, 'creater' => self::$aname, 'addtime' => $date ]; //扣减库存 InventoryExchangeModel::where('id', $item['inventory_id']) ->save(['inventory' => $after_inventory, 'updaterid' => self::$aid, 'updater' => self::$aname, 'updatetime' => $date]); $i++; } //更新主订单表数据 $insert_master_order = array_merge($insert_master_order, [ 'wx_openId' => '', 'prepay_info' => '', 'amount' => $amount, 'transaction_id' => '', 'trade_type' => '', 'notify_result' => '', 'expiretime' => $date, 'status' => MasterOrderModel::$order_status_not_deliver, ]); $res = ['is_need_pay' => 0, 'result' => '']; } else { $openId = AccountModel::where(['id' => self::$aid, 'is_del' => CommonModel::$del_normal]) ->value('wx_openId', ''); if ($openId == '') return json_show(CommonModel::$error_token, '获取账户openId失败,请重新登录'); switch ($data['type']) { //服务订单 case MasterOrderModel::$type_service: $rs = ServiceModel::field('id,original_price,activity_price,title,activity_status') ->whereIn('id', array_column($data['list'], 'id')) ->where(['is_del' => CommonModel::$del_normal, 'status' => CommonModel::$status_normal]) ->select() ->toArray(); if (empty($rs)) throw new Exception('购买的服务不存在或已下架'); $i = 0; $orderCode = make_no('QR'); $orderCode = substr($orderCode, 0, -2) . str_pad($i, 2, '0', STR_PAD_LEFT); foreach ($rs as $item) { //单价 if ($item['activity_status'] == ServiceModel::$activity_status_ing) $price = $rs['activity_price']; else $price = $rs['original_price']; $total_price = bcmul($price, $num[$item['id']] ?? 0, 2);//总价 $amount = bcadd($amount, $total_price, 2);//总金额 $insert_order[] = [ 'masterOrderCode' => $masterOrderCode, 'orderCode' => $orderCode, 'company_id' => self::$company_id, 'card_id' => self::$card_id, 'uid' => self::$aid, 'child_id' => $item['id'], 'num' => $num[$item['id']] ?? 0, 'price' => $price, 'total_price' => $total_price, 'addr_id' => $data['addr_id'], 'type' => $data['type'], 'status' => MasterOrderModel::$order_status_wait_pay, 'is_del' => CommonModel::$del_normal, 'createrid' => self::$aid, 'creater' => self::$aname, 'addtime' => $date, 'updaterid' => self::$aid, 'updater' => self::$aname, 'updatetime' => $date, ]; $i++; } break; //商城商品订单 case MasterOrderModel::$type_shopping_good: $rs = GoodModel::alias('a') ->leftJoin('inventory_exchange c', 'c.account_id=' . self::$aid . ' AND c.good_id=a.id') ->whereIn('a.id', array_column($data['list'], 'id')) ->where(['a.is_del' => CommonModel::$del_normal, 'a.status' => CommonModel::$status_normal, 'type' => GoodModel::$type_shopping]) ->column('a.id,a.good_code,a.good_name,a.moq,a.price,c.inventory,c.id inventory_id', 'a.id'); if (empty($rs)) throw new Exception('购买的商品不存在或已禁用'); $i = 0; $orderCode = make_no('QR'); $orderCode = substr($orderCode, 0, -2) . str_pad($i, 2, '0', STR_PAD_LEFT); foreach ($rs as $item) { if ($item['moq'] > $num[$item['id']]) throw new Exception('不满足该商品的起订量,' . $item['moq']); if ($item['inventory'] < $num[$item['id']]) throw new Exception('库存数不足'); $total_price = bcmul($rs['price'], $num[$item['id']] ?? 0, 2);//总价 $amount = bcadd($amount, $total_price, 2);//总金额 $order_insert[] = [ 'masterOrderCode' => $masterOrderCode, 'orderCode' => $orderCode, 'company_id' => self::$company_id, 'card_id' => self::$card_id, 'uid' => self::$aid, 'child_id' => $item['id'], 'num' => $num[$item['id']], 'price' => $rs['price'], 'total_price' => $total_price, 'addr_id' => $data['addr_id'], 'type' => $data['type'], 'status' => MasterOrderModel::$order_status_wait_pay, 'is_del' => CommonModel::$del_normal, 'createrid' => self::$aid, 'creater' => self::$aname, 'addtime' => $date, 'updaterid' => self::$aid, 'updater' => self::$aname, 'updatetime' => $date, ]; //扣减库存 $after_inventory = bcsub($item['inventory'], $num[$item['id']]); //添加库存变动记录 $insert_inventory_exchange_log[] = [ 'inventory_exchange_id' => $item['inventory_id'], 'before_inventory' => $item['inventory'], 'after_inventory' => $after_inventory, 'flag' => '-1', 'good_id' => $item['id'], 'good_code' => $item['good_code'], 'good_name' => $item['good_name'], 'source' => CommonModel::$source_account, 'createrid' => self::$aid, 'creater' => self::$aname, 'addtime' => $date ]; //扣减库存 InventoryExchangeModel::where('id', $item['inventory_id']) ->save(['inventory' => $after_inventory, 'updaterid' => self::$aid, 'updater' => self::$aname, 'updatetime' => $date]); $i++; } break; } //获取预支付信息, //@todo body要写什么???????? $result = WechatLogic::getPrepayId($openId, '', $masterOrderCode, $amount); //更新主订单表数据 $insert_master_order = array_merge($insert_master_order, [ 'wx_openId' => $openId, 'prepay_info' => '',//预支付信息 'amount' => $amount, 'transaction_id' => '', 'trade_type' => '', 'notify_result' => '', 'expiretime' => $date, 'status' => MasterOrderModel::$order_status_wait_pay, ]); $res = ['is_need_pay' => 1, 'result' => $result]; } //处理数据 MasterOrderModel::create($insert_master_order)->save(); if ($insert_inventory_exchange_log) Db::name('inventory_exchange_log')->insertAll($insert_inventory_exchange_log); if ($insert_order) Db::name('order')->insertAll($insert_order); Db::commit(); return json_show(CommonModel::$success, '下单成功', $res); } catch (Exception $exception) { Db::rollback(); return json_show(CommonModel::$success, '下单失败,' . $exception->getMessage()); } } //微信支付成功后的异步通知及订单处理 public static function Notify() { Db::startTrans(); try { $notifyInfo = WechatLogic::Notify(); $pay_info = PayInfoModel::field('id,type,status') ->where('pay_code', $notifyInfo['out_trade_no']) ->findOrEmpty(); //要加lock吗? if ($pay_info->isEmpty()) throw new Exception('该支付信息不存在'); //待处理 if ($pay_info->status == MasterOrderModel::$order_status_wait_pay) { $updatetime = date('Y-m-d H:i:s'); PayInfoModel::where(['pay_code' => $notifyInfo['out_trade_no'], 'status' => MasterOrderModel::$order_status_wait_pay, 'id' => $pay_info->id]) ->save([ 'status' => MasterOrderModel::$order_status_not_deliver, 'updaterid' => '0', 'updater' => '微信支付', 'updatetime' => $updatetime, 'transaction_id' => $notifyInfo['transaction_id'], 'trade_type' => $notifyInfo['trade_type'], 'notify_result' => json_encode($notifyInfo, JSON_UNESCAPED_UNICODE), ]); if ($pay_info->type == GoodModel::$type_exchange) { //兑换商品订单 Db::name('order') ->where(['is_del' => CommonModel::$del_normal, 'pay_info_id' => $pay_info->id, 'status' => MasterOrderModel::$order_status_wait_pay]) ->update([ 'updaterid' => '0', 'updater' => '微信支付', 'updatetime' => $updatetime, 'status' => MasterOrderModel::$order_status_not_deliver ]); } else { //服务订单 Db::name('order_service') ->where(['is_del' => CommonModel::$del_normal, 'pay_info_id' => $pay_info->id, 'status' => MasterOrderModel::$order_status_wait_pay]) ->update([ 'updaterid' => '0', 'updater' => '微信支付', 'updatetime' => $updatetime, 'status' => MasterOrderModel::$order_status_not_deliver ]); } } Db::commit(); return xml(['return_code' => 'SUCCESS', 'return_msg' => 'DEAL WITH SUCCESS']); } catch (Exception $exception) { Db::rollback(); return xml(['return_code' => 'FAIL', 'return_msg' => $exception->getMessage()]); } // 返回XML状态,至于XML数据可以自己生成,成功状态是必须要返回的。 // // return_code> // return_msg> // } //查询支付结果 public static function checkPayResult(string $pay_code = ''): Json { $rs = PayInfoModel::field('id,status') ->where(['pay_code' => $pay_code, 'uid' => self::$aid]) ->findOrEmpty() ->toArray(); if (empty($rs)) return json_show(CommonModel::$error_param, '该支付信息不存在'); if ($rs['status'] == MasterOrderModel::$order_status_wait_pay) { //待支付时,手动去微信端查验是否支付完成(有可能异步通知到的晚,尚未更新状态) $temp = WechatLogic::checkPayResult($pay_code); $rs['status'] = $temp['RESULT_CODE'];//????@todo } return json_show(CommonModel::$success, '请求成功', ['result' => $rs['status']]); } }