慢慢的你会发现除了获取参数的地方不一样,登录流程都差不多,可能是接口路径啥的不太一致
但是获取用户信息,出奇的一至: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函数
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、获取二维码
$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
$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.获取用户信息
$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登录
前端调取授权
后端根据前端的code获取OPENID和身份信息
先来个公共的curl函数
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, 移动应用都是一致的
);
小程序
1、前端获取到code后传给后端
2、通过code获取openid 接口路径https://api.weixin.qq.com/sns/jscode2session?
3、通过openid获取用户信息 接口路径 api.weixin.qq.com/sns/userinf…?
整合代码
<?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;
}
//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;
}
}
公众号
写代码前先得服务器配置
服务器配置验证用
$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();
}
去权限设置,授权登录,设置域名
来我们解释代码了
微信公众号第一步:获取code
$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
$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获取用户信息
这里不用第三步,没必要哈
$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
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);
}
}