shopnc 支持 支付宝快捷登陆 shopnc权限验证原理说明

为目前使用的是shopnc商场二次开发,shopnc本身做了qq互联和微博快捷登陆的api,做成了集成通用的接口

首先说下基本的这种类型的api访问方式,首先,的有个配置文件,配置你申请的id和key,callback的url文件,请注意貌似都得是一个.php文件,不能用控制器接手,会报错,至于是为什么目前我也不知道

然后有个核心类,用来做验证,实例化核心类之后,然后有个提交验证的方法,比如用表单提交,curl

然后接收返回值,来处理,一般看返回什么值,比如username userid email token等等,验证是否绑定就是查询用户的支付宝id字段是不是存在,存在就直接绑定,直接登录,如果不存在就注册新用户

分配一个用户id,密码,邮箱等,但是你也可以返回的时候,绑定新用户的时候,就可以不用自己分配,让用户自己填写密码和邮箱

 

alipay.auth.authorize-PHP-UTF-8 版本下下面几个文件

alipay.config.php  配置文件
alipayapi.php      实例化类,主要实现登陆功能 
cacert.pem        ca 公钥 密钥
index.php         没啥用
<DIR> lib         库文件
log.txt              日志
readme.txt       说明文件
return_url.php  callback文件 重要

 

<DIR> lib

alipay_core.function.php    核心类文件
alipay_md5.function.php   加密算法文件
alipay_notify.class.php      到服务器端验证
alipay_submit.class.php    提交url到服务器验证的方法

 

因为代码注释都比较详细,就不要一一解释,具体用的的东西就详细解释一下

 

alipayapi.php 

在login.php 控制器里面    

//支付宝快捷登陆 public function ali_loginOp() { include_once BASE_ROOT_PATH.'/shop/api/ali_login/alipay.config.php'; include_once BASE_ROOT_PATH.'/shop/api/ali_login/lib/alipay_submit.class.php'; /**************************请求参数**************************/ //目标服务地址 $target_service = "user.auth.quick.login"; //必填 //必填,页面跳转同步通知页面路径 //$return_url = "http://商户网关地址/alipay.auth.authorize-PHP-UTF-8/return_url.php"; 必须 $return_url = ""; //需http://格式的完整路径,不允许加?id=123这类自定义参数 $alipaySubmit = new AlipaySubmit($alipay_config); //防钓鱼时间戳 $anti_phishing_key = $alipaySubmit->query_timestamp(); //若要使用请调用类文件submit中的query_timestamp函数 //客户端的IP地址 $exter_invoke_ip = ""; //非局域网的外网IP地址,如:221.0.0.1 /************************************************************/ //构造要请求的参数数组,无需改动 $parameter = array( "service" => "alipay.auth.authorize", "partner" => trim($alipay_config['partner']), "target_service" => $target_service, "return_url" => $return_url, "anti_phishing_key" => $anti_phishing_key, "exter_invoke_ip" => $exter_invoke_ip, "_input_charset" => trim(strtolower($alipay_config['input_charset'])) ); //建立请求 //$alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "跳转"); header("Content-type:text/html;charset=utf-8"); echo $html_text; }

alipay_submit.class.php

 

function buildRequestForm($para_temp, $method, $button_name) {
        //待请求参数数组
        $para = $this->buildRequestPara($para_temp);
        
        $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>";
        while (list ($key, $val) = each ($para)) {
            $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
        }

        //submit按钮控件请不要含有name属性
        $sHtml = $sHtml."</form>";
        //去掉跳转按钮 
        //$sHtml = $sHtml."<input type='submit' value='".$button_name."'></form>";
        
        $sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
        
        return $sHtml;
    }

return_url.php

<?php
/* * 
 * 功能:支付宝页面跳转同步通知页面
 * 版本:3.3
 * 日期:2012-07-23
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。

 *************************页面功能说明*************************
 * 该页面可在本机电脑测试
 * 可放入HTML等美化页面的代码、商户业务逻辑程序代码
 * 该页面可以使用PHP开发工具调试,也可以使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyReturn
 */

