客户在证书站下单后,填购买时提交的 UDID,即可把签名证书导入闪签 App。
或者用本地订单的领取码:
必须在 iPhone 的 Safari 里打开本页,微信内置浏览器和电脑浏览器会拦截 fsign:// 自定义协议。两个按钮都要点一次:先导入 P12,再导入描述文件。
前提:这套文件必须放在 https://rjy.ipaioscc.cn 的网站根目录——服务器版 IPA 把服务基址写死成了这个域名,App 只会请求它下面的 /api/...。放到 xs.xskja.com 或别的域名/子目录都不会生效。域名不对就说一声,我重打一份 IPA。
| 选项 | 选什么 |
|---|---|
| 域名 | rjy.ipaioscc.cn,A 记录指向服务器,不加 www、不带端口 |
| 数据库 | 不创建。MySQL / Redis / SQLite 全不需要,也不用导 SQL |
| PHP 版本 | PHP 7.1 以上,推荐 7.4 / 8.0 / 8.1,需带 cURL。千万别选「纯静态」,否则 .php 会被当文件下载 |
| FTP | 不创建,用文件管理器上传即可 |
| SSL | 必须开有效证书并开启强制 HTTPS。iOS 拒绝 http 和自签证书 |
| 伪静态 | 先留默认,第 ④ 步再填 |
| 防跨站 / 防盗链 / CC 防护 | 关掉或加白名单,别把 /api/* 拦成 HTML 页 |
最省事:把桌面上的 闪签_证书站_上传包.zip 传上去,用面板「解压」到网站根目录(zip 内已是根目录层级,别再多套一层文件夹)。也可以手动把 闪签_证书站/ 里的全部内容(含隐藏的 .htaccess)传上去,保持层级:
网站根目录/ ├── index.html ├── .htaccess ← 隐藏文件,别漏传 ├── api/ │ ├── _lib.php config.php config.json │ ├── upstream.php import.php admin.php │ ├── selftest.php ← 部署自检,验证完删掉 │ └── certificates/router.php ├── data/ ← upstream.json / orders.json / .htaccess └── certs/ ← 可选,本地订单模式才用
目录 755、文件 644。data/ 和 certs/ 需要禁止 Web 访问(见第 ④ 步),里面存着 Token。
api/_lib.php:把 FLASH_SECRET 换成 32 位以上随机串、FLASH_ADMIN_PW 换成后台密码。若站点在 CDN/反代后面导致生成的导入链接是 http://,把 FLASH_PUBLIC_BASE 填成 'https://rjy.ipaioscc.cn'。data/upstream.json:证书站地址和 Token 已填好。若证书站签出的 P12 有固定密码,填进 p12Password;无密码留空。api/config.json 里的 officialSourceURL 已经是你的软件源,不用改。
Apache:随包的 .htaccess 自动生效,但需要站点允许 AllowOverride All。若报 500,删掉第一行的 -MultiViews。
Nginx / 宝塔:在「网站 → 设置 → 伪静态」粘贴下面这段(完整说明见 nginx.conf.example):
location ~ ^/(data|certs)/ { deny all; return 404; }
location ~ ^/api/certificates/(redeem|session-restore)$ {
rewrite ^/api/certificates/(.*)$ /api/certificates/router.php?action=$1 last;
}
这一段做两件事:把 App 请求的两个无扩展名路径转到 router.php,并封住敏感目录。宝塔默认模板已带 pathinfo.conf,不需要额外改 PHP 配置;万一 /api/import.php/cert.p12 返回 404,页面会自动给备用链接。
→ 打开 /api/selftest.php。它会逐项检查 PHP、HTTPS、密钥是否改过、敏感目录有没有封住、rewrite 是否生效、以及 Token 能不能连通证书站。全部通过后删除 api/selftest.php。
DOMAIN=https://rjy.ipaioscc.cn
curl -i $DOMAIN/api/config.php
curl -i -X POST -H 'Content-Type: application/json' \
-d '{"udid":"40位UDID","code":"fsr_..."}' \
$DOMAIN/api/certificates/redeem
curl -i $DOMAIN/data/upstream.json
第一条要返回含 officialSourceURL 的 JSON;第二条要返回 JSON(certificate_not_found 属正常),返回 404 HTML 就是 rewrite 没生效;第三条必须 403/404,绝不能 200。
上游模式不需要录入订单:客户在证书站买完证书,只要 UDID 对得上,打开本页填 UDID 就能拿到导入链接。api/admin.php 后台只用于可选的「本地订单」模式。软件源自动导入和证书领取是同一个站点、同一套文件,不冲突。
| 路径 | 请求体 | 用途 |
|---|---|---|
POST api/certificates/redeem | udid, code | 恢复码兑换证书 |
POST api/certificates/session-restore | udid, enrollmentToken, bundleID | 启动自动查询 |
POST api/config.php | — | 远程配置(上次已给) |
GET api/import.php/cert.p12 | o,e,t | 一键导入证书文件 |
错误码:invalid_request / certificate_not_found / certificate_missing / certificate_pending / certificate_revoked / recovery_disabled / automatic_disabled / enrollment_required / method_not_allowed
基础地址 https://xs.xskja.com。所有接口必须用 POST,且 token 必须放在请求体里;放 URL 上会返回 {"code":1001,"msg":"请使用 POST 提交 token(禁止 URL 传参)"}。你的 Token 已写入 data/upstream.json。
| 路径 | 参数 | 说明 |
|---|---|---|
/api/getcertificate | id 或 udid | 查询证书,返回 p12 / mobileprovision 的 base64 —— 中转层只用这个 |
/api/adddevice | udid, warranty, type, beizhu, deviceType | 添加设备(秒出),会扣费 |
/api/addyydevice | 同上 + iswsh | 添加设备(预约) |
/api/checkstatus | kid | 检查设备状态 |
/api/getbalance | — | 实测 {"code":1,"data":{"balance":2.6,"score":0}} |
/api/getalldevice | — | 实测 30 秒无响应,疑似未开放 |
错误码:1 成功 / 0 失败 / 1001 参数错误或 Token 无效 / 1002 余额不足 / 1003 设备数不足 / 1004 无可用开发者账号。warranty:0 躺平 1 普通 2 加强 3 稳定 4 摆烂;type:0 公共池 1 独立池 2 自动选择。
getcertificate / getbalance),不会调用 adddevice,不会产生任何扣费。证书售卖、UDID 绑定、扣费仍全部由你原来的证书站负责。router.php 里成功响应的 profile 结构(分字段 base64 / 整体 zip / 下载链接)静态分析定不死,需真机 + 真实订单抓一次成功报文,抓到后只改 profile_response() 一个函数。「UDID → 一键导入」这条不依赖它,现在就能用。getcertificate 的文档示例里没有 P12 密码字段。代码会自动尝试 password/p12pwd/pwd 等常见字段,取不到就回落到 data/upstream.json 的 p12Password。请确认该站签出的 P12 是否无密码,若有固定密码,把它填进 p12Password。订单:data/orders.json 证书:certs/<订单号>.p12 与 .mobileprovision。换成数据库只是把 read_orders() / save_orders() 两个函数改成 SQL,其余不用动。