PHP实现微信获取用户基本信息(openid、头像、昵称)

41次阅读

共计 4849 个字符,预计需要花费 13 分钟才能阅读完成。

<?php
error_reporting(1);
header(‘Content-type:text/html; Charset=utf-8’);
/* 配置开始 */
$appid = ”; // 微信公众平台 -> 开发 -> 基本配置 ->AppID
$appKey = ”; // 微信公众平台 -> 开发 -> 基本配置 ->AppSecret
/* 配置结束 */

//①、获取用户 openid
$wxPay = new WxService($appid,$appKey);
$data = $wxPay->GetOpenid(); // 获取 openid
if(!$data[‘openid’]) exit(‘ 获取 openid 失败 ’);
//②、获取用户信息
$user = $wxPay->getUserInfo($data[‘openid’],$data[‘access_token’]);
?>
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<meta name=”renderer” content=”webkit” />
<meta http-equiv=”X-UA-Compatible” content=”IE=edge,Chrome=1″ />
<meta name=”viewport” content=”width=device-width, initial-scale=1.0, maximum-scale=1.0″ />
<title> 微信获取用户信息 demo</title>
<link href=”https://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css” rel=”stylesheet”>
<script src=”https://cdn.bootcss.com/jquery/2.1.0/jquery.min.js”></script>
</head>
<body>
<div class=”container”>
<div class=”row”>
<h1> 你的基本信息如下:</h1>
<table class=”table table-bordered”>
<tr>
<td>openid</td>
<td><?=$user[‘openid’]?></td>
</tr>
<tr>
<td>unionid</td>
<td><?=$user[‘unionid’]?></td>
</tr>
<tr>
<td> 昵称 </td>
<td><?=$user[‘nickname’]?></td>
</tr>
<tr>
<td> 头像 </td>
<td><img src=”<?=$user[‘headimgurl’]?>” style=”width: 100px;” alt=””></td>
</tr>
<tr>
<td> 性别 </td>
<td><?php
switch (strtoupper($user[‘sex’])){
case 1:
echo ‘ 男性 ’;
break;
case 2:
echo ‘ 女性 ’;
break;
default:
echo ‘ 未知 ’;
break;
}
?></td>
</tr>
<tr>
<td> 省份 / 城市 </td>
<td><?=$user[‘province’].’ / ‘.$user[‘city’]?></td>
</tr>
<tr>
<td>language</td>
<td><?=$user[‘language’]?></td>
</tr>
</table>
</div>
</div>
</body>
</html>
<?php
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://’;
$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;
}

}

DEMO:

http://likeyunba.comTANKING2019-1-21

正文完
 0