欢迎光临,了解微信小程序开发,就上易用通!

thinkphp后台获取微信小程序用户信息

发布:2017-12-30 09:12浏览: 来源:网络 作者:tianshu

首先需要看懂微信小程序开发文档的  开放接口中的  登录 和 用户信息。
 
wx.login(OBJECT)

调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

code 换取 session_key

​这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。

session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输

小程序端的代码:

[javascript] view plain copy
 
 print?
  1. //app.js  
  2. App({  
  3.   onLaunch: function () {  
  4.     //调用API从本地缓存中获取数据  
  5.     var logs = wx.getStorageSync('logs') || []  
  6.     logs.unshift(Date.now())  
  7.     wx.setStorageSync('logs', logs)  
  8.   },  
  9.   getUserInfo:function(cb){  
  10.     var that = this  
  11.     if(this.globalData.userInfo){  
  12.       typeof cb == "function" && cb(this.globalData.userInfo)  
  13.     }else{  
  14.       //调用登录接口  
  15.       wx.login({  
  16.         success: function (res) {  
  17.               var code = res.code  
  18.                 // success  
  19.                 // 获取用户信息  
  20.               wx.getUserInfo({  
  21.                   success: function (data) {  
  22.                     that.globalData.userInfo = data.userInfo  
  23.                     typeof cb == "function" && cb(that.globalData.userInfo)  
  24.                     var rawData = data.rawData;  
  25.                     var signature = data.signature;  
  26.                     var encryptedData = data.encryptedData;  
  27.                     var iv = data.iv;  
  28.                     wx.request({  
  29.                       url: "你的后台地址",  
  30.                       data: {  
  31.                           "code" : code,  
  32.                          " rawData" : rawData,  
  33.                           "signature" : signature,  
  34.                          " iv" : iv,  
  35.                           "encryptedData" : encryptedData  
  36.                       },  
  37.                       method: 'GET',  
  38.                       success: function(res){  
  39.                         // success  
  40.                         console.log(res)  
  41.                         console.log(rawData)  
  42.                       }  
  43.                     })  
  44.                   }  
  45.                 })  
  46.         }  
  47.       })  
  48.     }  
  49.   },  
  50.   globalData:{  
  51.     userInfo:null  
  52.   },  
  53. })  

查看微信小程序端的 network 可能查看请求是否成功
 

thinkphp后台代码

[php] view plain copy
 
 print?
  1. public function sendCode(){  
  2.     $APPID = '################APPID';  
  3.     $AppSecret = '#################';  
  4.     $code = input('get.code');  
  5.     $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$APPID.'&secret='.$AppSecret.'&js_code='.$code.'&grant_type=authorization_code';  
  6.     $arr = $this -> vegt($url);  
  7.   
  8.     $arr = json_decode($arr,true);  
  9.     // $openid = $arr['openid'];  
  10.     $session_key = $arr['session_key'];  
  11.   
  12.     // 数字签名校验  
  13.     $signature = input('get.signature');  
  14.     $signature2 = sha1($_GET['rawData'].$session_key);  
  15.     if($signature != $signature2){  
  16.         echo "数字签名失败";  
  17.         die;  
  18.     }  
  19.     // 获取信息,对接口进行解密  
  20.     Vendor("PHP.wxBizDataCrypt");  
  21.     $encryptedData = $_GET['encryptedData'];  
  22.     $iv = $_GET['iv'];  
  23.     if(empty($signature) || empty($encryptedData) || empty($iv)){  
  24.         echo "传递信息不全";  
  25.     }  
  26.     include_once "PHP/wxBizDataCrypt.php";  
  27.     $pc = new \WXBizDataCrypt($APPID,$session_key);  
  28.     $errCode = $pc->decryptData($encryptedData,$iv,$data);  
  29.     if($errCode != 0){  
  30.         echo "解密数据失败";  
  31.         die;  
  32.     }else {  
  33.         $data = json_decode($data,true);  
  34.         session('myinfo',$data);  
  35.         $save['openid'] = $data['openId'];  
  36.         $save['uname'] = $data['nickName'];  
  37.         $save['unex'] = $data['gender'];  
  38.         $save['address'] = $data['city'];  
  39.         $save['time'] = time();  
  40.         $map['openid'] = $data['openId'];  
  41.         !empty($data['unionId']) && $save['unionId'] = $data['unionId'];  
  42.   
  43.         $res = \think\Db::name('user') -> where($map) -> find();  
  44.         if(!$res){  
  45.             $db = \think\Db::name('user') -> insert($save);   
  46.             if($db !== false){  
  47.                 echo "保存用户成功";  
  48.             }else{  
  49.                 echo "error";  
  50.             }  
  51.         }else{  
  52.             echo "用户已经存在";  
  53.         }  
  54.     }  
  55. //生成第三方3rd_session  
  56. $session3rd  = null;  
  57. $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";  
  58. $max = strlen($strPol)-1;  
  59. for($i=0;$i<16;$i++){  
  60.     $session3rd .=$strPol[rand(0,$max)];  
  61. }  
  62. // echo $session3rd;  
  63. }  
  64. public function vegt($url){  
  65.     $info = curl_init();  
  66. curl_setopt($info,CURLOPT_RETURNTRANSFER,true);  
  67.    curl_setopt($info,CURLOPT_HEADER,0);  
  68.    curl_setopt($info,CURLOPT_NOBODY,0);  
  69.    curl_setopt($info,CURLOPT_SSL_VERIFYPEER, false);  
  70.    curl_setopt($info,CURLOPT_SSL_VERIFYHOST, false);  
  71.    curl_setopt($info,CURLOPT_URL,$url);  
  72.    $output= curl_exec($info);  
  73.    curl_close($info);  
  74.    return $output;  
  75. }  
 
官网有加解密的文件自行下载:  https://www.w3cschool.cn/weixinapp/weixinapp-signature.html
写的不好的地方欢迎补充,这也是小编经过多处得出学习得出的




免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。