请求的 api.php页面
<?php
/*
+-------------------------------------------------------------------------------------------
+ Title : 请求方传输数据进行请求验证
+ Version : V1.0.0.1
+ Start - Time : 2017-08-04 21:30 + sgw
+ Last - Time : 2017-08-04 22:10 + sgw
+ Desc : 把数据通过cURL请求到接口方返回信息
+-------------------------------------------------------------------------------------------
*/
header("Content-type:text/html; charset=UTF-8");
/*==注意要开启 PHP扩展配置cURL ==*/
class Api
{
//Token
private static $_TOKEN = 'hello_sgw';
private static $_url = 'http://localhost/myApi/validaApi.php';//注意这里要写你运行程序的文件路径,不能是相对路径
/**
* 生成签名 - 发送验证
* 一般需要3个值去发送 token | time | sign
*/
public static function Sign(){
$time = date('Y-m-d H:i:s');
$token = self::$_TOKEN;
# 随机数10位
$rand = rand(1000000000, 9999999999);
# 进行排序(这里生成sign一种假设排序规则'A'。实际会按接口方需求编写)
$tmpArr = array($time, $token, $rand);
sort($tmpArr, SORT_STRING);// 单元被作为字符串来比较
# 数组转成字符串
$sign = implode($tmpArr);
$sign = sha1($sign);// sha1加密
# 发送签名到checkApi.php页面验证
$url = self::$_url;
# 随机文字用于验证返回验证是否成功
$msg = '随机内容,用于延签成功后返回';
# 参数数组
$data = array(
'time' => $time,
'rand' => $rand,
'sign' => $sign,
'msg' => $msg,
);
# cURL方式最常用的请求接口数据,还有用http请求接口
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url);
curl_setopt ( $ch, CURLOPT_POST, 1 );//post请求方式
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );//以文件流的形式返回,而不是直接输出
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );//post提交data数据
# curl_exec 请求并返回结果
$return = curl_exec ( $ch );
curl_close ( $ch );
if($return === $msg){
exit('验签成功');
}
exit('验签失败!');
}
}
$API = new Api();
$API->Sign();
<?php
/*
+-------------------------------------------------------------------------------------------
+ Title : 接口方进行验签
+ Version : V1.0.0.1
+ Start - Time : 2017-08-04 22:10 + sgw
+ Last - Time : 2017-08-04 22:45 + sgw
+ Desc : 通过$TOKEN进行数据验证并返回验签结果
+-------------------------------------------------------------------------------------------
*/
define('TOKEN', 'hello_sgw');
# 进行验签
$valid = new ValidaApi();
if(isset($_POST['msg'])) {
$valid->valida();
}
class ValidaApi
{
/**
* 验签,并返回结果
*/
public function valida(){
$msg = $_POST['msg'];
if($this->checkSign()){
echo $msg;exit;//返回提交过来的随机文字
}
}
/**
* 生成签名
*/
private function checkSign(){
# 接受参数 重新的变量名为了区分和api.php页面传过来的变量名
$signature = $_POST['sign'];
$timestamp = $_POST['time'];
$random = $_POST['rand'];
# 按照生成规则'A'
$token = TOKEN;
$tmpArr = array($token, $timestamp, $random);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);// 进行sha1加密
# 对比两个签名是否一致
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
}