Monoize
仪表盘

商店

充值余额、购买套餐、处理订单并管理兑换码。

打开商店

在 /dashboard/store 打开商店。选择余额、套餐或兑换码。

商店

使用货币控件显示人民币或美元。此控件会同时更新余额、本月用量、价格、赠送、实得金额和套餐额度。

Monoize 所有美元与人民币的换算都使用固定汇率 1 美元 = 6.72 元。市场汇率变化不会改变余额。

充值余额

  1. 选择充值商品,或输入自定义金额。
  2. 检查充值金额、赠送金额和实得金额。
  3. 选择一个已启用的支付 Channel。
  4. 创建订单。

Monoize 在联系 Provider 前保存支付尝试。Stripe 随后打开其托管的 Checkout 页面。

易支付按所选方式返回一个动作。二维码内容在支付对话框中显示为可扫描的二维码。支付链接显示一个动作,选择后跳转。易支付只接受人民币订单。美元订单使用 Stripe。

Provider 结果未知时,不要创建另一个支付尝试。等待 Monoize 对账现有支付尝试。

Checkout 结束后,商店每两秒检查一次订单。支付和履约完成、订单关闭或订单过期后,检查停止。

在 /dashboard/orders 查看订单。分别检查支付状态和履约状态。

Monoize 仅在验证渠道支付后发放余额。管理员不能把未支付订单标记为已支付或已履约。

配置 Stripe 回调

把 Stripe Webhook 端点设为 https://lynshen.org/api/store/callbacks/{channel_id}。用 Stripe Channel ID 替换 {channel_id}。

订阅 checkout.session.completed 和 checkout.session.async_payment_succeeded。把端点签名密钥保存到加密的 Stripe 凭据中。

配置易支付

一个易支付 Channel 同时提供支付宝方式和微信支付方式。

把易支付异步通知地址设为 https://lynshen.org/api/store/callbacks/{channel_id}。使用易支付 Channel ID 替换 {channel_id}。该端点接受文档规定的 GET 通知。

在商店管理中保存网关根地址、商户 ID 和商户密钥。启用支付宝方式、微信支付方式或两者。网关根地址必须以 / 结尾,且不能指向回环地址、链路本地地址或私有地址。

Monoize 对每个请求签名:排除 sign、sign_type 和空值,按 ASCII 排序字段,计算小写 MD5。只有在验证签名、商户 ID、订单号、以分为单位的人民币金额和预期方式,并且支付状态转换提交之后,才返回 success。

在 Channel 行上打开易支付方式,设置每种方式的对外名称、排序和启用状态。在此处停用的方式不会出现在商店中。

购买套餐

选择套餐和支付 Channel。一个套餐可以同时应用多个额度周期。周期可以是 5 小时、12 小时、每日、每周、每月或自定义整数小时。

Monoize 以人民币存储套餐额度。商店会把额度显示为四舍五入后的整数人民币或美元金额。

为 SQLite 启用套餐

更改 SQLite 配额 Gate 前,停止 Monoize 应用。把 MONOIZE_DATABASE_DSN 设为目标 SQLite 数据库。

把已通过演练的 manifest 导入 next 槽位:

monoize-store-ops quota-gate import --slot next --manifest ./quota-manifest.json

从命令输出中读取兼容性 fingerprint。启动新应用版本前,推广已导入的 manifest:

monoize-store-ops quota-gate promote --expected-fingerprint <fingerprint>

此命令会拒绝 PostgreSQL、过大的 manifest、无效 JSON,以及与当前 SQLite 环境不匹配的 manifest。

使用兑换码

在兑换码中输入一个未使用的兑换码。兑换码可以增加余额或激活套餐。兑换过程不使用支付 Channel,也不创建订单。

管理商店

