fail(700003, [], '暂时请私下和群主联系'); // } $uid = $request->uid; $r = $this->_create_order($request); if($r['code'] != 200){ return $this->fail($r['code'], _array_key($r, 'data', []), $r['msg']); } //支付需要资料 $openid = WxUser::where('id', $uid)->value('weixin_openid'); $appid = Settings::get('app_id'); $mch_id = Settings::get('mch_id'); $key = Settings::get('mch_secret'); $out_trade_no = $r['orderSn']; $body = Settings::get('app_title') . 'SHOP购物'; $total_fee = $r['order_amount']; if(_empty_($openid)){ return $this->fail(200043, [ 'title' => '未绑定微信', 'content' => '还没有获取到您的小程序openId,无法拉起支付', 'confirmText' => '去绑定', 'target_type' => 6, 'target_id' => '/pagesA/mine/editmine/accountbind' ], '未绑定微信'); } return $this->payHandler($uid, 'wxpay', 'mini', $total_fee, $body, $out_trade_no, 2); // // 发起支付 // $payObject = new WeixinPay($appid, $openid, $mch_id, $key, $out_trade_no, $body, $total_fee); // $pay_result = $payObject->pay(); // if(_array_key($pay_result, 'return_code', '') == 'FAIL'){ // return $this->fail(200014, [], $pay_result['return_msg']); // }else{ // return $this->success($pay_result); // } } /** app商品统一下单地址 * @param Request $request */ public function orderForApp(Request $request){ if(!in_array($request->provider, ['wxpay', 'alipay'])){ return $this->fail(200004, ['msg'=>'provider参数仅支持wxpay/alipay']); } if(!in_array($request->pay_type, ['app', 'h5', 'yi', 'code', 'code_pc'])){ return $this->fail(200004, ['msg'=>'pay_type参数仅支持app/h5/yi/code']); } $uid = $request->uid; $r = $this->_create_order($request); if($r['code'] != 200){ return $this->fail($r['code'], _array_key($r, 'data', []), $r['msg']); } // 共同的资料 $total_fee = $r['order_amount']; $body = Settings::get('app_title') . 'SHOP购物'; $out_trade_no = $r['orderSn']; $pay_type = $request->pay_type; global $__MINI_GLOBAL_DEVICE__; if($__MINI_GLOBAL_DEVICE__ == 'h5' && _empty_default_($request->h5_browser, '') == 'wxclient'){ $pay_type = 'mp'; } return $this->payHandler($uid, $request->provider, $pay_type, $total_fee, $body, $out_trade_no, 2); } private function _create_order(Request $request){ DB::beginTransaction(); try { $r = ['code'=>0,'msg'=>'', 'orderSn'=>'', 'order_amount'=>0, 'orderId'=>0]; $uid = $request->uid; $aid = $request->aid; $user_remark = $request->user_remark; $goods_amount = $request->goods_amount; $discounts_amount = $request->discounts_amount; $order_amount = $request->order_amount; $order_goods = $request->order_goods; $random_str_ = _empty_default_($request->random_str_, ''); // 用于检验程序 $buy_user = WxUser::where('id', $uid)->first(); if (_empty_($buy_user) || _empty_($order_goods)) { DB::rollBack(); $r['code'] = 200001; return $r; } $is_vip = $buy_user->is_member; $acculate_amount = 0; $acculate_vip_amount = 0; $seller_user_id = null; // 0:电商 6:二手 7: 组局 $order_from = 0; $contact_id = 0; $order_goods_id = []; $goods_type_arr = []; foreach ($order_goods as $order_good){ $goods_type_arr[] = $order_good['goods_type']; if($order_good['goods_type'] == 6){ // 闲置 $the_used_good = WxUsedGood::where('id', $order_good['goods_id'])->where('status', 1)->first(); if($the_used_good){ $order_from = 6; $seller_user_id = $the_used_good->user_id; $order_goods_id[] = $the_used_good->id; if($the_used_good->price != $order_good['price']){ DB::rollBack(); $r['code'] = 200004; $r['msg'] = '参数1检验失败,疑似参数被纂改'; return $r; }else{ $acculate_amount += ($the_used_good->price * 1); $acculate_vip_amount += ($the_used_good->price * 1); } }else{ DB::rollBack(); $r['code'] = 200003; $r['msg'] = '订单中存在已售出的闲置商品'; return $r; } }else { $the_product = WxShopGoodsProduct::where([['id', '=', $order_good['product_id']], ['goods_id', '=', $order_good['goods_id']], ['state', '=', 0]])->first(); if ($the_product) { if($the_product['stock'] < 1){ DB::rollBack(); $r['code'] = 200004; $r['msg'] = '规格库存不足'; return $r; } if($order_good['goods_type'] == 5){ $WxShopGoods = WxShopGoods::where('id', $the_product->goods_id)->first(); $contact_id = $WxShopGoods->contact_id; } if ($the_product->price != $order_good['price'] || $the_product->vip_price != $order_good['vip_price']) { DB::rollBack(); $r['code'] = 200004; $r['msg'] = '参数1检验失败,疑似参数被纂改'; return $r; } else { $order_goods_id[] = $the_product->goods_id; $product_seller = WxShopGoods::where('id', $the_product->goods_id)->value('user_id'); if(_empty_($seller_user_id)){ $seller_user_id = $product_seller; }else{ if($seller_user_id == $product_seller){ }else{ $seller_user_id = null; } } $acculate_amount += ($the_product->price * $order_good['num']); $acculate_vip_amount += ($the_product->vip_price * $order_good['num']); } } else { DB::rollBack(); $r['code'] = 200003; return $r; } } } if(in_array(2, $goods_type_arr) || in_array(3, $goods_type_arr) || in_array(4, $goods_type_arr)){ if(count(array_unique($goods_type_arr)) > 1){ DB::rollBack(); $r['code'] = 200004; $r['msg'] = '虚拟,卡密商品不能和其他商品一起购买'; return $r; } } $acculate_order_amount = $is_vip ? $acculate_vip_amount : $acculate_amount; if(_abs($acculate_order_amount - $order_amount) >= 0.5 || _abs(($acculate_amount - $acculate_order_amount) - $discounts_amount) >= 0.5){ DB::rollBack(); $r['code'] = 200004; $r['msg'] = '参数2检验失败,疑似参数被纂改'; return $r; } // 纠正前端数据 $acculate_amount = round($acculate_amount, 2); $acculate_vip_amount = round($acculate_vip_amount, 2); $goods_amount = $acculate_amount; $discounts_amount = $is_vip ? round($acculate_amount - $acculate_vip_amount, 2) : 0; $order_amount = $is_vip ? $acculate_vip_amount : $acculate_amount; $orderSn = Utils::getSn(1);//生成订单号 if($contact_id > 0 && _empty_($aid)){ $addsinfo = [ 'id' => 0, 'name' => '', 'mobile' => '', 'province' => '', 'city' => '', 'county' => '', 'adds' => '', ]; }else{ $addsinfo = WxShopAddress::where('user_id', $uid)->where('id', $aid)->first();//获取配送地址 if(!$addsinfo){ DB::rollBack(); $r['code'] = 800003; return $r; } } //生成SHOP订单 $order_model = new WxShopOrder(); $order_model->user_id = $uid; $order_model->order_id = $orderSn;//订单号 $order_model->goods_amount = $goods_amount;//商品总价 $order_model->discounts_amount = $discounts_amount;//优惠金额 $order_model->order_amount = $order_amount;//订单总额 $order_model->adds_id = $addsinfo['id'];//收货地址id $order_model->adds_name = $addsinfo['name'];//收货人姓名 $order_model->adds_mobile = $addsinfo['mobile'];//收货人电话 $order_model->address = $addsinfo['province'] . $addsinfo['city'] . $addsinfo['county'] . $addsinfo['adds'];//收货详细地址 $order_model->contact_id = $contact_id; $order_model->user_remark = $user_remark;//用户备注 $order_model->pay_status = 1;//支付状态 1=未付款 2=已付款 3=已退款 $order_model->status = 0;//发货状态 0=正常 1=未发货 2=已发货 3=确认收货 4=已退货 5=取消 $order_model->order_from = $order_from; $order_model->order_goods_id = $order_goods_id; if($seller_user_id > 0){ // todo: 多商户这里需要拆订单 $order_model->seller_user_id = $seller_user_id; } $order_model->save(); $orderId = $order_model->id;//获取订单id // $_goods_amount = 0; $_order_amount = 0; //批量添加订单商品 $orderGoods = []; foreach ($order_goods as $k => $v) { if($v['goods_type'] == 6){ $the_used_good = WxUsedGood::where('id', $v['goods_id'])->where('status', 1)->first(); if ($the_used_good) { // 临时暂用 WxUsedGood::where('id', $v['goods_id'])->where('status', 1)->update(['status' => 7]); if($the_used_good->image_urls){ $the_used_good->pic = _array_key($the_used_good->image_urls[0], 'url', '') . ''; } $created_at = date('Y-m-d H:i:s', time()); $good_servers = [2]; $refund_deadline = Carbon::now()->addDays(7); if(in_array(1, $good_servers)){ $refund_deadline = Carbon::now(); $created_at = $refund_deadline; } $recharge = $the_used_good->price * 1; $_order_amount += $recharge; $_goods_amount += $the_used_good->price * 1; $orderGoods[$k]['pic'] = $the_used_good->pic; $orderGoods[$k]['name'] = $the_used_good->title; $orderGoods[$k]['product'] = ''; $orderGoods[$k]['vip_price'] = $the_used_good->price; $orderGoods[$k]['price'] = $the_used_good->price; $orderGoods[$k]['recharge'] = $recharge; $orderGoods[$k]['quantity'] = 1; $orderGoods[$k]['order_id'] = $orderId; $orderGoods[$k]['seller_user_id'] = $the_used_good->user_id; $orderGoods[$k]['buyer_user_id'] = $uid; $orderGoods[$k]['goods_id'] = $the_used_good->id; $orderGoods[$k]['goods_type'] = 6; $orderGoods[$k]['product_id'] = 0; $orderGoods[$k]['created_at'] = $created_at; $orderGoods[$k]['refund_deadline'] = $refund_deadline; }else{ DB::rollBack(); $r['code'] = 200003; return $r; } }else { $the_product = WxShopGoodsProduct::where('id', $v['product_id'])->first(); // 规格存在并且有存量时 if ($the_product) { $WxShopGoods = WxShopGoods::where('id', $the_product->goods_id)->first(); $good_servers = $WxShopGoods->service_id; if (_empty_($good_servers)) { $good_servers = '[]'; } $created_at = date('Y-m-d H:i:s', time()); $good_servers = json_decode($good_servers, true); $refund_deadline = Carbon::now()->addDays(7); if (in_array(1, $good_servers)) { $refund_deadline = Carbon::now(); $created_at = $refund_deadline; } $recharge = $is_vip ? $the_product->vip_price * $v['num'] : $the_product->price * $v['num']; $_order_amount += $recharge; $_goods_amount += $the_product->price * $v['num']; $orderGoods[$k]['pic'] = $the_product->pic; $orderGoods[$k]['name'] = $v['goods_name']; $orderGoods[$k]['product'] = $the_product->param_value; $orderGoods[$k]['vip_price'] = $the_product->vip_price; $orderGoods[$k]['price'] = $the_product->price; $orderGoods[$k]['recharge'] = $recharge; $orderGoods[$k]['quantity'] = $v['num']; $orderGoods[$k]['order_id'] = $orderId; $orderGoods[$k]['seller_user_id'] = $WxShopGoods->user_id ?: 0; $orderGoods[$k]['buyer_user_id'] = $uid; $orderGoods[$k]['goods_id'] = $the_product->goods_id; $orderGoods[$k]['goods_type'] = $WxShopGoods->type; $orderGoods[$k]['product_id'] = $the_product->id; $orderGoods[$k]['created_at'] = $created_at; $orderGoods[$k]['refund_deadline'] = $refund_deadline; } else { DB::rollBack(); $r['code'] = 200003; return $r; } } } $ogModel = new WxShopOrderGoods(); $ogModel->addAll($orderGoods); //修改购物车数据 if(_empty_default_($request->cart_id, 0) > 0){ WxShopCart::where('id', _empty_default_($request->cart_id, 0))->update(['state' => 2]); }else{ WxShopCart::where('user_id', $uid)->where('is_check', 1)->where('state', 0)->update(['state' => 2]); } if($random_str_){ Cache::put(md5('shop:order:random:'.$random_str_), $orderId, 60); } DB::commit(); $r['code'] = 200; $r['orderSn'] = $orderSn; $r['order_amount'] = $order_amount; $r['orderId'] = $orderId; return $r; } catch (\Exception $e) { DB::rollBack(); _logger_(__file__, __line__, $e->getMessage()); $r['code'] = 200002; return $r; } } /** * Shop订单列表Count */ public function getOrderCount(Request $request) { $uid = $request->uid; $seller = _empty_default_($request->seller, 0); return $this->success(ShopUtils::get_order_count($uid, $seller == 1)); } /** * Shop订单列表 */ public function getOrderList(Request $request) { $uid = $request->uid; $type = $request->type; $seller = _empty_default_($request->seller, 0); $yesterday = date("Y-m-d H:i:s", strtotime("-2 hours")); //清除超时未支付订单 WxShopOrder::where('user_id', $uid)->where('pay_status', 1)->where('status', 0) ->where('created_at', '<', $yesterday) ->update(['status' => 5]); if($seller == 1){ if ($type == 1) { $data = WxShopOrder::where('seller_user_id', $uid) ->where('pay_status', 1)->where('status', 0) ->orderBy('created_at', 'desc') ->paginate(6); } else if ($type == 2) { $data = WxShopOrder::where('seller_user_id', $uid) ->where('pay_status', 2)->where('status', 1) ->orderBy('created_at', 'desc') ->paginate(6); } else if ($type == 3) { $data = WxShopOrder::where('seller_user_id', $uid) ->where('pay_status', 2)->where('status', 2) ->orderBy('created_at', 'desc') ->paginate(6); } else if ($type == 4) { // 退款中 $order_ids = WxShopOrderGoods::select('order_id')->whereIn('state', [1,2])->whereIn('order_id', function ($query) use($uid){ $query->select('id')->from('wx_shop_order')->where('seller_user_id', $uid)->whereIn('status', [1, 2, 7]); })->distinct()->pluck('order_id')->toArray(); $data = WxShopOrder::whereIn('id', $order_ids) ->orderBy('created_at', 'desc') ->paginate(6); } else { if(UserUtils::is_mini_supder_admin($uid)){ $data = WxShopOrder::whereIn('seller_user_id', [$uid, 0]) ->where('status', '<>', 6) ->orderBy('created_at', 'desc') ->paginate(6); }else{ $data = WxShopOrder::where('seller_user_id', $uid) ->where('status', '<>', 6) ->orderBy('created_at', 'desc') ->paginate(6); } } $data->map(function ($v) { $v->goods = WxShopOrderGoods::where('order_id', $v->id)->get(); $has_refund_good = false; $face_to_face = 0; if($v->status == 8){ ShopOrderDeliverInfoManage::dispatch('query', $v->id, null); }else if($v->status == 10){ ShopOrderDeliverInfoManage::dispatch('virtual-query', $v->id, null); }else if($v->status == 9){ ShopOrderDeliverInfoManage::dispatch('virtual-upload', $v->id, null); } if($v->goods){ $v->goods->map(function ($good, $k) use (&$has_refund_good, &$face_to_face){ if($good->state == 1 || $good->state == 2){ $has_refund_good = true; } if($good->goods_type == 6){ if(WxUsedGood::where('id', $good->goods_id)->value('is_self_pickup') == 1){ $face_to_face = 1; } }else if($good->goods_type == 5){ $face_to_face = 2; }else if($good->goods_type == 7){ $face_to_face = 3; } return $good; }); } if($face_to_face > 0){ $order_coupon = WxShopOrderCoupon::where('order_id', $v->id)->first(); if($order_coupon && $order_coupon->scanner > 0){ $order_coupon->scan_user = UserUtils::get_cached_user($order_coupon->scanner); $v->order_coupon = $order_coupon; } } // 全部退款中就是7,这个表达商品列表中是否有退款中商品 $v->has_refund = $has_refund_good ? 1 : 0; // 支持面对面 0:不支持 1:二手的支持 2:核销的支持 3: 组局的核销 $v->face_to_face = $face_to_face > 0 ? $face_to_face : 0; $v->status_text = self::orderStatusText($v->pay_status, $v->status); }); return $this->success($data); }else{ if ($type == 1) { $data = WxShopOrder::where('user_id', $uid) ->where('pay_status', 1)->where('status', 0) ->orderBy('created_at', 'desc') ->paginate(6); } else if ($type == 2) { $data = WxShopOrder::where('user_id', $uid) ->where('pay_status', 2)->where('status', 1) ->orderBy('created_at', 'desc') ->paginate(6); } else if ($type == 3) { $data = WxShopOrder::where('user_id', $uid) ->where('pay_status', 2)->where('status', 2) ->orderBy('created_at', 'desc') ->paginate(6); } else if ($type == 4) { $data = WxShopOrder::where('user_id', $uid) ->where('pay_status', 2)->where('status', 3) ->orderBy('created_at', 'desc') ->paginate(6); } else { $data = WxShopOrder::where('user_id', $uid) ->where('status', '<>', 6) ->orderBy('created_at', 'desc') ->paginate(6); } $data->map(function ($v) { $v->goods = WxShopOrderGoods::where('order_id', $v->id)->get(); $has_refund_good = false; $face_to_face = 0; if($v->goods){ $v->goods->map(function ($good, $k) use (&$has_refund_good, &$face_to_face){ if($good->state == 1 || $good->state == 2){ $has_refund_good = true; } if($good->goods_type == 6){ if(WxUsedGood::where('id', $good->goods_id)->value('is_self_pickup') == 1){ $face_to_face = 1; } }else if($good->goods_type == 5){ $face_to_face = 2; }else if($good->goods_type == 7){ $face_to_face = 3; } return $good; }); } // 全部退款中就是7,这个表达商品列表中是否有退款中商品 $v->has_refund = $has_refund_good ? 1 : 0; // 支持面对面 0:不支持 1:二手的支持 2:核销的支持 3:组局的核销 $v->face_to_face = $face_to_face > 0 ? $face_to_face : 0; $v->status_text = self::orderStatusText($v->pay_status, $v->status); }); return $this->success($data); } } /** * 订单状态 * @param $pay_status * @param $status */ public static function orderStatusText($pay_status, $status) { $text = ''; if ($pay_status == 1 && $status == 0) { $text = '待支付(2分钟内有效)'; } else if ($pay_status == 2 && $status == 1) { $text = '待发货'; } else if ($pay_status == 2 && $status == 2) { $text = '待收货'; } else if ($pay_status == 2 && $status == 3) { $text = '待晒单'; } else if ($pay_status == 1 && $status == 5) { $text = '已取消'; } else if ($pay_status == 3 && $status == 4) { $text = '已退款'; } else if ($pay_status == 2) { if($status == 8){ $text = '待收货'; }else if($status == 9){ $text = '待发货'; }else if($status == 10){ $text = '需微信收货'; } } return $text; } /** * Shop删除订单 */ public function delOrder(Request $request) { $uid = $request->uid; $oid = $request->oid; $r = WxShopOrder::where('user_id', $uid)->where('id', $oid)->whereIn('status', [5, 4, 3]) ->update(['status' => 6]); if($r){ return $this->success(); } return $this->fail(200004); } /** * Shop取消订单 */ public function cancelOrder(Request $request) { $uid = $request->uid; $oid = $request->oid; $random_str_ = _empty_default_($request->random_str_, ''); if(_empty_($oid)){ if(!_empty_($random_str_)){ $oid = Cache::get(md5('shop:order:random:'.$random_str_)); } } if(_empty_($oid)){ return $this->fail(200001); } DB::beginTransaction(); try { if(WxShopOrder::where('user_id', $uid)->where('id', $oid)->where('pay_status', 1)->where('status', 0)->exists()){ // todo: WxShopOrderGoods::where('order_id', $oid)->get()->map(function ($v2){ // 库存返还 $rows = ->delete(); if($v2->goods_type == 6){ // 二手 WxUsedGood::where('id', $v2->goods_id)->where('status', 7)->update([ 'status' => 1 ]); }else{ WxShopGoodsProduct::where('id', $v2->product_id)->where('state', 0)->increment('stock', (int)($v2->quantity)); } }); WxShopOrder::where('user_id', $uid)->where('id', $oid)->update(['status' => 5]); DB::commit(); return $this->success(); } DB::rollBack(); return $this->fail(200000); } catch (\Exception $e) { DB::rollBack(); _logger_(__file__, __line__, $e->getMessage()); return $this->fail(200002); } } /** * Shop重新付款 */ public function payment(Request $request) { $uid = $request->uid; $openid = WxUser::where('id', $uid)->value('weixin_openid'); $appid = Settings::get('app_id'); $mch_id = Settings::get('mch_id'); $key = Settings::get('mch_secret'); $out_trade_no = $request->orderSn; $body = Settings::get('app_title').'SHOP购物'; $total_fee = $request->order_amount; return $this->payHandler($uid, 'wxpay', 'mini', $total_fee, $body, $out_trade_no, 2); // $payObject = new WeixinPay($appid, $openid, $mch_id, $key, $out_trade_no, $body, $total_fee); // $pay_result = $payObject->pay(); // if(_array_key($pay_result, 'return_code', '') == 'FAIL'){ // return $this->fail(200014, [], $pay_result['return_msg']); // }else{ // return $this->success($pay_result); // } } /** * App Shop重新付款 */ public function paymentForApp(Request $request) { if(!in_array($request->provider, ['wxpay', 'alipay'])){ return $this->fail(200004, ['msg'=>'provider参数仅支持wxpay/alipay']); } if(!in_array($request->pay_type, ['app', 'h5', 'yi', 'code', 'code_pc'])){ return $this->fail(200004, ['msg'=>'pay_type参数仅支持app/h5/yi/code']); } $uid = $request->uid; $out_trade_no = $request->orderSn; $total_fee = $request->order_amount; $body = Settings::get('app_title').'SHOP购物'; $pay_type = $request->pay_type; global $__MINI_GLOBAL_DEVICE__; if($__MINI_GLOBAL_DEVICE__ == 'h5' && _empty_default_($request->h5_browser, '') == 'wxclient'){ $pay_type = 'mp'; } return $this->payHandler($uid, $request->provider, $pay_type, $total_fee, $body, $out_trade_no, 2); } /** * 查询物流 * @param Request $request * @param $no 快递单号 * @return \Illuminate\Http\JsonResponse */ public function kuaidi(Request $request) { $no = $request->no;//快递单号 $type = _empty_default_($request->type, ''); $appcode = Settings::get('app_ali_wuliu_appcode');//换成你自己阿里云的appcode if(_empty_($no) || _empty_($appcode)){ return $this->fail(200001); } $formData = ['no'=>$no]; if(!_empty_($type)){ $formData['type'] = $type; if($type == 'SFEXPRESS'){ $adds_mobile = WxShopOrder::where('express_no', $no)->where('express_type', $type)->value('adds_mobile'); if($adds_mobile){ $no .= ':'.substr($adds_mobile, -4); $formData['no'] = $no; } } }else{ $shop_order = WxShopOrder::where('express_no', $no)->first(); if($shop_order){ $express_type = $shop_order->express_type; $formData['type'] = $express_type; if($express_type == 'SFEXPRESS'){ $adds_mobile = $shop_order->adds_mobile; if($adds_mobile){ $no .= ':'.substr($adds_mobile, -4); $formData['no'] = $no; } } } } $res = ApiUtils::ali_request($appcode, 'https://wuliu.market.alicloudapi.com/kdi', $formData); if($res){ if($res && $res['status'] == 0){ return $this->success($res['result']); } } if($res === null){ UserUtils::assistant_notice('admin', '【阿里全国快递物流查询】Api不可用,是不是服务没开通'); _logger_(__file__, __line__, '【阿里全国快递物流查询】Api不可用,是不是服务没开通'); } return $this->fail(200003, [], $data['msg'] ?? '暂时未查询到该订单'); } public function deliver(Request $request){ $uid = $request->uid; $action = _empty_default_($request->action, 'express'); if(!in_array($action, ['express', 'coupon'])){ return $this->fail(200004); } $remark = _empty_default_($request->remark, ''); if($action == 'express'){ $order_id = _empty_default_($request->order_id, 0); if(_empty_($order_id)){ return $this->fail(200001); } $WxOrder = WxShopOrder::find($order_id); if(!$WxOrder){ return $this->fail(200003); } if($WxOrder->seller_user_id != $uid && !UserUtils::is_mini_supder_admin($uid)){ return $this->fail(200000); } if($WxOrder->pay_status != 2 || $WxOrder->status != 1){ return $this->fail(200004, [], '该订单已不是待发货状态'); } $express_type = _empty_default_($request->express_type, ''); $express_no = _empty_default_($request->express_no, ''); if(_empty_($express_type) || _empty_($express_no)){ return $this->fail(200001); } $express = ''; $express_arr = ShopUtils::get_expree_name_range(); foreach ($express_arr as $item){ if($item['type'] == $express_type){ $express = $item['name']; break; } } if(_empty_($express)){ return $this->fail(200004, [], '未查找到该快递公司'); } $remark = strip_tags($remark); if(_empty_($remark)){ $remark = ''; } // 验证express_no是否可用 $flag = true; if(!$flag){ $appcode = Settings::get('app_ali_wuliu_appcode');//换成你自己阿里云的appcode if(_empty_($appcode)){ return $this->fail(200001, [], '管理员未配置阿里物流查询接口'); } // 顺丰特殊情况 if(_empty_($express_type)){ $shop_order = WxShopOrder::where('express_no', $express_no)->first(); if($shop_order){ $express_type = $shop_order->express_type; if($express_type == 'SFEXPRESS'){ $adds_mobile = $shop_order->adds_mobile; if($adds_mobile){ $express_no .= ':'.substr($adds_mobile, -4); } } } }else{ if($express_type == 'SFEXPRESS'){ $adds_mobile = WxShopOrder::where('express_no', $express_no)->where('express_type', $express_type)->value('adds_mobile'); if($adds_mobile){ $express_no .= ':'.substr($adds_mobile, -4); } } } $res = ApiUtils::ali_request($appcode, 'https://wuliu.market.alicloudapi.com/kdi', ['no'=>$express_no, 'type' => $express_type ]); if($res){ if($res && $res['status'] == 0){ $flag = true; }else{ return $this->fail(200004, [], $res['msg']); } } if(!$flag){ return $this->fail(200004, [], '未查找到物流信息'); } } DB::beginTransaction(); try { // todo: $ship_at = date('Y-m-d H:i:s', time()); WxShopOrder::where('id', $order_id)->update([ 'express' => $express, 'express_no' => $express_no, 'express_type' => $express_type, 'remark' => $remark, 'ship_at' => $ship_at, 'status' => 2, ]); $oinfo = WxShopOrder::where('id', $order_id)->first(); $nr = '您的订单:' . $oinfo['order_id'] . ' 由:' . $express . ':「' . $express_no . '」已经发出了。'; // 发送通知 UserUtils::add_user_notice(6001, $oinfo['user_id'], '商品发货通知', $nr, 100, '', $order_id); // 处理售后的催货 WxShopOrderAfter::where([ ['order_id', '=', $oinfo['order_id']], ['title', '=', '催发货'] ])->update([ 'state' => 1, ]); Cache::forget('total:todo:count'); Cache::forget('total:tenant:todo:count'); GatewayUtils::success(GatewayUtils::uid2client_id($uid), 17); GatewayUtils::success(GatewayUtils::uid2client_id($WxOrder->user_id), 17); GatewayUtils::success(GatewayUtils::uid2client_id($WxOrder->user_id), 12); DB::commit(); return $this->success([ 'express_no' => $express_no, 'express_type' => $express_type, ]); } catch (\Exception $e) { DB::rollBack(); _logger_(__file__, __line__, $e->getMessage()); return $this->fail(200006); } }else if($action == 'coupon'){ $code = _empty_default_($request->code, ''); $code = str_replace(' ', '', $code); if(_empty_($code)){ return $this->fail(200001); } $coupon = WxShopOrderCoupon::where('code', $code)->first(); if(!$coupon){ return $this->fail(200003); } if($coupon->status !== 0){ return $this->fail(200010, [], '该扫码卷已不可使用'); } $order_id = $coupon->order_id; $WxOrder = WxShopOrder::find($order_id); if(!$WxOrder){ return $this->fail(200003); } if($WxOrder->pay_status != 2 || $WxOrder->status != 1){ return $this->fail(200004, [], '订单不是已支付和待发货状态'); } $order_goods = WxShopOrderGoods::where('order_id', $WxOrder->id)->where('state', 0)->get()->toArray(); if(_empty_($order_goods)){ return $this->fail(200010, [], '参数错误'); } $scanners = []; if($WxOrder->order_from === 0){ $goods_id = $order_goods[0]['goods_id']; $scanners = WxShopGoods::where('id', $goods_id)->value('scanners'); $is_in_scanners = false; if($scanners){ if(is_string($scanners)){ $scanners = explode(',', $scanners); } } } if(_empty_($scanners)){ $scanners = []; } if(in_array($uid, $scanners)){ $is_in_scanners = true; } if($WxOrder->seller_user_id != $uid && !UserUtils::is_mini_supder_admin($uid) && !$is_in_scanners){ return $this->fail(200000, [], '您不是该订单的核销人'); } if($WxOrder->pay_status != 2 || $WxOrder->status != 1){ return $this->fail(200004, [], '该订单已不是待发货状态'); } $shopOrder = WxShopOrder::where('id', $order_id)->first(); // 先检查是否需要对接发货信息管理 $is_need_deliver_info_manage = false; if($shopOrder->serial_platform === 0 && $shopOrder->serial_platform_type == 'mini' && Settings::get('need_mini_deliver_info_manage', 0) == 1){ $is_need_deliver_info_manage = true; } if($is_need_deliver_info_manage){ $weapp = new WeApp('mini'); $manage = $weapp->getDeliverInfoManage(); $manage->selfPickUp($WxOrder, $uid); return $this->fail(200047, [ 'query_state_no' => ('wx_shoporder_' . $shopOrder->serial_number) ]); }else{ if(ShopUtils::coupon_to_finish($shopOrder, $uid, '')){ GatewayUtils::success(GatewayUtils::uid2client_id($uid), 17); GatewayUtils::success(GatewayUtils::uid2client_id($WxOrder->user_id), 17); return $this->success(); }else{ return $this->fail(200006); } } } } /** * Shop催发货 */ public function pushDelivery(Request $request) { $uid = $request->uid; // 长id $on = $request->on; $title = $request->title; $message = $request->message; $used_goods_id = []; // 自营 $system_shop_goods_id = []; // 短id $wxShopOrder = WxShopOrder::where('order_id', $on)->first(); if(_empty_($wxShopOrder)){ return $this->fail(200003); } $the_order_id = $wxShopOrder->id; WxShopOrderGoods::where('order_id', $the_order_id)->get()->map(function ($v) use (&$used_goods_id, &$system_shop_goods_id){ if($v->goods_type == 6){ $used_goods_id[] = $v->goods_id; }else{ $system_shop_goods_id[] = $v->goods_id; } }); if($used_goods_id){ foreach ($used_goods_id as $used_id){ $WxUsedGood = WxUsedGood::find($used_id); $user_id = $WxUsedGood->user_id; UserUtils::assistant_notice($user_id, '您的闲置商品(id: '.$WxUsedGood->id.')订单被催发货了,请您和购买者协商,达成一致的发货的时间约定'); } return $this->success(); } if($system_shop_goods_id){ $isExists = WxShopOrderAfter::where('user_id', $uid)->where('order_id', $on)->where('state', 0)->exists(); if ($isExists) { return $this->fail(800010); } else { $model = new WxShopOrderAfter(); $model->user_id = $uid; $model->seller_user_id = $wxShopOrder->user_id; $model->order_id = $on; $model->title = $title; $model->content = $message; $model->save(); return $this->success(); } } } /** 扫码劵 * @param Request $request */ public function orderCoupon(Request $request){ $uid = $request->uid; $action = _empty_default_($request->action, 'get'); if(!in_array($action, ['get'])){ return $this->fail(200001); } $order_id = _empty_default_($request->order_id, 0); if(_empty_($order_id)){ return $this->fail(200001); } $order = WxShopOrder::where([ ['id', '=', $order_id], ['user_id', '=', $uid], ['pay_status', '=', 2], // ['status', '=', 1] ])->first(); if(!$order){ return $this->fail(200004, [], '当前订单不是已支付状态,无法获得扫码卷'); } if($action == 'get'){ $coupon = ShopUtils::get_user_coupon($uid, $order_id); $goods = WxShopOrderGoods::where('order_id', $order_id)->get(); $order_title = ''; $order_image = ''; $is_used = false; if($goods){ $goods->map(function ($v, $k) use (&$order_title, &$order_image, &$is_used, &$order){ if(!_empty_($order_title)){ $order_title .= '、'; } $order_title .= $v->name; if(_empty_($order_image)){ $order_image = $v->pic; } if($v->goods_type == 6){ $is_used = true; $user_good = WxUsedGood::find($v->goods_id); if($user_good->distance && $user_good->distance > 0){ if($user_good->distance < 10){ $user_good->distance = '<10m'; $user_good->distance_name = $user_good->district; }else if($user_good->distance >= 1000 && $user_good->distance <= 200000){ $user_good->distance = '<'. round($user_good->distance / 1000, 2).'km'; $user_good->distance_name = $user_good->city; }else if($user_good->distance > 200000){ $user_good->distance = round($user_good->distance / 1000, 2).'km'; $user_good->distance_name = $user_good->province; }else{ $user_good->distance = '<'.(int)$user_good->distance.'m'; $user_good->distance_name = $user_good->district; } }else{ $user_good->distance = ''; $user_good->distance_name = $user_good->district; } if(_empty_($user_good->distance_name)){ $user_good->distance_name = ''; } $order->distance = $user_good->distance; $order->longitude = $user_good->longitude; $order->latitude = $user_good->latitude; $order->address_name = $user_good->address_name; $order->address_detailed = $user_good->address_detailed; }else if($v->goods_type == 5 || $v->goods_type == 7){ $shop_contact = WxShopContact::find($order->contact_id); if(!$shop_contact){ _logger_(__file__, __line__, 'shop_contact id为'.$order->contact_id.'不存在'); } $order->distance = ''; $order->longitude = $shop_contact->longitude; $order->latitude = $shop_contact->latitude; $order->address_name = $shop_contact->address_name; $order->address_detailed = $shop_contact->address_detail; if($shop_contact->phone){ $order->seller_phone = $shop_contact->phone; } } // 状态(0正常,1退款中,2退货退款,3已退款,4异常) if($v->state == 1){ $v->state_tip = '退款中'; }else if($v->state == 2){ $v->state_tip = '退货退款'; }else if($v->state == 3){ $v->state_tip = '已退款'; } else if($v->state == 4){ $v->state_tip = '异常'; } else if($v->state == 5){ $v->state_tip = '微信退款处理中'; } else if($v->state == 6){ $v->state_tip = '支付宝退款处理中'; }else{ if($v->refund_deadline === 0){ $v->state_tip = '不支持退款'; }else if($v->refund_deadline == 1){ $v->state_tip = '申请退款'; }else{ $v->state_tip = '超时不可退款'; } } }); } $order->address_tip = ($order->distance ? ('距您'.$order->distance. ' · ') : '') . $order->address_name; $order->order_title = $order_title; $order->order_image = $order_image; $order->is_used = $is_used; if(_empty_($order->seller_phone)){ $order->seller_phone = $order->seller_user_id > 0 ? _get_origin_attribute('wx_user', [['id', '=', $order->seller_user_id]], 'phone') : ''; } $order->query_state_no = 'wx_shoporder_' . $order->serial_number; return $this->success([ 'order' => $order, 'coupon' => $coupon, 'goods' => $goods ]); } } /** * Shop申请退款 */ public function orderRefund(Request $request) { $uid = $request->uid; $action = _empty_default_($request->action, 'add'); // todo: 这是订单的某个规格的退款, 还有一种情况是整个订单的退款 if($action == 'add'){ // 申请退款 // 1、根据某个订单的product_id做定位 $oid = $request->oid; $opid = $request->opid; // 2、直接根据orderGood id做定位 $order_good_id = $request->order_good_id; if($order_good_id > 0){ $oginfo = WxShopOrderGoods::where('buyer_user_id', $uid)->where('id', $order_good_id)->first(); }else{ $oginfo = WxShopOrderGoods::where('buyer_user_id', $uid)->where('order_id', $oid)->where('product_id', $opid)->first(); } if(_empty_($oginfo)){ return $this->fail(200003); } if($oginfo->refund_deadline == 0){ return $this->fail(200009, [], '该商品不支持退款'); } if($oginfo->refund_deadline == 2){ return $this->fail(200009, [], '您已超过最大可退款期限'); } $shopOrder = WxShopOrder::where('id', $oginfo['order_id'])->first(); if(_empty_($shopOrder)){ return $this->fail(200003); } $title = '退款申请'; $message = '订单:'.$shopOrder['order_id'].':'.$oginfo['quantity'].'件 '.$oginfo['name'].'【'.$oginfo['product'].'】会员价为:【'.$oginfo['vip_price'].'】普通价为:'.$oginfo['price'].' 申请退款。'; if( $oginfo->goods_type != 2 && $oginfo->goods_type != 3 ){ DB::beginTransaction(); try { // todo: WxShopOrderGoods::where('order_id', $oid)->where('product_id', $opid) ->update(['state' => 1]); $model = new WxShopOrderAfter(); $model->user_id = $uid; $model->seller_user_id = $oginfo->seller_user_id ?: 0; $model->order_id = $shopOrder['order_id']; $model->title = $title; $model->content = $message; $model->save(); $order_id = $oginfo->order_id; if(!WxShopOrderGoods::where('order_id', $order_id)->where('state', 0)->exists()){ update_shop_order_meta($order_id, 'last_status', WxShopOrder::where('id', $order_id)->value('status'), 'n'); WxShopOrder::where('id', $order_id)->update([ 'status' => 7 ]); } DB::commit(); return $this->success([], 200, '退款申请提交成功,我们会尽快为您处理。'); } catch (\Exception $e) { DB::rollBack(); _logger_(__file__, __line__, $e->getMessage()); return $this->fail(200006); } } return $this->fail(200004, [], '虚拟物品不能申请退款'); }else if($action == 'confirm' || $action == 'cancel'){ // 同意退款 $order_good_id = _empty_default_($request->order_good_id, 0); if(_empty_($order_good_id)){ return $this->fail(200001); } $orderGood = WxShopOrderGoods::find($order_good_id); if(_empty_($orderGood)){ return $this->fail(200003); } $old_state = $orderGood->state; if($old_state != 1 && $old_state != 2){ return $this->fail(200004, [], '该订单商品状态不是退款中'); } $order_id = $orderGood->order_id; $seller_user_id = WxShopOrder::where('id', $order_id)->value('seller_user_id'); if(_empty_($seller_user_id)){ return $this->fail(200000); } if($seller_user_id != $uid){ return $this->fail(200000, [], '你不是该次订单的卖家'); } if($action == 'confirm'){ $r = ShopUtils::order_good_refund($order_good_id); if($r){ return $this->success(); }else{ return $this->fail(200006); } }else{ DB::beginTransaction(); try { // todo: if($old_state != 3){ // 这里仅仅再判断一次,已无必要 WxShopOrderGoods::where('id', $order_good_id)->update([ 'state' => 0, ]); $last_status = get_shop_order_meta($order_id, 'last_status', 'n'); if(_empty_($last_status, true)){ $last_status = 1; } update_shop_order_meta($order_id, 'last_status', null, 'n'); WxShopOrder::where('id', $order_id)->update(['status' => $last_status]); DB::commit(); return $this->success(); } DB::rollBack(); return $this->fail(200006); } catch (\Exception $e) { DB::rollBack(); _logger_(__file__, __line__, $e->getMessage()); return $this->fail(200006); } } } } /** * Shop退货退款 */ public function refundGoods(Request $request) { $uid = $request->uid; $on = $request->on; $oid = $request->oid; $opid = $request->opid; $title = $request->title; $message = $request->message; $oginfo = WxShopOrderGoods::where('order_id', $oid)->where('product_id', $opid)->first(); if(_empty_($oginfo)){ return $this->fail(200003); } if($oginfo->refund_deadline == 0){ return $this->fail(200009, [], '该商品不支持退款'); } if($oginfo->refund_deadline == 2){ return $this->fail(200009, [], '您已超过最大可退款期限'); } if( $oginfo->goods_type != 2 && $oginfo->goods_type != 3 ){ WxShopOrderGoods::where('order_id', $oid)->where('product_id', $opid) ->update(['state' => 2]); $model = new WxShopOrderAfter(); $model->user_id = $uid; $model->seller_user_id = $oginfo->seller_user_id ?: 0; $model->order_id = $on; $model->title = $title; $model->content = $message; $model->save(); $nr = '您购买的:「' . $oginfo['name'] . '(规格:' . $oginfo['product'] . ')」×' . $oginfo['quantity'] . '件的售后申请已提交,您需要联系客服将货物退回。'; UserUtils::add_user_notice(6002, $uid, '商品售后通知', $nr, 100); return $this->success(); } return $this->fail(200004, [], '虚拟物品不能申请退货退款'); } public function shop_order_process(Request $request) { $type = _empty_default_($request->type, ''); if ($type == 'update_user_remark') { return $this->user_remark($request); } } private function user_remark(Request &$request){ $uid = $request->uid; $order_id = _empty_default_($request->order_id, 0); $user_remark = _empty_default_($request->user_remark, ''); if(_empty_($order_id) || _empty_($user_remark)){ return $this->fail(200001); } if(is_array($user_remark)){ $user_remark = json_encode($user_remark); } $shop_order = WxShopOrder::find($order_id); if(!$shop_order){ return $this->fail(200003); } if($shop_order->status != 1){ return $this->fail(200004, [], '当前订单状态不支持修改'); } if($shop_order->user_id != $uid && !UserUtils::is_mini_supder_admin($uid)){ return $this->fail(200004, [], '当前订单不是你的订单,无法修改'); } WxShopOrder::where('id', $order_id)->where('user_id', $uid)->update([ 'user_remark' => $user_remark ]); return $this->success(); } /** * Shop确认收货 */ public function confirmReceipt(Request $request) { $uid = $request->uid; $oid = $request->oid; if(_empty_($uid) || _empty_($oid)){ return $this->fail(200001); } $shop_order = WxShopOrder::where([ ['id', '=', $oid], ['user_id', '=', $uid], ['status', '=', 2], ['pay_status', '=', 2] ])->first(); if($shop_order){ if(ShopUtils::confirm_recived($shop_order, 1)){ return $this->success(); }else{ return $this->fail(200006); } }else{ return $this->fail(200003); } } }