require_once("alipay.config.php");
require_once("lib/alipay_notify.class.php");
?>
<!DOCTYPE HTML>
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<?php
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyReturn();
if($verify_result) {//验证成功
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //请在这里加上商户的业务逻辑程序代码
    
    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
    //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

    //支付宝用户号
        global $user_id;
    $user_id = $_GET['user_id'];

    //授权令牌
    $token = $_GET['token'];
        

    //判断是否在商户网站中已经做过了这次通知返回的处理
        //如果没有做过处理,那么执行商户的业务程序
        //如果有做过处理,那么不执行商户的业务程序
  

    //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
       require __DIR__.'../../../../shopnc.php';//引入框架,调用框架库类
        $model_member = Model('member');调用member表
        
        //$user_id = '208840239355555';
        $res = $model_member->where(array('member_aliopenid'=>$user_id))->select();
        //根据member_aliopenid是否存在,存在就是已经绑定了,可以直接登陆,没有就重新分配一个新账号给用户,读取购物车信息到数据库
        if(is_array($res) and !empty($res)){

            $array  = array();
            $array['member_name']   = $res['0']['member_name'] ;
            $array['member_passwd'] = $res['0']['member_passwd'] ;
            $member_info = $model_member->getMemberInfo($array);
            if(is_array($member_info) and !empty($member_info)) {
               $model_member->createSession($member_info);
                // cookie中的cart存入数据库
               Model('cart')->mergecart($member_info,$_SESSION['store_id']);

               // cookie中的浏览记录存入数据库
               Model('goods_browse')->mergebrowse($_SESSION['member_id'],$_SESSION['store_id']);
               @header('location: index.php');
           exit();
            }
            
        }else{
            //添加会员
           
            $model_member->checkloginMember();//检查是否登陆
            
            $register_info = array();
            $register_info['username'] =  'zx_'.date("Ymd").rand(1000, 9999);
            $register_info['password'] = $user_id;
            $register_info['password_confirm'] = $user_id;
            $register_info['email'] = 'alipay'.time().'@alipay.com';
            $register_info['member_aliopenid'] =$user_id;
            
            //var_dump($register_info);
            $member_info = $model_member->register($register_info);
            if(is_array($member_info) and !empty($member_info)) {
            $model_member->createSession($member_info,true);
            process::addprocess('reg');

            // cookie中的cart存入数据库
            Model('cart')->mergecart($member_info,$_SESSION['store_id']);

            // cookie中的浏览记录存入数据库
            Model('goods_browse')->mergebrowse($_SESSION['member_id'],$_SESSION['store_id']);
            @header('location: index.php');
        exit();
           
        } else {
            echo "授权失败"; 
        }

        }
}else {
    //验证失败
    //如要调试,请看alipay_notify.php页面的verifyReturn函数
    echo "验证失败";
     sleep('3');
    @header('location: index.php');
}



?>
        <title>支付宝快捷登录</title>
    </head>
    <body>
    </body>
</html>

还有member_model.php 在data下面的模型

在register  方法加入

$member_info['member_aliopenid']        = $register_info['member_aliopenid'];

 addMember 方法加入

$member_info['member_aliopenid'] = $param['member_aliopenid'];

 

在数据库的shopnc_member表加入2个字段

 

member_aliopenid  member_aliinfo

 

 

就OK了

 

  shopnc权限验证原理说明

 

需要注意的是,shopnc虽然也是RBAC进行验证权限,但是 不是传统能精确到controller的每个方法的,只是在目录的文件的配置文件进行验证

比如在admin\modules\system\include的menu.php,只能到这个级别的验证,

比如平台的菜单

<?php
/**
 * 菜单
 *
 * @copyright  Copyright (c) 2007-2015 ShopNC Inc. (http://www.shopnc.net)
 * @license    http://www.shopnc.net
 * @link       http://www.shopnc.net
 * @since      File available since Release v1.1
 */
defined('InShopNC') or exit('Access Invalid!');
$_menu['system'] = array (
        'name' => '平台',
        'child' => array (
                array(
                        'name' => $lang['nc_config'],
                        'child' => array(
                                'setting' => $lang['nc_web_set'],
                                'upload' => $lang['nc_upload_set'],
                                'message' => '邮件设置',
                                'taobao_api' => '淘宝接口',
                                'admin' => '权限设置',
                                'admin_log' => $lang['nc_admin_log'],
                                'cache' => $lang['nc_admin_clear_cache'],
                        )
                ),
                array(
                        'name' => $lang['nc_member'],
                        'child' => array(
                                'member' => $lang['nc_member_manage'],
                                'account' => $lang['nc_web_account_syn']
                        )
                ),
                array(
                        'name' => $lang['nc_website'],
                        'child' => array(
                                'article_class' => $lang['nc_article_class'],
                                'article' => $lang['nc_article_manage'],
                                'document' => $lang['nc_document'],
                                'navigation' => $lang['nc_navigation'],
                                'adv' => $lang['nc_adv_manage'],
                                'rec_position' => $lang['nc_admin_res_position']
                        )
                )
        ) 
);

如果你要增加一个菜单,就在这直接加,在权限菜单结点上会自动读取过去,这个其实也是为什么这样设计的原因,可以自动做权限验证,不需要再数据添加,然后手动吧权限结点增加进去,不了解RBAC可以在百度下

 

控制器方法就是你添加

'name' => $lang['nc_config'],
                        'child' => array(
                                'setting' => $lang['nc_web_set'],
                                'upload' => $lang['nc_upload_set'],
                                'message' => '邮件设置',
                                'taobao_api' => '淘宝接口',
                                'admin' => '权限设置',
                                'admin_log' => $lang['nc_admin_log'],
                                'cache' => $lang['nc_admin_clear_cache'],
                        )
setting就是你控制器的,你在这个目录的控制器,新建一个控制器文件,然后需要做什么就可以做需要做的页面

posted on 2015-04-09 09:17  zh7314  阅读(1445)  评论(0编辑  收藏  举报