=', $endTime], ['b.update_time', '<=', $toDay], ['o.order_status', '>', 0], ]; $bill = Db::name('dividemoney_bill') ->join('member m', 'm.member_id=b.member_id', 'inner') ->join('order o', 'o.order_id=b.order_id', 'inner') ->alias('b') ->where($where) ->limit(20) ->order('b.create_time asc') ->field('b.site_id,b.states,b.order_id,b.out_trade_no,b.create_time,b.out_trade_no,b.is_video_number,b.channel_type,m.ali_openid,o.order_status') ->select(); if ($bill) { foreach ($bill as $item) { switch ($item['channel_type']) { case 'aliapp': case 'alipay': //开始分账 if ($item['is_video_number']) { if (in_array($item['order_status'], [3, 4, 10])) { $this->CheckDelivery($item['site_id'], $item['out_trade_no'], $item['ali_openid'], $item['order_id'], $item['states']); //检查是否发货 } else if (in_array($item['states'], [0, 2, 3])) { $this->CheckDivide($item['out_trade_no'], $item['states']); //开始发起分账 } } else { $this->CheckDivide($item['out_trade_no'], $item['states']); //开始发起分账 } break; case 'weapp': case 'wechat': case 'wechatpay': $this->CheckWechatDivide($item['out_trade_no'], $item); //开始发起分账 break; } } } return success(); } /*** * 检查微信分账未成功订单 * @param $out_trade_no * @param $item * @return void */ public function CheckWechatDivide($out_trade_no, $item = []) { } /*** * 检查是否发货 * @param $site_id * @param $out_trade_no * @param $openid * @param $order_id * @return void */ public function CheckDelivery($site_id, $out_trade_no, $openid, $order_id, $states) { $mini = new MinCode($site_id); $info = $mini->miniOrderQuery($out_trade_no, $openid); if ($info['code'] == '10000') { $status = $info['status']; switch ($status) { case 'PAID': $this->pushOrder($info, $order_id);//检查推送订单 break; case 'RECEIVED_CONFIRM': $this->confirmDelivery($info, $site_id, $out_trade_no, $openid);//自动确认收货 break; case 'DELIVERED': case 'CONFIRMED': case 'FINISHED': $res = $this->CheckDivide($out_trade_no, $states);//检查分账 break; case 'REFUND_CLOSED': model('dividemoney_bill')->update(['states' => 5, 'refuse' => '订单已退款'], ['order_id' => $order_id]); break; case 'TIMEOUT_CLOSED': model('dividemoney_bill')->update(['states' => 5, 'refuse' => '订单超时关闭'], ['order_id' => $order_id]); break; } } else if ($info['code'] != 10000) { model('dividemoney_bill')->update(['states' => 3, 'refuse' => $info['sub_msg'], 'update_time' => time()], ['order_id' => $order_id]); } return success(); } /*** * 检查分账 * @param $site_id * @param $out_trade_no * @return void */ public function CheckDivide($out_trade_no, $states) { $split = new OrderPay(); $res = $split->startSplitAccount('', $out_trade_no, $states, true); return success(); } /*** * 设置发货 * @param $info * @return void */ public function confirmDelivery($info, $site_id, $out_trade_no, $openid) { $create_time = strtotime($info['create_time']); $config_model = new Config(); $auto_take_delivery = $config_model->getOrderEventTimeConfig($site_id)['data']['value']['auto_take_delivery']; $res = []; if ((time() - $create_time) / 86400 >= $auto_take_delivery) { $apiApp = new MinCode($site_id); $res = $apiApp->recieveDelivery(['out_order_id' => $out_trade_no, 'user_id' => $openid]); } return $res; } /*** * 推送订单 * @param $item * @return void */ public function pushOrder($info, $order_id) { $res = event('OrderDelivery', ['order_id' => $order_id]);//设置发货同步 if ($res[0]['code'] == 0) { model('order')->update(['is_sync_order' => 1], ['order_id' => $order_id]); } else { model('order')->update(['is_sync_order' => 2, 'sync_msg' => $res[0]['message']], ['order_id' => $order_id]); } return success(); } /*** * 获取分账权限 * @param $data * @return bool[] */ public function checkAccountsAuth($data) { $divideStatet = true; $isDivide = false; $is_pay_error = ''; $res = event('getDivideAccounts', $data);//获取分账权限 $Accounts = []; if ($res) { foreach ($res as $v) { foreach ($v as $item) { $Accounts[] = $item; } } $is_commission = array_sum(array_column($Accounts, 'is_commission')); if ($is_commission <= 0) return '';//剔除免佣账号 $isDivide = true; if ($data['pay_type'] == 'alipay') {//验证支付宝是否开启分账 $is_pay_error = cache('is_pay_error' . $data['site_id']); if (!cache('alipayTradeBatchquery' . $data['site_id']) || $is_pay_error) { $micode = new MinCode($data['site_id']); $request = $micode->requestApi('alipay.trade.royalty.relation.batchquery', ['out_request_no' => date('YmdHisw')])['alipay_trade_royalty_relation_batchquery_response']; if ($request['code'] == 10000) { cache('alipayTradeBatchquery' . $data['site_id'], 1, 7200); cache('is_pay_error' . $data['site_id'], null); } else { $divideStatet = false; $is_pay_error = '未检开启分账权限'; } } } else if ($data['pay_type'] == 'wechatpay') { //微信验证账号分账全权 } $startTime = mktime(0, 0, 0, date('m'), date('d') - 20, date('Y')); $where = [ ['site_id', '=', $data['site_id']], ['states', 'in', [0, 2, 3]], ['is_order_account_locking', '=', 0], ['create_time', '<', $startTime], ]; $countMone = model('dividemoney_bill')->getSum($where, 'amount'); if ($countMone >= 50) { $divideStatet = false; $is_pay_error = '服务佣金未结清'; } } return [ 'isDivide' => $isDivide, 'divideState' => $divideStatet, 'err_msg' => $is_pay_error, ]; } }