server->push(function ($message)use ($instance,$app,$code) { $instance->info("信息:".json_encode($message)); switch ($message['MsgType']) { case 'event'://事件 self::handleClickEvent($message,$app,$code); break; case 'text'://文字 self::handleTxt($message,$app,$code); break; case 'image'://图片 break; case 'voice'://语音 break; case 'video'://视频 break; case 'location'://坐标 break; case 'link'://链接 break; case 'file'://文件 // ... 其它消息 default: break; } }); $response = $app->server->serve(); return $response; } /** * 处理事件 * @param $message array 时间信息 * @param $app \EasyWeChat\OfficialAccount\Application * @throws \App\Exceptions\CommonException */ public static function handleClickEvent($message,$app,$code) { $instance = new LoggerFactoryUtil(WechatLogic::class); $officialOpenId = $message["FromUserName"]; $user = $app->user->get($officialOpenId); $log = new LoggerFactoryUtil(WechatLogic::class); $log->info("用户信息".json_encode($user)); //判断用户是否存在 $daogoUser = UserModel::query()->where("user_open_id",$officialOpenId)->first(); $instance->info("数据库用户:".json_encode($daogoUser)); //获取公众号信息 $account = WechatAccountModel::findByWechatAppCode($code); //获取所属站点信息 $webSite = WebSiteModel::findByWechatAccountId($account->id); if(!$daogoUser){ //不存在则写入用户 //判断是否存在上级用户ID $inviteUserId = 0; if($message["Event"]=="subscribe" && ($user["qr_scene"] || $user["qr_scene_str"])){ $instance->info("邀请用户ID:".$user["qr_scene"]."邀请ID".$user["qr_scene_str"]); if($user["qr_scene_str"]){ $inviteUserId = $user["qr_scene_str"]; } if($user["qr_scene"]){ $inviteUserId = $user["qr_scene"]; } } $userId = UserModel::query()->insertGetId( [ "invite_user_id"=>$inviteUserId, "user_open_id"=>$officialOpenId, "user_head_img_url"=>$user["headimgurl"]??"", "user_nickname"=>$user["nickname"]??"", "user_sex"=>$user["sex"]??1, "user_api_key"=>md5(microtime(true)), "user_api_key_expire_time"=>date("Y-m-d H:i:s",strtotime("+1 year")), "created_at"=>date("Y-m-d H:i:s"), "updated_at"=>date("Y-m-d H:i:s"), "wechat_account_id"=>$account->id, "web_site_id"=>$webSite->id ] ); }else{ $userId = $daogoUser->id; } $nickname = $user["nickname"]; switch ($message["Event"]){ case "subscribe"://关注公众号 //获取美团的推广链接 // $platformSid = BaseUtil::getPlatformUserSpreadId(PlatformTypeEnum::PLATFORM_MEITUAN,$userId); // //外卖 // $meituanUrl1 = MeituanLianmengUtil::getMeituanWaimaiUrl($userId,$platformSid,2,MeiTuanLinkTypeEnum::H5); // //获取饿了么的推广链接 // $elmUrl1 = TaobaoLianMengUtil::getElmWaimaiSpreadUrl($userId,"20150318020002597"); // $elmUrl2 = TaobaoLianMengUtil::getElmWaimaiSpreadUrl($userId,"20150318020004284"); // $elmUrl3 = TaobaoLianMengUtil::getElmWaimaiSpreadUrl($userId,"20150318020005049"); // $elmUrl4 = TaobaoLianMengUtil::getElmWaimaiSpreadUrl($userId,"20150318020004425"); // $elmLink1 = "饿了么超大外卖红包"; // $elmLink2 = "饿了么超大限时红包"; // $elmLink3 = "饿了么最新红包"; // $elmLink4 = "饿了么大额红包"; //判断EventKey是否存在 $msg1 = new Image(env("WECHAT_IMAGE_MEDIA_ID")); $msg2 = <<customer_service->message($msg1)->to($officialOpenId)->send(); $res2 = $app->customer_service->message($msg2)->to($officialOpenId)->send(); $instance->info('结果1:'.json_encode($res1)); // $instance->info('结果2:'.json_encode($res2)); break; case "unsubscribe"://取关公众号 break; case "CLICK"://点击事件 $date = date("m月d日"); switch ($message["EventKey"]){ case "elmwaimai": //饿了么外卖 $url = TaobaoLianMengUtil::getElmWaimaiSpreadUrl($userId,"20150318020002597"); $link = "点我领取饿了么外卖红包"; break; case "elmxianshi": //饿了么限时红包 $url = TaobaoLianMengUtil::getElmWaimaiSpreadUrl($userId,"20150318020004284"); $link = "点我领取饿了么限时红包"; break; case "elmzhaji": //饿了么炸鸡红包 $url = TaobaoLianMengUtil::getElmWaimaiSpreadUrl($userId,"20150318020005049"); $link = "点我领取饿了么炸鸡红包"; break; case "elmxiawu": //饿了么下午茶红包 $url = TaobaoLianMengUtil::getElmWaimaiSpreadUrl($userId,"20150318020004425"); $link = "点我领取饿了么下午茶红包"; break; case "mtwaimai": //美团外卖红包 //获取美团的推广链接 $platformSid = BaseUtil::getPlatformUserSpreadId(PlatformTypeEnum::PLATFORM_MEITUAN,$userId); $url = MeituanLianmengUtil::getMeituanWaimaiUrl($userId,$platformSid,2,MeiTuanLinkTypeEnum::H5); // $link = "点我领取美团外卖红包"; $link = "点我领取美团外卖红包"; break; case "mtjiudian": //美团酒店红包 //获取美团的推广链接 $platformSid = BaseUtil::getPlatformUserSpreadId(PlatformTypeEnum::PLATFORM_MEITUAN,$userId); $url = MeituanLianmengUtil::getMeituanWaimaiUrl($userId,$platformSid,7,MeiTuanLinkTypeEnum::MINIPROGRAME); $link = "点我领取美团酒店红包"; break; case "mtyouxuan": //美团优选红包 //获取美团的推广链接 $platformSid = BaseUtil::getPlatformUserSpreadId(PlatformTypeEnum::PLATFORM_MEITUAN,$userId); $url = MeituanLianmengUtil::getMeituanWaimaiUrl($userId,$platformSid,22,MeiTuanLinkTypeEnum::MINIPROGRAME); $link = "点我领取美团优选红包"; // $link = "点我领取美团优选红包"; break; case "mtshangou": //美团闪购红包 //获取美团的推广链接 $platformSid = BaseUtil::getPlatformUserSpreadId(PlatformTypeEnum::PLATFORM_MEITUAN,$userId); $url = MeituanLianmengUtil::getMeituanWaimaiUrl($userId,$platformSid,4,MeiTuanLinkTypeEnum::H5); // $link = "点我领取美团闪购红包"; $link = "点我领取美团闪购红包"; break; case "help": //使用教程 $msg = new Image(env("WECHAT_IMAGE_MEDIA_ID")); $res = $app->customer_service->message($msg)->to($officialOpenId)->send(); return; break; } $msg = <<customer_service->message($msg)->to($officialOpenId)->send(); $instance->info("返回结果:".json_encode($res)); } } /** * 处理文字 * @param $message * @param $app Application */ public static function handleTxt($message,$app,$code) { $instance = new LoggerFactoryUtil(WechatLogic::class); $officialOpenId = $message["FromUserName"]; $instance->info("用户信息:".$message["Content"]); $daogoUser = UserModel::query()->where("user_open_id",$officialOpenId)->first(); $platformSid = BaseUtil::getPlatformUserSpreadId(PlatformTypeEnum::PLATFORM_PINGDUODUO,$daogoUser->id); $instance->info("pid:".$platformSid); //获取聚推客的推广位ID $jutuikeSid = BaseUtil::getPlatformUserSpreadId(PlatformTypeEnum::PLATFORM_JUTUIKE,$daogoUser->id); //获取淘宝推广位ID $taobaoSid = BaseUtil::getPlatformUserSpreadId(PlatformTypeEnum::PLATFORM_TAOBAO,$daogoUser->id); //判断是否是帮助 if($message["Content"]=="帮助"){ $msg1 = new Image(env("WECHAT_IMAGE_MEDIA_ID")); $app->customer_service->message($msg1)->to($officialOpenId)->send(); return; } //判断是否是提现 if($message["Content"]=="提现"){ $wenti = new Text("点击公众号菜单=>个人中心=>我的=>可提现余额==>提现"); $app->customer_service->message($wenti)->to($officialOpenId)->send(); return; } //判断是否余额 if($message["Content"]=="余额"){ $wenti = new Text("点击公众号菜单=>个人中心,可查看当月预估收益和上月收益"); $app->customer_service->message($wenti)->to($officialOpenId)->send(); return; } $wenti = new Text("稍等"); $app->customer_service->message($wenti)->to($officialOpenId)->send(); try{ //1.判断是否匹配上拼多多商品链接 $res = preg_match("/https\:\/\/mobile\.yangkeduo\.com/",$message["Content"],$match); if($res){ //去除链接上的多余参数防止出现比价订单 // $tmp = BaseUtil::getParamsByUrl($message["Content"]); // if(isset($tmp["goods_id"]) && isset($tmp["url"])){ // $message["Content"] = $tmp["url"]."?goods_id=".$tmp["goods_id"]; // } $instance->info("匹配到拼多多链接"); // $goodsInfo = JutuikeUtil::transferGoodsLink($message["Content"]); // $tuiguangRes = JutuikeUtil::convert($goodsInfo["goodsId"],$jutuikeSid,"pdd"); // $goodsTitle = $tuiguangRes["goodsName"]; // $goodsPrice = $tuiguangRes["marketPrice"]; // $couponPrice = $tuiguangRes["couponInfo"]["fav"]; // $afterCouponPrice = $tuiguangRes["price"]; // $rebeatPrice = round($tuiguangRes["commission"]*0.7,2); // $url = $tuiguangRes["url"]; // $msg = <<我的=>钱包,可以1:1提现哦 //S; // $wenti = new Text($msg); // $app->customer_service->message($wenti)->to($officialOpenId)->send(); // return; // $instance->info("拼多多处理过的链接:".$message["Content"]); //获取商品详情 $bean = new GoodsSearchParamBean( [ "keyword"=>$message["Content"], "pid"=>"23985775_220421267" ] ); $goodsData = DuoDuoKeUtil::goodsSearch($bean); $instance->info("拼多多返回商品详情数据:".json_encode($goodsData)); //1.判断推广位是否备案 $oauthRes = DuoDuoKeUtil::memberAuthorityQuery($platformSid); $instance->info("备案信息:".json_encode($oauthRes)); //2.未备案这授权,已备案则直接获取推广链接 if($oauthRes["authority_query_response"]["bind"]){ //已备案 $instance->info("拼多多转链用的url:".$message["Content"]); $data = DuoDuoKeUtil::goodsZsUnitUrlGen($platformSid,$message["Content"]); $instance->info("拼多多返回数据:".json_encode($data)); $url = $data["goods_zs_unit_generate_response"]["short_url"]; // $link = "点我购买,即刻拿优惠"; }else{ //未备案,使用自己已备案的pid调用商品搜索接口获取goods_sign //获取到goods_sign $goods_sign = $goodsData["goods_search_response"]["goods_list"][0]["goods_sign"]; $beanData = [ "p_id"=>$platformSid, "goods_sign_list"=>json_encode([$goods_sign]), "generate_authority_url"=>"true", ]; $generateBean = new GoodsPromotionUrlGenerateParamBean($beanData); $res = DuoDuoKeUtil::goodsPromotionUrlGenerate($generateBean); $instance->info("生成备案信息:".json_encode($res)); $url = $res["goods_promotion_url_generate_response"]["goods_promotion_url_list"][0]["short_url"]; // $link = "点击备案之后,直接购买"; } $goodsPrice = round($goodsData["goods_search_response"]["goods_list"][0]["min_group_price"]/100,2); $couponPrice = round($goodsData["goods_search_response"]["goods_list"][0]["coupon_discount"]/100,2); $afterCouponPrice = $goodsPrice-$couponPrice; $rebeatPrice = round($goodsData["goods_search_response"]["goods_list"][0]["promotion_rate"]*$afterCouponPrice*0.7/1000,2); $goodsTitle = $goodsData["goods_search_response"]["goods_list"][0]["goods_name"]; $msg = <<我的=>钱包,可以1:1提现哦 S; $wenti = new Text($msg); $app->customer_service->message($wenti)->to($officialOpenId)->send(); return; } //3.判断是否匹配到维品会链接 $res = preg_match("/https\:\/\/m\.vip\.com/",$message["Content"],$match); if($res){ $instance->info("匹配到维品会链接"); $goodsInfo = JutuikeUtil::transferGoodsLink($message["Content"]); $tuiguangRes = JutuikeUtil::convert($goodsInfo["goodsId"],$jutuikeSid,$goodsInfo["source"]); $goodsTitle = $tuiguangRes["goodsName"]; $goodsPrice = $tuiguangRes["marketPrice"]; $couponPrice = $tuiguangRes["couponInfo"]["fav"]; $afterCouponPrice = $tuiguangRes["price"]; $rebeatPrice = round($tuiguangRes["commission"]*0.7,2); $url = $tuiguangRes["url"]; $msg = <<我的=>钱包,可以1:1提现哦 S; $wenti = new Text($msg); $app->customer_service->message($wenti)->to($officialOpenId)->send(); return; } //3.判断是否匹配到京东链接 $res = preg_match("/https\:\/\/item\.m\.jd\.com/",$message["Content"],$match); if($res){ $instance->info("匹配到京东链接"); $goodsInfo = JutuikeUtil::transferGoodsLink($message["Content"]); $tuiguangRes = JutuikeUtil::convert($goodsInfo["goodsId"],$jutuikeSid,$goodsInfo["source"]); $goodsTitle = $tuiguangRes["goodsName"]; $goodsPrice = $tuiguangRes["marketPrice"]; $couponPrice = $tuiguangRes["couponInfo"]["fav"]; $afterCouponPrice = $tuiguangRes["price"]; $rebeatPrice = round($tuiguangRes["commission"]*0.7,2); $url = $tuiguangRes["url"]; $msg = <<我的=>钱包,可以1:1提现哦 S; $wenti = new Text($msg); $app->customer_service->message($wenti)->to($officialOpenId)->send(); return; } //2.判断是否匹配上淘宝链接 // $res = preg_match("/https\:\/\/m\.tb\.cn/",$message["Content"],$match); // // if($res){ // $instance->info("匹配到淘宝链接"); // $goodsInfo = JutuikeUtil::transferGoodsLink($message["Content"]); // $tuiguangRes = JutuikeUtil::convert($goodsInfo["goodsId"],$jutuikeSid); // $goodsTitle = $tuiguangRes["goodsName"]; // $goodsPrice = $tuiguangRes["marketPrice"]; // $couponPrice = $tuiguangRes["couponInfo"]["fav"]; // $afterCouponPrice = $tuiguangRes["price"]; // $rebeatPrice = round($tuiguangRes["commission"]*0.7,2); // $url = $tuiguangRes["url"]; // $msg = <<我的=>钱包,可以1:1提现哦 //S; // $wenti = new Text($msg); // $app->customer_service->message($wenti)->to($officialOpenId)->send(); // return; // } //默认是认为淘宝链接 $instance->info("匹配到淘宝链接"); $info = TaobaoLianMengUtil::taokoulingConvert($message["Content"],$taobaoSid); $instance->info("淘宝返回数据:".json_encode($info)); $goodsInfo = TaobaoLianMengUtil::getGoodsInfo($info["num_iid"],$taobaoSid); $res = TaobaoLianMengUtil::taokoulingCreate($info["click_url"],$taobaoSid); $heimaData = HeiMaUtil::gaoYongZhuanLian($info["num_iid"],$taobaoSid); $goodsTitle = $goodsInfo["title"]; $goodsPrice = $goodsInfo["zk_final_price"]; $couponInfo = $heimaData["coupon_info"]??""; $couponPrice = 0; if (preg_match("/满\d*元减(\d*)元/",$couponInfo,$match)){ $couponPrice = $match[1]; } $afterCouponPrice = $goodsPrice-$couponPrice; $rebeatPrice = round($goodsInfo["zk_final_price"]*$heimaData["max_commission_rate"]/100*0.7,2); $url = $res["model"]; //获取淘口令 // $tuiguangRes = JutuikeUtil::convert($goodsInfo["num_iid"],$jutuikeSid); // $goodsTitle = $tuiguangRes["goodsName"]; // $goodsPrice = $tuiguangRes["marketPrice"]; // $couponPrice = $tuiguangRes["couponInfo"]["fav"]; // $afterCouponPrice = $tuiguangRes["price"]; // $rebeatPrice = round($tuiguangRes["commission"]*0.7,2); // $url = $tuiguangRes["url"]; $msg = <<我的=>钱包,可以1:1提现哦 S; $wenti = new Text($msg); $app->customer_service->message($wenti)->to($officialOpenId)->send(); return; }catch (\Throwable $exception){ $instance->info("异常信息:".$exception->getMessage()); $wenti = new Text("请换个商品,该商品没有返利"); $app->customer_service->message($wenti)->to($officialOpenId)->send(); } } /** * 设置公众号菜单逻辑 */ public static function setMenuLogic() { $params = request()->all(); //1.获取所有上线的一级菜单 $menus = WechatAccountMenuConfigModel::getMenuByParentId(0); $configs = []; foreach ($menus as $menu){ switch ($menu->menu_type){ case WechatAccountMenuTypeEnum::CLICK: //点击菜单 $configs[] = [ "type" => "click", "name" => $menu->menu_name, "key" => $menu->menu_key ]; break; case WechatAccountMenuTypeEnum::LINK: //商品链接 $configs[] = [ "type" => "view", "name" => $menu->menu_name, "url" => $menu->menu_url ]; break; case WechatAccountMenuTypeEnum::MENU: //菜单 //获取下级菜单 $tmps = WechatAccountMenuConfigModel::getMenuByParentId($menu->id); $subMenus = []; foreach ($tmps as $tmp){ switch ($tmp->menu_type) { case WechatAccountMenuTypeEnum::CLICK: //点击菜单 $subMenus[] = [ "type" => "click", "name" => $tmp->menu_name, "key" => $tmp->menu_key ]; break; case WechatAccountMenuTypeEnum::LINK: //链接 $subMenus[] = [ "type" => "view", "name" => $tmp->menu_name, "url" => $tmp->menu_url ]; break; } } $configs[] = [ "name"=>$menu->menu_name, "sub_button"=>$subMenus ]; break; } } $app = WechatAccountUtil::getApp($params["wechat_app_code"]); $instance = new LoggerFactoryUtil(WechatLogic::class); $instance->info("菜单:".json_encode($configs)); return $app->menu->create($configs); } /** * 获取公众号配置 */ public static function accountConfigLogic() { $params = request()->all(); $account = WechatAccountModel::findByWechatAppCode($params["wechat_app_code"]); $data = BaseUtil::getJsapiSign($account->wechat_app_id,$account->wechat_app_secret,$params["url"]); return $data; } /** * 微信公众号授权回调 */ public static function accountCallbackLogic() { $instance = new LoggerFactoryUtil(WechatLogic::class); $params = request()->all(); $instance->info("微信回调数据:".json_encode($params)); //切割公众号和邀请人 $arr = explode("|",$params["state"]); $wechatAccount = WechatAccountModel::findByWechatAppId($arr[0]); //获取站点信息 $webSite = WebSiteModel::findByWechatAccountId($wechatAccount->id); $app = WechatAccountUtil::getAppByID($wechatAccount->id); try{ $userInfo = $app->oauth->user()->getOriginal(); }catch (\Throwable $exception){ if(env("APP_ENV")=="local"){ $url = "http://127.0.0.1:8080"; }else{ $url = "http://".$webSite->web_site_host; } return $url; } $instance->info("用户信息:".json_encode($userInfo)); //判断用户是否存在 $user = UserModel::findByAccountOpenId($userInfo["openid"]); $inviteUserId = 0; if($arr[1]){ //存在推荐人 $inviteUserId = $arr[1]; } if(!$user){ //不存在则创建 $userId = UserModel::query()->insertGetId( [ "wechat_account_id"=>$wechatAccount->id, "web_site_id"=>$webSite->id, "user_open_id"=>$userInfo["openid"], "user_head_img_url"=>$userInfo["headimgurl"], "user_nickname"=>$userInfo["nickname"], "user_sex"=>$userInfo["sex"], "user_api_key"=>uniqid("fbt"), "user_api_key_expire_time"=>date("Y-m-d H:i:s",strtotime("+1 year")), "created_at"=>date("Y-m-d H:i:s"), "updated_at"=>date("Y-m-d H:i:s"), "invite_user_id"=>$inviteUserId ] ); }else{ //存在则更新用户头像 UserModel::query() ->where("id",$user->id) ->update( [ "user_head_img_url"=>$userInfo["headimgurl"], "user_nickname"=>$userInfo["nickname"], "wechat_account_id"=>$wechatAccount->id, "web_site_id"=>$webSite->id ] ); $userId = $user->id; } $token = md5(uniqid("fbt")); BaseUtil::setRedisCache($token,$userId,24*3600); if(env("APP_ENV")=="local"){ $url = "http://127.0.0.1:8080?wechatToken=".$token; }else{ $url = "http://".$webSite->web_site_host."?wechatToken=".$token; } $instance->info("回调地址:".$url); return $url; } }