Blog原文:一木林多 - https://www.l5v.cn/archives/95/
前言
近期在做一个项目,甲方爸爸要求平台系统接入微信登录的功能。我寻思着好像微信开发平台好像有这个功能(不是微信公众号平台是微信开发平台)。
但是我去微信开发平台看了一下,要接入网站着实有点麻烦。于是我就放弃了通过微信开发平台接入网站登录的功能。当我在百度上搜索相关解决方案的时候突然发现:可以利用公众号的一些功能来实现甲方爸爸的要求!
实现过程
1、首先需要准备一个认证的微信服务号(或者测试号)。测试账号的申请地址:
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
无需公众帐号、快速申请接口测试号直接体验和测试公众平台所有高级接口。
由于项目目前还是在本地localhost的开发环境,我在ngrok里面买了个frp用来访问外网。测试环境下如何安装ngrok的frp,请参考ngrok的官方文档。
我们先来写一个WeChat类以实现一些必要的基本操作。直接贴代码:
<?php
Class WeChat{
protected $appid;
protected $secret;
protected $accessToken;
function __construct(){
$this->appid = "公众号的appID";
$this->secret = "公众号的appsecret";
$this->accessToken = $this->getAccessToken();
}
/***
* 获取access_token
* token的有效时间为2小时,这里可以做下缓存处理,提高效率
* @return
**/
private function getAccessToken(){
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->secret;
$res = json_decode($this->httpRequest($url),true);
return $res['access_token'];
}
/***
* POST/GET请求
* @url 请求url
* @data POST数据
* @return
**/
private function httpRequest($url, $data = ""){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if(!empty($data)){ //判断是否为POST请求
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
/***
* 获取openID和unionId
* @code 微信授权登录返回的code
* @return
**/
public function getOpenIdOrUnionId($code){
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->secret."&code=".$code."&grant_type=authorization_code";
$data = $this->httpRequest($url);
return $data;
}
/***
* 通过openId获取用户信息
* @openId
* @return
**/
public function getUserInfo($openId){
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$this->accessToken."&openid=".$openId."&lang=zh_CN"