getWxpayModel() ->where('payment_method', $payment_method) ->where('status', PayConstants::WXPAY_STATUS_ON) ->find(); if (!$pay) { throw new \Exception('支付方式不存在,请换一种支付方式'); } $this->oWxPay = (new WxPayObject())->bind($pay->toArray()); $this->oOrder = new OrderObject(); return $this; } /** * 设置用户属性 * @param UserObject $user * @return $this */ public function setUser(UserObject $user) { $this->oUser = $user; return $this; } /** * 获取用户属性 * @return UserObject */ public function getUser() { return $this->oUser; } /** * 设置主动参数 * @param $wxPayParams * @return $this */ public function setParams($wxPayParams) { $this->oWxPayParams = (new WxPayParamsObject())->bind($wxPayParams); return $this; } /** * 检查活动是否有效 * @param null $activity_id * @return ReturnObject */ public function checkActivity($activity_id = null) { if (!$activity_id) { $activity_id = $this->oWxPayParams->activityId; } if (!$activity_id) { return $this->getReturn(); } $activity = ActivityService::instance()->getActivityModel()->where('id', $activity_id)->find(); if (!$activity) { return $this->setCode(ErrorCodeConstants::PARAMS_ERROR_INVALID)->setMsg('活动不存在')->getReturn(); } if ($activity['starttime'] > time() || $activity['endtime'] < time()) { return $this->setCode(ErrorCodeConstants::PARAMS_ERROR_INVALID)->setMsg('活动未进行')->getReturn(); } return $this->getReturn(); } /** * @return \app\main\model\object\ReturnObject|array */ public function saveOrder() { try { $goods_id = $this->oWxPayParams->id ?? 0; if (!$this->mGoods = GoodsService::instance()->getGoodsModel()->getGoodsInfoById($goods_id)) { throw new \Exception('商品不存在'); } $checkActivity = $this->checkActivity(); if ($checkActivity->code != ErrorCodeConstants::SUCCESS) { return $checkActivity; } //初始化订单信息 $this->initOrderInfo(); $cacheKey = OrderService::instance()->getOrderCacheKey($this->oOrder)->data; if ($cache = Redis::instance()->get($cacheKey)) { LogService::debug('调用缓存:' . $cacheKey . ':' . $cache); return $this->setData(json_decode($cache, true))->getReturn(); } //订单扣量&订单转移 list($admin_id, $group_id) = $this->initOrderDeductionOrTransfer(); $this->oOrder->admin_id = $admin_id; //订单赏金处理 $this->initOrderReward(); //三方平台订单创建 $pay_json = $this->createOrder(); //系统创建订单 if (!$ordersId = OrderService::instance()->getOrderModel()->insertGetId($this->oOrder->toArray())) { throw new \Exception("订单创建失败"); } if ($pay_json->code == ErrorCodeConstants::SUCCESS) { $pay_json->data['order_id'] = $this->oOrder->out_trade_no; Redis::instance()->setex($cacheKey, PayConstants::getPayTimeoutSeconds(), json_encode($pay_json->data)); } //统计相关信息,扣量不统计 if (!$this->oOrder->deduct) { $channel_id = WebUserService::instance()->getUserChannelId()->data; $business = $this->oWxPayParams->businessLine ?? PayConstants::BUSINESS_APP; OrderCollectService::instance()->addCreateOrderCollect($this->oOrder->user_id, $admin_id, (bool)$this->oOrder->day, $channel_id, $group_id, $business, (bool)$this->oOrder->activity_id); } return $pay_json; } catch (\Exception $e) { return $this->setCode(ErrorCodeConstants::EXCEPTION)->setMsg($e->getMessage())->getReturn(); } } /** * 订单扣量与转移 */ protected function initOrderDeductionOrTransfer() { $admin_id = WebUserService::instance()->getUserAdminId()->data; $group_id = model('AuthGroupAccess')->getGroupId($admin_id); $channel_id = $this->oUser->channel_id; $is_activity = (bool)$this->oWxPayParams->activityId; try { if ($channel_id) {//订单KL if ($adminInfo = AdminKlService::instance()->orderKL($admin_id, $channel_id, $this->oOrder->toArray(), $is_activity)->data) { $this->oOrder->deduct = OrderContents::ORDER_DEDUCT_YES; $this->oOrder->admin_id = $adminInfo['admin_id']; $this->oOrder->resource_id = $admin_id; } } if ($group_id == AdminConstants::ADMIN_GROUP_ID_AGENT && empty($this->oOrder->deduct)) { //订单ZY if ($adminInfo = AdminKlService::instance()->orderTransfer($admin_id, $channel_id, $this->oOrder->toArray(), $is_activity)) { $this->oOrder->benefit = $adminInfo['benefit']; $this->oOrder->money_benefit = round($this->mGoods['money'] * $adminInfo['benefit'], 2); $this->oOrder->admin_id = $channel_id; $this->oOrder->resource_id = $admin_id; $admin_id = $channel_id; $group_id = AdminConstants::ADMIN_GROUP_ID_CHANNEL; } } } catch (\Exception $e) { LogService::error('订单KL失败, Error:' . $e->getMessage()); } return [$admin_id, $group_id]; } /** * 订单的赏金处理 */ final protected function initOrderReward() { $admin_id = WebUserService::instance()->getUserAdminId()->data; $adminExtend = AdminService::instance()->getAdminExtendModel()->getInfo($this->oOrder->admin_id); $is_activity = (bool)$this->oWxPayParams->activityId; $group_id = model('AuthGroupAccess')->getGroupId($admin_id); //不是活动订单,如果订单没有扣量也没有转移,判断订单是否有赏金 if ( !$is_activity && empty($this->oOrder->deduct) && empty($this->oOrder->resource_id) && $group_id == 4 && !empty($adminExtend['invite_id']) ) { $invite_admin = model('AdminExtend')->where(['admin_id' => $adminExtend['invite_id']])->find(); $admin_agent = model('Admin')->where('id', $adminExtend['invite_id'])->find(); if ($invite_admin && $admin_agent['status'] == 'normal') { $this->oOrder->reward_money = round($this->mGoods['money'] * $invite_admin['reward_benefit'], 2); $this->oOrder->reward_admin_id = $adminExtend['invite_id']; $this->oOrder->reward_benefit = $invite_admin['reward_benefit']; } } } /** * 初始化订单信息 */ protected function initOrderInfo() { $this->oOrder->admin_id = WebUserService::instance()->getUserAdminId()->data; $adminExtend = AdminService::instance()->getAdminExtendModel()->getInfo($this->oOrder->admin_id); $benefit = $adminExtend['benefit']; if($this->oWxPay->business_line == PayConstants::BUSINESS_APP){ $benefit = $adminExtend['benefit_app']; } //初始化订单信息 $this->oOrder->user_id = $this->oUser->id; $this->oOrder->benefit = $benefit; $this->oOrder->money = $this->mGoods['money']; $this->oOrder->money_benefit = round($this->mGoods['money'] * $benefit, 2); $this->oOrder->category = $this->mGoods['category_id']; $this->oOrder->ip = Ip::ip(); $this->oOrder->referral_id = $this->oUser->referral_id; $this->oOrder->referral_id_permanent = $this->oUser->referral_id_permanent; $this->oOrder->book_id = $this->oWxPayParams->bookId; $this->oOrder->chapter_id = $this->oWxPayParams->chapterId; $this->oOrder->goods_id = $this->mGoods['id']; $this->oOrder->kandian = $this->mGoods['kandian']; $this->oOrder->free_kandian = $this->mGoods['free_kandian']; $this->oOrder->day = $this->mGoods['day']; $this->oOrder->type = $this->mGoods['type']; $this->oOrder->state = OrderContents::ORDER_STATE_TO_PAY; $this->oOrder->activity_id = $this->oWxPayParams->activityId; $this->oOrder->wxpay_id = $this->oWxPay->id; $this->oOrder->payment_method = $this->oWxPay->payment_method; $this->oOrder->createtime = time(); $this->oOrder->updatetime = time(); $this->oOrder->business_line = $this->oWxPay->business_line; $this->oOrder->ext = $this->oUser->ext; //需要三方支付补充信息 $this->oOrder->payid = ''; $this->oOrder->pay_json = ''; $this->oOrder->out_trade_no = ''; $this->oOrder->pdorderid = ''; } /** * 获取订单编号 * @param $user_id * @return \app\main\model\object\ReturnObject */ protected function getOutTradeNo($user_id) { $number = date('YmdHis') . '_' . $user_id . '_' . Random::build('alnum', 4); return $this->setData($number)->getReturn(); } /** * 获取跳转地址 * @return \app\main\model\object\ReturnObject */ public function getRedirectUrl() { $url = $_SERVER['HTTP_REFERER'] ?? ''; if ($url) { $referral = parse_url($url); $url = $referral['scheme'] . '://' . $referral['host'] . $referral['path'] . '?status=return'; } return $this->setData($url)->getReturn(); } /** * 调用第三方服务创建订单 * @return ReturnObject */ abstract function createOrder(); }