开发使用的thinkphp5
一,小程序登录
可参考小程序登录
前端调用 wx.login() 获取 临时登录凭证code 。
二,微信授权
前端请求后端授权登录接口(code参数传递过来),代码实现。
/*
* APPID //定义常量 APPID
* SECRET // 定义常量密钥
* GRANTYPE //定义常量类型
* WX_LOGIN_URL //定义常量微信请求地址 https://api.weixin.qq.com/sns/jscode2session
* */
$js_code=input('post.code');
$url_param='?appid='.APPID.'&secret='.SECRET.'&js_code='.$js_code.'&grant_type='.GRANTYPE;
$requre_url=WX_LOGIN_URL.$url_param;
$wx_data_json=getCurl($requre_url);
$wx_data=json_decode($wx_data_json,true);
if (isset($wx_data['errcode']) !=0){
Log::write('登录失败:错误码是-'.$wx_data_json,'debug');
return json_return('1000','登录失败');
}
$openid = $wx_data['openid'];
$session_key = $wx_data['session_key'];
//信息保存在redis中,可根据需要保存自己可查看到的位置
$openid_redis=$redis->set($openid,$session_key);
//用户是否已获取信息
$status=db('user_record')->where('openid',$openid)->value('id');
$yzk_data['openid']=$openid;
$yzk_data['status']=empty($status) ? 0 : 1;
return json_return('0','success',$yzk_data);
三,获取个人信息
signature,rawData,openid,encryptedData,iv。需要前端传递的参数,后端数据解析获取用户信息。
$redis=redis();
$js_code=input('post.');
// 数据签名校验
$signature = $js_code['signature'];
$rawData = $js_code['rawData'];
$openid = $js_code['openid'];
Log::write('获取用户信息------------'.$signature,'debug');
if (empty($signature)) return json_return('4001','signature参数为空');
$session_key=$redis->get($js_code['openid']);
$signature2 = sha1($rawData . $session_key);
if ($signature != $signature2) {
return json_return('1000','数据签名验证失败!');
}
$encryptedData = $js_code['encryptedData'];
$iv = $js_code['iv'];
$pc = new WXBizDataCrypt(APPID, $session_key);
$errCode = $pc->decryptData($encryptedData, $iv, $data); //其中$data包含用户的所有数据
$data = json_decode($data,true);
if ($errCode == 0){
//保存用户信息
try{
$res=$this->storageUser($data,$session_key);
// return json_return('0','success',$res);
// if ($res == 'has'){
//
// return json_return('0','用户信息已存在');
// }
if($res){
// $info=$this->product_token($openid,$session_key);
return json_return('0','success',['info'=>$data]);
}
if (!$res) return json_return('1000','添加信息失败');
$return_arr['info']=$data;
}catch (Exception $exception){
return json_return('1000',$exception->getMessage());
}
// $token_res=$redis->set($token,$session_key);
}else{
return json_return('1000','获取信息失败');
}
return json_return('0','success',$return_arr);
四,授权获取手机号,并绑定。
openid,encryptedData,iv。前端传递参数,后端接收参数解析并获取手机号。
$redis=redis();
$js_code=input('post.');
$openid = $js_code['openid'];
$session_key=$redis->get($js_code['openid']);
$encryptedData = $js_code['encryptedData'];
$iv = $js_code['iv'];
$pc = new WXBizDataCrypt(APPID, $session_key);
$errCode = $pc->decryptData($encryptedData, $iv, $data); //其中$data包含用户的所有数据
$data = json_decode($data,true);
Log::write('errCode------------------'.$errCode,'debug');
if ($errCode == 0){
try{
//判断用户信息是否已绑定
$wx_bind=model('user_record')->where(array('mobile'=>$data['phoneNumber'],'openid'=>$openid))->value('id');
if ($wx_bind){
$res_token=$this->product_token($openid,$session_key);
return json_return('0','success',$res_token);
}
//检查用户手机号是否存在
$has_tel_id=model('user_record')->getUserTel($data);
if ($has_tel_id){
//更新信息到手机用户
$res=model('user_record')->updateUserMess($has_tel_id,$openid,$session_key);
if (!$res) return json_return('1000','更新数据失败');
}else{
//手机号绑定至用户
$info=model('user_record')->bindUserTel($data,$openid,$session_key);
if (empty($info)) return json_return('1000','绑定信息失败');
}
$return_arr=$this->product_token($openid,$session_key);
}catch (Exception $exception){
return json_return('1000',$exception->getMessage());
}
// $token_res=$redis->set($token,);
}else{
return json_return('1000','获取信息失败');
}
return json_return('0','success',$return_arr);
本实例是本人开发调用,可根据自己项目情况借鉴参考。如有疑问欢迎留言沟通。