总结下微信小程序的用户授权登录php后台设计
1.前端授权登录后,调用wx.getUserInfo获取到用户公共信息
将code,encrypted_data,iv传给后端,
2.后端接受参数后
通过code用户登录凭证(有效期五分钟)获取到open_id和session_key(微信秘钥,有些解密需要该参数)
通过encrypted_data,iv,session_key解密出用户个人信息
通过open_id获取unionid查询自己数据库是否存在改用户,不存在则注册新用户
将session_key保存下来,通过某种加密算法或者其他规则生成自己服务器的session,返回给前端作为维持登录状态的session
3.主要代码
//通过登录凭证 code 获取 session_key 和 openid,session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输。
function jscode2session($js_code) { $post = array ( 'appid' =>$app_id, 'secret' => $secret, 'js_code'=> $js_code, 'grant_type'=>'authorization_code', ); $url = "https://api.weixin.qq.com/sns/jscode2session"; //伪代码,curl提交数据 $pCurl = curl($url); $res = $pCurl -> POST($post); $res = json_decode($res,true); if($res['openid']&&$res['session_key']){ //保存session_key;保存到memcache或者redis等nosql中 return $res; }else{ return false; } }
拿到open_id后判断用户是否存在,不存在通过session_key,encryptedData,iv解密获取用户个人信息,encryptedData解密结果如下,其中unionId需满足一定条件才返回
unionId为同一个公众号平台下用户的唯一标识,open_id为同一个应用中用户的唯一标识
{ "openId": "OPENID", "nickName": "NICKNAME", "gender": GENDER, "city": "CITY", "province": "PROVINCE", "country": "COUNTRY", "avatarUrl": "AVATARURL", "unionId": "UNIONID", "watermark": { "appid": "APPID", "timestamp": TIMESTAMP } }
//微信小程序解密程序 public static function decryptData($sessionKey,$encryptedData,$iv){ $aesKey=base64_decode($sessionKey); $aesIV=base64_decode($iv); $aesCipher=base64_decode($encryptedData); $result=openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV); $dataObj=json_decode($result,true); return $dataObj; }
其他代码主要是业务逻辑,可根据上面思路自己编写,这里就不贴代码了