diff --git a/csp/README.md b/csp/README.md index dbfaa44..2bf5ef3 100644 --- a/csp/README.md +++ b/csp/README.md @@ -1,4 +1,4 @@ -# COS JavaScript SDK 私有化使用文档 +# COS JavaScript SDK CSP 使用文档 [快速入门](./start.md) diff --git a/csp/api.md b/csp/api.md index ba4c3cb..378de81 100644 --- a/csp/api.md +++ b/csp/api.md @@ -1,3 +1,5 @@ +# COS JavaScript SDK CSP 接口说明 + > 本文针对 JavaScript SDK 的接口做详细的介绍说明 JavaScript SDK github 地址:[tencentyun/cos-js-sdk-v5](https://github.com/tencentyun/cos-js-sdk-v5) @@ -547,7 +549,7 @@ cos.putBucketAcl({ cos.putBucketAcl({ Bucket: 'test-1250000000', /* 必须 */ Region: 'ap-guangzhou', /* 必须 */ - GrantFullControl: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"' // 1001 是 uin + GrantFullControl: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"' // 1001 是 uin(帐号ID) }, function(err, data) { console.log(err || data); }); @@ -558,7 +560,7 @@ cos.putBucketAcl({ cos.putBucketAcl({ Bucket: 'test-1250000000', /* 必须 */ Region: 'ap-guangzhou', /* 必须 */ - GrantFullControl: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"' // 1001 是 uin + GrantFullControl: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"' // 1001 是 uin(帐号ID) }, function(err, data) { console.log(err || data); }); @@ -599,11 +601,11 @@ cos.putBucketAcl({ | GrantFullControl | 赋予被授权者读写权限。格式:id=" ",id=" ";
当需要给子账户授权时,id="qcs::cam::uin/<OwnerUin>:uin/<SubUin>",
当需要给根账户授权时,id="qcs::cam::uin/<OwnerUin>:uin/<OwnerUin>",
例如:'id="qcs::cam::uin/123:uin/123", id="qcs::cam::uin/123:uin/456"' | String | 否 | | AccessControlPolicy | 说明跨域资源共享配置的所有信息列表 | Object | 否 | | - Owner | 代表存储桶所有者的对象 | Object | 否 | -| - - ID | 代表用户 ID 的字符串,格式如 qcs::cam::uin/1001:uin/1001,1001 是 uin | Object | 否 | +| - - ID | 代表用户 ID 的字符串,格式如 qcs::cam::uin/1001:uin/1001,1001 是 uin(帐号ID) | Object | 否 | | - Grants | 说明跨域资源共享配置的所有信息列表 | Object | 否 | | - - Permission | 说明跨域资源共享配置的所有信息列表,可选项 READ、WRITE、READ_ACP、WRITE_ACP、FULL_CONTROL | String | 否 | | - - Grantee | 说明跨域资源共享配置的所有信息列表 | ObjectArray | 否 | -| - - - ID | 代表用户 ID 的字符串,格式如 qcs::cam::uin/1001:uin/1001,1001 是 uin | String | 否 | +| - - - ID | 代表用户 ID 的字符串,格式如 qcs::cam::uin/1001:uin/1001,1001 是 uin(帐号ID) | String | 否 | | - - - DisplayName | 代表用户名称的字符串,一般填写成和 ID 一致的字符串 | String | 否 | #### 回调函数说明 @@ -783,6 +785,47 @@ function(err, data) { ... } | - headers | 请求返回的头部信息 | Object | +### Get Bucket Location + +[Get Bucket Location 接口说明](https://cloud.tencent.com/document/product/436/8275) + +Get Bucket Location 接口用于获取 Bucket 所在的地域信息,该 GET 操作使用 location 子资源返回 Bucket 所在的区域,只有 Bucket 持有者才有该 API 接口的操作权限。 + +#### 使用示例 + +```js +cos.getBucketLocation({ + Bucket: 'test-1250000000', /* 必须 */ + Region: 'ap-guangzhou', /* 必须 */ +}, function(err, data) { + console.log(err || data); +}); +``` + +#### 参数说明 + +| 参数名 | 参数描述 | 类型 | 必填 | +|--------|----------|------|------| +| Bucket | Bucket 的名称。命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式 | String | 是 | +| Region | Bucket 所在区域。枚举值请见:[Bucket 地域信息](https://cloud.tencent.com/document/product/436/6224) | String | 是 | + +#### 回调函数说明 + +```js +function(err, data) { ... } +``` + +| 参数名 | 参数描述 | 类型 | +|--------|----------|------| +| err | 请求发生错误时返回的对象,包括网络错误和业务错误。如果请求成功,则为空,[错误码文档](https://cloud.tencent.com/document/product/436/7730) | Object | +| - statusCode | 请求返回的 HTTP 状态码,如 200、403、404 等 | Number | +| - headers | 请求返回的头部信息 | Object | +| data | 请求成功时返回的对象,如果请求发生错误,则为空 | Object | +| - statusCode | 请求返回的 HTTP 状态码,如 200、403、404 等 | Number | +| - headers | 请求返回的头部信息 | Object | +| - LocationConstraint |Bucket 所在区域。枚举值请见:[Bucket 地域信息](https://cloud.tencent.com/document/product/436/6224) | String | + + ### Get Bucket Lifecycle [Get Bucket Lifecycle 接口说明](https://cloud.tencent.com/document/product/436/8278) @@ -1554,7 +1597,7 @@ cos.putObjectAcl({ Bucket: 'test-1250000000', /* 必须 */ Region: 'ap-guangzhou', /* 必须 */ Key: '1.jpg', /* 必须 */ - GrantFullControl: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"' // 1001 是 uin + GrantFullControl: 'id="qcs::cam::uin/1001:uin/1001",id="qcs::cam::uin/1002:uin/1002"' // 1001 是 uin(帐号ID) }, function(err, data) { console.log(err || data); }); @@ -2200,62 +2243,3 @@ cos.restartTask(taskId); | 参数名 | 参数描述 | 类型 | 必填 | |--------|----------|------|------| | taskId | 文件上传任务的编号,在调用 sliceUploadFile 方法时,其 TaskReady 回调会返回该上传任务的 taskId | String | 是 | - - -### Slice Copy File - -Slice Copy File 可用于实现通过分块复制将一个文件从源路径复制到目标路径。在拷贝的过程中,文件元属性和 ACL 可以被修改。用户可以通过该接口实现文件移动,文件重命名,修改文件属性和创建副本。 - -#### 操作方法原型 - -调用 Slice Copy File 操作: - -```js -cos.sliceCopyFile({ - Bucket: 'test-1250000000', /* 必须 */ - Region: 'ap-guangzhou', /* 必须 */ - Key: '1.zip', /* 必须 */ - CopySource: 'test1.cos.ap-guangzhou.myqcloud.com/2.zip', /* 必须 */ - onProgress:function (progressData) { /* 非必须 */ - console.log(JSON.stringify(progressData)); - } -},function (err,data) { - console.log(err || data); -}); - -``` - -#### 操作参数说明 - -| 参数名 | 参数描述 | 类型 | 必填 | -|--------|---------|--------|--------| -| Bucket | Bucket 的名称。命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式 | String | 是 | -| Region | Bucket 所在区域。枚举值请见:[Bucket 地域信息](https://cloud.tencent.com/document/product/436/6224) | String | 是 | -| Key | 对象键(Object 的名称),对象在存储桶中的唯一标识,[对象键说明](https://cloud.tencent.com/document/product/436/13324) | String | 是 | -| CopySource | 源文件 URL 路径 | String | 是 | -| ChunkSize | 分片复制时,每片的大小字节数,默认值 1048576 (1MB) | Number | 否 | -| SliceSize | 使用分片复制的文件大小,默认值 5G | Number | 否 | -| onProgress | 上传文件的进度回调函数,回调参数为进度对象 progressData | Function | 否 | -| - progressData.loaded | 已经上传的文件部分大小,以字节(bytes)为单位 | Number | 否 | -| - progressData.total | 整个文件的大小,以字节(bytes)为单位 | Number | 否 | -| - progressData.speed | 文件的上传速度,以字节/秒(bytes/s)为单位 | Number | 否 | -| - progressData.percent | 文件的上传百分比,以小数形式呈现,例如:下载 50% 即为 0.5 | Number | 否 | - -#### 回调函数说明 - -```js -function(err, data) { ... } -``` - -| 参数名 | 参数描述 | 类型 | -|--------|---------|--------| -| err | 请求发生错误时返回的对象,包括网络错误和业务错误。如果请求成功,则为空,错误码文档 | Object | -| - statusCode | 请求返回的 HTTP 状态码,如 200、403、404 等 | Number | -| - headers | 请求返回的头部信息 | Object | -| data | 请求成功时返回的对象,如果请求发生错误,则为空 | Object | -| - statusCode | 请求返回的 HTTP 状态码,如 200、403、404 等 | Number | -| - headers | 请求返回的头部信息 | Object | -| - Location | 创建的 Object 的外网访问域名 | String | -| - Bucket | 分块上传的目标 Bucket | String | -| - Key | 对象键(Object 的名称),对象在存储桶中的唯一标识,[对象键说明](https://cloud.tencent.com/document/product/436/13324) | String | -| - ETag | 合并后文件的 MD5 算法校验值,如 "22ca88419e2ed4721c23807c678adbe4c08a7880",注意前后携带双引号 | String | \ No newline at end of file diff --git a/csp/auth.php b/csp/auth.php index 77c8bf0..2b21d3e 100644 --- a/csp/auth.php +++ b/csp/auth.php @@ -55,8 +55,8 @@ function getAuthorization($method, $pathname, $query, $headers) { // 获取个人 API 密钥 https://console.qcloud.com/capi - $SecretId = 'xxx'; - $SecretKey = 'xxx'; + $SecretId = 'AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; + $SecretKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // 整理参数 !$query && ($query = array()); @@ -133,11 +133,19 @@ function obj2str($obj) // 获取前端过来的参数 -$params = json_decode(file_get_contents("php://input"), 1); -$pathname = isset($params['pathname']) ? $params['pathname'] : '/'; -$method = isset($params['method']) ? $params['method'] : 'get'; -$query = isset($params['query']) ? $params['query'] : array(); -$headers = isset($params['headers']) ? $params['headers'] : array(); +$inputBody = file_get_contents("php://input"); +if ($_SERVER['REQUEST_METHOD'] === 'POST' && $inputBody){ + $params = json_decode($inputBody, 1); + $pathname = isset($params['pathname']) ? $params['pathname'] : '/'; + $method = isset($params['method']) ? $params['method'] : 'get'; + $query = isset($params['query']) ? $params['query'] : array(); + $headers = isset($params['headers']) ? $params['headers'] : array(); +} else { + $pathname = isset($_GET['pathname']) ? $_GET['pathname'] : '/'; + $method = isset($_GET['method']) ? $_GET['method'] : 'get'; + $query = isset($_GET['query']) && $_GET['query'] ? json_decode($_GET['query'], 1) : array(); + $headers = isset($_GET['headers']) && $_GET['headers'] ? json_decode($_GET['headers'], 1) : array(); +} // 返回数据给前端 header('Content-Type: text/plain'); diff --git a/csp/csp.html b/csp/csp.html index d0e89c4..02bdec2 100644 --- a/csp/csp.html +++ b/csp/csp.html @@ -51,20 +51,11 @@

