MENU

微信小程序『用户信息获取』

前言

这些天在忙着做『星邀请』小程序后台,用户详细信息获取需要解密,官方也给出相应解密的SDK,自己用laravel框架也进行了一些改写适应框架。

参考方法

  • 小程序微信登录过程(下图为官方的登录解释)

    57-1
    首先是调用wx.login方法,获取到临时票据,该票据结合APPID以及APPSECRET可以获得会话密钥session_key(session_key是对用户数据进行加密签名的密钥,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥)。为什么不能?因为接着在wx.getUserInfo方法中获取到的加密数据需要这个session_key来解密,所以该session_key很重要。

  • 用户详细信息解密
    在进行完上一步后,可以得到一个临时票据,接着在调用wx.getUserInfo方法,可以得到encryptedData(包括敏感数据在内的完整用户信息的加密数据)、iv(加密算法的初始向量),结合官方的解密SDK获取用户的详细。
    解密过程大致是,首先利用到步骤一中的code获得session_key,接着再结合encryptedDataivAPPID、官方解密方法,最后就可以获得用户详细信息。

代码实现

/**
 * @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;
 }
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码