php 小程序授权 跟获取unionID

	 public function weixinlogin()
	
    {  
       //接收前端传过来的code 偏移量
        $get = I('get.');
        // var_dump($get);exit;
        //获取session_key
        $params['appid']= C("appid");
        $params['secret']= C("secret");
        $params['js_code']= define_str_replace($get['code']);
        $params['grant_type']= 'authorization_code';
        $http_key = curl_post_contents('https://api.weixin.qq.com/sns/jscode2session', $params, 'GET');
        $session_key = json_decode($http_key,true);
        // var_dump($session_key);exit;
        if(!empty($session_key['session_key'])){
            $openid=$session_key['openid'];
            $encryptedData= urldecode($get['encryptedData']);
            $iv = define_str_replace($get['iv']);
            $errCode = decryptData($params['appid'],$session_key['session_key'],$encryptedData,$iv);//获取unioID
            $unioId=$errCode['unionId']; //打印获取的数据
            //查询数据库
             $userinfo= getUserinfo($openid);
             //判断数据库中是否有该用户的数据
            if(!$userinfo){
              //如果没有就添加
                $insertInfo['openid'] = $openid;
                $insertInfo['nickname'] = $get['nickname'];
                $insertInfo['face'] = $get['face'];
                $insertInfo['unionid'] = $unioId;
                $insertInfo['sex'] = $get['sex'];
                $insertInfo['addtime'] = date("Y-m-d H:i:s",time());
                $insertInfo['updatetime'] = date("Y-m-d H:i:s",time());
                $res = M("wxinfo")->add($insertInfo);
            }else{
              //否则就修改最后登入时间
              $where['openid']=$openid;
              $updatetime['updatetime'] = date("Y-m-d H:i:s",time());
              M("wxinfo")->where($where)->save($updatetime);
            }
            session("openid",$openid);
            $encryption  = array("openid"=>$openid,'unionid'=>$unioId,"session_key"=>$session_key['session_key']);
            $session3rd = session_3rd();
            $data['session3rd'] = $session3rd;
             S($session3rd,$encryption);
             $this->ajaxReturn(array('status'=>200,'data'=>array("token"=>$session3rd)));
        }else{
            // echo '获取session_key失败!';
            $this->ajaxReturn(array('status'=>400,'data'=>array("msg"=>"获取session_key失败!")));
        }
    }


方法

//获取unionID

function decryptData( $appid , $sessionKey, $encryptedData, $iv ){

    $OK = 0;
    $IllegalAesKey = -41001;
    $IllegalIv = -41002;
    $IllegalBuffer = -41003;
    $DecodeBase64Error = -41004;
 
    if (strlen($sessionKey) != 24) {
        return $IllegalAesKey;
    }
    // $str = base64_decode(str_replace(" ","+",$_GET['str']));
    $aesKey=base64_decode(str_replace(" ","+",$sessionKey));
    // var_dump($aesKey);exit;
    if (strlen($iv) != 24) {
        return $IllegalIv;
    }
    $aesIV=base64_decode(str_replace(" ","+",$iv));
    $aesCipher=base64_decode(str_replace(" ","+",$encryptedData));
    $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
    $dataObj=json_decode( $result );
    // var_dump($dataObj);exit;
    if( $dataObj  == NULL )
    {
        return $IllegalBuffer;
    }
    if( $dataObj->watermark->appid != $appid )
    {
        return $DecodeBase64Error;
    }
    $data = json_decode($result,true);
 
    return $data;
}

//session_3rd();

function session_3rd($length = 16) {
     //生成第三方3rd_session
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for ($i = 0; $i < $length; $i++) {
      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;

}

//define_str_replace

function define_str_replace($data)
{
    return str_replace(' ','+',$data);
}

 

### 微信小程序中通过 OpenID 获取 UnionID 在微信生态内,OpenID 是用户在一个特定的小程序中的唯一标识符,而 UnionID 则是在同一微信公众平台下的多个应用(包括公众号、小程序等)之间的通用用户标识。对于已经绑定了微信开放平台账号的应用来说,可以通过用户的授权获取 UnionID。 #### 接口说明 当开发者希望从小程序端获得用户的UnionID时,并不是直接基于OpenID去查询得到UnionID,而是应该利用`auth.code2Session`接口完成此操作[^3]。该过程涉及前端向后端发送临时登录凭证 code ,由服务器携带 appid 和 secret 向微信服务器发起请求交换 session_key 及可能存在的 unionid 。需要注意的是只有当用户将小程序绑定到微信开放平台上之后才会返回 unionid 字段;如果未绑定,则不会提供 unionid 信息。 具体流程如下: 1. 用户同意授权小程序2. 前端调用微信提供的 `wx.login()` 方法获取临时登录凭证(code); 3. 将code传送给自己的服务端; 4. 服务端使用appid,secret以及收到的code访问`https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code` URL 来换取 openId , session_key (还有可能是unionid); 5. 如果需要进一步处理加密数据(如头像昵称),则还需要解密 encryptedData 参数内的内容才能拿到完整的用户资料,这部分涉及到AES算法的具体实现,在某些框架中有现成工具可以直接调用,比如ThinkPHP 中的做法就是如此[^4]. ```php // PHP示例代码用于解密并获取unionid public function getUionid($sessionKey,$iv,$encryptedData){ /** * 通过$sessionKey,$iv,$encryptedData解密获取unionid */ vendor('wxunionid.wxBizDataCrypt'); $pc = new \WXBizDataCrypt($this->appId, $sessionKey); $unionId = $pc->decryptData($encryptedData, $iv, $data); return json_decode($unionId,true); } ``` 值得注意的是,上述过程中提到的服务端逻辑应当妥善保管好敏感信息(appid/secret/session_key), 并确保传输的安全性以防止泄露风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值