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就是你控制器的,你在这个目录的控制器,新建一个控制器文件,然后需要做什么就可以做需要做的页面
shopnc 支持 支付宝快捷登陆 shopnc权限验证原理说明的更多相关文章
- Asp.net Core, 基于 claims 实现权限验证 - 引导篇
什么是Claims? 这个直接阅读其他大神些的文章吧,解释得更好. 相关文章阅读: http://www.cnblogs.com/JustRun1983/p/4708176.html http://w ...
- shiro登陆权限验证
一>引入shirojar包 <!-- shiro登陆权限控制 --> <dependency> <groupId>org. ...
- Struts2 自定义拦截器实例—登陆权限验证
实现一个登陆权限验证的功能 message.jsp: <body> message:${message } </body> login.jsp: <% request.g ...
- .net core 2.0 登陆权限验证
首先在Startup的ConfigureServices方法添加一段权限代码 services.AddAuthentication(x=> { x.DefaultAuthenticateSche ...
- Spring Security 自定义 登陆 权限验证
转载于:https://www.jianshu.com/p/6b8fb59b614b 项目简介 基于Spring Cloud 的项目,Spring Cloud是在Spring Boot上搭建的所以按照 ...
- 学习总结之 WebApi 用户登录和匿名登录,及权限验证
近些天,看了一些博客园大牛关于webApi项目的的文章,也有请教师兄一些问题,自己做了个Demo试了试,收获甚多.感谢感谢,下面是我一些学习的总结,如若有错的地方请多多指教!! WebApi登陆与身份 ...
- .NET MVC5简介(四)Filter和AuthorizeAttribute权限验证
在webform中,验证的流程大致如下图: 在AOP中: 在Filter中: AuthorizeAttribute权限验证 登录后有权限控制,有的页面是需要用户登录才能访问的,需要在访问页面增加一个验 ...
- web权限验证方法说明[转载]
前言 本文将会从最基本的一种web权限验证说起,即HTTP Basic authentication,然后是基于cookies和tokens的权限验证,最后则是signatures和一次性密码. HT ...
- NETCore使用带有权限验证的Swagger
原文:NETCore使用带有权限验证的Swagger 文章目录 Swagger 什么是Swagger NuGet安装 Startup注册Swagger 设置默认首页打开Swagger 为接口添加注释 ...
随机推荐
- 阻止Ajax多次提交
1.Ajax的abort() xhr = $.ajax({}) if (xhr){ xhr.abort(); } 2.通过在Ajax的beforeSend()方法以及complete()方法添加删除类 ...
- TestNg线程池配置、执行次数配置、超时配置
使用注解的方式对TestNg线程池配置.执行次数配置.超时配置 注:使用注解来控制测试方法运行的次数和超时时间,timeOut在单线程或者多线程模式下都可用,threadPoolSize设置了线程池的 ...
- Fzu月赛11 老S的旅行计划 dij
Description 老S在某城市生活的非常不自在,想趁着ICPC举办期间在省内转转.已知老S所在的省有N个城市,M条无向边(对于某一对结点可能出现重边).由于省内的交通相当糟糕,通过某条边所需要花 ...
- Python基础1-Python环境搭建
Python环境搭建首先通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本: 若未安装则需要下载安装,下面为linux和windo ...
- POJ2976 Dropping tests(01分数规划)
题目大概说给n个二元组Ai和Bi,要去掉k个,求余下的100*∑Ai/∑Bi的最大值. 假设要的最大的值是ans,令Di=Ai-ans*∑Bi,对Di排序取最大的n-k个,如果∑Ai-ans*∑Bi& ...
- Shell 编程基础之注意技巧
退出状态bash中的内建命令虽然不创建新的进程,但也会有Exit Status,通常也用0表示成功非零表示失败,可以用特殊变量$?读出 命令代换:`或$() user@ae01:~$ echo `da ...
- iOS学习31之UITableVIewCell自定义
1. 自定义Cell 1> 为什么要自定义Cell UITableView 中系统的Cell共提供了四种默认样式, 分别是: UITableViewCellStyleDefault UITab ...
- ACM 括号配对问题
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=1 ...
- 【BZOJ】3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 题意:太水了= = #include <bits/stdc++.h> using ...
- SRM 595 DIV2 1000
数位DP的感觉,但是跟模版不是一个套路的,看的题解,代码好理解,但是确实难想. #include <cstdio> #include <cstring> #include &l ...