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

首先需要看懂微信小程序开发文档的 开放接口中的 登录 和 用户信息。
wx.login(OBJECT)
调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。
code 换取 session_key
这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。
session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输。

小程序代码

//app.js  
App({  
  onLaunch: function () {  
    //调用API从本地缓存中获取数据  
    var logs = wx.getStorageSync('logs') || []  
    logs.unshift(Date.now())  
    wx.setStorageSync('logs', logs)  
  },  
  getUserInfo:function(cb){  
    var that = this  
    if(this.globalData.userInfo){  
      typeof cb == "function" && cb(this.globalData.userInfo)  
    }else{  
      //调用登录接口  
      wx.login({  
        success: function (res) {  
              var code = res.code  
                // success  
                // 获取用户信息  
              wx.getUserInfo({  
                  success: function (data) {  
                    that.globalData.userInfo = data.userInfo  
                    typeof cb == "function" && cb(that.globalData.userInfo)  
                    var rawData = data.rawData;  
                    var signature = data.signature;  
                    var encryptedData = data.encryptedData;  
                    var iv = data.iv;  
                    wx.request({  
                      url: "你的后台地址",  
                      data: {  
                          "code" : code,  
                         " rawData" : rawData,  
                          "signature" : signature,  
                         " iv" : iv,  
                          "encryptedData" : encryptedData  
                      },  
                      method: 'GET',  
                      success: function(res){  
                        // success  
                        console.log(res)  
                        console.log(rawData)  
                      }  
                    })  
                  }  
                })  
        }  
      })  
    }  
  },  
  globalData:{  
    userInfo:null  
  },  
})

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

thinkphp后台代码

public function sendCode(){  
    $APPID = '################APPID';  
    $AppSecret = '#################';  
    $code = input('get.code');  
    $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$APPID.'&secret='.$AppSecret.'&js_code='.$code.'&grant_type=authorization_code';  
    $arr = $this -> vegt($url);  

    $arr = json_decode($arr,true);  
    // $openid = $arr['openid'];  
    $session_key = $arr['session_key'];  

    // 数字签名校验  
    $signature = input('get.signature');  
    $signature2 = sha1($_GET['rawData'].$session_key);  
    if($signature != $signature2){  
        echo "数字签名失败";  
        die;  
    }  
    // 获取信息,对接口进行解密  
    Vendor("PHP.wxBizDataCrypt");  
    $encryptedData = $_GET['encryptedData'];  
    $iv = $_GET['iv'];  
    if(empty($signature) || empty($encryptedData) || empty($iv)){  
        echo "传递信息不全";  
    }  
    include_once "PHP/wxBizDataCrypt.php";  
    $pc = new \WXBizDataCrypt($APPID,$session_key);  
    $errCode = $pc->decryptData($encryptedData,$iv,$data);  
    if($errCode != 0){  
        echo "解密数据失败";  
        die;  
    }else {  
        $data = json_decode($data,true);  
        session('myinfo',$data);  
        $save['openid'] = $data['openId'];  
        $save['uname'] = $data['nickName'];  
        $save['unex'] = $data['gender'];  
        $save['address'] = $data['city'];  
        $save['time'] = time();  
        $map['openid'] = $data['openId'];  
        !empty($data['unionId']) && $save['unionId'] = $data['unionId'];  

        $res = \think\Db::name('user') -> where($map) -> find();  
        if(!$res){  
            $db = \think\Db::name('user') -> insert($save);   
            if($db !== false){  
                echo "保存用户成功";  
            }else{  
                echo "error";  
            }  
        }else{  
            echo "用户已经存在";  
        }  
    }  
//生成第三方3rd_session  
$session3rd  = null;  
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";  
$max = strlen($strPol)-1;  
for($i=0;$i<16;$i++){  
    $session3rd .=$strPol[rand(0,$max)];  
}  
// echo $session3rd;  
}  
public function vegt($url){  
    $info = curl_init();  
curl_setopt($info,CURLOPT_RETURNTRANSFER,true);  
   curl_setopt($info,CURLOPT_HEADER,0);  
   curl_setopt($info,CURLOPT_NOBODY,0);  
   curl_setopt($info,CURLOPT_SSL_VERIFYPEER, false);  
   curl_setopt($info,CURLOPT_SSL_VERIFYHOST, false);  
   curl_setopt($info,CURLOPT_URL,$url);  
   $output= curl_exec($info);  
   curl_close($info);  
   return $output;  
}

你可能感兴趣的:(小程序)