当前位置:   article > 正文

ThinkPHP5-微信小程序获取用户授权登录信息_thinkphp5 wxbizdatacrypt

thinkphp5 wxbizdatacrypt

因为最近在用 TP5 开发小程序,所以就上网搜索了一下 TP 框架对应的微信小程序获取授权信息的依赖,但是结果不太理想,于是就借鉴了 laravel 的 iwanli/wxxcx 依赖,自己手动写了一个 TP5 的获取信息接口,下面分享一下具体的实现流程。

1. 梳理
首先要知道的是,小程序开发中,微信小程序授权时后台会获取的参数:

encryptedData:加密后的用户信息
code:登录凭证码
iv:偏移向量,在解密是要用到的


这三个参数是通过小程序前端发送到后台的。

之后需要去微信小程序官方文档里面下载解密 sdk 。

下载完毕之后,解压并放入 TP5 项目的 extend 文件夹里面。

2. 实现流程
首先在控制器中引用,以本人代码为例。

  1. .
  2. .
  3. .
  4. //引用解密组件
  5. use wxxcx\wxBizDataCrypt;
  6. .
  7. .
  8. .
  9. public function demo()
  10. {
  11. // 前台参数
  12. $encryptedData = input('get.encryptedData');
  13. $code = input('get.code');
  14. $iv = input('get.iv');
  15. // 小程序 appid 和 appsecret
  16. $appid = 'wx4f4bc4dec97d474b';
  17. $appsecret = '#################';
  18. // step1
  19. // 通过 code 用 curl 向腾讯服务器发送请求获取 session_key
  20. $session_key = $this->sendCode($appid, $appsecret, $code);
  21. // step2
  22. // 用过 session_key 用 sdk 获得用户信息
  23. $save = [];
  24. // 相关参数为空判断
  25. if (empty($session_key) || empty($encryptedData) || empty($iv)) {
  26. $msg = "信息不全";
  27. return $this->ApiSuccess($save, $msg);
  28. }
  29. //进行解密
  30. $userinfo = $this->getUserInfo($encryptedData, $iv, $session_key, $appid);
  31. // 解密成功判断
  32. if (isset($userinfo['code']) && 10001 == $userinfo['code']) {
  33. $msg = "请重试"; // 用户不应看到程序细节
  34. return $this->ApiSuccess($save, $msg);
  35. }
  36. session('myinfo', $userinfo);
  37. $save['openid'] = &$userinfo['openId'];
  38. $save['uname'] = &$userinfo['nickName'];
  39. $save['unex'] = &$userinfo['gender'];
  40. $save['address'] = &$userinfo['city'];
  41. $save['avatarUrl'] = &$userinfo['avatarUrl'];
  42. $save['time'] = time();
  43. $map['openid'] = &$userinfo['openId'];
  44. $msg = "获取成功";
  45. //返回用户信息
  46. return $this->ApiSuccess($save, $msg);
  47. }
  48. //获取微信用户信息
  49. private function sendCode($appid, $appsecret, $code)
  50. {
  51. // 拼接请求地址
  52. $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='
  53. . $appid . '&secret=' . $appsecret . '&js_code='
  54. . $code . '&grant_type=authorization_code';
  55. $arr = $this->vegt($url);
  56. $arr = json_decode($arr, true);
  57. return $arr['session_key'];
  58. }
  59. // curl 封装
  60. private function vegt($url)
  61. {
  62. $info = curl_init();
  63. curl_setopt($info, CURLOPT_RETURNTRANSFER, true);
  64. curl_setopt($info, CURLOPT_HEADER, 0);
  65. curl_setopt($info, CURLOPT_NOBODY, 0);
  66. curl_setopt($info, CURLOPT_SSL_VERIFYPEER, false);
  67. curl_setopt($info, CURLOPT_SSL_VERIFYHOST, false);
  68. curl_setopt($info, CURLOPT_URL, $url);
  69. $output = curl_exec($info);
  70. curl_close($info);
  71. return $output;
  72. }
  73. //信息解密
  74. private function getUserInfo($encryptedData, $iv, $session_key, $APPID)
  75. {
  76. //进行解密
  77. $pc = new WXBizDataCrypt($APPID, $session_key);
  78. $decodeData = "";
  79. $errCode = $pc->decryptData($encryptedData, $iv, $decodeData);
  80. //判断解密是否成功
  81. if ($errCode != 0) {
  82. return [
  83. 'code' => 10001,
  84. 'message' => 'encryptedData 解密失败',
  85. ];
  86. }
  87. //返回解密数据
  88. return json_decode($decodeData, true);
  89. }
  90. .
  91. .
  92. .

 

以上就是 TP5 获取微信小程序授权用户信息的实现流程。

可以将代码中 vegt 方法转到公共函数库中

sendCode 和 getUserInfo 可以进行抽象、再次改进,实现功能分离。

以后如果有钉钉小程序,百度小程序等等用户信息获取,都可以用

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/131992
推荐阅读
相关标签
  

闽ICP备14008679号