table('QPPlatformDB.dbo.ChannelOpenRecharge') // ->join( // 'agent.dbo.admin_configs', // 'admin_configs.id', // '=', // 'ChannelOpenRecharge.ConfigID' // ) // ->where('admin_configs.new_pay_type', $method) // ->where('admin_configs.type', 'pay') // ->where('admin_configs.status', 1) // ->where('ChannelOpenRecharge.Status', 1) // ->where('ChannelOpenRecharge.Channel', $channel) // ->where('ChannelOpenRecharge.Sort', '>', 0) // ->selectRaw('admin_configs.config_key, ChannelOpenRecharge.Sort as sort') // ->get(); // } $services = DB::table('agent.dbo.admin_configs')->where([ 'new_pay_type' => $method, 'type' => 'pay', 'status' => 1, ])->get(); if (!$services->count()) { Log::error('支付渠道配置异常', [ 'method' => $method, ]); return false; } $matrix = []; foreach ($services as $v) { for ($i = 0; $i < $v->sort; $i++) { $matrix[] = $v->config_key; } } $res = $matrix[mt_rand(0, count($matrix)-1)]; return $res; }*/ /** * 根据支付方式随机获取充值渠道 * @param $method * @param $channel * @return bool|mixed */ public static function getServiceByPayMethod($method, $payAmt,$pay_method) { $services = DB::table('agent.dbo.admin_configs')->where([ 'new_pay_type' => $method, 'type' => 'pay', 'status' => 1, ])->whereRaw('pay_types&'.$pay_method.'='.$pay_method) ->where('min_amount', '<=', $payAmt) ->where('max_amount', '>=', $payAmt) ->get(); if (!$services->count()) { Log::error('支付渠道配置异常', [ 'method' => $method, ]); return false; } $matrix = []; foreach ($services as $v) { for ($i = 0; $i < $v->sort; $i++) { // if(Redis::exists("PayErro_".$v->config_key)) continue; if(!empty($v->remarks)&&$v->remarks!=null){ $remarks=json_decode($v->remarks,true); // 按支付类型校验金额是否在允许范围内:不满足则跳过该渠道 if(isset($remarks['limit'])){ $typeKey='type_'.$pay_method; $limitConfig=$remarks['limit'][$typeKey]??null; if($limitConfig!==null && !self::isAmountInLimit($payAmt,$limitConfig)){ continue; } } } $matrix[] = $v->config_key; } } if(count($matrix)==0) { foreach ($services as $v) { for ($i = 0; $i < $v->sort; $i++) { $matrix[] = $v->config_key; } } } $res = $matrix[mt_rand(0, count($matrix)-1)]; return $res; } /** * 判断支付金额是否在 limit 配置的取值范围内 * @param float $payAmt 支付金额 * @param mixed $limitConfig 配置:数组为允许金额列表;['min'=>x,'max'=>y] 为区间;'all' 或 ['全部'] 为不限制 * @return bool */ public static function isAmountInLimit($payAmt, $limitConfig) { if ($limitConfig === 'all' || $limitConfig === '全部' || $limitConfig === ['全部']) { return true; } if (isset($limitConfig['min']) && isset($limitConfig['max'])) { $min = (float)$limitConfig['min']; $max = (float)$limitConfig['max']; $amt = (float)$payAmt; return $amt >= $min && $amt <= $max; } if (is_array($limitConfig)) { $payAmtRounded = round((float)$payAmt, 2); foreach ($limitConfig as $allowed) { if (round((float)$allowed, 2) === $payAmtRounded) { return true; } } return false; } return true; } /** * 根据支付方式随机获取充值渠道 * @param $method * @param $channel * @return bool|mixed */ public static function getServiceByPayCountry($method, $channel,$country,$except_channelName="") { $except_configKeys=[$except_channelName]; $switch = Redis::get("recharge_config_switch_{$channel}"); if ($channel && $switch) { $services = DB::connection('write') ->table('QPPlatformDB.dbo.ChannelOpenRecharge') ->join( 'agent.dbo.admin_configs', 'admin_configs.id', '=', 'ChannelOpenRecharge.ConfigID' ) ->where('admin_configs.new_pay_type', $method) ->whereNotIn('admin_configs.config_key',$except_configKeys) ->where('admin_configs.country', $country) ->where('admin_configs.type', 'pay') ->where('admin_configs.status', 1) ->where('ChannelOpenRecharge.Status', 1) ->where('ChannelOpenRecharge.Channel', $channel) ->where('ChannelOpenRecharge.Sort', '>', 0) ->selectRaw('admin_configs.config_key, ChannelOpenRecharge.Sort as sort') ->get(); } if (!isset($services) || !$services->count()) { $services = DB::table('agent.dbo.admin_configs')->where([ 'new_pay_type' => $method, 'type' => 'pay', 'status' => 1, 'country' => $country, ])->get(); if (!$services->count()) { Log::error('支付渠道配置异常', [ 'method' => $method, ]); return false; } } $matrix = []; foreach ($services as $v) { for ($i = 0; $i < $v->sort; $i++) { if(Redis::exists("PayErro_".$v->config_key)) continue; $matrix[] = $v->config_key; } } if(count($matrix)==0) { foreach ($services as $v) { for ($i = 0; $i < $v->sort; $i++) { $matrix[] = $v->config_key; } } } $res = $matrix[mt_rand(0, count($matrix)-1)]; return $res; } }