lmaster 4年前

修改理由:

简单排版

详细描述:

文章的排版很重要。

整齐有调理的文章更能吸引读者

论坛使用 markdown 编辑器,推荐学习下


此投稿已在 4年前 合并。

内容修改:

红色背景 为原始内容

绿色背景 为新增或者修改的内容

OldNewDifferences
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:偏移向量,在解密是要用到的
4510
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这三个参数是通过小程序前端发送到后台的。
6412
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//引用解密组件
 26use 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以后如果有钉钉小程序,百度小程序等等用户信息获取,都可以用