📷 QR Share System - 第三方 API 接入文档

图片上传扫码分享系统 · HTTP API 接入指南

🌐 API Base: https://qrshare.nsjia.cn/api 📡 协议: HTTP/HTTPS 🔑 认证: Access Key 🔄 跨域: 已开启 (*)

📋 目录

1概览

本系统提供 HTTP API,允许第三方系统/小程序/App 直接上传图片(拍照/签名),并获取图片查看网址和二维码。

核心流程

流程图第三方系统 ──上传图片──▶ QR Share API
                                │
                                ▼
                         返回 view_url (查看网址)
                                │
                                ▼
                  第三方根据 view_url 生成二维码
                                │
                                ▼
                     用户扫码 → 打开查看页 → 预览/下载

接口列表

接口方法认证说明
/api/upload.phpPOSTAccess Key上传图片(支持文件/Base64,可带预占 link_key)
/api/reserve_link.phpPOSTAccess Key🔑 上传前预占图片链接,提前获取查看链接/二维码
/api/image_info.phpGETlink_key 或 Access Key查询图片详情与配置(含 pending/ready 状态)
/api/qrcode.phpGET公开生成二维码图片(PNG)
/api/reset_link.phpPOST管理员登录重置图片链接(旧链接失效)

当前可用项目

#6 侗听新晃—虚拟换装 c31d111cdca1bf1f
#5 电子签名 c5e9159698e58d3d
#4 测试 de7bd5febe106ec9
#3 长沙禁毒项目签名拍照 4339cd263b03b1a6
#2 永嘉学派数字馆 b81f88aa6f22a1c2

⚠️ 以上 access_key 是调用上传接口的身份凭证,请妥善保管,不要泄露到前端代码中。

2认证方式

本系统使用 access_key 作为项目身份凭证,无需 token 或 OAuth。

获取 access_key

  1. 登录后台管理 → 项目管理 → 新建/编辑项目
  2. 系统会自动生成 16 位 access_key
  3. 在项目编辑页底部「第三方 API 接入说明」卡片中复制

使用方式

将 access_key 作为请求参数传递:

安全提示:
  • access_key 等同于项目密码,请通过服务端调用,不要写在前端JS/小程序客户端代码中
  • 建议在第三方服务端中转上传请求,避免直接暴露 access_key
  • 如怀疑泄露,可在后台编辑项目时重新生成(目前需删除项目重建,或联系管理员)

3图片上传接口 POST

上传拍照或签名图片,返回图片查看网址、原图直链、二维码URL。

🔑 需要"上传前先拿到二维码"? (例如把查看二维码合成进图片后再上传)
先调用 第4节 链接预占接口 获取 link_key 与 qrcode_url → 用二维码合成图片 → 上传本接口时额外携带 link_key 字段,系统即把该预占链接绑定到本次图片。 不传 link_key 时行为与原来完全一致(上传时自动生成新链接)。

接口地址

URLhttps://qrshare.nsjia.cn/api/upload.php

支持两种上传方式:

方式1: multipart/form-data 文件上传 推荐

适合前端表单、移动端WebView、原生HTTP客户端直接上传二进制文件。

参数类型必填说明
access_keystring是项目访问密钥 (16位)
img_typestring是图片类型: photo=拍照 / signature=签名
filefile是图片文件 (二进制),支持 jpg/jpeg/png/gif/webp,最大 10MB
project_idint否项目ID(可选,如填写需与access_key匹配)
link_keystring否预占的图片链接密钥(由 reserve_link.php 返回);传入则认领该链接,不传则自动生成新链接

请求示例

HTTPPOST https://qrshare.nsjia.cn/api/upload.php HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

------WebKitFormBoundary
Content-Disposition: form-data; name="access_key"

1a2b3c4d5e6f7890
------WebKitFormBoundary
Content-Disposition: form-data; name="img_type"

photo
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="photo.jpg"
Content-Type: image/jpeg

(二进制图片数据)
------WebKitFormBoundary--

方式2: application/json Base64 上传

适合服务端调用、无法使用multipart的场景。将图片转为Base64字符串后以JSON提交。

参数类型必填说明
access_keystring是项目访问密钥
img_typestring是photo 或 signature
file_base64string是图片Base64编码,可带 data:image/xxx;base64, 前缀
filenamestring否原始文件名(用于判断扩展名)
link_keystring否预占的图片链接密钥(由 reserve_link.php 返回);传入则认领该链接,不传则自动生成新链接

请求示例

JSONPOST https://qrshare.nsjia.cn/api/upload.php HTTP/1.1
Content-Type: application/json

{
  "access_key": "1a2b3c4d5e6f7890",
  "img_type": "photo",
  "filename": "photo.jpg",
  "file_base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASA..."
}

成功响应