管理员打开 /dashboard/store-admin。使用四个标签管理商品、支付 Channel、订单和兑换码。

  • 分别设置人民币和美元的自定义充值范围。
  • 添加易支付、Stripe 或 HTTP 草稿 Channel。使用内置图标、HTTPS 图片链接或上传图片。
  • 打开一个现有的易支付或 Stripe Channel。填写全部凭据字段和当前管理员密码。选择替换凭据。Monoize 加密新版本、停用旧版本并禁用此 Channel。
  • 在易支付 Channel 行上打开 Governance 并选择易支付方式,配置支付宝方式和微信支付方式。
  • 在 Milestone 1 中保持 HTTP Channel 停用。
  • 分别查看支付状态和履约状态。不要使用人工完成操作。
  • 一次生成 1 至 20 个单次兑换码。Monoize 显示明文时立即保存。
  • 在支付渠道标签页顶部打开隐私记录和数据保留。
  • 在易支付或 Stripe 的 Channel 行上打开 Governance。选择支付合规、商户能力、渠道就绪状态或易支付方式。HTTP Channel 行不显示该控件。

查看隐私记录

生产环境的结账和回调需要一条当前已接受的商店隐私记录。复审间隔不得超过 365 天。

在 /dashboard/store-admin 打开商店管理。选择支付渠道标签页。选择隐私记录。

商店隐私记录

列表中的每条记录显示政策版本、司法辖区、允许区域、接受状态和下次复审日期。记录保存后不能编辑。

批准政策更新后追加一条记录。填写以下值,然后选择新增隐私记录:

字段取值范围
政策版本1 至 64 字节
司法辖区1 至 128 字节
允许区域(逗号分隔)1 至 32 个互不相同的值
法律依据1 至 512 字节
证据 SHA-256 摘要恰好 64 个小写十六进制字符
财务记录保留天数1 至 36500
过期授权保留小时数1 至 24
复审间隔(天)1 至 365

表单打开时预填司法辖区和允许区域 CN、财务记录保留 2557 天(七年)、过期授权保留 24 小时、复审间隔 90 天。把每个值替换为政策批准的值。

Monoize 设置复审人、批准时间和下次复审日期。Monoize 还固定三个表单不提供的保留期:回调原文 30 天、网络元数据 90 天、兑换审计 730 天。

绑定渠道治理

在支付合规、商户能力和就绪配置完成之前,Channel 保持不可用。就绪配置必须引用一条当前已接受的隐私记录。

商店支付渠道

在易支付或 Stripe 的 Channel 行上打开 Governance。

  1. 选择支付合规。审阅当前商店支付条款。用管理员密码确认条款。Monoize 获取一个 scope 为 compliance_confirm 的五分钟重认证授权。
  2. 选择商户能力。为每项所需商户能力记录状态、环境、渠道商品、证据摘要和到期时间。
  3. 选择渠道就绪状态。选择一条隐私记录。仅在签名回调测试通过后打开回调验证已通过。设置支持的货币、结账动作、每种货币的金额范围,以及许可证、运行和可用性证据摘要,再设置 1 至 90 天的有效期。选择保存。

没有任何隐私记录时,就绪保存按钮保持禁用。先在隐私记录中新增一条记录。

每个 Channel 行显示配置状态和生效状态。不可用的 Channel 会列出可读原因标签和原始原因代码,例如隐私记录待补、就绪配置缺失或过期、回调验证待完成、支付条款未确认,以及能力验证缺口。

了解数据保留

Monoize 每天 03:00 UTC 在 Store Primary 上运行一次有界的保留任务。Replica 不运行该任务。每次运行使用启动时当前已接受的隐私记录。

以下保留期适用于全部记录:

  • 回调原文:30 天。
  • 网络元数据(源 IP 和 User-Agent):90 天。
  • 兑换码的查看、复制和导出审计:730 天。
  • 过期重认证授权哈希:过期后再经过过期授权保留小时数。
  • 财务记录:财务记录保留天数。

