重新整理做过的功能,以及过程遇到问题,温故而知新
官方文档
一 准备工作 (a.接入 b.配置)
a) 修改/添加 业务域名、网页授权域名; 授权回调域名 不加 http:// 协议头
绑定时微信要求将 *.txt文件上传根目录,需要将文件 添加到我项目.htaccess许可中 确保文件可被访问,否则绑定不通过
b) 公众平台 参数
appid
secret
二 授权登录
简单画一个流程图
- 网上很多人说微信浏览器 session 失效的问题,我测试并不存在; 不太懂为什么session会失效;暂时get不到
- 忽略了refresh_token 刷新access_token步骤
ci框架
function __construct() {
parent::__construct();
$this->load->library('session');
}
public function index() {
if (!isset($_SESSION['wx_user_data'])) {
// 1. 获取缓存token: 如果token过期则通过 refresh_token获取,都过期或首次请求则获取code
$code = $this->input->get('code');
if (!$code) {
//获取现有token
$access_token = $this->get_wx_access_token();
}
// 2. get access token
$this->load->library('mycurl');
$wx_get_token = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.WX_APP_ID.'&secret='.WX_SECRET.'&code='.$code.'&grant_type=authorization_code';
list($returnCode, $returnContent) = $this->mycurl->curl_post_json_to_java($wx_get_token);
$returnContent = json_decode($returnContent, true);
if ($returnCode ===200 && !isset($returnContent['access_token'])) {
die('error-page-todo-later'.$returnContent['errcode']);
}
$access_token = $returnContent['access_token'];
$refresh_token = $returnContent['refresh_token'];
$expires_date = time()+7100;
$openid = $returnContent['openid'];
// 3. 刷新 access token
// 4. 拉取用户信息
$wx_get_userinfo = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';
list($returnCode, $returnContent) = $this->mycurl->curl_post_json_to_java($wx_get_userinfo);
$returnContent = json_decode($returnContent, true);
if ($returnCode ===200 && isset($returnContent['errcode'])) {
die('error-page-todo-later'.$returnContent['errcode']);
}
$userData = array();
$userData['openid'] = $returnContent['openid'];
$userData['unionid'] = $returnContent['unionid'];
$userData['nickname'] = $returnContent['nickname'];
$userData['sex'] = $returnContent['sex'];
$userData['province'] = $returnContent['province'];
$userData['city'] = $returnContent['city'];
$userData['country'] = $returnContent['country'];
$userData['headimgurl'] = $returnContent['headimgurl'];
$userData['privilege'] = $returnContent['privilege'];
// 5. session 存储userData 缓存做不到每次从入口进来实时刷新用户信息
$this->session->set_userdata('wx_user_data', $userData);
}
// 6. 项目主逻辑
$templateData['userData'] = $_SESSION['wx_user_data'];
$this->load->view('union_m/index.html', $templateData);
}
/**
* 跳转至授权页面,公众号入口 scope user-info 同样静默
* @return [type] [description]
*/
public function redirect_wx_url() {
$wx_get_code = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.WX_APP_ID.'&redirect_uri='.urlencode(UNION_INDEX).'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
$this->load->helper('url');
redirect($wx_get_code);
}
// access token 维护
public function get_wx_access_token() {
// 1. 是否有未过期 token 直接return
// 2. 是否有未过期 refresh_token 则获取 token, 刷新access_token (忽略)
// 3. 都不存在 首次授权 或 全部过期的情况 跳转授权页面
$this->redirect_wx_url();
}
结合项目最后实现地址
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。