JSON · 200{
  "success": true,
  "code": 0,
  "msg": "上传成功",
  "data": {
    "image_id": 123,
    "img_type": "photo",
    "view_url": "https://qrshare.nsjia.cn/view/?k=abc123def456ghi789",
    "image_url": "https://qrshare.nsjia.cn/uploads/2026/08/xxx.jpg",
    "qrcode_url": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789&s=300",
    "link_key": "abc123def456ghi789",
    "project_id": 1,
    "project_name": "示例项目",
    "upload_time": "2026-08-12 18:00:00"
  }
}
字段类型说明
data.view_urlstring🔑 图片查看页网址,第三方用它生成二维码供用户扫码
data.image_urlstring原图文件直链URL(可直链访问/嵌入)
data.qrcode_urlstring系统已生成的二维码图片URL(可直接作为img的src)
data.link_keystring链接密钥(用于查询/重置接口)
data.image_idint图片记录ID
💡 核心用法: 上传成功后,把 data.view_url 用第三方工具生成二维码,或直接把 data.qrcode_url 作为二维码图片展示给用户扫码。用户扫码后自动打开图片预览/下载页。

4链接预占接口(上传前生成二维码) POST

适用场景:需要在图片上传之前就知道该图片未来的查看链接与二维码——先拿到二维码,把它合成/打印到图片上,再上传合成后的图片。上传成功后,预先生成的二维码扫码即可打开该图片。

三步流程:
  1. 调用本接口(reserve_link.php),拿到 link_key / view_url / qrcode_url;
  2. 下载 qrcode_url 的二维码PNG,合成到目标图片中;
  3. 调用 upload.php 上传图片时携带 link_key,完成绑定(扫码即可查看)。
预占后、上传前,扫码会看到"图片上传处理中"的等待页;预占链接超过 24 小时未上传会被系统自动清理。

接口地址

URLhttps://qrshare.nsjia.cn/api/reserve_link.php

支持 application/json 与 application/x-www-form-urlencoded / multipart/form-data。

参数类型必填说明
access_keystring是项目访问密钥
img_typestring否photo(默认) 或 signature

请求示例

JSONPOST https://qrshare.nsjia.cn/api/reserve_link.php HTTP/1.1
Content-Type: application/json

{
  "access_key": "1a2b3c4d5e6f7890",
  "img_type": "photo"
}
cURLcurl -X POST https://qrshare.nsjia.cn/api/reserve_link.php \
  -d "access_key=1a2b3c4d5e6f7890" \
  -d "img_type=photo"

成功响应

JSON · 200{
  "success": true,
  "code": 0,
  "msg": "链接预占成功",
  "data": {
    "link_key": "abc123def456ghi789abc123def456ghi7",
    "view_url": "https://qrshare.nsjia.cn/view/?k=abc123def456ghi789abc123def456ghi7",
    "qrcode_url": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789abc123def456ghi7&s=300",
    "qrcode_big": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789abc123def456ghi7&s=500",
    "img_type": "photo",
    "project_id": 1,
    "project_name": "示例项目",
    "status": "pending"
  }
}
字段说明
data.link_key预占的链接密钥,第3步上传时原样回传
data.view_url图片查看页网址(二维码编码内容)
data.qrcode_url300px 二维码PNG直链,可直接下载或作为 img src
data.qrcode_big500px 高清二维码PNG直链,适合印刷/合成
data.status固定为 pending;上传完成后通过 image_info.php 查询变为 ready
注意:
  • 每个预占 link_key 只能被上传一次(重复上传返回 1016);
  • link_key 必须与 access_key 属于同一项目,否则返回 1015;
  • 预占时要求项目处于可上传状态(启用且在有效期内)。

5图片查询接口 GET

根据 link_key 或 image_id 查询图片详情,包含查看页配置(可用于第三方自定义展示)。

接口地址

URLhttps://qrshare.nsjia.cn/api/image_info.php

参数(二选一)

方式参数说明
方式1?link_key=xxx通过上传返回的 link_key 查询(公开)
方式2?image_id=123&access_key=xxx通过图片ID + 项目密钥查询

请求示例

HTTPGET https://qrshare.nsjia.cn/api/image_info.php?link_key=abc123def456ghi789

成功响应

