最近开始忙一个新需求,就是给公司的电商网站接入微信第三方登录,由于之前的工作中很少接触微信公众平台这一块的开发,所以在开发之前做了比较多的准备工作,查阅微信公众平台开发者文档和相关资料,然后我也试着用PHP做后端简单实现一下这个功能,由于个人订阅号没有获取OpenId和用户基本信息的权限,所以我申请了一个公众平台测试账号来进行开发。
官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
修改OAuth2.0网页授权回调页面域名
申请好公众平台测试账号后,第一步是修改OAuth2.0网页授权回调页面域名,不然的话,在用户同意授权后获取code会报错“scope参数错误或没有scope权限”。
点击修改,然后输入回调页面的域名:
做好准备工作,然后开始开发。
用户同意授权,获取code
首先是拼装链接,提供用户在微信浏览器打开,以弹出授权页面:
具体每个参数代表什么,我这里就不做解释了,微信公众平台开发者文档有详细说明。其中scope是比较重要的,由于不是采用静默授权的方式,所以它的值必须是snsapi_userinfo,另外就是要注意每个参数的顺序必须保持跟官方文档一致,不然会授权失败。在微信浏览器打开链接后,会弹出授权页面,用户点击同意后,页面会返回到redirect_uri页面,并且在链接中带上code参数,然后PHP就可以拿到code进行下一步的操作。
通过code换取网页授权access_token
用户在上一步点击同意授权后,获取OpenId以及用户基本信息的工作就交给PHp来做了,接下来示例一下PHP如何跟微信服务器交互。
<?php
$wechatObj = new wechatCallbackapiTest();
$wechatObj->redirectUrl();
class wechatCallbackapiTest
{
public function redirectUrl()
{
$appid = "公众平台测试账号的appid";
$secret = "公众平台测试账号的appsecret";
$code = $_GET["code"];
$get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code';
$json = file_get_contents($get_token_url);
echo($json);
}
}
?>
上面的代码会在拿到access_token相关信息后在页面打印出来。
根据access_token获取OpenId以及用户基本信息
<?php
$wechatObj = new wechatCallbackapiTest();
$wechatObj->redirectUrl();
class wechatCallbackapiTest
{
public function redirectUrl()
{
$appid = "公众平台测试账号的appid";
$secret = "公众平台测试账号的appsecret";
$code = $_GET["code"];
$get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code';
$json = file_get_contents($get_token_url);
// echo($json);
$arr = json_decode($json, true);
$access_token = $arr['access_token'];
$openid = $arr['openid'];
$url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN';
$userInfo = file_get_contents($url);
$user_data = json_decode($userInfo, true);
echo($userInfo);
}
}
?>
这样,就获取到OpenId以及用户基本信息了,并将获取到的内容打印到页面。