This commit is contained in:
Alone
2024-09-14 15:10:43 +08:00
parent 6c64bbd82a
commit 610dee88cd
4241 changed files with 0 additions and 622695 deletions
-332
View File
@@ -1,332 +0,0 @@
<?php
/*
* Copyright (c) 2014 Baidu.com, Inc. All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* Http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
class SignOption
{
const EXPIRATION_IN_SECONDS = 'expirationInSeconds';
const HEADERS_TO_SIGN = 'headersToSign';
const TIMESTAMP = 'timestamp';
const DEFAULT_EXPIRATION_IN_SECONDS = 1800;
const MIN_EXPIRATION_IN_SECONDS = 300;
const MAX_EXPIRATION_IN_SECONDS = 129600;
}
class HttpUtil
{
// 根据RFC 3986,除了:
// 1.大小写英文字符
// 2.阿拉伯数字
// 3.点'.'、波浪线'~'、减号'-'以及下划线'_'
// 以外都要编码
public static $PERCENT_ENCODED_STRINGS;
//填充编码数组
public static function __init()
{
HttpUtil::$PERCENT_ENCODED_STRINGS = array();
for ($i = 0; $i < 256; ++$i) {
HttpUtil::$PERCENT_ENCODED_STRINGS[$i] = sprintf("%%%02X", $i);
}
//a-z不编码
foreach (range('a', 'z') as $ch) {
HttpUtil::$PERCENT_ENCODED_STRINGS[ord($ch)] = $ch;
}
//A-Z不编码
foreach (range('A', 'Z') as $ch) {
HttpUtil::$PERCENT_ENCODED_STRINGS[ord($ch)] = $ch;
}
//0-9不编码
foreach (range('0', '9') as $ch) {
HttpUtil::$PERCENT_ENCODED_STRINGS[ord($ch)] = $ch;
}
//以下4个字符不编码
HttpUtil::$PERCENT_ENCODED_STRINGS[ord('-')] = '-';
HttpUtil::$PERCENT_ENCODED_STRINGS[ord('.')] = '.';
HttpUtil::$PERCENT_ENCODED_STRINGS[ord('_')] = '_';
HttpUtil::$PERCENT_ENCODED_STRINGS[ord('~')] = '~';
}
//在uri编码中不能对'/'编码
public static function urlEncodeExceptSlash($path)
{
return str_replace("%2F", "/", HttpUtil::urlEncode($path));
}
//使用编码数组编码
public static function urlEncode($value)
{
$result = '';
for ($i = 0; $i < strlen($value); ++$i) {
$result .= HttpUtil::$PERCENT_ENCODED_STRINGS[ord($value[$i])];
}
return $result;
}
//生成标准化QueryString
public static function getCanonicalQueryString(array $parameters)
{
//没有参数,直接返回空串
if (count($parameters) == 0) {
return '';
}
$parameterStrings = array();
foreach ($parameters as $k => $v) {
//跳过Authorization字段
if (strcasecmp('Authorization', $k) == 0) {
continue;
}
if (!isset($k)) {
throw new \InvalidArgumentException(
"parameter key should not be null"
);
}
if (isset($v)) {
//对于有值的,编码后放在=号两边
$parameterStrings[] = HttpUtil::urlEncode($k)
. '=' . HttpUtil::urlEncode((string) $v);
} else {
//对于没有值的,只将key编码后放在=号的左边,右边留空
$parameterStrings[] = HttpUtil::urlEncode($k) . '=';
}
}
//按照字典序排序
sort($parameterStrings);
//使用'&'符号连接它们
return implode('&', $parameterStrings);
}
//生成标准化uri
public static function getCanonicalURIPath($path)
{
//空路径设置为'/'
if (empty($path)) {
return '/';
} else {
//所有的uri必须以'/'开头
if ($path[0] == '/') {
return HttpUtil::urlEncodeExceptSlash($path);
} else {
return '/' . HttpUtil::urlEncodeExceptSlash($path);
}
}
}
//生成标准化http请求头串
public static function getCanonicalHeaders($headers)
{
//如果没有headers,则返回空串
if (count($headers) == 0) {
return '';
}
$headerStrings = array();
foreach ($headers as $k => $v) {
//跳过key为null的
if ($k === null) {
continue;
}
//如果value为null,则赋值为空串
if ($v === null) {
$v = '';
}
//trim后再encode,之后使用':'号连接起来
$headerStrings[] = HttpUtil::urlEncode(strtolower(trim($k))) . ':' . HttpUtil::urlEncode(trim($v));
}
//字典序排序
sort($headerStrings);
//用'\n'把它们连接起来
return implode("\n", $headerStrings);
}
}
HttpUtil::__init();
class SampleSigner
{
const BCE_AUTH_VERSION = "bce-auth-v1";
const BCE_PREFIX = 'x-bce-';
//不指定headersToSign情况下,默认签名http头,包括:
// 1.host
// 2.content-length
// 3.content-type
// 4.content-md5
public static $defaultHeadersToSign;
public static function __init()
{
SampleSigner::$defaultHeadersToSign = array(
"host",
"content-length",
"content-type",
"content-md5",
);
}
//签名函数
public function sign(
array $credentials,
$httpMethod,
$path,
$headers,
$params,
$options = array()
) {
//设定签名有效时间
if (!isset($options[SignOption::EXPIRATION_IN_SECONDS])) {
//默认值1800秒
$expirationInSeconds = SignOption::DEFAULT_EXPIRATION_IN_SECONDS;
} else {
$expirationInSeconds = $options[SignOption::EXPIRATION_IN_SECONDS];
}
//解析ak sk
$accessKeyId = $credentials['ak'];
$secretAccessKey = $credentials['sk'];
//设定时间戳,注意:如果自行指定时间戳需要为UTC时间
if (!isset($options[SignOption::TIMESTAMP])) {
//默认值当前时间
$timestamp = new \DateTime();
} else {
$timestamp = $options[SignOption::TIMESTAMP];
}
$timestamp->setTimezone(new \DateTimeZone("UTC"));
//生成authString
$authString = SampleSigner::BCE_AUTH_VERSION . '/' . $accessKeyId . '/'
. $timestamp->format("Y-m-d\TH:i:s\Z") . '/' . $expirationInSeconds;
//使用sk和authString生成signKey
$signingKey = hash_hmac('sha256', $authString, $secretAccessKey);
//生成标准化URI
$canonicalURI = HttpUtil::getCanonicalURIPath($path);
//生成标准化QueryString
$canonicalQueryString = HttpUtil::getCanonicalQueryString($params);
//填充headersToSign,也就是指明哪些header参与签名
$headersToSignOption = null;
if (isset($options[SignOption::HEADERS_TO_SIGN])) {
$headersToSignOption = $options[SignOption::HEADERS_TO_SIGN];
}
$headersToSign = SampleSigner::getHeadersToSign($headers, $headersToSignOption);
//生成标准化header
$canonicalHeader = HttpUtil::getCanonicalHeaders($headersToSign);
$headersToSign = array_keys($headersToSign);
sort($headersToSign);
//整理headersToSign,以';'号连接
$signedHeaders = '';
if ($headersToSignOption !== null) {
$signedHeaders = strtolower(
trim(implode(";", $headersToSign))
);
}
//组成标准请求串
$canonicalRequest = "$httpMethod\n$canonicalURI\n"
. "$canonicalQueryString\n$canonicalHeader";
//使用signKey和标准请求串完成签名
$signature = hash_hmac('sha256', $canonicalRequest, $signingKey);
//组成最终签名串
$authorizationHeader = "$authString/$signedHeaders/$signature";
return $authorizationHeader;
}
/** 根据headsToSign过滤应该参与签名的header
*
* @param $headers array
* @param $headersToSign array
* @return array
*/
public static function getHeadersToSign($headers, $headersToSign)
{
$ret = array();
if ($headersToSign !== null) {
$tmp = array();
//处理headers的key:去掉前后的空白并转化成小写
foreach ($headersToSign as $header) {
$tmp[] = strtolower(trim($header));
}
$headersToSign = $tmp;
}
foreach ($headers as $k => $v) {
if (trim((string) $v) !== '') {
if ($headersToSign !== null) {
//预处理headersToSign:去掉前后的空白并转化成小写
if (in_array(strtolower(trim($k)), $headersToSign)) {
$ret[$k] = $v;
}
} else {
//如果没有headersToSign,则根据默认规则来选取headers
if (SampleSigner::isDefaultHeaderToSign($k, $headersToSign)) {
$ret[$k] = $v;
}
}
}
}
return $ret;
}
/**
* 检查header是不是默认参加签名的:
* 1.是host、content-type、content-md5、content-length之一
* 2.以x-bce开头
*
* @param $header string
* @return bool
*/
public static function isDefaultHeaderToSign($header)
{
$header = strtolower(trim($header));
if (in_array($header, SampleSigner::$defaultHeadersToSign)) {
return true;
}
$prefix = substr($header, 0, strlen(SampleSigner::BCE_PREFIX));
if ($prefix === SampleSigner::BCE_PREFIX) {
return true;
} else {
return false;
}
}
}
SampleSigner::__init();
-148
View File
@@ -1,148 +0,0 @@
<?php
include_once __DIR__ . '/baidusign.php';
class Baidusmsv3
{
//终端,默认为smsv3.bj.baidubce.com
protected $endPoint;
//AK
protected $accessKey;
//SK
protected $secretAccessKey;
/**
* $config = array(
* 'endPoint' => 'smsv3.bj.baidubce.com',
* 'accessKey' => '618888888888888888888888',
* 'secretAccessKey' => 'a6888888888888888888888888',
* );
*/
function __construct(array $config)
{
$this->endPoint = isset($config['endPoint']) ? $config['endPoint'] : 'sms.bj.baidubce.com';
$this->accessKey = isset($config['accessKey']) ? $config['accessKey'] : '';
$this->secretAccessKey = isset($config['secretAccessKey']) ? $config['secretAccessKey'] : '';
}
public function sendMessage($message_array)
{
//生成json格式
$json_data = json_encode($message_array);
//生成签名
$signer = new SampleSigner();
$credentials = array("ak" => $this->accessKey, "sk" => $this->secretAccessKey);
$httpMethod = "POST";
$path = "/api/v3/sendSms";
$params = array("clientToken" => $this->create_uuid());
$timestamp = new \DateTime();
$timestamp->setTimezone(new \DateTimeZone("GMT"));
$datetime = $timestamp->format("Y-m-d\TH:i:s\Z");
//$datetime_gmt = $timestamp->format("D, d M Y H:i:s T");
$headers = array("Host" => $this->endPoint);
//$str_sha256 = hash('sha256', $json_data);
//$headers['x-bce-content-sha256'] = $str_sha256;
$headers['Content-Length'] = strlen($json_data);
$headers['Content-Type'] = "application/json";
$headers['x-bce-date'] = $datetime;
$options = array(SignOption::TIMESTAMP => $timestamp, SignOption::HEADERS_TO_SIGN => array('host', 'x-bce-date',),);
$ret = $signer->sign($credentials, $httpMethod, $path, $headers, $params, $options);
$headers_curl = array(
'Content-Type:application/json',
'Host:' . $this->endPoint,
'x-bce-date:' . $datetime,
'Content-Length:' . strlen($json_data),
//'x-bce-content-sha256:' . $str_sha256,
'Authorization:' . $ret,
//"Accept-Encoding: gzip,deflate",
//'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0',
//'Date:' . $datetime_gmt,
);
//$url = 'http://sms.bj.baidubce.com/bce/v2/message';
$url = 'http://' . $this->endPoint . $path . "?" . http_build_query($params);
//$url = '/bce/v2/message';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
//curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json_data);
//curl_setopt($curl, CURLOPT_HEADER, 1);
//curl_setopt($curl,CURLOPT_PROXY,'127.0.0.1:8888');//设置代理服务器
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers_curl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
$errorno = curl_errno($curl);
curl_close($curl);
//print var_export($result, true);
return json_decode($result, true);
}
private function create_uuid()
{
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
}
/**
* {}
*/
public function setEndPoint($endPoint)
{
$this->endPoint = $endPoint;
return $this;
}
/**
* {}
*/
public function getEndPoint()
{
return $this->endPoint;
}
/**
* {}
*/
public function setAccessKey($accessKey)
{
$this->accessKey = $accessKey;
return $this;
}
/**
* {}
*/
public function getAccessKey()
{
return $this->accessKey;
}
/**
* {}
*/
public function setSecretAccessKey($secretAccessKey)
{
$this->secretAccessKey = $secretAccessKey;
return $this;
}
/**
* {}
*/
public function getSecretAccessKey()
{
return $this->secretAccessKey;
}
}
-17
View File
@@ -1,17 +0,0 @@
<?php
require_once __DIR__ . "/baidusmsv3.php";
$config = array(
'endPoint' => 'smsv3.bj.baidubce.com',
'accessKey' => '028xxxxxxxxxxxxxxxxxxxxxxx',
'secretAccessKey' => '024xxxxxxxxxxxxxxxxxxxxxxxxxxx',
);
$smsClient = new Baidusmsv3($config);
$message = array(
"signatureId" => "sms-sign-jfMrIB59398",
"mobile" => $tel,
"template" => "sms-tmpl-yNtPhQ89473",
"contentVar" => array(
"code" => $code,
),
);
echo json_encode($smsClient->sendMessage($message), JSON_UNESCAPED_UNICODE);