嘟嘟社区

微信免申请实现扫码登陆



不要泛滥,不要泛滥,不要泛滥
和谐了,你我都不好受

不知道是啥的,看演示地址: https://forum.runpod.cn/OAuthLogin/WeChat

php代码如下,大佬们自行研究吧

做的太简单和谐的快

  1. <?php
  2. namespace AppPluginsOAuthLoginsrcControllerWeChat;
  3. use AppPluginsOAuthLoginsrcModelOauthLoginWechat;
  4. use AppPluginsOAuthLoginsrcModelOauthLoginWechatBind;
  5. use AppPluginsUsersrcEventAfterLogin;
  6. use AppPluginsUsersrcLibUserAuth;
  7. use AppPluginsUsersrcModelsUser;
  8. use AppPluginsUsersrcModelsUserClass;
  9. use AppPluginsUsersrcModelsUsersOption;
  10. use HyperfHttpServerAnnotationController;
  11. use HyperfHttpServerAnnotationGetMapping;
  12. use HyperfHttpServerAnnotationPostMapping;
  13. use HyperfUtilsStr;
  14. use HyperfExtHashingHash;
  15. #[Controller(prefix:"/api/OAuthLogin/WeChat")]
  16. class ApiController
  17. {
  18.         private string $appid = "wx311697afe4355554";
  19.         private string $redirect_uri = "https://lol.qq.com/";
  20.         private string $qrcode_uri = "https://open.weixin.qq.com/connect/qrcode/";
  21.        
  22.         // 获取二维码
  23.         public function getQrCode(){
  24.                 return $this->qrcode_uri.$this->getUuid();
  25.         }
  26.        
  27.         private function getSessionId(){
  28.                 if(!session()->get("OAuthLogin_WeChat")){
  29.                         session()->set("OAuthLogin_WeChat",Str::random());
  30.                 }
  31.                 return session()->get("OAuthLogin_WeChat");
  32.         }
  33.        
  34.         // 获取uuid
  35.         private function getUuid(){
  36.                 $session_id = $this->getSessionId();
  37.                 if(cache()->has("oauth.wechat.uuid.".$session_id)){
  38.                         return cache()->get("oauth.wechat.uuid.".$session_id);
  39.                 }
  40.                 $data = http("raw")->get("https://open.weixin.qq.com/connect/qrconnect?appid=".$this->appid."&redirect_uri=".$this->redirect_uri."&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect")->getBody();
  41.                 $uuid = Str::after((string)$data,’"https://long.open.weixin.qq.com/connect/l/qrconnect?uuid=’);
  42.                 $uuid = Str::before($uuid,’"’);
  43.                 cache()->set("oauth.wechat.uuid.".$session_id,$uuid,300);
  44.                 return cache()->get("oauth.wechat.uuid.".$session_id);
  45.         }
  46.        
  47.         // get open id
  48.         public function getWxCode(){
  49.                 $data = http("raw")->get("https://long.open.weixin.qq.com/connect/l/qrconnect?uuid=".$this->getUuid())->getBody();
  50.                 $wx_errcode = Str::after((string)$data,’window.wx_errcode=’);
  51.                 $wx_errcode = Str::before($wx_errcode,";");
  52.                 if($wx_errcode!=405){
  53.                         return null;
  54.                 }
  55.                 $wx_code = Str::after((string)$data,"window.wx_code=’");
  56.                 $wx_code = Str::before($wx_code,"’");
  57.                 return $wx_code;
  58.         }
  59.        
  60.         // 获取SMsg
  61.         public function getSMsg(){
  62.                 if(!cache()->has("oauth.wechat.wxcode.".$this->getWxCode())){
  63.                         $config = [
  64.                                 "headers" =>[
  65.                                         "authority" => "apps.game.qq.com",
  66.                                         "referer" => "https://lol.qq.com/"
  67.                                 ]
  68.                         ];
  69.                         $data = http(‘array’)->get("https://apps.game.qq.com/ams/ame/codeToOpenId.php?appid=".$this->appid."&wxcode=".$this->getWxCode()."&sServiceType=lol&wxcodedomain=lol.qq.com&acctype=wx",$config);
  70.                         cache()->set("oauth.wechat.wxcode.".$this->getWxCode(),$data,600);
  71.                 }
  72.                 return cache()->get("oauth.wechat.wxcode.".$this->getWxCode());
  73.         }
  74.        
  75.         private function getOpenId(){
  76.                 $data  = $this->getSMsg();
  77.                 if($data[‘iRet’]!=0){
  78.                         return null;
  79.                 }
  80.                 return json_decode($data[‘sMsg’],true)[‘openid’];
  81.         }
  82.        
  83.         public function get_access_token(){
  84.                 $data  = $this->getSMsg();
  85.                 if($data[‘iRet’]!=0){
  86.                         return null;
  87.                 }
  88.                 return json_decode($data[‘sMsg’],true)[‘access_token’];
  89.         }
  90.        
  91.         #[PostMapping(path:"get_user_info")]
  92.         public function get_user_info(){
  93.                 $data = http("raw")->get("https://api.weixin.qq.com/sns/userinfo?access_token=".$this->get_access_token()."&openid=".$this->getOpenId())->getBody();
  94.                 return json_decode(stripcslashes($data),true);
  95.         }
  96.        
  97.         #[PostMapping(path:"status")]
  98.         public function status(){
  99.                 if(!$this->getUuid()){
  100.                         return Json_Api(403,false,[‘msg’ => ‘uuid不存在’]);
  101.                 }
  102.                 $data = http("raw")->get("https://long.open.weixin.qq.com/connect/l/qrconnect?uuid=".$this->getUuid())->getBody();
  103.                 $wx_errcode = Str::after((string)$data,’window.wx_errcode=’);
  104.                 $wx_errcode = Str::before($wx_errcode,";");
  105.                 $msg = match (@(string)$wx_errcode){
  106.                         ‘404’ => ‘扫码成功’,
  107.                         ‘405’ => ‘确认登录’,
  108.                         ‘403’ => ‘取消登陆’,
  109.                         ‘402’ => ‘超时或获取失败,需要重新获取二维码’,
  110.                         ‘408’ => ‘暂未扫码’
  111.                 };
  112.                 if($wx_errcode==405){
  113.                         return Json_Api(200,true,[‘msg’ => $msg]);
  114.                 }
  115.                
  116.                 return Json_Api((int)$wx_errcode,false,[‘msg’ => $msg]);
  117.         }
  118.        
  119.         #[PostMapping(path:"remove_cookie")]
  120.         public function remove_cookie(){
  121.                
  122.                 // get session id
  123.                 $session_id = $this->getSessionId();
  124.                 // remove uuid
  125.                 cache()->delete("oauth.wechat.uuid.".$session_id);
  126.                 return Json_Api(200,true,[‘msg’ => ‘cookie清理完毕’]);
  127.         }
  128.        
  129.         #[PostMapping(path:"bind")]
  130.         public function bind(){
  131.                 // 绑定
  132.                 if($this->get_wechat_id()===false){
  133.                         // 没读到openid
  134.                         return Json_Api(403,false,[‘msg’ => ‘未获取到open_id’]);
  135.                 }
  136.                 if(auth()->check()){
  137.                         // 开始绑定
  138.                         return $this->logind_bind($this->get_wechat_id());
  139.                 }
  140.                 if(OauthLoginWechatBind::query()->where([‘wechat_id’=>$this->get_wechat_id()])->exists()){
  141.                         $user_id = OauthLoginWechatBind::query()->where([‘wechat_id’=>$this->get_wechat_id()])->first()->user_id;
  142.                         $user_data = User::query()->where(‘id’,$user_id)->first();
  143.                         $this->SignIn($user_data);
  144.                         $this->remove_cookie();
  145.                         return Json_Api(302,true,[‘msg’ => ‘登陆成功!’]);
  146.                 }
  147.                 return Json_Api(301,true,[‘msg’ => ‘未登录,注册或登录后自动绑定’]);
  148.         }
  149.        
  150.         private function SignIn($user){
  151.                 // 数据库里的密码
  152.                 $token = Str::random(17);
  153.                 session()->set(‘auth’, $token);
  154.                 (new UserAuth())->create($user->id,$token);
  155.                 session()->set("auth_data",User::query()->where("id",auth()->id())->with("Class")->first());
  156.                 session()->set("auth_data_class",UserClass::query()->where("id",auth()->data()->class_id)->first());
  157.                 session()->set("auth_data_options",UsersOption::query()->where("id",auth()->data()->options_id)->first());
  158.                 EventDispatcher()->dispatch(new AfterLogin($user));
  159.                 return true;
  160.         }
  161.        
  162.         private function logind_bind($wechat_id){
  163.                 if(OauthLoginWechatBind::query()->where("wechat_id",$wechat_id)->exists()){
  164.                         return Json_Api(403,false,[‘msg’ => ‘绑定失败,此微信已被别的用户绑定!’]);
  165.                 }
  166.                 OauthLoginWechatBind::query()->where("wechat_id",$wechat_id)->create([
  167.                         ‘user_id’ => auth()->id(),
  168.                         ‘wechat_id’ => $wechat_id
  169.                 ]);
  170.                 $this->remove_cookie();
  171.                 return Json_Api(200,true,[‘msg’ => ‘绑定成功!’]);
  172.         }
  173.        
  174.         // 读oauth_login_wechat表数据:id
  175.         private function get_wechat_id():bool|int{
  176.                 if($this->getOpenId()){
  177.                         if(OauthLoginWechat::query()->where("open_id",$this->getOpenId())->exists()){
  178.                                 return (int)OauthLoginWechat::query()->where("open_id",$this->getOpenId())->first()->id;
  179.                         }
  180.                         $data = http("raw")->get("https://api.weixin.qq.com/sns/userinfo?access_token=".$this->get_access_token()."&openid=".$this->getOpenId())->getBody();
  181.                         OauthLoginWechat::query()->create([
  182.                                 ‘open_id’ => $this->getOpenId(),
  183.                                 ‘data’ => $data
  184.                         ]);
  185.                         return (int)OauthLoginWechat::query()->where("open_id",$this->getOpenId())->first()->id;
  186.                        
  187.                 }
  188.                 return false;
  189.         }
  190. }

复制代码

开源QQ机器人程序 https://hostloc.com/thread-978890-1-1.html
开源论坛程序 https://hostloc.com/thread-978629-1-1.html
早几个月前我就分析过了,只能说用来做些临时的项目可以(或者对已有用户系统进行绑定实现快速登录也可以,一旦失效自身的用户登录系统还可用),如果没有自身账号密码登录系统的话长远考虑并不推荐,因为一旦被封用不了了将丢失全部用户。
大佬牛逼啊
还是想念大佬的WP开心主题
前排膜拜
牛逼 我改个.net的
谢谢大佬
这是个真大佬
NB PULS
nbnb