需求: 微信扫码时每次需要弹窗确认效果。
微信开放平台 :创建网站应用,绑定公众号,用于打通公众号用户数据。
注意域名填写规范,不带协议。eg:www.xxx-test.com
页面嵌套扫码登录二维码 部分代码如下:
<div id="login_qrcode"></div>
<script type="text/javascript" src="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
<script>
window.onload = function () {
var appId = $("#open_appid").val();
var state = $("#unique_id").val();
var redirectUri = $("#open_redirect_uri").val(); // www.xxx-test.com/api/openWXLogin
var scope = 'snsapi_login';
//微信登录二维码
var obj = new WxLogin({
id: "login_qrcode",
appid: appId,
scope: scope,
redirect_uri: redirectUri,
state: state,
style: "",
href: ""
});
}
</script>
服务器端部分代码:
public function openWXLogin()
{
$code = $request->get("code");
if (empty($code)) {
echo "授权失败,code信息不存在";
exit;
}
//通过code获取用户信息
$rs = pc_open_userinfo($code);
//其他业务流程代码
...
}
function pc_open_userinfo($code)
{
$appid = '';// 网站应用的appid
$secret = '';//网站应用的secret
if (empty($code)) {
echo "授权失败,code信息不存在";
exit;
} else {
$token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code';
//获取token,为了获取access_token 如果没有就弹出错误
$token = json_decode(curl_get($token_url), true);
if (isset($token['errcode'])) {
echo $token['errcode'];
echo '<br/>' . $token['errmsg'];
exit;
}
$access_token_url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=' . $appid . '&grant_type=refresh_token&refresh_token=' . $token['refresh_token'];
//获取access_token ,为了获取微信的个人信息,如果没有就弹出错误
$access_token = json_decode(curl_get($access_token_url), true);
if (isset($access_token['errcode'])) {
echo $access_token['errcode'];
echo '<br/>' . $access_token['errmsg'];
exit;
}
$user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token['access_token'] . '&openid=' . $access_token['openid'] . '&lang=zh_CN';
//获取用户信息
$user_info = json_decode(curl_get($user_info_url), true);
if (isset($user_info['errcode'])) {
echo $user_info['errcode'];
echo '<br/>' . $user_info['errmsg'];
exit;
}
//这里转换为数组
$user_data = (array)$user_info;
return $user_data;
}
}
/**
* curl以get方式请求
*/
if (!function_exists('curl_get')) {
function curl_get($url)
{
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_URL, $url);
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
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
}