JSON · 200{
  "success": true,
  "code": 0,
  "msg": "ok",
  "data": {
    "image": {
      "id": 123,
      "project_id": 1,
      "img_type": "photo",
      "img_type_cn": "照片",
      "create_time": "2026-08-12 18:00:00",
      "link_key": "abc123def456ghi789",
      "status": "ready"
    },
    "project": {
      "id": 1,
      "name": "示例项目",
      "access_key": "1a2b3c4d5e6f7890",
      "status_text": "运行中",
      "end_time": null,
      "is_expired": false,
      "can_view": true
    },
    "urls": {
      "view_url": "https://qrshare.nsjia.cn/view/?k=abc123def456ghi789",
      "image_url": "https://qrshare.nsjia.cn/uploads/2026/08/xxx.jpg",
      "qrcode_url": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789&s=300",
      "qrcode_big": "https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789&s=500"
    },
    "view_config": {
      "title": "图片预览",
      "logo": "",
      "subtitle": "长按图片或点击下方按钮可下载",
      "footer": "© QR Share System",
      "theme_color": "#4A90D9",
      "bg_image": "",
      "header_text": "",
      "show_info": true,
      "show_download": true
    }
  }
}
字段 image.status: ready=图片已上传可查看;pending=链接已由 reserve_link.php 预占但图片尚未上传,此时 urls.image_url 为空字符串,而 view_url / qrcode_url 已可用,第三方可轮询本接口等待状态变为 ready。

6二维码生成接口 GET

直接返回二维码 PNG 图片,可作为 <img> 的 src 使用。

接口地址

URLhttps://qrshare.nsjia.cn/api/qrcode.php

参数

参数类型必填说明
textstring三选一任意文本,直接生成该文本的二维码(优先级最高)
kstring三选一图片 link_key,生成图片预览页URL的二维码(图片上传后使用)
akstring三选一项目 access_key,生成项目上传页URL的二维码(图片上传前即可生成,可提前打印张贴)
sint否尺寸(像素),默认300,范围50-1000

使用示例

HTML
<img src="https://qrshare.nsjia.cn/api/qrcode.php?ak=a1b2c3d4e5f6g7h8&s=300"
     width="300" height="300" alt="扫码上传图片">


<img src="https://qrshare.nsjia.cn/api/qrcode.php?k=abc123def456ghi789&s=300"
     width="300" height="300" alt="扫码查看图片">


<img src="https://qrshare.nsjia.cn/api/qrcode.php?text=https%3A%2F%2Fexample.com" alt="二维码">
响应 Content-Type 为 image/png,可直接用于网页、小程序 image 标签等。已开启浏览器缓存(1小时)。
参数优先级: text > k > ak(同时传入多个时只取最高优先级);key 无效时二维码内容为 invalid link / invalid access key 提示文本。ak 模式不校验项目启停状态,方便提前打印张贴二维码——项目关闭/过期时扫码打开的上传页会自行提示"通道已关闭"。

7链接重置接口 POST 需管理员登录

重置图片的访问链接,旧链接立即失效,返回新链接。适合图片泄露后重新加密。

接口地址

URLhttps://qrshare.nsjia.cn/api/reset_link.php
⚠️ 此接口需要管理员登录会话(Cookie),不能直接通过 access_key 调用。如需第三方调用,请先实现管理员登录获取会话Cookie。

参数

参数类型必填说明
image_idint是要重置链接的图片ID

成功响应

JSON{
  "success": true,
  "new_link": "https://qrshare.nsjia.cn/view/?k=newkey1234567890abcdef"
}

8代码示例

PHP - cURL 文件上传

PHP<?php
$ch = curl_init('https://qrshare.nsjia.cn/api/upload.php');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => [
        'access_key' => '1a2b3c4d5e6f7890',
        'img_type'   => 'photo',
        'file'       => new CURLFile('/path/to/photo.jpg', 'image/jpeg'),
    ],
]);
$response = curl_exec($ch);
curl_close($ch);

$result = json_decode($response, true);
if ($result['success']) {
    echo "查看网址: " . $result['data']['view_url'] . "\n";
    echo "二维码URL: " . $result['data']['qrcode_url'] . "\n";
    echo "原图URL: " . $result['data']['image_url'] . "\n";
} else {
    echo "上传失败: " . $result['msg'] . "\n";
}

PHP - Base64 上传

PHP<?php
$imagePath = '/path/to/photo.jpg';
$base64 = 'data:image/jpeg;base64,' . base64_encode(file_get_contents($imagePath));

$payload = [
    'access_key'  => '1a2b3c4d5e6f7890',
    'img_type'    => 'signature',
    'filename'    => 'sign.png',
    'file_base64' => $base64,
];

$ch = curl_init('https://qrshare.nsjia.cn/api/upload.php');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = curl_exec($ch);
curl_close($ch);

$result = json_decode($response, true);
print_r($result['data']);

JavaScript - fetch 文件上传

JavaScriptconst formData = new FormData();
formData.append('access_key', '1a2b3c4d5e6f7890');
formData.append('img_type', 'photo');
formData.append('file', fileInput.files[0]);

const res = await fetch('https://qrshare.nsjia.cn/api/upload.php', {
    method: 'POST',
    body: formData
});
const result = await res.json();

