公众号自动登录php
public function isWeixin()
{
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'wxwork') === false) {
return true;
}
return false;
}创建WxService.php,代码如下
<?php
namespace app\common\controller;
class WxService
{
protected $appid;
protected $appKey;
public $data = null;
public function __construct($appid, $appKey)
{
$this->appid = $appid; //微信支付申请对应的公众号的APPID
$this->appKey = $appKey; //微信支付申请对应的公众号的APP Key
}
/**
* 通过跳转获取用户的openid,跳转流程如下:
* 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
* 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
*
* @return 用户的openid
*/
public function GetOpenid()
{
//通过code获得openid
if (!isset($_GET['code'])){
//触发微信返回code码
$baseUrl = $this->getCurrentUrl();
$url = $this->__CreateOauthUrlForCode($baseUrl);
Header("Location: $url");
exit();
} else {
//获取code码,以获取openid
$code = $_GET['code'];
$openid = $this->getOpenidFromMp($code);
return $openid;
}
}
public function getCurrentUrl()
{
//$scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';
$scheme = 'http://';
$uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING'];
if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI'];
$baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$uri);
return $baseUrl;
}
/**
* 通过code从工作平台获取openid机器access_token
* @param string $code 微信跳转回来带上的code
* @return openid
*/
public function GetOpenidFromMp($code)
{
$url = $this->__CreateOauthUrlForOpenid($code);
$res = self::curlGet($url);
$data = json_decode($res,true);
$this->data = $data;
return $data;
}
/**
* 构造获取open和access_toke的url地址
* @param string $code,微信跳转带回的code
* @return 请求的url
*/
private function __CreateOauthUrlForOpenid($code)
{
$urlObj["appid"] = $this->appid;
$urlObj["secret"] = $this->appKey;
$urlObj["code"] = $code;
$urlObj["grant_type"] = "authorization_code";
$bizString = $this->ToUrlParams($urlObj);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
}
/**
* 构造获取code的url连接
* @param string $redirectUrl 微信服务器回跳的url,需要url编码
* @return 返回构造好的url
*/
private function __CreateOauthUrlForCode($redirectUrl)
{
$urlObj["appid"] = $this->appid;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_userinfo";
$urlObj["state"] = "STATE";
$bizString = $this->ToUrlParams($urlObj);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
}
/**
* 拼接签名字符串
* @param array $urlObj
* @return 返回已经拼接好的字符串
*/
private function ToUrlParams($urlObj)
{
$buff = "";
foreach ($urlObj as $k => $v)
{
if($k != "sign") $buff .= $k . "=" . $v . "&";
}
$buff = trim($buff, "&");
return $buff;
}
/**
* 获取用户信息
* @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid
* @return string
*/
public function getUserInfo($openid,$access_token)
{
$response = self::curlGet('https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN');
return json_decode($response,true);
}
public static function curlGet($url = '', $options = array())
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public static function curlPost($url = '', $postData = '', $options = array())
{
if (is_array($postData)) {
$postData = http_build_query($postData);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
}
登录OR注册用户代码
$config = getSettingCache('weixin');
$wx = new WxService($config['appid'], $config['appsecret']);
$wxGetOpenid = $wx->GetOpenid();
$access_token = $wxGetOpenid['access_token'];
//获取openid
$openid = $wxGetOpenid['openid'];
$wxGetUser = $wx->getUserInfo($openid, $access_token);
//获取头像
$nick_name = $wxGetUser['nickname'];
$headimgurl = $wxGetUser['headimgurl'];
//检测用户是否已注册
$check = model('user')->where('openid', $openid)->count();
if($check > 0){
$user = model('user')->where('openid', $openid)->find();
$data['id'] = $user['id'];
$data['user_name'] = $user['user_name'];
$data['nick_name'] = $user['nick_name'];
$data['refer_id'] = $user['refer_id'];
$info = \org\Crypt::encrypt(json_encode($data));
cookie('userInfo',$info);
session('__token__',null);
}else{
if(!empty(cookie('uid'))){
$refer_id = intval(cookie('uid'));
}else{
$refer_id = 0;
}
$password = rand(100000, 999999);
$data['user_name'] = '微信用户'.substr($openid, 2, 10);
$data['nick_name'] = $nick_name;
$data['avatar'] = $headimgurl;
$data['password'] = md5($password);
$data['refer_id'] = $refer_id;
$data['mobile'] = '';
$data['login_time'] = time();
$data['model'] = 1;
$data['openid'] = $openid;
if(model('user')->allowField(true)->save($data))
{
unset($data['password']);
$data['id'] = model('user')->id;
$info = \org\Crypt::encrypt(json_encode($data));
cookie('userInfo', $info);
session('__token__',null);
$this->redirect('user.account/phone');
}else{
exit('注册失败,请刷新重试');
}
}