bindings; $rawSql = preg_replace_callback('/\?/', function ($matches) use ($bindings, &$i) { $item = isset($bindings[$i]) ? $bindings[$i] : $matches[0]; $i++; return gettype($item) == 'string' ? "'$item'" : $item; }, $sql->sql); //记录sql LoggerFactoryUtil::addSqlMessage($rawSql); // echo $rawSql, "\n

\n"; }); } /** * 统一企微报警 * @param $params * @param $response * @param $funcname * @throws \Tool\ShanTaoTool\Exception\QiWeiException */ public static function sendBaoJing($params,$response,$funcname) { $param = [ "功能"=>$funcname, "请求参数"=>$params, "用户ID"=>"", "相应信息"=>$response, "信息时间"=>date("Y-m-d H:i:s"), "环境"=>env("ENV_NAME") ]; QiWeiTool::sendMessageToBaoJing(json_encode($param,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); } /** * 获取应用编号 */ public static function getAppCodeByQuery() { return request()->input("wechat_app_code"); } /** * 从redis中获取数据 * @param $key string 键 */ public static function getCacheFromRedis($key) { /** * @var \Redis $redis */ $redis = app("redis"); return $redis->get($key); } /** * 设置redis数据的过期时间 * @param $key string 键 * @param $val string 值 * @param $ttl int 过期时间 */ public static function setRedisCache($key, $val, $ttl) { /** * @var \Redis $redis */ $redis = app("redis"); if($ttl==0){ return $redis->set($key,$val); }else{ return $redis->setex($key,$ttl,$val); } } /** * 获取redis锁 * @param $lokKey string 键 * @param $ttl int 过期时间 */ public static function setRedisLock($lokKey, $ttl) { /** * @var \Redis $redis */ $redis = app("redis")->client(); $flag = $redis->set($lokKey,1,["nx","ex"=>$ttl]); if(!$flag){ throw new CommonException(ErrorEnum::ERROR_REPEAT); } } /** * 生成美团推广位 * @param $userId int 用户ID */ public static function generateMeiTuanSid($userId) { return "meituanSpread:".$userId; } /** * 生成聚推客推广位 * @param $userId */ public static function generateJutuiKeSid($userId) { return "jtkupstream".$userId; } /** * 获取用户的平台推广位 * @param $platformType int 平台 * @param $userId int 用户ID */ public static function getPlatformUserSpreadId($platformType,$userId,$userSpreadId="") { //获取平台推广位 $platformSid = PlatformSidModel::query() ->where("user_id",$userId) ->where("platform_type",$platformType) ->first(); if($platformSid){ //存在则直接返回 return $platformSid->platform_sid; }else{ switch ($platformType){ case PlatformTypeEnum::PLATFORM_TAOBAO: //淘宝 DB::beginTransaction(); $taobaoPid = TaobaoPidModel::query()->where("status",0)->lock(true)->first(); if(!$taobaoPid){ DB::rollBack(); BaseUtil::sendBaoJing("","淘宝推广位不足","获取淘宝推广位"); throw new CommonException(ErrorEnum::ERROR_SYSTEM); } TaobaoPidModel::query()->where("id",$taobaoPid["id"])->update(["status"=>1]); DB::commit(); $sid = $taobaoPid["adzone_id"]; break; case PlatformTypeEnum::PLATFORM_PINGDUODUO: //拼多多 $res = DuoDuoKeUtil::goodsPidGenerate(1,["用户:".$userId]); $instance = new LoggerFactoryUtil(BaseUtil::class); $instance->info("拼多多返回数据:".json_encode($res)); $sid = $res["p_id_generate_response"]["p_id_list"][0]["p_id"]; break; case PlatformTypeEnum::PLATFORM_JINGDONG: //京东 break; case PlatformTypeEnum::PLATFORM_MEITUAN: //美团 $sid = self::generateMeiTuanSid($userId); break; case PlatformTypeEnum::PLATFORM_FANBUTING: //平台(饭不停) break; case PlatformTypeEnum::PLATFORM_JUTUIKE: //聚推客 $sid = self::generateJutuiKeSid($userId); break; default: throw new CommonException(ErrorEnum::ERROR_EXIST_PLATFORM); } if(!$userSpreadId){ //不存在用户自传的推广位,则默认和平台的推广位相等 $userSpreadId = $sid; } //写入用户的推广位 PlatformSidModel::query()->insert( [ "user_id"=>$userId, "user_sid"=>$userSpreadId, "platform_type"=>$platformType, "platform_sid"=>$sid, "created_at"=>date("Y-m-d H:i:s"), "updated_at"=>date("Y-m-d H:i:s") ] ); return $sid; } } /** * 根据app ID和secret获取accesstoken * @param $appId * @param $appSecret */ public static function getAccessToken($appId, $appSecret) { $key = $appId."accesstoken"; $val = self::getCacheFromRedis($key); if($val){ return $val; } //不存在则获取 $params = [ "grant_type"=>"client_credential", "appid"=>$appId, "secret"=>$appSecret ]; $res = HttpCurl::getCurl("https://api.weixin.qq.com/cgi-bin/token",$params); if(isset($res["errcode"])){ $instance = new LoggerFactoryUtil(BaseUtil::class); $instance->info("微信返回信息:".json_encode($res)); throw new CommonException(ErrorEnum::ERROR_ACCOUNT_ACCESS_TOKEN); } self::setRedisCache($key,$res["access_token"],7100); return $res["access_token"]; } /** * 获取jsapi_ticket * @param $appId * @param $appSecret */ public static function getJsapiTicket($appId, $appSecret) { $key = $appId."getJsapiTicket"; $val = self::getCacheFromRedis($key); if($val){ return $val; } $accessToken = self::getAccessToken($appId,$appSecret); $params = [ "access_token"=>$accessToken, "type"=>"jsapi" ]; $res = HttpCurl::getCurl("https://api.weixin.qq.com/cgi-bin/ticket/getticket",$params); if($res["errcode"]==0){ self::setRedisCache($key,$res["ticket"],7000); return $res["ticket"]; } throw new CommonException(ErrorEnum::ERROR_ACCOUNT_ACCESS_TOKEN); } /** * 获取公众号支付参数校验数据 * @param $appId * @param $appSecret */ public static function getJsapiSign($appId, $appSecret,$url) { $jsapi_ticket = self::getJsapiTicket($appId,$appSecret); $instance = new LoggerFactoryUtil(BaseUtil::class); $instance->info("jsapiticket:".$jsapi_ticket); $noncestr = uniqid(); $timestamp = time(); $instance->info("url:".$url); // $url = substr($url,0,strpos($url,"#")); $string = "jsapi_ticket=".$jsapi_ticket."&noncestr=$noncestr"."×tamp=".$timestamp."&url=".$url; $instance->info("签名字符串:".$string); $signature = sha1($string); return [ "appId"=>$appId, "timestamp"=>$timestamp, "nonceStr"=>$noncestr, "signature"=>$signature ]; } /** * 根据网址获取微信公众号 * @param $host string 网址 */ public static function getWechatAccountByHost($host) { $webSite = WebSiteModel::query()->where("web_site_host",$host)->first(); if(!$webSite){ throw new CommonException(ErrorEnum::ERROR_EXIST_WEB_SITE); } $wechatAccount = WechatAccountModel::query()->find($webSite->wechat_account_id); if(!$wechatAccount){ throw new CommonException(ErrorEnum::ERROR_ACCOUNT_EXIST); } return $wechatAccount; } /** * 获取用户ID */ public static function getUserId() { return request()->header("user_id"); } /** * 从url中获取get参数,以数组形式返回 * @param $url */ public static function getParamsByUrl($url) { $flag = preg_match("/(.*)\?(.*)/",$url,$match); $tmp = []; if($flag){ $arrs = explode("&",$match[2]); foreach ($arrs as $arr){ $t = explode("=",$arr); $tmp[$t[0]] = $t[1]; } $tmp["url"]=$match[1]; } return $tmp; } /** * 获取订单编号 * @param $userId */ public static function getOrderNumber($userId) { return date("YmdHis").$userId.random_int(10000,99999); } }