为目前使用的是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就是你控制器的,你在这个目录的控制器,新建一个控制器文件,然后需要做什么就可以做需要做的页面

shopnc 支持 支付宝快捷登陆 shopnc权限验证原理说明的更多相关文章

  1. Asp.net Core, 基于 claims 实现权限验证 - 引导篇

    什么是Claims? 这个直接阅读其他大神些的文章吧,解释得更好. 相关文章阅读: http://www.cnblogs.com/JustRun1983/p/4708176.html http://w ...

  2. shiro登陆权限验证

    一>引入shirojar包 <!-- shiro登陆权限控制 -->        <dependency>            <groupId>org. ...

  3. Struts2 自定义拦截器实例—登陆权限验证

    实现一个登陆权限验证的功能 message.jsp: <body> message:${message } </body> login.jsp: <% request.g ...

  4. .net core 2.0 登陆权限验证

    首先在Startup的ConfigureServices方法添加一段权限代码 services.AddAuthentication(x=> { x.DefaultAuthenticateSche ...

  5. Spring Security 自定义 登陆 权限验证

    转载于:https://www.jianshu.com/p/6b8fb59b614b 项目简介 基于Spring Cloud 的项目,Spring Cloud是在Spring Boot上搭建的所以按照 ...

  6. 学习总结之 WebApi 用户登录和匿名登录,及权限验证

    近些天,看了一些博客园大牛关于webApi项目的的文章,也有请教师兄一些问题,自己做了个Demo试了试,收获甚多.感谢感谢,下面是我一些学习的总结,如若有错的地方请多多指教!! WebApi登陆与身份 ...

  7. .NET MVC5简介(四)Filter和AuthorizeAttribute权限验证

    在webform中,验证的流程大致如下图: 在AOP中: 在Filter中: AuthorizeAttribute权限验证 登录后有权限控制,有的页面是需要用户登录才能访问的,需要在访问页面增加一个验 ...

  8. web权限验证方法说明[转载]

    前言 本文将会从最基本的一种web权限验证说起,即HTTP Basic authentication,然后是基于cookies和tokens的权限验证,最后则是signatures和一次性密码. HT ...

  9. NETCore使用带有权限验证的Swagger

    原文:NETCore使用带有权限验证的Swagger 文章目录 Swagger 什么是Swagger NuGet安装 Startup注册Swagger 设置默认首页打开Swagger 为接口添加注释 ...

随机推荐

  1. Spring Data JPA 查询方法支持的关键字

    Table 2.3. Supported keywords inside method names Keyword Sample JPQL snippet And findByLastnameAndF ...

  2. ArcGIS 最短路径计算

    using System;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Geodatabase;using ...

  3. Oracle 查询性能优化实践

      1.索引使用原则   不要对索引使用全模糊,但是 LIKE 'asdf%'是可以的,即不要Contains,可用StartWith 不要对索引进行函数,表达式操作,或者使用is null判断,否则 ...

  4. java实现文件上传--flash上传

    1.http请求的头信息是“application/octet-stream”,request body 是二进制的flash图片流 2.把流中的信息读入到文件中 代码如下,代码分三个部分: ---- ...

  5. 在SUBLIME TEXT中安装SUBLIMELINTER进行JS&CSS代码校验

    一:Sublime Text 中需要先安装Package Control.(如果有则无需安装) 安装方法:打开Sublime Text控制台(快捷键Ctrl+`),在控制台粘贴以下代码,按回车执行. ...

  6. 纯CSS打造银色MacBook Air(完整版)

    上一篇:<selection伪元素小解> ::selection{ background:blue; color:red; }p{font-size:14px;} 作者主页:myvin 博 ...

  7. javac命令出现“**.java使用了未经检查或不安全的操作”

    Collection col=new ArrayList();引发了“**.java使用了未经检查或不安全的操作”错误, 这是因为JDK1.5中引进了泛型,但是你的ArrayList却没有采用,所有会 ...

  8. Codeforces Round #353 (Div. 2)Restoring Painting

    Vasya works as a watchman in the gallery. Unfortunately, one of the most expensive paintings was sto ...

  9. Android & iOS 第三方 Crash ANR 捕捉上传

    1. Bugly 地址:http://bugly.qq.com/ 提供:专业的Crash(崩溃).Android ANR(application not response).iOS卡顿监控和解决方案. ...

  10. [Leetcode] Word BreakII

    Question: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence w ...