cos-js-sdk-v5

ForcePathStyle: true, // 后缀式 // Domain: 'http://{Bucket}.cos.{Region}.example.com', // 前缀式 getAuthorization: function (options, callback) { - var url = './sts.php'; + var url = './auth.php?method=' + options.Method + '&pathname=' + encodeURIComponent(options.Key); var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onload = function (e) { - try { - var data = JSON.parse(e.target.responseText); - } catch (e) { - } - callback({ - TmpSecretId: data.credentials && data.credentials.tmpSecretId, - TmpSecretKey: data.credentials && data.credentials.tmpSecretKey, - XCosSecurityToken: data.credentials && data.credentials.sessionToken, - ExpiredTime: data.expiredTime, - }); + callback(e.target.responseText); }; xhr.send(); }, @@ -155,27 +146,27 @@

cos-js-sdk-v5

ACL: 'private', // AccessControlPolicy: { // "Owner": { // AccessControlPolicy 里必须有 owner - // "ID": 'qcs::cam::uin/459000000:uin/459000000' // 459000000 是 Bucket 所属用户的 QQ 号 + // "ID": 'qcs::cam::uin/459000000:uin/459000000' // 459000000 是 Bucket 所属用户的 uin(帐号ID) // }, // "Grants": [{ // "Grantee": { - // "ID": "qcs::cam::uin/1001:uin/1001", // 10002 是 QQ 号 - // "DisplayName": "qcs::cam::uin/1001:uin/1001" // 10002 是 QQ 号 + // "ID": "qcs::cam::uin/1001:uin/1001", // 10002 是 uin(帐号ID) + // "DisplayName": "qcs::cam::uin/1001:uin/1001" // 10002 是 uin(帐号ID) // }, // "Permission": "READ" // }, { // "Grantee": { - // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 QQ 号 + // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 uin(帐号ID) // }, // "Permission": "WRITE" // }, { // "Grantee": { - // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 QQ 号 + // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 uin(帐号ID) // }, // "Permission": "READ_ACP" // }, { // "Grantee": { - // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 QQ 号 + // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 uin(帐号ID) // }, // "Permission": "WRITE_ACP" // }] @@ -230,6 +221,15 @@

