XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

STHApplication

【MAUI】寄当家——安卓端交易管理系统

公开
关注 0 Fork 0 Star 0
UTF-8

卡密购买与支付宝配置(2.5.3)

登录页下方显示一年卡 ¥88(原价 ¥168)、永久卡 ¥198(原价 ¥328),原价划线并标注「首批体验价」。一年卡兑换后授权 365 天,永久卡兑换后永久授权,沿用现有的账户与设备绑定规则。账户与授权页也可以购买、续费和申请发票。

2.5.4 起,这些金额仅为首次初始化的默认值;管理员可修改两种卡的原价和实际售价。升级时客户端与服务器一起更新,服务器保留原数据目录。管理方式见 卡密价格管理(服务器交付包中为「卡密价格管理.md」)。

客服购买与发票申请共用用户提供的原始抖音二维码,账户为「辽宁金禧实业」,抖音号 28173761260。二维码随 APK 打包,离线也可查看、分享和复制抖音号。申请发票由客服处理,用户提供订单及开票信息;APP 不自动开票。

当前状态

支付宝商户配置尚未提供,服务端默认关闭自动支付。点击「支付宝支付」会进入客服购买页;未配置时不创建付款订单、不显示虚假付款成功、不自动发卡。客户端及服务器应一起升级至 2.5.3,服务器保留原数据目录。此版本没有向公网服务器部署,没有使用真实商户或进行真实付款。

开通支付宝

接口采用手机网站支付 alipay.trade.wap.pay(H5),RSA2 公钥模式。需要商户应用已开通相应支付产品,并取得应用 ID、商户 PID、应用私钥和支付宝公钥。客户端通过系统浏览器打开官方付款页,付款完成后返回 APP 查询。

密钥放在服务器专用目录,以 PEM 格式保存,运行服务器的账户需要读取权限。应用私钥须包含 RSA 私钥且不少于 2048 位,支付宝公钥须为该应用对应的支付宝 RSA 公钥。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、异步通知与验签。