多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
慢慢的你会发现除了获取参数的地方不一样,登录流程都差不多,可能是接口路径啥的不太一致 但是获取用户信息,**出奇的一至**:`https://api.weixin.qq.com/sns/userinfo` **获取openid的却不一样** 小程序的是:`https://api.weixin.qq.com/sns/jscode2session` 扫码的、公众号的、app的是:`https://api.weixin.qq.com/sns/oauth2/access_token` ## pc扫码 开始解说 先来个公共的curl函数 ```php function geturl($url){ $headerArray =array("Content-type:application/json;","Accept:application/json"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray); $output = curl_exec($ch); curl_close($ch); $output = json_decode($output,true); return $output; } ``` 1、获取二维码 ```php $appid="wx1e1275cb2e70e359"; //扫码后回调地址 $url=urlencode("http://www.taianyuannongmu.com/business/login/weixin2"); $headerurl="https://open.weixin.qq.com/connect/qrconnect?appid=".$appid; $headerurl.="&redirect_uri=".$url; $headerurl.="&response_type=code&scope=snsapi_login&state=wechat_redirect" header("Location:".$headerurl); ``` 2、成功回调获取openid ```php $appid=""; $AppSecret=""; $url=urlencode("http://www.taianyuannongmu.com/business/login/weixin2"); $weixinurl= "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid; $weixinurl.="&secret=".$AppSecret; $weixinurl.="&code=".$_GET["code"]; $weixinurl.="&grant_type=authorization_code"; //这里是curl $res=$this->geturl($weixinurl); $_SESSION["access_token"]=$res['access_token']; $_SESSION["openid"]=$res['openid']; ``` 3.获取用户信息 ```php $access_token=$_SESSION["access_token"]; $openid=$_SESSION["openid"]; /*获取用户信息*/ $get_user_info_url='https://api.weixin.qq.com/sns/userinf'; $get_user_info_url.='?access_token='.$access_token; $get_user_info_url.='&openid='.$openid.'&lang=zh_CN'; $weixin3res= $this->geturl($get_user_info_url); ``` 剩下的就是逻辑代码处理 ## app登录 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415141316813.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd6aGFl,size_16,color_FFFFFF,t_70) 前端调取授权 后端根据前端的code获取OPENID和身份信息 先来个公共的curl函数 ```php function geturl($url){ $headerArray =array("Content-type:application/json;","Accept:application/json"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray); $output = curl_exec($ch); curl_close($ch); $output = json_decode($output,true); return $output; } ```php $appid = ""; //开发平台申请 $appsecret = ""; //开发平台申请 $code = $_GET['code']; //安卓端提供用户同意登入后的code //认证 $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$appsecret."&code=".$code ."&grant_type=authorization_code"; //调用微信api $rs = $this -> geturl($url); if(!$rs)$this -> error('获取OPENID失败'); $rt = json_decode($rs, 1); if($rt['errcode'])$this -> error('授权失败:'.$rt['errmsg']); // 拉取用户信息 $url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$rt['access_token']."&openid=".$rt['openid']."&lang=zh_CN "; $wechat_info = $this -> geturl($url); if(!$wechat_info)$this -> error('获取用户资料失败:CURL '.$http -> errmsg); $wechat_info = json_decode($wechat_info, 1); if($wechat_info['errcode']){ $this -> error("获取用户资料失败".$wechat_info['errmsg']); } $user_info = array( "headimg"=>$wechat_info['headimgurl'], //头像 "nickname"=>$wechat_info['nickname'], //昵称 "sex"=>$wechat_info['sex'], //性别 "openid"=>$wechat_info['openid'], //app唯一 "unionid"=>$wechat_info['unionid'] //微信内部唯一,小程序, 公众号, web, 移动应用都是一致的 ); ``` ## 小程序 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415140958556.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd6aGFl,size_16,color_FFFFFF,t_70) 1、前端获取到code后传给后端 2、通过code获取openid 接口路径https://api.weixin.qq.com/sns/jscode2session? 3、通过openid获取用户信息 接口路径 https://api.weixin.qq.com/sns/userinfo? 整合代码 ```php <?php namespace real; /** * 小程序登录类 */ class WeChatMiniProgram { public $APPID=""; public $SECRET=""; // 1、前端获取到 code 后传给后端 // 2、通过 code 获取 openid public function getOpenid($code){ $httpcurl="https://api.weixin.qq.com/sns/jscode2session?"; $httpcurl.="appid=".$this->APPID; $httpcurl.="&secret=".$this->SECRET; $httpcurl.="&js_code=".$code; $httpcurl.="&grant_type=authorization_code"; $zz=$this->geturl($httpcurl); return $zz; } //3、通过openid获取用户信息 public function getUserinfo($access_token,$openid){ $get_user_info_url='https://api.weixin.qq.com/sns/userinfo'; $get_user_info_url.='?access_token='.$access_token; $get_user_info_url.='&openid='.$openid.'&lang=zh_CN'; $data=$this->geturl($get_user_info_url); return $data; } //getcurl public function geturl($url){ $headerArray =array("Content-type:application/json;","Accept:application/json"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray); $output = curl_exec($ch); //关闭URL请求 if($output === FALSE ){ echo "CURL Error:".curl_error($ch); } curl_close($ch); $output = json_decode($output,true); return $output; } } ``` ## 公众号 **写代码前先得服务器配置** 服务器配置验证用 ```php $timestamp = $_GET['timestamp']; $nonce = $_GET['nonce']; $token = 'weixuegu'; $signature = $_GET['signature']; $array = array($timestamp,$nonce,$token); sort($array); //将排序后的三个参数拼接之后参数拼接之后进行sha1加密 $tmpstr = implode('',$array); $tmpstr = sha1($tmpstr); // $file_write = file_put_contents("./".time().'.text',$signature.",".json_encode($tmpstr)); //将加密后的字符串与signature进行对比; if($tmpstr == $signature && isset($_GET['echostr'])){ echo $_GET['echostr']; exit; }else{ $this->responseMsg(); } ``` **去权限设置,授权登录,设置域名** ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061717411070.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd6aGFl,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415141227508.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd6aGFl,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415141239731.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd6aGFl,size_16,color_FFFFFF,t_70) 来我们解释代码了 **微信公众号第一步:获取code** ```php $appid= $this->appid; $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="; //appid $url.=$appid; $url.="&redirect_uri="; // 这里是回调的域名和地址 $url.="http://".$_SERVER['SERVER_NAME']."/api/Weixinlogin"; //下面的都是固定参数 $url.="&response_type=code"; $url.="&scope=snsapi_userinfo"; $url.="&state="."123"; $url.="#wechat_redirect"; header("location: ".$url) ; exit(); ``` **微信公众号第二步:根据code获取openid** ```php $appid= $this->appid; $secret= $this->secret; //第一步返回的code $code = $_GET['code']; $get_token_url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='; $get_token_url.=$appid; $get_token_url.='&secret='; $get_token_url.=$secret; $get_token_url.='&code='; $get_token_url.=$code; $get_token_url.='&grant_type=authorization_code'; //通过curl获取到数据access_token和openid $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $get_token_url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);// 跳过证书检查 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($curl); if($res === FALSE ){ echo "CURL Error:".curl_error($curl); } $json_obj=json_decode($res,true); $_SESSION["access_token"]=$json_obj['access_token']; $_SESSION["openid"]=$json_obj['openid']; ``` **微信公众号第四步:根据openid获取用户信息** 这里不用第三步,没必要哈 ```php $access_token=$_SESSION['access_token']; $openid=$_SESSION["openid"]; $get_user_info_url='https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN'; $curl1 = curl_init(); // 启动一个CURL会话 curl_setopt($curl1, CURLOPT_URL, $get_user_info_url); curl_setopt($curl1, CURLOPT_RETURNTRANSFER, 1);// 跳过证书检查 curl_setopt($curl1, CURLOPT_SSL_VERIFYPEER, false); $res1 = curl_exec($curl1); //返回api的json对象 //关闭URL请求 if($res1 === FALSE ){ echo "CURL Error:".curl_error($curl1); } ////解析json $user_obj=json_decode($res1,true); $data=$user_obj; ``` **然后我们可以根据openid,进行登录,如果没有账户,让客户绑定手机或者进行注册** ```php <?php namespace app\api\controller; header('Access-Control-Allow-Origin:*'); // 响应类型 header('Access-Control-Allow-Methods:*'); // 响应头设置 header('Access-Control-Allow-Headers:*'); header('Access-Control-Allow-Credentials: true'); use app\common\controller\Api; use app\common\library\Ems; use app\common\library\Sms; use fast\Random; use think\Validate; use think\Db; use think\Config; use \app\common\model\User; use app\common\model\UserRule; use app\common\library\Token; use think\Exception; use think\Hook; use think\Request; /** * 会员接口 */ class Weixinlogin extends Api { public $appid=""; public $secret=""; protected $noNeedLogin = ['*']; protected $noNeedRight = '*'; public function index(){ if(isset($_GET)&&!empty($_GET)){ $this->weiixnhuidiao(); }else{ $this->weilogin(); } } public function weilogin(){ $appid= $this->appid; $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="; $url.=$appid; $url.="&redirect_uri="; // $url.="http://admin.weixuegu.cn/api/Weixinlogin"; $url.="http://".$_SERVER['SERVER_NAME']."/api/Weixinlogin"; $url.="&response_type=code"; $url.="&scope=snsapi_userinfo"; $url.="&state="."123"; $url.="#wechat_redirect"; header("location: ".$url) ; exit(); } public function weiixnhuidiao(){ //第二步 if(!isset($_SESSION["openid"]) || empty($_SESSION["openid"])){ $appid= $this->appid; $secret= $this->secret; $code = $_GET['code']; $get_token_url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='; $get_token_url.=$appid; $get_token_url.='&secret='; $get_token_url.=$secret; $get_token_url.='&code='; $get_token_url.=$code; $get_token_url.='&grant_type=authorization_code'; $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $get_token_url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);// 跳过证书检查 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($curl); if($res === FALSE ){ echo "CURL Error:".curl_error($curl); } $json_obj=json_decode($res,true); // var_dump($json_obj);die; $_SESSION["access_token"]=$json_obj['access_token']; $_SESSION["openid"]=$json_obj['openid']; } //第四步 $access_token=$_SESSION['access_token']; $openid=$_SESSION["openid"]; $get_user_info_url='https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN'; $curl1 = curl_init(); // 启动一个CURL会话 curl_setopt($curl1, CURLOPT_URL, $get_user_info_url); curl_setopt($curl1, CURLOPT_RETURNTRANSFER, 1);// 跳过证书检查 curl_setopt($curl1, CURLOPT_SSL_VERIFYPEER, false); $res1 = curl_exec($curl1); //返回api的json对象 //关闭URL请求 if($res1 === FALSE ){ echo "CURL Error:".curl_error($curl1); } ////解析json $user_obj=json_decode($res1,true); $data=$user_obj; $url =" http://swa.weixuegu.cn"; $i=0; foreach ($data as $key=>$value) { if($i==0&&!is_array($value)){ $i++; $url.="?".$key."=".urldecode($value); }else if(!is_array($value)){ $i++; $url.="&".$key."=".urldecode($value); } } echo " <script>"; echo ' window.open("'.$url.'");'; echo " </script>"; echo ' <script src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script> <script> // init vConsole var vConsole = new VConsole(); console.log(res); </script> '; //die; } public function login($openid,$password=""){ //username mobile $user = User::get(['weixinopenid' => $openid]); if (!$user) { $this->error("没有账户"); } if ($user['status'] == 'hidden') { $this->error("用户被禁用"); } if ($user) { $ret = $this->auth->weixinopenid_login($user->username); if ($ret) { $data = ['userinfo' => $this->auth->getUserinfo()]; $this->success(__('Logged in successful'), $data); } else { $this->error($this->auth->getError()); } }else { $this->error("失败2"); } } /** * 设置错误信息 * * @param $error 错误信息 * @return Auth */ public function setError($error) { $this->_error = $error; return $this; } public function Binding_user(){ //username mobile $mobile = $this->request->request("mobile"); $password = $this->request->request("password"); $openid = $this->request->request("openid"); $headimgurl = $this->request->request("headimgurl"); if (!$password ) { $this->error(__('密码不能为空')); } if (!Validate::regex($mobile, "^1\d{10}$")) { $this->error(__('账户格式错误')); } $user = \app\common\model\User::getByMobile($mobile); if (!$user) { // 检测用户名或邮箱、手机号是否存在 $this->error(__('你还没有账号哦,请在pc端注册并绑定微信')); } if ($user->password != md5(md5($password) . $user->salt)) { $this->error(__('密码错误')); } $user->weixinopenid = $openid; $user->avatar = $headimgurl; $user->save(); // $ret = $this->auth->login($mobile, $password); $this->login($openid); //$this->success(__('Logged in successful'), $ret); } } ```