cos-js-sdk-v5

}); } + function getBucketLocation() { + cos.getBucketLocation({ + Bucket: config.Bucket, // Bucket 格式:test-1250000000 + Region: config.Region + }, function (err, data) { + logger.log(err || data); + }); + } + function putBucketLifecycle() { cos.putBucketLifecycle({ Bucket: config.Bucket, // Bucket 格式:test-1250000000 @@ -384,11 +384,11 @@

cos-js-sdk-v5

ACL: 'default', // 继承上一级目录权限 // AccessControlPolicy: { // "Owner": { // AccessControlPolicy 里必须有 owner - // "ID": 'qcs::cam::uin/459000000:uin/459000000' // 459000000 是 Bucket 所属用户的 QQ 号 + // "ID": 'qcs::cam::uin/459000000:uin/459000000' // 459000000 是 Bucket 所属用户的 uin(帐号ID) // }, // "Grants": [{ // "Grantee": { - // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 QQ 号 + // "ID": "qcs::cam::uin/10002:uin/10002", // 10002 是 uin(帐号ID) // }, // "Permission": "READ" // }] @@ -431,22 +431,6 @@

cos-js-sdk-v5

}); } - function restoreObject() { - cos.restoreObject({ - Bucket: config.Bucket, // Bucket 格式:test-1250000000 - Region: config.Region, - Key: '1.txt', - RestoreRequest: { - Days: 1, - CASJobParameters: { - Tier: 'Expedited' - } - } - }, function (err, data) { - logger.log(err || data); - }); - } - function abortUploadTask() { cos.abortUploadTask({ Bucket: config.Bucket, /* 必须 */ // Bucket 格式:test-1250000000 @@ -608,34 +592,6 @@

cos-js-sdk-v5

} - function sliceCopyFile() { - // 创建测试文件 - var sourceName = '3mb.zip'; - var Key = '3mb.copy.zip'; - - var sourcePath = config.Bucket + '.cos.' + config.Region + '.myqcloud.com/'+ encodeURIComponent(sourceName).replace(/%2F/g, '/'); - - cos.sliceCopyFile({ - Bucket: config.Bucket, // Bucket 格式:test-1250000000 - Region: config.Region, - Key: Key, - CopySource: sourcePath, - SliceSize: 2 * 1024 * 1024, // 大于2M的文件用分片复制,小于则用单片复制 - onProgress:function (info) { - var percent = parseInt(info.percent * 10000) / 100; - var speed = parseInt(info.speed / 1024 / 1024 * 100) / 100; - logger.log('进度:' + percent + '%; 速度:' + speed + 'Mb/s;'); - } - },function (err,data) { - if(err){ - logger.log(err); - }else{ - logger.log(data); - } - }); - - } - var time0 = Date.now(); var preMsg = '页面加载完成'; var showTime = function (msg) { @@ -694,10 +650,10 @@

cos-js-sdk-v5

'putBucketCors', 'getBucketCors', // 'deleteBucketCors', // 不提供 + 'getBucketLocation', 'getBucketLifecycle', 'putBucketLifecycle', 'deleteBucketLifecycle', - 'deleteBucketLifecycle', 'putBucketReplication', 'getBucketReplication', 'deleteBucketReplication', @@ -710,7 +666,6 @@

cos-js-sdk-v5

'getObjectAcl', 'deleteObject', 'deleteMultipleObject', - 'restoreObject', 'abortUploadTask', 'sliceUploadFile', 'selectFileToUpload', @@ -718,7 +673,6 @@

cos-js-sdk-v5

'pauseTask', 'restartTask', 'uploadFiles', - 'sliceCopyFile', 'selectUploadFiles', 'startSelectUploadFiles', ]; diff --git a/csp/start.md b/csp/start.md index bd6178a..bf904bc 100644 --- a/csp/start.md +++ b/csp/start.md @@ -1,4 +1,4 @@ -# CSP 使用 COS JavaScript SDK +# COS JavaScript SDK CSP 快速入门 ### SDK 获取 @@ -75,9 +75,4 @@ document.getElementById('file-selector').onchange = function () { 支持 webpack 打包的场景,可以用 npm 引入作为模块 ```shell npm i cos-js-sdk-v5 --save -``` - -## 其他文档和例子 - -1. 更多例子请参阅 [XML JavaScript SDK Demo](https://github.com/tencentyun/cos-js-sdk-v5/blob/master/demo)。 -2. 完整接口文档请参阅 [XML JavaScript SDK 接口文档](https://cloud.tencent.com/document/product/436/12260)。 \ No newline at end of file +``` \ No newline at end of file diff --git a/csp/sts.php b/csp/sts.php deleted file mode 100644 index 34a155f..0000000 --- a/csp/sts.php +++ /dev/null @@ -1,156 +0,0 @@ - 'http://sts.api2.example.com/v2/index.php', - 'Domain' => 'sts.api2.example.com', - 'Proxy' => '', - 'SecretId' => 'AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // 固定密钥 - 'SecretKey' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // 固定密钥 - 'Bucket' => 'test-1250000000', - 'Region' => 'default', - 'AllowPrefix' => '_ALLOW_DIR_/*', // 必填,这里改成允许的路径前缀,这里可以根据自己网站的用户登录态判断允许上传的目录,例子:* 或者 a/* 或者 a.jpg -); - -// obj 转 query string -function json2str($obj, $notEncode = false) { - ksort($obj); - $arr = array(); - foreach ($obj as $key => $val) { - array_push($arr, $key . '=' . ($notEncode ? $val : rawurlencode($val))); - } - return join('&', $arr); -} - -// 计算临时密钥用的签名 -function getSignature($opt, $key, $method) { - global $config; - $formatString = $method . $config['Domain'] . '/v2/index.php?' . json2str($opt, 1); - $sign = hash_hmac('sha1', $formatString, $key); - $sign = base64_encode(hex2bin($sign)); - return $sign; -} - -// 获取临时密钥 -function getTempKeys() { - - global $config; - - // 判断是否修改了 AllowPrefix - if ($config['AllowPrefix'] === '_ALLOW_DIR_/*') { - return array('error'=> '请修改 AllowPrefix 配置项,指定允许上传的路径前缀'); - } - - $ShortBucketName = substr($config['Bucket'],0, strripos($config['Bucket'], '-')); - $AppId = substr($config['Bucket'], 1 + strripos($config['Bucket'], '-')); - $policy = array( - 'version'=> '2.0', - 'statement'=> array( - array( - 'action'=> array( - // // 这里可以从临时密钥的权限上控制前端允许的操作 - // 'name/cos:*', // 这样写可以包含下面所有权限 - - // // 列出所有允许的操作 - // // ACL 读写 - // 'name/cos:GetBucketACL', - // 'name/cos:PutBucketACL', - // 'name/cos:GetObjectACL', - // 'name/cos:PutObjectACL', - // // 简单 Bucket 操作 - // 'name/cos:PutBucket', - // 'name/cos:HeadBucket', - // 'name/cos:GetBucket', - // 'name/cos:DeleteBucket', - // 'name/cos:GetBucketLocation', - // // Versioning - // 'name/cos:PutBucketVersioning', - // 'name/cos:GetBucketVersioning', - // // CORS - // 'name/cos:PutBucketCORS', - // 'name/cos:GetBucketCORS', - // 'name/cos:DeleteBucketCORS', - // // Lifecycle - // 'name/cos:PutBucketLifecycle', - // 'name/cos:GetBucketLifecycle', - // 'name/cos:DeleteBucketLifecycle', - // // Replication - // 'name/cos:PutBucketReplication', - // 'name/cos:GetBucketReplication', - // 'name/cos:DeleteBucketReplication', - // // 删除文件 - // 'name/cos:DeleteMultipleObject', - // 'name/cos:DeleteObject', - // 简单文件操作 - 'name/cos:PutObject', - 'name/cos:PostObject', - 'name/cos:AppendObject', - 'name/cos:GetObject', - 'name/cos:HeadObject', - 'name/cos:OptionsObject', - 'name/cos:PutObjectCopy', - 'name/cos:PostObjectRestore', - // 分片上传操作 - 'name/cos:InitiateMultipartUpload', - 'name/cos:ListMultipartUploads', - 'name/cos:ListParts', - 'name/cos:UploadPart', - 'name/cos:CompleteMultipartUpload', - 'name/cos:AbortMultipartUpload', - ), - 'effect'=> 'allow', - 'principal'=> array('qcs'=> array('*')), - 'resource'=> array( - 'qcs::cos:' . $config['Region'] . ':uid/' . $AppId . ':prefix//' . $AppId . '/' . $ShortBucketName . '/', - 'qcs::cos:' . $config['Region'] . ':uid/' . $AppId . ':prefix//' . $AppId . '/' . $ShortBucketName . '/' . $config['AllowPrefix'] - ) - ) - ) - ); - - $policyStr = str_replace('\\/', '/', json_encode($policy)); - $Action = 'GetFederationToken'; - $Nonce = rand(10000, 20000); - $Timestamp = time() - 1; - $Method = 'POST'; - - $params = array( - 'Region'=> 'gz', - 'SecretId'=> $config['SecretId'], - 'Timestamp'=> $Timestamp, - 'Nonce'=> $Nonce, - 'Action'=> $Action, - 'durationSeconds'=> 7200, - 'name'=> 'cos', - 'policy'=> urlencode($policyStr) - ); - $params['Signature'] = getSignature($params, $config['SecretKey'], $Method); - - $url = $config['Url']; - $ch = curl_init($url); - $config['Proxy'] && curl_setopt($ch, CURLOPT_PROXY, $config['Proxy']); - curl_setopt($ch, CURLOPT_HEADER, 0); - curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0); - curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, json2str($params)); - $result = curl_exec($ch); - if(curl_errno($ch)) $result = curl_error($ch); - curl_close($ch); - - $result = json_decode($result, 1); - if (isset($result['data'])) $result = $result['data']; - - return $result; -} - -// 获取临时密钥,计算签名 -$tempKeys = getTempKeys(); - -// 返回数据给前端 -header('Content-Type: application/json'); -header('Access-Control-Allow-Origin: http://127.0.0.1'); // 这里修改允许跨域访问的网站 -header('Access-Control-Allow-Headers: origin,accept,content-type'); -echo json_encode($tempKeys);