# 卡密购买与支付宝配置(2.5.3) 登录页下方显示一年卡 ¥88(原价 ¥168)、永久卡 ¥198(原价 ¥328),原价划线并标注「首批体验价」。一年卡兑换后授权 365 天,永久卡兑换后永久授权,沿用现有的账户与设备绑定规则。账户与授权页也可以购买、续费和申请发票。 2.5.4 起,这些金额仅为首次初始化的默认值;管理员可修改两种卡的原价和实际售价。升级时客户端与服务器一起更新,服务器保留原数据目录。管理方式见 [卡密价格管理](卡密价格管理-2.5.4.md)(服务器交付包中为「卡密价格管理.md」)。 客服购买与发票申请共用用户提供的原始抖音二维码,账户为「辽宁金禧实业」,抖音号 `28173761260`。二维码随 APK 打包,离线也可查看、分享和复制抖音号。申请发票由客服处理,用户提供订单及开票信息;APP 不自动开票。 ## 当前状态 支付宝商户配置尚未提供,服务端默认关闭自动支付。点击「支付宝支付」会进入客服购买页;未配置时不创建付款订单、不显示虚假付款成功、不自动发卡。客户端及服务器应一起升级至 2.5.3,服务器保留原数据目录。此版本没有向公网服务器部署,没有使用真实商户或进行真实付款。 ## 开通支付宝 接口采用手机网站支付 `alipay.trade.wap.pay`(H5),RSA2 公钥模式。需要商户应用已开通相应支付产品,并取得应用 ID、商户 PID、应用私钥和支付宝公钥。客户端通过系统浏览器打开官方付款页,付款完成后返回 APP 查询。 密钥放在服务器专用目录,以 PEM 格式保存,运行服务器的账户需要读取权限。应用私钥须包含 RSA 私钥且不少于 2048 位,支付宝公钥须为该应用对应的支付宝 RSA 公钥。PowerShell 配置示例(用实际值替换占位符): ```powershell $env:JDJ_ALIPAY_ENABLED = 'true' $env:JDJ_ALIPAY_APP_ID = '<支付宝应用 ID>' $env:JDJ_ALIPAY_SELLER_ID = '<商户 PID>' $env:JDJ_ALIPAY_PUBLIC_BASE_URL = 'http://<服务器公网主机>:5188/' $env:JDJ_ALIPAY_PRIVATE_KEY_FILE = 'C:\JiDangJiaSecrets\app-private.pem' $env:JDJ_ALIPAY_PUBLIC_KEY_FILE = 'C:\JiDangJiaSecrets\alipay-public.pem' .\启动服务器.ps1 -Url 'http://0.0.0.0:5188' ``` 公网地址必须是支付宝能访问的服务器根地址,可使用当前确认的 HTTP 试用地址或 HTTPS 域名,不得包含查询参数、用户名或子路径。自动通知地址为 `/api/purchase/alipay/notify`,浏览器返回地址为 `/purchase/return`。配置缺失、密钥无法读取或配置无效时,保持客服购买模式。真实密钥仅用于服务器,不进入 APK、源码 ZIP、服务器 ZIP 或日志。 ## 付款与领取 用户可在登录前购买。APP 生成随机查询凭证,保存在设备安全存储,服务器只保存哈希;查询和支付链接接口要求通过 `X-Purchase-Key` 请求头提交对应凭证。服务器决定套餐金额与授权,不接受客户端修改金额、天数或永久标记。 订单有效 30 分钟,创建请求重试返回原订单。只由通过 RSA2 验签并核对金额、应用 ID、商户 PID 的支付宝通知确认付款,浏览器跳转不能发卡。重复和并发通知只生成一张卡密,发卡与订单更新在同一个数据库事务中完成。有效的延迟到账通知仍会处理。 付款成功后复制卡密,或填入登录/授权页再激活。「我的购买订单」保留此设备之前订单的查询凭证,再次购买后仍可领取之前的卡密。清除 APP 数据或更换设备后,请凭支付宝交易记录联系客服核对。 订单与加密卡密保存在 `accounts.db` 的 `PurchaseOrders` 表,解密密钥为数据目录的 `purchase-vault.key`。备份和恢复必须同时保留数据库及该密钥;升级只替换程序。交付打包及旧版本清理保护该密钥文件。 ## 后台与退款 管理员进入「管理员后台 → 卡密购买订单」,按订单号或支付宝交易号查询最近 100 条订单,仅显示掩码卡密。完整卡密和查询凭证不在管理列表或操作日志中显示。 此版本不主动调用支付宝退款接口。管理员在支付宝商户侧处理退款;已付款订单收到有效 `TRADE_CLOSED` 通知后,标记「退款核对中」并停用卡密。卡密已经兑换时,须在现有授权列表核对、停用对应授权,避免误撤销其他续费产生的授权。退款核对中的订单停止向买方返回完整卡密。 ## 验证 `node tools/check-purchase.cjs` 使用本机临时数据库、随机测试 RSA 密钥和合成通知,验证价格保护、验签、金额与商户核对、凭证隔离、幂等发卡、两种授权、退款核对、到期、事务回滚、重启恢复和限流。不会连接支付宝或转账。 `dotnet run --project tests/JiDangJia.PurchaseChecks -c Release` 调用实际客户端与本机服务器,仅替换平台存储,验证登录前购买、设备凭证恢复、历史订单领取、并发重试及两种套餐凭证同时保存。 `tools/build-community-test.ps1` 构建独立测试包,`node tools/check-purchase-ui.cjs` 仅操作 `com.xfestudio.jidangjia.authtest` 及本机临时服务器。脚本会清除该测试包的数据,不操作正式包;验证价格、未配置提示、二维码显示与分享、复制抖音号和发票入口。运行前保持本机 5188 端口空闲并启动 Pixel 7 / API 36。 真实收款仍需商户配置完成后,在实际公网通知地址验证付款与到账。合成通知检查不代表真实收款已开通。 支付宝参考:[手机网站支付 API](https://developer.alibaba.com/docs/api.htm?apiId=1056&docType=4)、[异步通知与验签](https://developer.alibaba.com/docs/doc.htm?articleId=105902&docType=1&treeId=193)。