微擎无法调用oAuth

由于无聊玩玩改代码,结果发现,公众号无法调用oAuth;

file:///web/source/mc/passport.ctrl.php

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写。

来说说问题吧:

每一个公众号都有个唯一的uniacid唯一参数值,在创建完成之后,写入扩展表:uni_settings

有这么一个字段:oauth

字段值:a:2:{s:4:”host”;s:0:””;s:7:”account”;i:26;}

host=其他域名的,account=对应的oauth参数组合URL;

再来看看URL需要的参数

后台访问的时候,会GET个do=oauth,执行该方法

 

if($do == ‘oauth’) {
uni_user_permission_check(‘mc_passport_oauth’);
$_W[‘page’][‘title’] = ‘公众平台oAuth选项 – 会员中心’;

$where = ”;
$params = array();
if(empty($_W[‘isfounder’])) {
$where = ” WHERE `uniacid` IN (SELECT `uniacid` FROM ” . tablename(‘uni_account_users’) . ” WHERE `uid`=:uid)”;
$params[‘:uid’] = $_W[‘uid’];
}
$sql = “SELECT * FROM ” . tablename(‘uni_account’) . $where;

$uniaccounts = pdo_fetchall($sql, $params);
$accounts = array();
if(!empty($uniaccounts)) {
foreach($uniaccounts as $uniaccount) {
$accountlist = uni_accounts($uniaccount[‘uniacid’]);
if(!empty($accountlist)) {
foreach($accountlist as $account) {
if(!empty($account[‘key’]) && !empty($account[‘secret’]) && in_array($account[‘level’], array(4))) {
$accounts[$account[‘acid’]] = $account[‘name’];
}
}
}
}
}
…..次处省略N个字符……
}

在这特别注意:uni_accounts($uniaccount[‘uniacid’])方法

原型是:

function uni_accounts($uniacid = 0) {
global $_W;
$uniacid = empty($uniacid) ? $_W[‘uniacid’] : intval($uniacid);
$accounts = pdo_fetchall(“SELECT w.*, a.type, a.isconnect FROM ” . tablename(‘account’) . ” a INNER JOIN ” . tablename(‘account_wechats’) . ” w USING(acid) WHERE a.uniacid = :uniacid ORDER BY a.acid ASC”, array(‘:uniacid’ => $uniacid), ‘acid’);
return $accounts;
}

该方法里获取的值,是account_wechats里的数据,里面有个level,必须=4,否则将无法调用!

顺便给个方法:

if(!empty($uniaccounts)) {
foreach($uniaccounts as $uniaccount) {
$accountlist = uni_accounts($uniaccount[‘uniacid’]);
if(!empty($accountlist)) {
foreach($accountlist as $account) {
$arr=array(
‘2’ => 2,
‘3’ => 3,
‘4’ => 4,
);
if(!empty($account[‘key’]) && !empty($account[‘secret’]) && in_array($account[‘level’], $arr)) {
$accounts[$account[‘acid’]] = $account[‘name’];
}
}
}
}
}

这样就只提取2-4等级的了

 

JSAUTH也一样,文件位置:file:///web/source/profile/jsauth.ctrl.php

if(!empty($uniaccounts)) {
foreach($uniaccounts as $uniaccount) {
$accountlist = uni_accounts($uniaccount[‘uniacid’]);
if(!empty($accountlist)) {
foreach($accountlist as $account) {
if(!empty($account[‘key’])
&& !empty($account[‘secret’])
&& in_array($account[‘level’], array(2, 3, 4))) {
$accounts[$account[‘acid’]] = $account[‘name’];
}
}
}
}
}

发表评论