hash_hmac 签名
<?php
/**
* ===========================================================
* Model_Base
* Description
* Model_Base
* @Author wzhu.email@gmail.com
* @Version 1.0
* @Copyright Zhuweiwei
* Copyright © 2008-2012
* China. All Rights Reserved.
* ===========================================================
*/ namespace Action; use ZW\Utility as Utility;
use ZW\Http\Client as HttpClient; class Expo
{
CONST URL_BASE = 'https://api.webexpotec.cn'; CONST URL_EVENT = '/v1/event';
//登录
CONST URL_AUTH_SIGNIN = '/v1/auth/signin';
//获取验证码和验证验证码
CONST URL_AUTH_VCODE = '/v1/auth/vcode';
//下订单
CONST URL_ORDER = '/v1/order';
//生成凭证
CONST URL_ADMISSION = '/v1/admission';
//查询用户是否已经有凭证
CONST URL_ADMISSION_LISTING = '/v1/admission/listing';
//二维码
CONST URL_QR = '/v1/qr';
//问卷调查
CONST URL_QURESTION = '/v1/question/listing';
//提交问题
CONST URL_SURVEY = '/v1/survey/submit';
//lifecbd 接口路径
CONST URL_ARTICLE = '/v1/article'; /* protected $app_key = '1467721313';
protected $app_secret = '21e122dba62dcd9aed1488aced61f2c2';
protected $eventid = '1440860341';//
protected $ticketid = '1463800736';//票务ID*/ protected $app_key = '1467721309';
protected $app_secret = '567aa793d2cfb865eec8623dc7b9de92';
protected $eventid = '1440860340';//活动id
protected $ticketid = '000000';//票务ID--随便写 protected $app_ver = '1.0.0';
protected $app_uuid = 'ABCDEFG';
protected $sig_method = 'HMAC-SHA1';
protected $il8n_lang = 'zh-cn'; public function decodeQrcode($string)
{
$arrParam = array(
'string' => $string,
);
return $this->get(self::URL_QR, $arrParam);
} public function getSignin($arrParam = array())
{
$arrParam = array(
'username' => '13436919765',
'password' => '919765',
'countrycode' => 'CN',
);
return $this->get(self::URL_AUTH_SIGNIN, $arrParam);
} //登录
public function getEventListing(array $arrParam = array(), $start = 0, $num = 100, $scope = 0)
{
$arrParam['start'] = (int)$start;
$arrParam['num'] = (int)$num;
$arrParam['scope'] = $scope;
$url = sprintf('%s/listing', self::URL_EVENT);
return $this->get($url, $arrParam);
} //获取活动内容
public function getEvent($eventId, $scopes = 1)
{
$url = sprintf('%s/%d', self::URL_EVENT, $eventId);
$arrParam = array(
'id' => (int)$eventId,
'scopes' => (int)$scopes,
);
return $this->get($url, $arrParam);
} //获取验证码
public function getAuthVcode($username, $type = 4, $countryCode = 'CN')
{
$arrParam = array(
'username' => $username,
'countrycode' => $countryCode,
'type' => $type,
);
return $this->get(self::URL_AUTH_VCODE, $arrParam);
} /**
*读取列表数据
*/
public function getArticleList($channel, $start = 0, $num = 20, $type = 0){ $arrParam = array(
'channel' => $channel,
'type' => $type,
'start' => $start,
'num' => $num,
);
$url = sprintf('%s/listing', self::URL_ARTICLE);
return $this->get($url, $arrParam);
} /**读取文章数据
* @param $articleId 文章id
*/
public function getArticle($articleId){
$url = sprintf('%s/%d', self::URL_ARTICLE, $articleId);
return $this->get($url, array());
} //校验验证码
public function chkAuthVcode($username, $vcode = '', $type = 0, $countryCode = 'CN')
{
if (empty($vcode)) {
$vcode = "abcdfg";
}
$arrParam = array(
'username' => $username,
'countrycode' => $countryCode,
'type' => $type,
'vcode' => $vcode,
);
return $this->post(self::URL_AUTH_VCODE, $arrParam);
} //提交注册表单
public function orderForm($arr)
{
$goods = [
'id' => $arr['id'],
'num' => $arr['num'],
];
$goods = '[' . json_encode($goods) . ']';
$arrParam = array(
'type' => $arr['type'],
'goods' => $goods,
'realname' => $arr['realname'],
'cellphone' => $arr['cellphone'],
'email' => $arr['email'],
'corp' => $arr['corp'],
'title' => $arr['title'],
'address' => $arr['address'],
'countrycode' => $arr['countrycode'],
'adminmemo' => $arr['adminmemo'],
'promocode' => $arr['promocode'],
);
return $this->post(self::URL_ORDER, $arrParam);
} //检查订单状态
public function chkOrder($orderid)
{
$arrParam = array(
'orderid' => $orderid,
);
return $this->get(self::URL_ORDER . "/" . $orderid, $arrParam);
} //注册凭证
public function registerAdmission($ticketnoid, $arr)
{ $arrParam = array(
'ticketno' => $ticketnoid,
'realname' => $arr['realname'],
'cellphone' => $arr['cellphone'],
'email' => $arr['email'],
'corp' => $arr['corp'],
'title' => $arr['title'],
'countrycode' => 'CN',
'extdata' => $arr['adminmemo'],
);
return $this->post(self::URL_ADMISSION, $arrParam);
} public function getUserAdmissionList($arrParam)
{ $arrParam['eventid'] = $this->eventid;
$arrParam['ticketid'] = $this->ticketid; return $this->get(self::URL_ADMISSION_LISTING, $arrParam);
} //获取问题列表
public function getQuestionList($token, $suveryid)
{
$arrParam = array('surveyid' => (int)$suveryid,
'token' => $token,);
return $this->get(self::URL_QURESTION, $arrParam);
} //提交问题列表
public function submitSuvery($id, $answers)
{
return $this->post(self::URL_SURVEY . '/' . $id, $answers);
} ////////////////////////////////////////////////////////////////////////// //stdClass Object转array
public function objectArray($array)
{
if (is_object($array)) {
$array = (array)$array;
} else if (is_array($array)) {
foreach ($array as $key => $value) {
$array[$key] = $this->objectArray($value);
}
}
return $array;
} //get组装curl字符串
protected function urlGetstr($url, $arrParam)
{
$url = $url . "?" . $this->arrayTostr($arrParam);
return $url;
} //curl调用接口
protected function httpCurlExce($url, $arrParam = array(), $method)
{
//如果是get提交需要组装url,post的则不需要
if ($method == 'get') {
$url = $this->urlGetstr($url, $arrParam);
}
//echo $url;
//curl发送
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 1);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//绕过ssl验证
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//在尝试连接时等待的秒数
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 90);
//最大执行时间
curl_setopt($curl, CURLOPT_TIMEOUT, 90);
if ($method == 'post') {
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
//设置post数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $arrParam);
}
//执行命令
$data = curl_exec($curl);
//处理头信息
// 获得响应结果里的:头大小
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
// 根据头大小去获取头信息内容
$ret = substr($data, $headerSize);
//关闭URL请求
curl_close($curl);
//stdClass Object转array
$ret = json_decode($ret);
$ret = $this->objectArray($ret);
//echo "<pre>";
//print_r($data);
return $ret;
} //签名算法
protected function getSignature($str, $key)
{
$signature = "";
if (function_exists('hash_hmac')) {
//$signature = bin2hex(hash_hmac("sha1", $str, $key, true));
$signature = hash_hmac("sha1", $str, $key, true);
} else {
$blocksize = 64;
$hashfunc = 'sha1';
if (strlen($key) > $blocksize) {
$key = pack('H*', $hashfunc($key));
}
$key = str_pad($key, $blocksize, chr(0x00));
$ipad = str_repeat(chr(0x36), $blocksize);
$opad = str_repeat(chr(0x5c), $blocksize);
$hmac = pack(
'H*', $hashfunc(
($key ^ $opad) . pack(
'H*', $hashfunc(
($key ^ $ipad) . $str
)
)
)
);
//$signature = bin2hex($hmac);
$signature = $hmac;
}
return $signature;
} //base64UrlEncode
protected function base64UrlEncode($str)
{
$search = array('+', '/', '=');
$replace = array('*', '-', '');
$basestr = base64_encode($str);
return str_replace($search, $replace, $basestr);
} /**
* 将数组中的值,按照键值排序,之后将每个元素拼接成url样式
* @param $arrParam:数组
* @return $str : 拼接的url地址
*/
protected function arrayTostr($arrParam)
{
$i = $arr_num = 0;
$str = "";
ksort($arrParam, SORT_NATURAL);
$arr_num = count($arrParam);
foreach ($arrParam as $key => $val) {
$i++;
if ($i < $arr_num) {
$str .= $key . '=' . urlencode($val) . '&';
} else {
$str .= $key . '=' . urlencode($val);
}
}
return $str;
} protected function buildSignature($arrParam)
{
$str = $this->arrayTostr($arrParam);//url地址拼接
$signature = $this->getSignature($str, $this->app_secret);//hash_hmac 签名
$signature = $this->base64UrlEncode($signature);//base64加密
return $signature;
} protected function getRandStr()
{
$str = '';
for ($i = 1; $i <= 10; $i++) {
$str .= chr(rand(65, 90));
}
return $str;
} protected function adaptSysParam(array $arrParam)
{
$arrParam['app_key'] = $this->app_key;
$arrParam['timestamp'] = NOW_TIME;
$arrParam['sig_method'] = $this->sig_method;
$arrParam['app_uuid'] = $this->app_uuid;
$arrParam['app_ver'] = '1.0.0';
$arrParam['il8n_lang'] = $this->il8n_lang;
$arrParam['req_uuid'] = $this->getRandStr();
$arrParam['signature'] = $this->buildSignature($arrParam);
return $arrParam;
} /**
* @param :$url url地址
* @param :adaptSysParam 组合需要的传参,最后生成签名:签名方法:将数组组成url参数,生成hmac签名,base64加密
* @param :httpCurlExce curl获取接口内容
*/
protected function get($url, array $arrParam)
{
$arrParam = $this->adaptSysParam($arrParam);
$arr = $this->httpCurlExce(self::URL_BASE . $url, $arrParam, 'get');
return $arr;
} protected function post($url, array $arrParam)
{
$arrParam = $this->adaptSysParam($arrParam);
$arr = $this->httpCurlExce(self::URL_BASE . $url, $arrParam, 'post');
return $arr;
} }
hash_hmac 签名的更多相关文章
- HMAC-SHA1算法签名及Authorization头认证
使用PHP进行HMAC-SHA1签名,并通过Authorization头认证Deom $app_id = 'id'; $host = "test.abc.com"; $port = ...
- 关于下载SAE日志签名认证的方法——PHP版
之前需要下载SAE上的日志存入数据库,因此研究了下SAE的签名认证和日志下载.这个链接是SAE官方给出的API文档.https://www.sinacloud.com/doc/api.html#qia ...
- PHP生成腾讯云COS请求签名
目标 使用 PHP 创建 COS 接口所需要的请求签名 步骤 按照官方示例(也许是我笨,我怎么读都觉得官方文档结构费劲,示例细节互相不挨着,容易引起歧义),请求签名应用在需要身份校验的场景,即非公有读 ...
- php签名认证
一.概述 开年第一篇,该篇主要讲述了接口开发中,如何安全认证.如何用php签名认证. 二.说说历史 签名认证是什么?为什么要做签名认证?签名认证哪里会用到?no.no.no.....是不是,是不是,一 ...
- PHP HMAC_SHA1 算法 生成算法签名
HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议. 它可 ...
- 认证加密算法php hash_hmac和java hmacSha1的问题
public class Test{ public static void main(String[] args) throws Exception { String postString = &qu ...
- 阿里云OSS Web端直传 服务器签名C#版
最近用到队里OSS的文件上传,然后阿里官方给的四个服务器签名有Java PHP Python Go四个版本,就是没C#(话说写个C#有多难?) 百度了一下好像也没有,既然这样只能自己动手照着Java版 ...
- python通过sha1和base64生成签名
一.python生成时间戳 # 案例 生成时间戳 import time t = time.time() print(t) # 原始时间数据 print(int(t)) # 秒级时间戳 print(i ...
- 微信退款通知,退款回调数据解密.SHA256签名AEAD_AES_256_GCM解密
$xmlResult = file_get_contents("php://input");//获取微信的数据$result = $this->xmlToArray($xml ...
随机推荐
- 记录使用Redis和nginx 实现一个简单的负载均衡(FB)
这两年在博客园看了不少大牛的分享,一直打算能写点什么东西. 之前偶然看见一个利用Redis 当作 Session数据宿主的demo,出处我已经找不到了.后来没事看了看nginx相关的东西.其中负载均衡 ...
- js正则表达式 URL格式匹配详解
0.URL格式 protocol :// hostname[:port] / path / [;parameters][?query]#fragment [;parameters]没见过 这里就不做相 ...
- 详解纯css实现瀑布流(multi-column多列及flex布局)
瀑布流的布局自我感觉还是很吸引人的,最近又看到实现瀑布流这个做法,在这里记录下,特别的,感觉flex布局实现瀑布流还是有点懵的样子,不过现在就可以明白它的原理了 1.multi-column多列布局实 ...
- Go开发之路 -- Go语言基本语法
一. 变量 1.1 变量的声明 Go 语言的每一个变量都拥有自己的类型,必须经过声明才能开始用. 标准格式: var 变量名 变量类型 变量的声明以关键字 var 开头,行尾不需要写分号 常见变量的数 ...
- 《锋利的jQuery》笔记:插件的使用和写法
jQuery插件的种类 1.封装对象方法 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件.此类插件可以发挥出jQuery选择器的强大优势,有相当一部分 ...
- 列表转换为字典(setdefault())
li=[11,22,33,44,66,77,88] dict={} li_less=[] li_large=[] for i in li: if i == 66:continue if i < ...
- 2014年11月17~11月18日,杨学明老师《企业IT需求收集和实施》内训在湖南长沙某酒店成功举办!
2014年11月17至18日,受湖南某软件企业的邀请,杨学明老师<企业IT需求收集和实施>内训在某长沙某五星级酒店成功举办!来自全国各地的IT高管和企业负责人参加了此次培训.杨学明老师分别 ...
- GitHub Flow & Git Flow 基于Git 的两种协作开发模式
介绍基于Git 两种协作开发模式,GitHub Flow & Git Flow 对于Github 一些好用的特殊操作技巧 ,可以见GitHub 特殊操作技巧 和Git的基本操作 一 GitHu ...
- ajax请求经典格式
$.ajax({ url: url, type: "POST", dataType: "json", data: data, success: funtion1 ...
- mysql----SELECT names/zh
< SELECT names Language: English • 中文 name continent Afghanistan Asia Albania Europe Algeria A ...