一次运行在五个数据类中各最多检查并修改 500 条未被保留的根记录:raw_callback_bodies、network_metadata、financial_records、redemption_audits 和 expired_reauth_grants。

前两个数据类清除字段,而不删除行。运行清除已过期渠道事件的加密原文,并清除超过 90 天的事件的源 IP 和 User-Agent。事件行、原文摘要、解析后的事件、验证结果和投影状态保持不变。

删除一条财务根记录时,同时删除其支付尝试、事件应用、退款、退款查询重试、奖励回收行和追偿声明行。运行保留活跃权益及其发放记录。

每次运行在一个事务中完成。失败时回滚该次运行的全部删除。对未变化的数据重复运行,不改变已清除的字段,也不会因上次运行已删除候选记录而失败。

支付数据、回调证据、备份、日志和加密密钥保留在隐私记录的允许区域内。每一次证据读取、导出、保留覆盖和法律保留操作都写入一条不可变访问审计,记录操作者、角色、范围、原因、时间和结果。

手动执行保留任务

打开商店管理。选择支付渠道标签页。选择数据保留。

商店保留

对话框显示连续失败次数、结账状态(正常接单或已暂停)、保留任务数和法律封存数。它还会说明:执行后将永久删除超出保留期限的记录。

填写当前密码和原因。任一字段为空时,执行按钮保持禁用。选择执行保留任务。Monoize 获取一个 scope 为 retention_operation 的五分钟重认证授权,并启动一次有界运行。

已有运行进行中时,请求返回 HTTP 409 和代码 retention_run_active。运行成功把连续失败次数重置为零。运行失败或被中断则递增该计数。

应用法律封存

法律封存在一个数据类中暂停删除指定的标识符。数据保留对话框显示法律封存数。它不创建法律封存。

使用 POST /api/dashboard/store/admin/retention/legal-holds 创建法律封存。该请求需要管理员会话、Store Primary,以及一个 scope 为 legal_hold 的五分钟重认证授权。JSON 请求体必须包含 data_class、identifiers、reason、requesting_authority、requester_id、approver_role、expires_at 和 extends_hold_id。

  • data_class 必须是五个保留数据类之一。
  • identifiers 必须包含 1 至 100 个互不相同的值。每个值最多 255 字节。
  • approver_role 必须是 privacy 或 legal。
  • requester_id 必须不同于已认证的管理员。该管理员是审批人。
  • expires_at 必须是未来的 RFC3339 时刻。
  • 初次审批时 extends_hold_id 必须为 null。延期必须引用数据类和标识符完全相同的法律封存,并使用更晚的到期时间。

法律封存在其开始时间不晚于评估时间、且评估时间早于其到期时间时生效。到期自动结束封存,无需任何操作。法律封存不恢复已删除的数据。任何操作都不更新、删除、重新激活或修改已存储的封存行。延期会插入一条新的法律封存和一条新的审批审计。

解除结账暂停

某次运行失败后连续失败次数达到三次,且结账尚未暂停时,Monoize 创建一条严重保留告警并暂停结账。

结账暂停期间,新订单和新支付尝试返回 HTTP 503 和代码 store_retention_paused。对已有订单或终态支付尝试的幂等重放仍可返回其原有结果。回调接收、对账、退款和保留操作保持可用。

应用重启保留该计数、告警和暂停状态。仅有一次成功运行不会解除暂停。

打开数据保留解除暂停。仅在结账暂停时,对话框才显示证据 SHA-256 摘要字段。它还会说明:提交后将清除当前告警并立即恢复结账。填写当前密码、原因和该摘要。密码与原因为空、或摘要不是恰好 64 个字符时,处理按钮保持禁用。选择处理告警。

Monoize 记录处理结果、把告警标记为已处理并恢复结账。处理告警不改变连续失败次数。后续再次运行失败可以再次暂停结账。没有活跃且未处理的告警时,处理请求返回 HTTP 409 和代码 retention_containment_unavailable。

本页目录