当前位置:   article > 正文

微信小程序登录&授权&获取用户信息(thinkphp5后台)_thinkphp5.1 微信小程序登录

thinkphp5.1 微信小程序登录

后台用到的公共方法(写入common.php文件的)

1.发送HTTP请求方法,用于获取code。

  1. /**
  2. * 发送HTTP请求方法
  3. * @param string $url 请求URL
  4. * @param array $params 请求参数
  5. * @param string $method 请求方法GET/POST
  6. * @return array $data 响应数据
  7. */
  8. function httpCurl($url, $params, $method = 'POST', $header = array(), $multi = false){
  9. date_default_timezone_set('PRC');
  10. $opts = array(
  11. CURLOPT_TIMEOUT => 30,
  12. CURLOPT_RETURNTRANSFER => 1,
  13. CURLOPT_SSL_VERIFYPEER => false,
  14. CURLOPT_SSL_VERIFYHOST => false,
  15. CURLOPT_HTTPHEADER => $header,
  16. CURLOPT_COOKIESESSION => true,
  17. CURLOPT_FOLLOWLOCATION => 1,
  18. CURLOPT_COOKIE =>session_name().'='.session_id(),
  19. );
  20. /* 根据请求类型设置特定参数 */
  21. switch(strtoupper($method)){
  22. case 'GET':
  23. // $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
  24. // 链接后拼接参数 & 非?
  25. $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
  26. break;
  27. case 'POST':
  28. //判断是否传输文件
  29. $params = $multi ? $params : http_build_query($params);
  30. $opts[CURLOPT_URL] = $url;
  31. $opts[CURLOPT_POST] = 1;
  32. $opts[CURLOPT_POSTFIELDS] = $params;
  33. break;
  34. default:
  35. throw new Exception('不支持的请求方式!');
  36. }
  37. /* 初始化并执行curl请求 */
  38. $ch = curl_init();
  39. curl_setopt_array($ch, $opts);
  40. $data = curl_exec($ch);
  41. $error = curl_error($ch);
  42. curl_close($ch);
  43. if($error) throw new Exception('请求发生错误:' . $error);
  44. return $data;
  45. }

2.微信信息解密方法

  1. /**
  2. * 微信信息解密
  3. * @param string $appid 小程序id
  4. * @param string $sessionKey 小程序密钥
  5. * @param string $encryptedData 在小程序中获取的encryptedData
  6. * @param string $iv 在小程序中获取的iv
  7. * @return array 解密后的数组
  8. */
  9. function decryptData( $appid , $sessionKey, $encryptedData, $iv ){
  10. $OK = 0;
  11. $IllegalAesKey = -41001;
  12. $IllegalIv = -41002;
  13. $IllegalBuffer = -41003;
  14. $DecodeBase64Error = -41004;
  15. if (strlen($sessionKey) != 24) {
  16. return $IllegalAesKey;
  17. }
  18. $aesKey=base64_decode($sessionKey);
  19. if (strlen($iv) != 24) {
  20. return $IllegalIv;
  21. }
  22. $aesIV=base64_decode($iv);
  23. $aesCipher=base64_decode($encryptedData);
  24. $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
  25. $dataObj=json_decode( $result );
  26. if( $dataObj == NULL )
  27. {
  28. return $IllegalBuffer;
  29. }
  30. if( $dataObj->watermark->appid != $appid )
  31. {
  32. return $DecodeBase64Error;
  33. }
  34. $data = json_decode($result,true);
  35. return $data;
  36. }

3.请求过程中因为编码原因+号变成了空格,需要用下面的方法转换回来

  1. /**
  2. * 请求过程中因为编码原因+号变成了空格
  3. * 需要用下面的方法转换回来
  4. */
  5. function define_str_replace($data)
  6. {
  7. return str_replace(' ','+',$data);
  8. }

控制器里写入的代码

  1. public function weixinlogin()
  2. {
  3. $get = input('get.');
  4. //获取session_key
  5. $params['appid']= '小程序ID';
  6. $params['secret']= '小程序密钥';
  7. $params['js_code']= define_str_replace($get['code']);
  8. $params['grant_type']= 'authorization_code';
  9. $http_key = httpCurl('https://api.weixin.qq.com/sns/jscode2session', $params, 'GET');
  10. $session_key = json_decode($http_key,true);
  11. if(!empty($session_key['session_key'])){
  12. $appid = $params['appid'];
  13. $encryptedData= urldecode($get['encryptedData']);
  14. $iv = define_str_replace($get['iv']);
  15. $errCode = decryptData($appid,$session_key['session_key'],$encryptedData,$iv);
  16. dump($errCode); //打印获取的数据
  17. }else{
  18. echo '获取session_key失败!';
  19. }
  20. }

小程序JS因为getUserInfo方法将不再出现授权弹窗,请使用 <button open-type="getUserInfo"></button> 引导用户主动进行授权操作,

所以需要在页面加一个引导用户授权的按钮在js页面data里加一个

  1. data: {
  2. canIUse: wx.canIUse('button.open-type.getUserInfo')
  3. },

wxml里也需要加一个

<button wx:if="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">授权登录</button>

 

  1. onLoad: function() {
  2. wx.login({//login流程
  3. success: function (res) {//登录成功
  4. if (res.code) {
  5. var code = res.code;
  6. wx.getUserInfo({//getUserInfo流程
  7. success: function (res2) {//获取userinfo成功
  8. var encryptedData = encodeURIComponent(res2.encryptedData);//一定要把加密串转成URI编码
  9. var iv = res2.iv;
  10. //请求自己的服务器
  11. Login(code,encryptedData,iv);
  12. }
  13. })
  14. } else {
  15. console.log('获取用户登录态失败!' + res.errMsg)
  16. }
  17. }
  18. });
  19. function Login(code,encryptedData,iv){
  20. //创建一个dialog
  21. wx.showToast({
  22. title: '正在登录...',
  23. icon: 'loading',
  24. duration: 10000
  25. });
  26. //请求服务器
  27. wx.request({
  28. url: '你的服务器API接口',
  29. data: {
  30. code:code,
  31. encryptedData:encryptedData,
  32. iv:iv
  33. },
  34. method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
  35. header: {
  36. 'content-type': 'application/json'
  37. }, // 设置请求的 header
  38. success: function (res) {
  39. // success
  40. wx.hideToast();
  41. console.log('服务器返回'+res.data);
  42. },
  43. fail: function () {
  44. // fail
  45. // wx.hideToast();
  46. },
  47. complete: function () {
  48. // complete
  49. }
  50. })
  51. }
  52. }

 

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

闽ICP备14008679号