讨论数量:
以钉钉登录为例
登录继承的父类
路由文件
DingController 控制器
public function __construct()
{
parent::__construct();
$this->middleware(['web', 'admin'])->except('loginqrCode','login');
}
public function loginqrCode()
{
$redirect_uri = admin_url('/ding-ding/login');
return view('code',compact('redirect_uri'));
}
public function bindqrCode($id)
{
$redirect_uri = admin_url('/ding-ding/bind/'.$id);
return view('code',compact('redirect_uri'));
}
public function bind($id,Request $request)
{
$time = (int)now()->getPreciseTimestamp(3);
if ($request->code) {
$gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
$sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
$signature = base64_encode($sign);
$urlencode_signature = urlencode($signature);
$key = env('DT_AUTH_APPID');
$url = "$gateway?accessKey=$key×tamp=$time&signature=$urlencode_signature";
$res = Http::post($url,[
'tmp_auth_code' => $request->code,
]);
$data = $res->json();
if ($res->successful() && $data['errcode'] ===0 ) {
$user = $res['user_info'];
$d = Ding::where('unionid', $user['unionid'])->first();
if ($d) {
admin_info('钉钉账号','该账号已绑定');
return redirect(admin_url('/auth/users'));
}
$userid = DingAuth::getUseridByUnionid($user['unionid']);
$ding = Ding::create([
'openid' => $user['openid'],
'nick' => $user['nick'],
'ding_id' => $user['dingId'],
'user_id' => $id,
'unionid' => $user['unionid'],
'ding_user_id' => '',
]);
$ding_user = DingAuth::user($userid);
if ($ding_user['errcode'] === 0) {
$admin = $ding->User;
if (isset($ding_user['email']) && $email = $ding_user['email']){
$admin->email = $email;
}
if (isset($ding_user['mobile']) && $mobile = $ding_user['mobile']) {
$admin->phone = $mobile;
}
if (isset($ding_user['avatar']) && $avatar = $ding_user['avatar']) {
if (!$admin->avatar)
$admin->avatar = $avatar;
}
$admin->save();
}
admin_success('钉钉账号','绑定成功');
}else{
admin_error('钉钉账号', '绑定失败');
}
return redirect(admin_url('/auth/users'));
}
}
public function login(Request $request)
{
$time = (int)now()->getPreciseTimestamp(3);
if ($request->code) {
$gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
$sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
$signature = base64_encode($sign);
$urlencode_signature = urlencode($signature);
$key = env('DT_AUTH_APPID');
$url = "$gateway?accessKey=$key×tamp=$time&signature=$urlencode_signature";
$res = Http::post($url,[
'tmp_auth_code' => $request->code,
]);
$data = $res->json();
if ($res->successful() && $data['errcode'] === 0 ) {
$user = $res['user_info'];
$ding = Ding::where('unionid', $user['unionid'])->first();
if ($ding && $ding->User) {
auth('admin')->login($ding->User);
return redirect(admin_url('/'));
}
}
admin_error('username','用户不存在');
return redirect('admin/auth/login');
}
}
public function redirect(Request $request)
{
return redirect(admin_url("/ding-ding/login?{$request->getQueryString()}"));
}
admin.php配置文件
以钉钉登录为例
登录继承的父类
路由文件
DingController 控制器
public function __construct()
{
parent::__construct();
$this->middleware(['web', 'admin'])->except('loginqrCode','login');
}
public function loginqrCode()
{
$redirect_uri = admin_url('/ding-ding/login');
return view('code',compact('redirect_uri'));
}
public function bindqrCode($id)
{
$redirect_uri = admin_url('/ding-ding/bind/'.$id);
return view('code',compact('redirect_uri'));
}
public function bind($id,Request $request)
{
$time = (int)now()->getPreciseTimestamp(3);
if ($request->code) {
$gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
$sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
$signature = base64_encode($sign);
$urlencode_signature = urlencode($signature);
$key = env('DT_AUTH_APPID');
$url = "$gateway?accessKey=$key×tamp=$time&signature=$urlencode_signature";
$res = Http::post($url,[
'tmp_auth_code' => $request->code,
]);
$data = $res->json();
if ($res->successful() && $data['errcode'] ===0 ) {
$user = $res['user_info'];
$d = Ding::where('unionid', $user['unionid'])->first();
if ($d) {
admin_info('钉钉账号','该账号已绑定');
return redirect(admin_url('/auth/users'));
}
$userid = DingAuth::getUseridByUnionid($user['unionid']);
$ding = Ding::create([
'openid' => $user['openid'],
'nick' => $user['nick'],
'ding_id' => $user['dingId'],
'user_id' => $id,
'unionid' => $user['unionid'],
'ding_user_id' => '',
]);
$ding_user = DingAuth::user($userid);
if ($ding_user['errcode'] === 0) {
$admin = $ding->User;
if (isset($ding_user['email']) && $email = $ding_user['email']){
$admin->email = $email;
}
if (isset($ding_user['mobile']) && $mobile = $ding_user['mobile']) {
$admin->phone = $mobile;
}
if (isset($ding_user['avatar']) && $avatar = $ding_user['avatar']) {
if (!$admin->avatar)
$admin->avatar = $avatar;
}
$admin->save();
}
admin_success('钉钉账号','绑定成功');
}else{
admin_error('钉钉账号', '绑定失败');
}
return redirect(admin_url('/auth/users'));
}
}
public function login(Request $request)
{
$time = (int)now()->getPreciseTimestamp(3);
if ($request->code) {
$gateway = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
$sign = hash_hmac('sha256', $time, env('DT_AUTH_SECRET'), true);
$signature = base64_encode($sign);
$urlencode_signature = urlencode($signature);
$key = env('DT_AUTH_APPID');
$url = "$gateway?accessKey=$key×tamp=$time&signature=$urlencode_signature";
$res = Http::post($url,[
'tmp_auth_code' => $request->code,
]);
$data = $res->json();
if ($res->successful() && $data['errcode'] === 0 ) {
$user = $res['user_info'];
$ding = Ding::where('unionid', $user['unionid'])->first();
if ($ding && $ding->User) {
auth('admin')->login($ding->User);
return redirect(admin_url('/'));
}
}
admin_error('username','用户不存在');
return redirect('admin/auth/login');
}
}
public function redirect(Request $request)
{
return redirect(admin_url("/ding-ding/login?{$request->getQueryString()}"));
}
admin.php配置文件
以钉钉登录为例
登录继承的父类


路由文件
DingController 控制器
admin.php配置文件