微信小程序『用户信息获取』
前言
这些天在忙着做『星邀请』小程序后台,用户详细信息获取需要解密,官方也给出相应解密的SDK,自己用laravel框架也进行了一些改写适应框架。
参考方法
小程序微信登录过程(下图为官方的登录解释)
首先是调用wx.login方法,获取到临时票据,该票据结合APPID
以及APPSECRET
可以获得会话密钥session_key(session_key是对用户数据进行加密签名的密钥,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥)。为什么不能?因为接着在wx.getUserInfo方法中获取到的加密数据需要这个session_key
来解密,所以该session_key
很重要。用户详细信息解密
在进行完上一步后,可以得到一个临时票据,接着在调用wx.getUserInfo方法,可以得到encryptedData(包括敏感数据在内的完整用户信息的加密数据)、iv(加密算法的初始向量),结合官方的解密SDK获取用户的详细。
解密过程大致是,首先利用到步骤一中的code获得session_key
,接着再结合encryptedData
、iv
、APPID
、官方解密方法,最后就可以获得用户详细信息。
代码实现
/**
* @var int
* 定义错误代码
*/
public static $OK = 0;
public static $IllegalAesKey = -41001;
public static $IllegalIv = -41002;
public static $IllegalBuffer = -41003;
public static $DecodeBase64Error = -41004;
/**
* @param $code
* @return array|bool|mixed
* 获取session_key、openid
*/
public function GetSessionKey($code)
{
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
$wxappid = ; //你的小程序APPID
$wxsecret = ; //你的小程序APPSECRET
$code_url = sprintf($url,$wxappid,$wxsecret,$code);
$userInfo = $this->CURL($code_url);
if(!isset($userInfo['session_key'])){
return [
'code' => 40029,
'msg' => '获取 session_key 失败',
];
}
return $userInfo;
}
/**
* 检验数据的真实性,并且获取解密后的明文.
* @param $encryptedData string 加密的用户数据
* @param $iv string 与用户数据一同返回的初始向量
* @param $data string 解密后的原文
*
* @return int 成功0,失败返回对应的错误码
*/
public function decryptData( $encryptedData, $iv, &$data,$sessionKey )
{
if (strlen($sessionKey) != 24) {
return self::$IllegalAesKey;
}
$aesKey=base64_decode($sessionKey);
if (strlen($iv) != 24) {
return self::$IllegalIv;
}
$aesIV=base64_decode($iv);
$aesCipher=base64_decode($encryptedData);
$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
$dataObj=json_decode( $result );
if( $dataObj == NULL )
{
return self::$IllegalBuffer;
}
if( $dataObj->watermark->appid != $this->wxappid )
{
return self::$IllegalBuffer;
}
$data = $result;
return self::$OK;
}