我正在制作一个通过外部API(VK)使用授权的系统。当用户单击“通过VK授权”时,他们会出现一个弹出窗口,可以在其中选择是授予权限还是取消权限。无论选择什么,API都将它们重定向到同一弹出窗口中的我的php脚本中,当该脚本完成后,它们最终将打开一个空的弹出窗口。
我需要做两件事:
1)脚本完成后,关闭弹出窗口。
2)根据脚本中函数返回的内容,向用户显示适当的消息,而不是在该弹出窗口中,而是在启动弹出窗口的初始窗口中(在已有文本的两行之间的某个位置),弹出窗口关闭后。
现在,我不知道该怎么做。我必须要有一些javascript(最好是jquery),它根据从已关闭的弹出窗口中调用的函数获得的响应,将消息插入到初始窗口。
以下是系统摘录:
http://example.com/vkcode?error=access_denied&error_reason=user_denied&error_description=User+denied+your+request&state=secret_state_code
-如果用户选择“取消”,则将其重定向到该页面(在弹出窗口内)。并且他们一直停留在空白页中,地址栏中带有该字符串。
下面是一些处理VK API响应的PHP代码:
public function vkAuthHandler() {
if (isset($_GET['error'])) {
if ($_GET['error_reason'] == 'user_denied' {
return 'user_denied';
}
else return 'error';
}
else {
// ... haven't written other logic yet, it's irrelevant anyway
}
return new Response();
}
现在,如果我收到'user_denied'
响应,则需要显示一条消息,告诉用户他们拒绝了权限。但是不是在调用该函数的弹出窗口中(应该已经在此时关闭了),而是在初始页面上,而无需重新加载它。
答案 0 :(得分:0)
我以一种复杂的方式解决了它。不接受这个答案,因为也许有人提供了一个更简单的解决方案。
在PHP中:
public function vkAuthHandler() {
if (isset($_GET['error'])) {
if ($_GET['error_reason'] == 'user_denied' {
header('Set-cookie: vkresp=user_denied');
}
else header('Set-cookie: vkresp=error');
}
else {
// ...
}
echo "<script>window.close();</script>"; //closing the window here
return new Response();
}
基于this solution的JavaScript(用于jQuery和JS-Cookie):
var cookieRegistry = [];
function listenCookieChange(cookieName, callback) {
setInterval(function() {
if (cookieRegistry[cookieName] || Cookies.get(cookieName) != null) {
if (Cookies.get(cookieName) != cookieRegistry[cookieName]) {
cookieRegistry[cookieName] = Cookies.get(cookieName);
return callback();
}
} else {
cookieRegistry[cookieName] = Cookies.get(cookieName);
}
}, 100);
}
listenCookieChange('vkresp', function() {
if (Cookies.get('vkresp') == 'user_denied') {
console.log('VK response is user_denied');
$("#VKauth").append('<div style="color: red;">You denied authorization! Comments are blocked!</div>');
}
else if (Cookies.get('vkresp') == 'error') {
console.log('VK response is user_denied');
$("#VKauth").append('<div style="color: red;">Unknown authorization error. Try again.</div>');
}
Cookies.remove('vkresp');
});
$("#VKauth")
基本上是在我的页面上选择ID为VKauth
的HTML元素。