<?php
class WxUser
{
private $config;
private $CURL_TIMEOUT=6;
function __construct($config=[])
{
$this->setConfig($config);
}
/**
* 设置必须配置的信息
* @param $config
* @return $this
*/
public function setConfig($config){
$this->config['APPID']=$config['AppID'];
$this->config['APPSECRET']=$config['AppSecret'];
$this->config['REDIRECT_URI']='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
return $this;
}
/**
*
* 通过跳转获取当前用户的基本信息openid。跳转流程如下:
* 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
* 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
*/
public function getOpenid()
{
//通过code获得openid
if (!isset($_GET['code'])){
//触发微信返回code码
$baseUrl = urlencode($this->config['REDIRECT_URI']);
$url = $this->__CreateOauthUrlForCode($baseUrl);
header("Location: $url");
exit();
} else {
//获取code码,以获取openid
$url = $this->__CreateOauthUrlForOpenid($_GET['code']);
$info= $this->GetCurl($url);
return $info['openid'];
}
}
function getAccess_arr(){
$urlObj["grant_type"] = "client_credential";
$urlObj["appid"] = $this->config['APPID'];
$urlObj["secret"] = $this->config['APPSECRET'];
$url='https://api.weixin.qq.com/cgi-bin/token?'.$this->ToUrlParams($urlObj);
return $this->GetCurl($url);
}
/**
*
* 构造获取open和access_toke的url地址
* @param string $code,微信跳转带回的code
*
* @return 请求的url
*/
private function __CreateOauthUrlForOpenid($code)
{
$urlObj["appid"] = $this->config['APPID'];
$urlObj["secret"] = $this->config['APPSECRET'];
$urlObj["code"] = $code;
$urlObj["grant_type"] = "authorization_code";
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$this->ToUrlParams($urlObj);
}
/**
*
* 构造获取code的url连接
* @param string $redirectUrl 微信服务器回跳的url,需要url编码
*
* @return 返回构造好的url
*/
private function __CreateOauthUrlForCode($redirectUrl)
{
$urlObj["appid"] = $this->config['APPID'];
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$this->ToUrlParams($urlObj);
}
/**
* get方式获取远程服务器中的数据
* @param $url
* @return mixed
*/
private function GetCurl($url)
{
//初始化curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $this->CURL_TIMEOUT);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出返回数据
return json_decode($res,true);
}
/**
*
* 拼接签名字符串
* @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;
}
}
使用方式
$config['AppID']='';
$config['AppSecret']='';
$WxUser=new WxUser($config);
echo $id=$WxUser->getOpenid();