123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- <?php
- namespace App\Http\Utils;
- use App\Exceptions\CommonException;
- use App\Http\Enum\ErrorEnum;
- use App\Http\Enum\PlatformTypeEnum;
- use App\Http\Utils\Pdd\DuoDuoKeUtil;
- use App\Models\PlatformSidModel;
- use App\Models\TaobaoPidModel;
- use App\Models\WebSiteModel;
- use App\Models\WechatAccountModel;
- use Illuminate\Support\Facades\DB;
- use Tool\ShanTaoTool\HttpCurl;
- use Tool\ShanTaoTool\QiWeiTool;
- class BaseUtil
- {
- /**
- * sql监听
- */
- public static function listenSql()
- {
- DB::listen(function ($sql) {
- $i = 0;
- $bindings = $sql->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<br /><br />\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);
- }
- }
|