赞
踩
因为最近在用 TP5 开发小程序,所以就上网搜索了一下 TP 框架对应的微信小程序获取授权信息的依赖,但是结果不太理想,于是就借鉴了 laravel 的 iwanli/wxxcx 依赖,自己手动写了一个 TP5 的获取信息接口,下面分享一下具体的实现流程。
1. 梳理
首先要知道的是,小程序开发中,微信小程序授权时后台会获取的参数:
encryptedData:加密后的用户信息
code:登录凭证码
iv:偏移向量,在解密是要用到的
这三个参数是通过小程序前端发送到后台的。
之后需要去微信小程序官方文档里面下载解密 sdk 。
下载完毕之后,解压并放入 TP5 项目的 extend 文件夹里面。
2. 实现流程
首先在控制器中引用,以本人代码为例。
- .
- .
- .
- //引用解密组件
- use wxxcx\wxBizDataCrypt;
-
- .
- .
- .
- public function demo()
- {
- // 前台参数
- $encryptedData = input('get.encryptedData');
- $code = input('get.code');
- $iv = input('get.iv');
-
- // 小程序 appid 和 appsecret
- $appid = 'wx4f4bc4dec97d474b';
- $appsecret = '#################';
-
- // step1
- // 通过 code 用 curl 向腾讯服务器发送请求获取 session_key
- $session_key = $this->sendCode($appid, $appsecret, $code);
-
- // step2
- // 用过 session_key 用 sdk 获得用户信息
- $save = [];
-
- // 相关参数为空判断
- if (empty($session_key) || empty($encryptedData) || empty($iv)) {
- $msg = "信息不全";
- return $this->ApiSuccess($save, $msg);
- }
-
- //进行解密
- $userinfo = $this->getUserInfo($encryptedData, $iv, $session_key, $appid);
-
- // 解密成功判断
- if (isset($userinfo['code']) && 10001 == $userinfo['code']) {
- $msg = "请重试"; // 用户不应看到程序细节
- return $this->ApiSuccess($save, $msg);
- }
-
- session('myinfo', $userinfo);
- $save['openid'] = &$userinfo['openId'];
- $save['uname'] = &$userinfo['nickName'];
- $save['unex'] = &$userinfo['gender'];
- $save['address'] = &$userinfo['city'];
- $save['avatarUrl'] = &$userinfo['avatarUrl'];
- $save['time'] = time();
- $map['openid'] = &$userinfo['openId'];
-
- $msg = "获取成功";
-
- //返回用户信息
- return $this->ApiSuccess($save, $msg);
-
- }
-
- //获取微信用户信息
- private function sendCode($appid, $appsecret, $code)
- {
- // 拼接请求地址
- $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='
- . $appid . '&secret=' . $appsecret . '&js_code='
- . $code . '&grant_type=authorization_code';
-
- $arr = $this->vegt($url);
- $arr = json_decode($arr, true);
-
- return $arr['session_key'];
- }
-
- // curl 封装
- private function vegt($url)
- {
- $info = curl_init();
- curl_setopt($info, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($info, CURLOPT_HEADER, 0);
- curl_setopt($info, CURLOPT_NOBODY, 0);
- curl_setopt($info, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($info, CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($info, CURLOPT_URL, $url);
- $output = curl_exec($info);
- curl_close($info);
- return $output;
- }
-
- //信息解密
- private function getUserInfo($encryptedData, $iv, $session_key, $APPID)
- {
- //进行解密
- $pc = new WXBizDataCrypt($APPID, $session_key);
- $decodeData = "";
- $errCode = $pc->decryptData($encryptedData, $iv, $decodeData);
- //判断解密是否成功
- if ($errCode != 0) {
- return [
- 'code' => 10001,
- 'message' => 'encryptedData 解密失败',
- ];
- }
- //返回解密数据
- return json_decode($decodeData, true);
- }
- .
- .
- .
以上就是 TP5 获取微信小程序授权用户信息的实现流程。
可以将代码中 vegt 方法转到公共函数库中
sendCode 和 getUserInfo 可以进行抽象、再次改进,实现功能分离。
以后如果有钉钉小程序,百度小程序等等用户信息获取,都可以用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。