简单排版
此投稿已在 4年前 合并。
内容修改:
Old | New | Differences |
---|---|---|
1 | 因为最近在用TP5开发小程序,所以就上网搜索了一下TP框架对应的微信小程序获取授权信息的依赖,但是结果不太理想,于是就借鉴了laravel的iwanli/wxxcx依赖,自己手动写了一个TP5的获取信息接口,下面分享一下具体的实现流程。 | |
2 | 1.梳理 | |
3 | 首先要知道的是,小程序开发中,微信小程序授权时后台会获取的参数。 | |
4 | `encryptedData code iv` | |
5 | 这三个参数是通过小程序前端发送到后台的。encryptedData是加密后的用户信息; code是登录凭证码;iv是偏移向量,也是在解密是要用到的。 | |
6 | 之后需要去微信小程序官方文档里面下载解密sdk,https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-decode. 下载完毕之后,解压并放入TP5项目的extend文件夹里面。这样准备工作就完毕了。 | |
7 | 2.实现流程 | |
8 | 首先在控制器中引用,以本人代码为例。 | |
9 | ``` | |
10 | //引用解密组件 | |
11 | use wxxcx\wxBizDataCrypt; | |
12 | ||
13 | //获取微信用户信息 | |
14 | public function sendCode() | |
15 | { | |
16 | //获取seeion_key | |
17 | $appid = 'wx4f4bc4dec97d474b'; | |
18 | $appsecret = '#################'; | |
19 | //获取前台发送的code | |
20 | $code = input('get.code'); | |
21 | //用code 获取 session_key | |
22 | $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$appsecret.'&js_code='.$code.'&grant_type=authorization_code'; | |
23 | $arr = $this -> vegt($url); | |
24 | $arr = json_decode($arr,true); | |
25 | $session_key = $arr['session_key']; | |
26 | //获取前台发送的 encryptedData 和 iv | |
27 | $encryptedData = $_GET['encryptedData']; | |
28 | $iv = $_GET['iv']; | |
29 | //解密用户信息 | |
30 | if(empty($session_key) || empty($encryptedData) || empty($iv)){ | |
31 | echo "信息不全"; | |
32 | } | |
33 | //进行解密 | |
34 | $userinfo=$this->getUserInfo($encryptedData,$iv,$session_key,$appid); | |
35 | //创建新数组 获取微信用户信息 | |
36 | $data = json_decode($userinfo,true); | |
37 | session('myinfo',$data); | |
38 | $save['openid'] = $data['openId']; | |
39 | $save['uname'] = $data['nickName']; | |
40 | $save['unex'] = $data['gender']; | |
41 | $save['address'] = $data['city']; | |
42 | $save['avatarUrl'] = $data['avatarUrl']; | |
43 | $save['time'] = time(); | |
44 | $map['openid'] = $data['openId']; | |
1 | 因为最近在用TP5开发小程序,所以就上网搜索了一下TP框架对应的微信小程序获取授权信息的依赖,但是结果不太理想,于是就借鉴了laravel的iwanli/wxxcx依赖,自己手动写了一个TP5的获取信息接口,下面分享一下具体的实现流程。 | |
2 | ||
3 | ### 1.梳理 | |
4 | ||
5 | 首先要知道的是,小程序开发中,微信小程序授权时后台会获取的参数: | |
6 | ||
7 | * encryptedData:加密后的用户信息 | |
8 | * code:登录凭证码 | |
9 | * iv:偏移向量,在解密是要用到的 | |
45 | 10 | |
46 | $msg = "获取成功"; | |
47 | //返回用户信息 | |
48 | return $this->ApiSuccess($save, $msg); | |
49 | } | |
50 | ||
51 | //获取session_key | |
52 | public function vegt($url){ | |
53 | $info = curl_init(); | |
54 | curl_setopt($info,CURLOPT_RETURNTRANSFER,true); | |
55 | curl_setopt($info,CURLOPT_HEADER,0); | |
56 | curl_setopt($info,CURLOPT_NOBODY,0); | |
57 | curl_setopt($info,CURLOPT_SSL_VERIFYPEER, false); | |
58 | curl_setopt($info,CURLOPT_SSL_VERIFYHOST, false); | |
59 | curl_setopt($info,CURLOPT_URL,$url); | |
60 | $output= curl_exec($info); | |
61 | curl_close($info); | |
62 | return $output; | |
63 | } | |
11 | 这三个参数是通过小程序前端发送到后台的。 | |
64 | 12 | |
65 | //信息解密 | |
66 | public function getUserInfo($encryptedData, $iv,$session_key,$APPID){ | |
67 | //进行解密 | |
68 | $pc = new WXBizDataCrypt($APPID, $session_key); | |
69 | $decodeData = ""; | |
70 | $errCode = $pc->decryptData($encryptedData, $iv, $decodeData); | |
71 | //判断解密是否成功 | |
72 | if ($errCode !=0 ) { | |
73 | return [ | |
74 | 'code' => 10001, | |
75 | 'message' => 'encryptedData 解密失败' | |
76 | ]; | |
77 | } | |
78 | //返回解密数据 | |
79 | return $decodeData; | |
80 | } | |
81 | ``` | |
82 | 以上就是TP5获取微信小程序授权用户信息的实现流程。。 | |
13 | 之后需要去微信小程序官方文档里面下载解密 [sdk](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-decode) 。 | |
14 | ||
15 | 下载完毕之后,解压并放入TP5项目的extend文件夹里面。 | |
16 | ||
17 | ### 2.实现流程 | |
18 | ||
19 | 首先在控制器中引用,以本人代码为例。 | |
20 | ||
21 | ```php | |
22 | . | |
23 | . | |
24 | . | |
25 | //引用解密组件 | |
26 | use wxxcx\wxBizDataCrypt; | |
27 | ||
28 | . | |
29 | . | |
30 | . | |
31 | public function demo() | |
32 | { | |
33 | // 前台参数 | |
34 | $encryptedData = input('get.encryptedData'); | |
35 | $code = input('get.code'); | |
36 | $iv = input('get.iv'); | |
37 | ||
38 | // 小程序 appid 和 appsecret | |
39 | $appid = 'wx4f4bc4dec97d474b'; | |
40 | $appsecret = '#################'; | |
41 | ||
42 | // step1 | |
43 | // 通过 code 用 curl 向腾讯服务器发送请求获取 session_key | |
44 | $session_key = $this->sendCode($appid, $appsecret, $code); | |
45 | ||
46 | // step2 | |
47 | // 用过 session_key 用 sdk 获得用户信息 | |
48 | $save = []; | |
49 | ||
50 | // 相关参数为空判断 | |
51 | if (empty($session_key) || empty($encryptedData) || empty($iv)) { | |
52 | $msg = "信息不全"; | |
53 | return $this->ApiSuccess($save, $msg); | |
54 | } | |
55 | ||
56 | //进行解密 | |
57 | $userinfo = $this->getUserInfo($encryptedData, $iv, $session_key, $appid); | |
58 | ||
59 | // 解密成功判断 | |
60 | if (isset($userinfo['code']) && 10001 == $userinfo['code']) { | |
61 | $msg = "请重试"; // 用户不应看到程序细节 | |
62 | return $this->ApiSuccess($save, $msg); | |
63 | } | |
64 | ||
65 | session('myinfo', $userinfo); | |
66 | $save['openid'] = &$userinfo['openId']; | |
67 | $save['uname'] = &$userinfo['nickName']; | |
68 | $save['unex'] = &$userinfo['gender']; | |
69 | $save['address'] = &$userinfo['city']; | |
70 | $save['avatarUrl'] = &$userinfo['avatarUrl']; | |
71 | $save['time'] = time(); | |
72 | $map['openid'] = &$userinfo['openId']; | |
73 | ||
74 | $msg = "获取成功"; | |
75 | ||
76 | //返回用户信息 | |
77 | return $this->ApiSuccess($save, $msg); | |
78 | ||
79 | } | |
80 | ||
81 | //获取微信用户信息 | |
82 | private function sendCode($appid, $appsecret, $code) | |
83 | { | |
84 | // 拼接请求地址 | |
85 | $url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' | |
86 | . $appid . '&secret=' . $appsecret . '&js_code=' | |
87 | . $code . '&grant_type=authorization_code'; | |
88 | ||
89 | $arr = $this->vegt($url); | |
90 | $arr = json_decode($arr, true); | |
91 | ||
92 | return $arr['session_key']; | |
93 | } | |
94 | ||
95 | // curl 封装 | |
96 | private function vegt($url) | |
97 | { | |
98 | $info = curl_init(); | |
99 | curl_setopt($info, CURLOPT_RETURNTRANSFER, true); | |
100 | curl_setopt($info, CURLOPT_HEADER, 0); | |
101 | curl_setopt($info, CURLOPT_NOBODY, 0); | |
102 | curl_setopt($info, CURLOPT_SSL_VERIFYPEER, false); | |
103 | curl_setopt($info, CURLOPT_SSL_VERIFYHOST, false); | |
104 | curl_setopt($info, CURLOPT_URL, $url); | |
105 | $output = curl_exec($info); | |
106 | curl_close($info); | |
107 | return $output; | |
108 | } | |
109 | ||
110 | //信息解密 | |
111 | private function getUserInfo($encryptedData, $iv, $session_key, $APPID) | |
112 | { | |
113 | //进行解密 | |
114 | $pc = new WXBizDataCrypt($APPID, $session_key); | |
115 | $decodeData = ""; | |
116 | $errCode = $pc->decryptData($encryptedData, $iv, $decodeData); | |
117 | //判断解密是否成功 | |
118 | if ($errCode != 0) { | |
119 | return [ | |
120 | 'code' => 10001, | |
121 | 'message' => 'encryptedData 解密失败', | |
122 | ]; | |
123 | } | |
124 | //返回解密数据 | |
125 | return json_decode($decodeData, true); | |
126 | } | |
127 | . | |
128 | . | |
129 | . | |
130 | ``` | |
131 | 以上就是TP5获取微信小程序授权用户信息的实现流程。 | |
132 | ||
133 | 可以将代码中`vegt`方法转到公共函数库中 | |
134 | ||
135 | `sendCode`和`getUserInfo`可以进行抽象、再次改进,实现功能分离。 | |
136 | ||
137 | 以后如果有钉钉小程序,百度小程序等等用户信息获取,都可以用 |