<?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 签名的更多相关文章

  1. HMAC-SHA1算法签名及Authorization头认证

    使用PHP进行HMAC-SHA1签名,并通过Authorization头认证Deom $app_id = 'id'; $host = "test.abc.com"; $port = ...

  2. 关于下载SAE日志签名认证的方法——PHP版

    之前需要下载SAE上的日志存入数据库,因此研究了下SAE的签名认证和日志下载.这个链接是SAE官方给出的API文档.https://www.sinacloud.com/doc/api.html#qia ...

  3. PHP生成腾讯云COS请求签名

    目标 使用 PHP 创建 COS 接口所需要的请求签名 步骤 按照官方示例(也许是我笨,我怎么读都觉得官方文档结构费劲,示例细节互相不挨着,容易引起歧义),请求签名应用在需要身份校验的场景,即非公有读 ...

  4. php签名认证

    一.概述 开年第一篇,该篇主要讲述了接口开发中,如何安全认证.如何用php签名认证. 二.说说历史 签名认证是什么?为什么要做签名认证?签名认证哪里会用到?no.no.no.....是不是,是不是,一 ...

  5. PHP HMAC_SHA1 算法 生成算法签名

    HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议. 它可 ...

  6. 认证加密算法php hash_hmac和java hmacSha1的问题

    public class Test{ public static void main(String[] args) throws Exception { String postString = &qu ...

  7. 阿里云OSS Web端直传 服务器签名C#版

    最近用到队里OSS的文件上传,然后阿里官方给的四个服务器签名有Java PHP Python Go四个版本,就是没C#(话说写个C#有多难?) 百度了一下好像也没有,既然这样只能自己动手照着Java版 ...

  8. python通过sha1和base64生成签名

    一.python生成时间戳 # 案例 生成时间戳 import time t = time.time() print(t) # 原始时间数据 print(int(t)) # 秒级时间戳 print(i ...

  9. 微信退款通知,退款回调数据解密.SHA256签名AEAD_AES_256_GCM解密

    $xmlResult = file_get_contents("php://input");//获取微信的数据$result = $this->xmlToArray($xml ...

随机推荐

  1. 现在有两个变量,分别是a = 3, b = 4,那么我们不用第三个变量来调换a和b的值。

    现在有两个变量,分别是a = 3, b = 4,那么我们不用第三个变量来调换a和b的值. <!DOCTYPE html><html><head>    <me ...

  2. Js中的闭包原理

    要了解清楚js中的闭包制机,那么得先了解全局执行环境.块级执行环境.函数执行环境.变量对象.环境栈.作用域链.摧毁执行环境. 全局执行环境 全局执行环境指的是最外层的执行环境.在web中全局执行环境被 ...

  3. nodejs+expressjs+ws实现了websocket即时通讯,服务器和客户端互相通信

    nodejs代码 // 导入WebSocket模块: const WebSocket = require('ws'); // 引用Server类: const WebSocketServer = We ...

  4. 【20190226】CSS-知识点记录::nth-child,:nth-of-type

    :nth-child: ele:nth-child(k):选择父元素下第k个子元素,且该子元素为ele,若不是,则选择失败,k从1开始计数 ele:nth-child(-n+5):选中前五个子元素,n ...

  5. MachineLN博客目录

    MachineLN博客目录 https://blog.csdn.net/u014365862/article/details/78422372 本文为博主原创文章,未经博主允许不得转载.有问题可以加微 ...

  6. ios12怎么投屏电脑 苹果手机怎么投

    Ios12系统发布成功之后,是不是给我们带来更大的惊喜呢.我们只需要利用手机上的屏幕镜像就可以轻松将手机画面投屏至电脑上,那么ios12怎么投屏电脑?下面便是今天所要分享的手机投屏的方法. 使用工具: ...

  7. leetcode-973最接近原点的K个点

    leetcode-973最接近原点的K个点 题意 我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) ...

  8. (后端)maven仓库

    仓库网址:http://mvnrepository.com/artifact/org.springframework/spring-core 可以去选择评分高的jar,复制: <!-- http ...

  9. [20181130]control file sequential read.txt

    [20181130]control file sequential read.txt --//昨天上午探究了大量控制文件读的情况,链接:http://blog.itpub.net/267265/vie ...

  10. sql 语句按字段指定值排序及分页

    为特定字段赋值并排序 表[Table_temp]中列[col1]为字符,属性为varchar(),排序时需要按照B.A.C的顺序显示,则可按照以下SQL语句: select * from Table_ ...