if (result.success) {
    console.log('查看网址:', result.data.view_url);
    console.log('二维码URL:', result.data.qrcode_url);
    // 显示二维码
    qrImg.src = result.data.qrcode_url;
} else {
    alert('上传失败: ' + result.msg);
}

Python - requests 上传

Pythonimport requests

url = 'https://qrshare.nsjia.cn/api/upload.php'
files = {'file': ('photo.jpg', open('/path/to/photo.jpg', 'rb'), 'image/jpeg')}
data = {
    'access_key': '1a2b3c4d5e6f7890',
    'img_type': 'photo',
}
response = requests.post(url, files=files, data=data)
result = response.json()

if result['success']:
    print(f"查看网址: {result['data']['view_url']}")
    print(f"二维码URL: {result['data']['qrcode_url']}")
else:
    print(f"上传失败: {result['msg']}")

Java - OkHttp 上传

JavaOkHttpClient client = new OkHttpClient();

RequestBody formBody = new MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("access_key", "1a2b3c4d5e6f7890")
    .addFormDataPart("img_type", "photo")
    .addFormDataPart("file", "photo.jpg",
        RequestBody.create(new File("/path/to/photo.jpg"),
            MediaType.parse("image/jpeg")))
    .build();

Request request = new Request.Builder()
    .url("https://qrshare.nsjia.cn/api/upload.php")
    .post(formBody)
    .build();

try (Response response = client.newCall(request).execute()) {
    String body = response.body().string();
    System.out.println(body);
}

C# - HttpClient 上传

C#using var client = new HttpClient();
using var content = new MultipartFormDataContent();
content.Add(new StringContent("1a2b3c4d5e6f7890"), "access_key");
content.Add(new StringContent("photo"), "img_type");

using var fs = File.OpenRead("/path/to/photo.jpg");
content.Add(new StreamContent(fs), "file", "photo.jpg");

var response = await client.PostAsync("https://qrshare.nsjia.cn/api/upload.php", content);
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

微信小程序 - wx.uploadFile

JavaScriptwx.uploadFile({
  url: 'https://qrshare.nsjia.cn/api/upload.php',
  filePath: tempImagePath,  // wx.chooseImage 拿到的临时路径
  name: 'file',
  formData: {
    access_key: '1a2b3c4d5e6f7890',
    img_type: 'photo'
  },
  success: function(res) {
    var result = JSON.parse(res.data);
    if (result.success) {
      console.log('查看网址:', result.data.view_url);
      console.log('二维码URL:', result.data.qrcode_url);
    } else {
      wx.showToast({ title: result.msg, icon: 'none' });
    }
  }
});

9错误码

codeHTTP状态说明处理建议
0200成功-
400400JSON格式错误检查请求体是否为合法JSON
405405请求方法错误使用 POST 请求
1000200缺少必要参数检查 link_key 或 access_key+image_id
1001200缺少 access_key添加 access_key 字段
1002200access_key 无效核对 access_key 是否正确
1003200project_id 与 access_key 不匹配使用 access_key 自动识别项目,无需 project_id
1004200上传通道已关闭或项目已过期联系管理员开启上传或延期项目
1005200未选择文件检查 file 字段
1006200文件格式/大小不合法使用 jpg/png/gif/webp,小于10MB
1007200文件保存失败检查服务器 uploads 目录权限
1008200缺少 file_base64JSON方式必须传 file_base64
1009200Base64 解码失败检查 Base64 字符串是否完整
1010200不支持的图片格式从 MIME/filename 推断的扩展名不在白名单
1011200图片大小超限压缩后上传,建议 < 8MB
1012200无效的图片数据Base64 内容不是真实图片
1013200图片处理失败GD库异常,检查图片完整性
1014200记录保存失败数据库异常,联系管理员
1015200link_key 无效或不属于该项目先用 reserve_link.php 预占链接,并确保 access_key 为同一项目
1016200link_key 已被使用每个预占链接只能上传一次,请重新预占

10常见问题

Q1: 上传后如何生成二维码?

两种方式:

Q2: 用户扫码后看到什么?

扫码后会打开图片预览页(view_url),页面应用项目配置的查看页样式(标题/LOGO/背景/主题色),支持:

Q3: 图片会过期吗?

取决于项目配置:

Q4: 图片大小限制?

Q5: 跨域(CORS)支持?

已开启 Access-Control-Allow-Origin: *,支持浏览器、小程序、App WebView 直接调用。

Q6: 如何批量上传?

当前接口为单张上传,批量场景请循环调用。建议并发不超过 3 个,避免服务器压力。

Q7: 如何删除图片?

删除图片需登录后台管理 → 图片管理 → 选择图片删除。暂未提供删除API。

Q8: access_key 泄露了怎么办?

联系管理员在后台停用项目或重建项目,旧 access_key 立即失效。

© 2026 QR Share System · 文档生成时间 2026-10-22 06:00