From 2579c04c4d8449f73b2e12180a44bda41a2051e8 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Fri, 2 Oct 2026 20:50:50 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Web=20=E9=A2=84?= =?UTF-8?q?=E6=A3=80=E6=B5=8F=E8=A7=88=E5=99=A8=E5=A4=B1=E8=B4=A5=E6=81=A2?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WS 握手与 CDP 连接瞬态失败在确认进程树清理后使用新 Profile 重试一次\n- 加强 Windows Edge 进程身份、命令行 Profile 与 Job 子树归属校验\n- 透传恢复阶段诊断并补充预检规范、里程碑计划和定向测试 --- .../src-tauri/src/browser/process.rs | 374 +++++++++++++++--- .../src-tauri/src/browser/sweep.rs | 143 ++++++- .../src/environment_check/web_creation.rs | 102 ++++- ...ž施计划】Web预检浏览器失败恢复-2026-10-02.md | 31 ++ ...里程碑】Web预检浏览器失败恢复-2026-10-02.md | 41 ++ ...¹案】AI游戏创作智能体App实施计划-2026-06-24.md | 4 +- 6 files changed, 599 insertions(+), 96 deletions(-) create mode 100644 docs/project-memory/plans/【实施计划】Web预检浏览器失败恢复-2026-10-02.md create mode 100644 docs/project-memory/plans/【里程碑】Web预检浏览器失败恢复-2026-10-02.md diff --git a/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs b/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs index 098f43841..5d84d2c21 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs @@ -1,4 +1,5 @@ use std::fs; +use std::future::Future; use std::path::PathBuf; use std::time::Duration; #[cfg(windows)] @@ -120,8 +121,19 @@ enum OwnedBrowserLaunchError { } impl OwnedBrowserLaunchError { - fn is_timeout(self) -> bool { - matches!(self, Self::WsTimeout | Self::ConnectTimeout) + fn stage(self) -> BrowserLaunchStage { + match self { + Self::SpawnFailed => BrowserLaunchStage::Spawn, + Self::WsTimeout | Self::WsFailed => BrowserLaunchStage::WsHandshake, + Self::ConnectTimeout | Self::ConnectFailed => BrowserLaunchStage::CdpConnect, + } + } + + fn is_recoverable(self) -> bool { + matches!( + self, + Self::WsTimeout | Self::WsFailed | Self::ConnectTimeout | Self::ConnectFailed + ) } fn code(self) -> &'static str { @@ -135,6 +147,118 @@ impl OwnedBrowserLaunchError { } } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum BrowserLaunchStage { + Setup, + Spawn, + WsHandshake, + CdpConnect, +} + +impl BrowserLaunchStage { + fn as_str(self) -> &'static str { + match self { + Self::Setup => "setup", + Self::Spawn => "spawn", + Self::WsHandshake => "ws-handshake", + Self::CdpConnect => "cdp-connect", + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct BrowserLaunchFailure { + code: &'static str, + stage: BrowserLaunchStage, + recoverable: bool, + subprocess_exited: bool, + cleanup_confirmed: bool, +} + +impl BrowserLaunchFailure { + fn setup(code: &'static str) -> Self { + Self { + code, + stage: BrowserLaunchStage::Setup, + recoverable: false, + subprocess_exited: true, + cleanup_confirmed: true, + } + } + + fn from_launch_error( + error: OwnedBrowserLaunchError, + subprocess_exited: bool, + cleanup_confirmed: bool, + ) -> Self { + Self { + code: error.code(), + stage: error.stage(), + recoverable: error.is_recoverable(), + subprocess_exited, + cleanup_confirmed, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct BrowserRecoveryFailure { + first: BrowserLaunchFailure, + final_attempt: Option, +} + +impl BrowserRecoveryFailure { + fn diagnostic(self) -> String { + match self.final_attempt { + Some(final_attempt) => format!( + "browser-recovery-failed: initial-stage={} final-stage={} subprocess-exited={} cleanup-confirmed={} recovery-retried=true initial-cause={} final-cause={}", + self.first.stage.as_str(), + final_attempt.stage.as_str(), + final_attempt.subprocess_exited, + final_attempt.cleanup_confirmed, + self.first.code, + final_attempt.code, + ), + None => format!( + "{}: stage={} subprocess-exited={} cleanup-confirmed={} recovery-retried=false cause={}", + if self.first.recoverable { + "browser-recovery-blocked" + } else { + "browser-launch-failed" + }, + self.first.stage.as_str(), + self.first.subprocess_exited, + self.first.cleanup_confirmed, + self.first.code, + ), + } + } +} + +async fn launch_with_one_recovery(mut launch: F) -> Result +where + F: FnMut() -> Fut, + Fut: Future>, +{ + let first = match launch().await { + Ok(value) => return Ok(value), + Err(error) => error, + }; + if !first.recoverable || !first.subprocess_exited || !first.cleanup_confirmed { + return Err(BrowserRecoveryFailure { + first, + final_attempt: None, + }); + } + match launch().await { + Ok(value) => Ok(value), + Err(final_attempt) => Err(BrowserRecoveryFailure { + first, + final_attempt: Some(final_attempt), + }), + } +} + type BrowserStderrReader = futures::io::BufReader; /// 复刻 chromiumoxide 私有 ws_url_from_output 的语义(读 stderr 直到 @@ -224,22 +348,22 @@ impl BrowserProcessGuard { async fn confirm_reaped(&mut self) -> Result<(), String> { #[cfg(windows)] { - if let Some(job) = &self.job { - let deadline = Instant::now() + BROWSER_CLOSE_TIMEOUT; - loop { - if job - .is_empty() - .map_err(|_| "browser-tree-reap-unconfirmed".to_string())? - { - return Ok(()); - } - if Instant::now() >= deadline { - return Err("browser-tree-reap-unconfirmed".into()); - } - tokio::time::sleep(Duration::from_millis(20)).await; + let Some(job) = &self.job else { + return Err("browser-tree-reap-unconfirmed".into()); + }; + let deadline = Instant::now() + BROWSER_CLOSE_TIMEOUT; + loop { + if job + .is_empty() + .map_err(|_| "browser-tree-reap-unconfirmed".to_string())? + { + return Ok(()); } + if Instant::now() >= deadline { + return Err("browser-tree-reap-unconfirmed".into()); + } + tokio::time::sleep(Duration::from_millis(20)).await; } - Ok(()) } #[cfg(not(windows))] { @@ -281,7 +405,10 @@ impl OwnedBrowser { let waited = tokio::time::timeout(BROWSER_CLOSE_TIMEOUT, self.process.child.wait()).await; self.handler_task.abort(); self.drain_task.abort(); - if matches!(close, Ok(Ok(_))) && matches!(waited, Ok(Ok(_))) { + if matches!(close, Ok(Ok(_))) + && matches!(waited, Ok(Ok(_))) + && self.process.confirm_reaped().await.is_ok() + { return Ok(()); } if !self.process.reap().await { @@ -310,6 +437,24 @@ impl Drop for OwnedBrowser { } } +async fn cleanup_failed_launch( + mut process: BrowserProcessGuard, + temp: TempDir, + error: OwnedBrowserLaunchError, +) -> BrowserLaunchFailure { + let subprocess_exited = process.reap().await; + let tree_reaped = subprocess_exited && process.confirm_reaped().await.is_ok(); + drop(process); + let cleanup_confirmed = if tree_reaped { + temp.close().is_ok() + } else { + // 保留 Profile 和 owner.json;后续清扫不得因证据丢失猜测归属。 + let _ = temp.keep(); + false + }; + BrowserLaunchFailure::from_launch_error(error, subprocess_exited, cleanup_confirmed) +} + /// 自拉浏览器并完成 CDP 连接。spawn 与 Job 绑定之间存在极小的逸出 /// 窗口:绑定前产生的子进程未入 Job——Unix 上随 root 死亡级联退出; /// Windows 没有这种级联,但窗口只有毫秒级(Chrome 此时尚未拉起子 @@ -319,15 +464,27 @@ async fn launch_owned_browser( config: BrowserConfig, executable: &std::path::Path, temp: TempDir, -) -> Result { - let child = config - .launch() - .map_err(|_| OwnedBrowserLaunchError::SpawnFailed)?; - // 无法证明整树可收割时拒绝放行浏览器;child 随 drop 由 kill_on_drop 收尾。 +) -> Result { + let child = match config.launch() { + Ok(child) => child, + Err(_) => { + return Err(BrowserLaunchFailure::from_launch_error( + OwnedBrowserLaunchError::SpawnFailed, + true, + true, + )); + } + }; + // 无法证明整树可收割时拒绝放行浏览器;先收束 root,但不宣称 Job 子树已清空。 #[cfg(windows)] let job = match WindowsProcessJob::assign_tokio(&child.inner) { Ok(job) => Some(job), - Err(_) => return Err(OwnedBrowserLaunchError::SpawnFailed), + Err(_) => { + let process = BrowserProcessGuard { child, job: None }; + return Err( + cleanup_failed_launch(process, temp, OwnedBrowserLaunchError::SpawnFailed).await, + ); + } }; let mut process = BrowserProcessGuard { child, @@ -336,17 +493,13 @@ async fn launch_owned_browser( }; // 跨会话清扫的身份锚点:写入失败时该目录之后按旧残留只删不杀。 if let Some(pid) = process.child.inner.id() { - super::sweep::write_browser_process_owner(temp.path(), pid, executable); + let _ = super::sweep::write_browser_process_owner(temp.path(), pid, executable); } let (url, reader) = match devtools_ws_url_from_stderr(&mut process.child, BROWSER_TIMEOUT).await { Ok(pair) => pair, Err(error) => { - // 收割未确认时保留目录与 owner.json,交给跨会话清扫。 - if !process.reap().await { - std::mem::forget(temp); - } - return Err(error); + return Err(cleanup_failed_launch(process, temp, error).await); } }; let drain_task = spawn_stderr_drain(reader); @@ -359,17 +512,21 @@ async fn launch_owned_browser( Ok(Ok(pair)) => pair, Ok(Err(_)) => { drain_task.abort(); - if !process.reap().await { - std::mem::forget(temp); - } - return Err(OwnedBrowserLaunchError::ConnectFailed); + return Err(cleanup_failed_launch( + process, + temp, + OwnedBrowserLaunchError::ConnectFailed, + ) + .await); } Err(_) => { drain_task.abort(); - if !process.reap().await { - std::mem::forget(temp); - } - return Err(OwnedBrowserLaunchError::ConnectTimeout); + return Err(cleanup_failed_launch( + process, + temp, + OwnedBrowserLaunchError::ConnectTimeout, + ) + .await); } }; let handler_task = tokio::spawn(async move { @@ -388,22 +545,31 @@ async fn launch_owned_browser( }) } +async fn launch_browser_attempt( + executable: &std::path::Path, + proxy_bypass_list: &str, +) -> Result { + let temporary = create_browser_process_temp_dir() + .map_err(|_| BrowserLaunchFailure::setup("browser-temp-unavailable"))?; + let config = browser_config(executable, &temporary, proxy_bypass_list) + .map_err(|_| BrowserLaunchFailure::setup("browser-config-invalid"))?; + launch_owned_browser(config, executable, temporary).await +} + +async fn launch_browser_with_recovery( + executable: &std::path::Path, + proxy_bypass_list: &str, +) -> Result { + launch_with_one_recovery(|| launch_browser_attempt(executable, proxy_bypass_list)) + .await + .map_err(|failure| failure.diagnostic()) +} + /// 仅验证浏览器启动和真实 CDP,不加载项目、不生成试玩凭证。 /// 每次独立 profile;既不串行化其它工具,也不继承 Codex 的临时 HOME。 pub(crate) async fn check_browser_health() -> Result { let discovered = discover_chrome_or_edge().map_err(|_| "browser-not-found")?; - let temporary = create_browser_process_temp_dir().map_err(|_| "browser-temp-unavailable")?; - let config = browser_config(&discovered.executable_path, &temporary, "<-loopback>") - .map_err(|_| "browser-config-invalid")?; - let owned = launch_owned_browser(config, &discovered.executable_path, temporary) - .await - .map_err(|error| { - if error.is_timeout() { - "browser-start-timeout" - } else { - "browser-start-failed" - } - })?; + let owned = launch_browser_with_recovery(&discovered.executable_path, "<-loopback").await?; let version = tokio::time::timeout(Duration::from_secs(5), owned.browser().version()).await; if owned.shutdown().await.is_err() { return Err("browser-cleanup-failed".into()); @@ -460,23 +626,19 @@ pub(crate) async fn validate_local_preview_in_browser_with_cancellation( let preview_url = validate_input(&input)?; prepare_evidence_root(&input.evidence_root)?; let browser_executable = discover_chrome_or_edge()?; - let browser_temp = create_browser_process_temp_dir()?; let proxy_bypass_list = preview_proxy_bypass_list(&preview_url); - let config = browser_config( - &browser_executable.executable_path, - &browser_temp, - &proxy_bypass_list, - )?; - - let owned = launch_owned_browser(config, &browser_executable.executable_path, browser_temp) - .await - .map_err(|error| { - if error.is_timeout() { - "启动浏览器超时".to_string() - } else { - format!("启动浏览器失败:{}", error.code()) - } - })?; + let owned = + launch_browser_with_recovery(&browser_executable.executable_path, &proxy_bypass_list) + .await + .map_err(|error| { + if error.starts_with("browser-recovery-") + || error.starts_with("browser-launch-failed") + { + error + } else { + format!("启动浏览器失败:{error}") + } + })?; let work = run_browser_validation( owned.browser(), @@ -583,6 +745,88 @@ mod health_tests { assert_eq!(config.viewport, Some(Viewport::default())); } + #[tokio::test] + async fn browser_ws_failure_retries_after_confirmed_cleanup_with_new_profile() { + let attempts = std::sync::Arc::new(std::sync::atomic::AtomicUsize::new(0)); + let profiles = std::sync::Arc::new(std::sync::Mutex::new(Vec::new())); + let attempts_for_launch = std::sync::Arc::clone(&attempts); + let profiles_for_launch = std::sync::Arc::clone(&profiles); + let result = launch_with_one_recovery(move || { + let attempt = attempts_for_launch.fetch_add(1, std::sync::atomic::Ordering::AcqRel); + let profiles = std::sync::Arc::clone(&profiles_for_launch); + async move { + let temporary = tempfile::tempdir().unwrap(); + profiles + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()) + .push(temporary.path().to_path_buf()); + if attempt == 0 { + drop(temporary); + Err(BrowserLaunchFailure::from_launch_error( + OwnedBrowserLaunchError::WsFailed, + true, + true, + )) + } else { + drop(temporary); + Ok(()) + } + } + }) + .await; + assert!(result.is_ok()); + assert_eq!(attempts.load(std::sync::atomic::Ordering::Acquire), 2); + let profiles = profiles + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + assert_eq!(profiles.len(), 2); + assert_ne!(profiles[0], profiles[1]); + } + + #[tokio::test] + async fn browser_recovery_does_not_retry_when_cleanup_is_unconfirmed() { + let attempts = std::sync::Arc::new(std::sync::atomic::AtomicUsize::new(0)); + let attempts_for_launch = std::sync::Arc::clone(&attempts); + let failure = launch_with_one_recovery(move || { + attempts_for_launch.fetch_add(1, std::sync::atomic::Ordering::AcqRel); + async { + Err::<(), BrowserLaunchFailure>(BrowserLaunchFailure::from_launch_error( + OwnedBrowserLaunchError::ConnectTimeout, + false, + false, + )) + } + }) + .await + .unwrap_err(); + let diagnostic = failure.diagnostic(); + assert_eq!(attempts.load(std::sync::atomic::Ordering::Acquire), 1); + assert!(diagnostic.contains("stage=cdp-connect")); + assert!(diagnostic.contains("subprocess-exited=false")); + assert!(diagnostic.contains("cleanup-confirmed=false")); + assert!(diagnostic.contains("recovery-retried=false")); + } + + #[tokio::test] + async fn consecutive_browser_failures_keep_both_recovery_stages_and_safe_diagnostics() { + let failure = launch_with_one_recovery(|| async { + Err::<(), BrowserLaunchFailure>(BrowserLaunchFailure::from_launch_error( + OwnedBrowserLaunchError::WsFailed, + true, + true, + )) + }) + .await + .unwrap_err(); + let diagnostic = failure.diagnostic(); + assert!(diagnostic.contains("initial-stage=ws-handshake")); + assert!(diagnostic.contains("final-stage=ws-handshake")); + assert!(diagnostic.contains("subprocess-exited=true")); + assert!(diagnostic.contains("cleanup-confirmed=true")); + assert!(diagnostic.contains("recovery-retried=true")); + assert!(!diagnostic.contains("/tmp")); + } + #[tokio::test] #[ignore = "requires an installed Chrome/Chromium/Edge; local CDP only"] async fn real_browser_health_checks_can_run_concurrently() { diff --git a/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs b/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs index d33a4a2ef..f002db1b4 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs @@ -34,13 +34,17 @@ pub(super) struct BrowserProcessOwner { /// 运行期 launch 的身份锚点;任何一步拿不到身份证明都不写, /// 该目录之后按旧残留只删不杀。 -pub(super) fn write_browser_process_owner(temp_root: &Path, browser_pid: u32, executable: &Path) { +pub(super) fn write_browser_process_owner( + temp_root: &Path, + browser_pid: u32, + executable: &Path, +) -> bool { let identity = crate::process_identity::external_agent_runner_process_start_identity(browser_pid); let owner_identity = crate::process_identity::external_agent_runner_process_start_identity(std::process::id()); let (Ok(Some(identity)), Ok(Some(owner_identity))) = (identity, owner_identity) else { - return; + return false; }; let owner = BrowserProcessOwner { schema_version: OWNER_SCHEMA.into(), @@ -52,9 +56,9 @@ pub(super) fn write_browser_process_owner(temp_root: &Path, browser_pid: u32, ex created_unix_ms: super::evidence::unix_time_ms(), }; let Ok(bytes) = serde_json::to_vec_pretty(&owner) else { - return; + return false; }; - let _ = fs::write(temp_root.join(OWNER_FILE), bytes); + fs::write(temp_root.join(OWNER_FILE), bytes).is_ok() } fn read_browser_process_owner(dir: &Path) -> Option { @@ -115,34 +119,109 @@ fn trusted_browser_executable(path: &Path) -> bool { } /// 杀前复核:PID 对应的活进程镜像必须就是 owner.json 声明的那个可执行 -/// 文件。仅核对字符串不够——/tmp 全局可写时,同机其他用户可以伪造 -/// owner.json 把 browser_pid 指到本用户的任意进程借清扫杀之。 -/// Linux 进一步要求命令行声明本目录的 profile,把 PID 绑到这份配置 -/// 目录,挡住同用户伪造 owner.json 指向正在使用的浏览器。 +/// 文件,命令行还必须绑定同一份临时 Profile;只核对镜像会把其它 AGC +/// 实例或用户 Edge 误认成本轮浏览器。 #[cfg(windows)] -fn live_process_executable_matches(pid: u32, expected: &Path, _profile_dir: &Path) -> bool { - // 已知残余风险:Windows 读他进程命令行成本高(PEB/WMI),此处只核对 - // 镜像;同用户伪造 owner.json 指向正在使用的浏览器时可误杀它。 +fn windows_process_command_line(pid: u32) -> Option { + use std::ffi::c_void; + use windows_sys::Win32::Foundation::CloseHandle; + use windows_sys::Win32::System::Threading::{ + OpenProcess, PROCESS_QUERY_INFORMATION, PROCESS_VM_READ, + }; + + #[repr(C)] + struct UnicodeString { + length: u16, + maximum_length: u16, + buffer: *const u16, + } + + #[link(name = "ntdll")] + unsafe extern "system" { + fn NtQueryInformationProcess( + process: *mut c_void, + information_class: u32, + information: *mut c_void, + information_length: u32, + return_length: *mut u32, + ) -> i32; + } + + let process = unsafe { OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, pid) }; + if process.is_null() { + return None; + } + let mut required = 0; + let _ = + unsafe { NtQueryInformationProcess(process, 60, std::ptr::null_mut(), 0, &mut required) }; + if required == 0 || required > 64 * 1024 { + unsafe { CloseHandle(process) }; + return None; + } + let mut buffer = vec![0u8; required as usize]; + let status = unsafe { + NtQueryInformationProcess( + process, + 60, + buffer.as_mut_ptr().cast(), + required, + &mut required, + ) + }; + unsafe { CloseHandle(process) }; + if status != 0 { + return None; + } + let command_line = unsafe { &*(buffer.as_ptr().cast::()) }; + if command_line.buffer.is_null() || command_line.length == 0 || command_line.length % 2 != 0 { + return None; + } + let text = unsafe { + std::slice::from_raw_parts(command_line.buffer, command_line.length as usize / 2) + }; + String::from_utf16(text).ok() +} + +#[cfg(windows)] +fn command_line_contains_profile(command_line: &str, profile_dir: &Path) -> bool { + const MARKER: &str = "--user-data-dir="; + let mut remaining = command_line; + while let Some(index) = remaining.find(MARKER) { + let value = remaining[index + MARKER.len()..].trim_start(); + let value = if let Some(quoted) = value.strip_prefix('"') { + quoted.split('"').next().unwrap_or_default() + } else { + value.split_whitespace().next().unwrap_or_default() + }; + if same_executable_path(Path::new(value), profile_dir) { + return true; + } + remaining = &remaining[index + MARKER.len()..]; + } + false +} + +#[cfg(windows)] +fn live_process_executable_matches(pid: u32, expected: &Path, profile_dir: &Path) -> bool { use windows_sys::Win32::Foundation::CloseHandle; use windows_sys::Win32::System::Threading::{ OpenProcess, QueryFullProcessImageNameW, PROCESS_QUERY_LIMITED_INFORMATION, }; - // SAFETY: 句柄非空时由 CloseHandle 释放;打开失败按不匹配处理(fail-closed)。 let handle = unsafe { OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid) }; if handle.is_null() { return false; } let mut buffer = [0u16; 1024]; let mut length = buffer.len() as u32; - // SAFETY: buffer 可写,length 先传入容量、返回实际长度。 let okay = unsafe { QueryFullProcessImageNameW(handle, 0, buffer.as_mut_ptr(), &mut length) }; - // SAFETY: handle 是本函数持有的合法句柄。 unsafe { CloseHandle(handle) }; if okay == 0 || length == 0 { return false; } let actual = std::path::PathBuf::from(String::from_utf16_lossy(&buffer[..length as usize])); same_executable_path(&actual, expected) + && windows_process_command_line(pid) + .is_some_and(|command_line| command_line_contains_profile(&command_line, profile_dir)) } #[cfg(target_os = "linux")] @@ -468,6 +547,18 @@ mod tests { } } + #[test] + fn owner_write_failure_leaves_no_partial_ownership_record() { + let root = tempfile::tempdir().unwrap(); + let missing_root = root.path().join("missing"); + assert!(!write_browser_process_owner( + &missing_root, + std::process::id(), + &std::env::current_exe().unwrap(), + )); + assert!(!missing_root.join(OWNER_FILE).exists()); + } + #[test] fn legacy_directory_without_owner_file_is_removed_only_when_old_enough() { let root = tempfile::tempdir().unwrap(); @@ -548,6 +639,24 @@ mod tests { assert!(trusted_browser_executable(&installed)); } + #[cfg(windows)] + #[test] + fn windows_browser_cleanup_requires_the_exact_profile_argument() { + let profile = Path::new(r#"C:\Users\tester\App Data\ga-browser-1\profile"#); + assert!(command_line_contains_profile( + r#"msedge.exe --headless --user-data-dir="C:\Users\tester\App Data\ga-browser-1\profile""#, + profile + )); + assert!(!command_line_contains_profile( + r#"msedge.exe --headless --user-data-dir="C:\Users\tester\App Data\ga-browser-2\profile""#, + profile + )); + assert!(!command_line_contains_profile( + r#"msedge.exe --headless --user-data-dir="C:\Users\tester\App Data\ga-browser-1\profile-copy""#, + profile + )); + } + #[cfg(windows)] #[test] fn kill_browser_process_tree_reaps_fixture_tree() { @@ -600,10 +709,8 @@ mod tests { fn live_process_executable_matches_current_process_image() { let exe = std::env::current_exe().unwrap(); let profile = Path::new("C:\\fixture\\ga-browser-x\\profile"); - // Windows 只核对镜像;Linux 还要求命令行绑定 profile,本测试进程 - // 不具备该标记,正例只在 Windows 断言。 - #[cfg(windows)] - assert!(live_process_executable_matches( + // 当前测试进程不携带目标 Profile 标识,即使镜像一致也不能清理。 + assert!(!live_process_executable_matches( std::process::id(), &exe, profile diff --git a/apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs b/apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs index 8fa08dcd6..fc17d9f12 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs @@ -311,6 +311,13 @@ async fn host_npm( fn browser_validation_failure_code(error: &str) -> &'static str { if error.contains("未发现可用的") { "web-preflight-browser-missing" + } else if error.starts_with("browser-recovery-") { + "web-preflight-browser-recovery-failed" + } else if error.contains("browser-temp-unavailable") || error.contains("browser-config-invalid") + { + "web-preflight-browser-environment-failed" + } else if error.starts_with("browser-launch-failed:") { + "web-preflight-browser-launch-failed" } else if error.contains("启动浏览器超时") { "web-preflight-browser-launch-timeout" } else if error.contains("启动浏览器失败") { @@ -342,6 +349,11 @@ fn browser_validation_failure_code(error: &str) -> &'static str { } } +fn browser_validation_diagnostic(error: &str) -> Option<&str> { + (error.starts_with("browser-recovery-") || error.starts_with("browser-launch-failed:")) + .then_some(error) +} + pub(crate) async fn host_web_creation_preflight() -> Value { let started = Instant::now(); // 预检前顺手清扫陈旧的无头浏览器,避免残留进程放大本轮超时。 @@ -362,18 +374,60 @@ pub(crate) async fn host_web_creation_preflight() -> Value { let validation = crate::browser::validate_local_preview_in_browser(BrowserValidationInput { url: preview.url, viewports: vec![BrowserValidationViewport::Desktop, BrowserValidationViewport::Mobile], expected_text: vec![], settle_ms: 100, fail_on_console_error: true, playtest_scenario: None, evidence_root: root.join("evidence"), }).await; - let result = validation.map_err(|error| browser_validation_failure_code(&error).to_string())?; - if !result.passed || result.viewport_results.len() != 2 { return Err("web-preflight-page-check-failed".into()); } + let result = validation + .map_err(|error| { + let code = browser_validation_failure_code(&error); + browser_validation_diagnostic(&error) + .map(|diagnostic| format!("{code};diagnostic={diagnostic}")) + .unwrap_or_else(|| code.to_string()) + })?; + if !result.passed || result.viewport_results.len() != 2 { + return Err("web-preflight-page-check-failed".into()); + } let mut pngs = Vec::new(); for viewport in result.viewport_results { - let bytes = fs::read(&viewport.screenshot_path).map_err(|_| "web-preflight-screenshot-missing")?; - if !bytes.starts_with(b"\x89PNG\r\n\x1a\n") || bytes.len() < 128 { return Err("web-preflight-screenshot-invalid".into()); } - image::load_from_memory(&bytes).map_err(|_| "web-preflight-screenshot-invalid")?; - pngs.push(json!({"viewport":viewport.viewport,"passed":viewport.passed,"pngBytes":bytes.len()})); + let bytes = fs::read(&viewport.screenshot_path) + .map_err(|_| "web-preflight-screenshot-missing")?; + if !bytes.starts_with(b"\x89PNG\r\n\x1a\n") || bytes.len() < 128 { + return Err("web-preflight-screenshot-invalid".into()); + } + image::load_from_memory(&bytes) + .map_err(|_| "web-preflight-screenshot-invalid")?; + pngs.push(json!({ + "viewport": viewport.viewport, + "passed": viewport.passed, + "pngBytes": bytes.len(), + })); } - Ok::<_, String>(json!({"schemaVersion":"agc-web-creation-preflight.v1","status":"ready","runtime":{"source":runtime.source,"nodeVersion":node,"npmVersion":npm},"build":{"status":"ready","kind":"npm-node-fixture"},"browser":{"status":"ready","viewports":pngs}})) - }.await; - let mut result = run.unwrap_or_else(|code| json!({"schemaVersion":"agc-web-creation-preflight.v1","status":"blocked","code":code})); + Ok::<_, String>(json!({ + "schemaVersion": "agc-web-creation-preflight.v1", + "status": "ready", + "runtime": { + "source": runtime.source, + "nodeVersion": node, + "npmVersion": npm, + }, + "build": {"status": "ready", "kind": "npm-node-fixture"}, + "browser": {"status": "ready", "viewports": pngs}, + })) + } + .await; + let mut result = run.unwrap_or_else(|error| { + let (code, diagnostic) = error + .split_once(";diagnostic=") + .map_or((error.as_str(), None), |(code, diagnostic)| { + (code, Some(diagnostic)) + }); + let mut blocked = json!({ + "schemaVersion": "agc-web-creation-preflight.v1", + "status": "blocked", + "code": code, + }); + if let Some(diagnostic) = diagnostic { + blocked["diagnostic"] = json!(diagnostic); + } + blocked + }); result["elapsedMs"] = json!(started.elapsed().as_millis()); result } @@ -382,9 +436,14 @@ pub(crate) async fn host_web_creation_preflight() -> Value { pub(crate) async fn preflight_web_game_creation() -> Result { let result = host_web_creation_preflight().await; if result["status"] != "ready" { + let diagnostic = result["diagnostic"] + .as_str() + .map(|value| format!(";诊断:{value}")) + .unwrap_or_default(); return Err(format!( - "Web 游戏环境预检未通过:{};尚未启动生成", - result["code"].as_str().unwrap_or("web-preflight-failed") + "Web 游戏环境预检未通过:{}{};尚未启动生成", + result["code"].as_str().unwrap_or("web-preflight-failed"), + diagnostic, )); } Ok(result) @@ -548,6 +607,27 @@ mod tests { browser_validation_failure_code("启动浏览器失败:2"), "web-preflight-browser-launch-failed" ); + + assert_eq!( + browser_validation_failure_code( + "browser-launch-failed: stage=setup cause=browser-temp-unavailable" + ), + "web-preflight-browser-environment-failed" + ); + + let recovery_diagnostic = "browser-recovery-failed: initial-stage=ws-handshake final-stage=cdp-connect subprocess-exited=true cleanup-confirmed=true recovery-retried=true"; + assert_eq!( + browser_validation_failure_code(recovery_diagnostic), + "web-preflight-browser-recovery-failed" + ); + assert_eq!( + browser_validation_diagnostic(recovery_diagnostic), + Some(recovery_diagnostic) + ); + assert_eq!( + browser_validation_diagnostic("启动浏览器失败:原始错误"), + None + ); assert_eq!( browser_validation_failure_code("宿主已停止本轮浏览器验证"), "web-preflight-cancelled" diff --git a/docs/project-memory/plans/【实施计划】Web预检浏览器失败恢复-2026-10-02.md b/docs/project-memory/plans/【实施计划】Web预检浏览器失败恢复-2026-10-02.md new file mode 100644 index 000000000..b887524b2 --- /dev/null +++ b/docs/project-memory/plans/【实施计划】Web预检浏览器失败恢复-2026-10-02.md @@ -0,0 +1,31 @@ +# Web 预检浏览器失败恢复实现计划 + +- Version: `1` +- Status: `active` +- Date: `2026-10-02` +- Milestone: [`Web 预检浏览器失败恢复`](./【里程碑】Web预检浏览器失败恢复-2026-10-02.md) + +## 实现顺序 + +1. 将浏览器启动失败建模为带阶段、原因、子进程退出确认、清理确认的内部结果;失败收束必须复用本轮 `BrowserProcessGuard`,并在成功收束时确认 Windows Job 为空。 +2. 在 Web 预检使用的一次浏览器启动入口加入一次有界恢复:仅 WS/CDP 瞬态失败且首次清理确认后创建新的临时目录/Profile 重试;其余失败直接失败关闭。 +3. 保留/加强 owner 与 sweep 的归属门禁,补齐 Windows 活进程 Profile 命令行标识核对;无 owner、身份未知、PID 退出或复用均不得按猜测杀进程。 +4. 将安全恢复诊断保留到预检 blocked 报告和 Tauri 错误中;稳定错误码独立于诊断文本,前端继续区分宿主阻塞与 IPC 故障。 +5. 补充 Rust 纯策略测试、清理边界测试和现有真实 Edge/Chromium ignored smoke;补充首页错误展示的定向测试。 + +## 验证命令 + +- `cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell browser::` +- `cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell environment_check::web_creation::tests` +- `npx vitest run apps/ai-game-creator-shell/tests/homeWebPreflight.test.tsx` +- `npm run typecheck --workspace apps/ai-game-creator-shell` +- `npm run check:encoding` +- `git diff --check` + +可选真实环境证据:安装 Windows Edge 时运行现有 `real_browser_health_checks_can_run_concurrently` 及新增恢复 smoke;无浏览器时保持 ignored,不把缺失环境写成通过。 + +## 风险与回滚 + +- Windows 进程命令行读取失败按不匹配处理,不执行杀进程;这可能留下临时目录,但保证不误杀。 +- 首次失败进程树收束未确认时不自动重试,避免第二个 Edge 与残留树并存;错误返回安全诊断。 +- 回滚点为浏览器启动恢复入口和 owner/sweep 归属校验,不触及 Web 预检的 Node/npm 或项目写入流程。 diff --git a/docs/project-memory/plans/【里程碑】Web预检浏览器失败恢复-2026-10-02.md b/docs/project-memory/plans/【里程碑】Web预检浏览器失败恢复-2026-10-02.md new file mode 100644 index 000000000..e56e78d5c --- /dev/null +++ b/docs/project-memory/plans/【里程碑】Web预检浏览器失败恢复-2026-10-02.md @@ -0,0 +1,41 @@ +# Web 预检浏览器失败恢复 + +- Version: `1` +- Status: `active` +- Date: `2026-10-02` +- Parent Spec: [`AI游戏创作智能体 App 实施计划`](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#自动预检与可信脚手架) + +## 目标 + +修复 Issue #584:Web 游戏环境预检在受控 Edge/Chrome 的 WS 握手或 CDP 连接失败时,能够只针对本轮 AGC 浏览器实例完成清理、使用新的隔离 Profile 重试一次,并在仍失败时保留安全、可行动的诊断信息。 + +## 边界 + +- 只改 AGC Rust 浏览器启动/清理、Web 预检错误投影及其定向测试、对应现行专题文档。 +- 清理对象必须同时满足 AGC 临时 Profile、进程启动身份、可信浏览器可执行文件和 Windows 进程树归属;无法确认时 fail-closed。 +- 不执行全量 `taskkill /IM msedge.exe`,不影响用户 Edge、其它 AGC 实例、其它项目或 worktree。 +- 不改变 Web 预检的失败关闭、Node/npm 检查、桌面/移动双视口检查和首次生成顺序。 +- 不新增网络、自动下载、跳过浏览器验证或伪造 ready 的旁路。 + +## 行为合同 + +1. WS 握手失败、WS 超时、CDP 连接失败或 CDP 连接超时属于可恢复的浏览器启动瞬态失败。 +2. 第一次失败后,宿主必须先确认本轮进程树已退出并清理本轮 Profile / owner 记录 / 临时目录;清理未确认时不得启动第二次浏览器。 +3. 清理确认后,第二次启动必须创建新的隔离临时目录和 Profile;第二次成功后继续现有 desktop/mobile 预检。 +4. 连续失败或清理被阻断时,结果保持 blocked,并带有阶段(WS 握手或 CDP 连接)、子进程是否退出、清理是否确认、是否执行恢复重试等安全诊断。 +5. owner.json 缺失/写入失败、目录过新、进程已退出、PID 被复用、身份未知或归属不明时只能按保守路径处理:不杀不明进程;可安全删除的临时目录才删除。 + +## 验收标准 + +- 定向测试构造 `browser-ws-failed` 后证明只在清理确认时重试,且重试使用新的 Profile;第二次成功返回成功。 +- 定向测试覆盖 WS/CDP 阶段、连续失败、清理未确认、owner.json 缺失/无效、刚创建目录、进程退出、PID 复用和非 AGC 进程跳过。 +- Windows 真实 Edge 安装版 smoke 保留在现有真实浏览器测试入口中;无 Edge 的环境明确跳过而不是伪造通过。 +- 现有首页预检、正常 Edge 使用、首次生成失败关闭和前端 IPC/宿主错误区分回归通过。 + +## 依赖 + +- `apps/ai-game-creator-shell/src-tauri/src/browser/process.rs` +- `apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs` +- `apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs` +- `apps/ai-game-creator-shell/src/features/app-shell/homeWebPreflight.ts` +- 对应 Rust 与 Vitest 测试。 diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index 70bbbd2fe..74c74685f 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -134,7 +134,7 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema - 对客户端刚创建且内容仍匹配可信模板的 Web 脚手架,在正式生成前由宿主执行受控依赖准备和真实 Vite 构建。依赖安装禁用生命周期脚本;不自动安装或覆盖导入/用户修改过的工程。 - 准备凭证的 `ready` 只证明初次环境准备成功,不代表当前游戏已验收,后续正常修改不得因此重新安装。`preparing` 中断恢复必须证明原拥有者已结束且其执行子树已回收;身份或归属未知时保留阻断,不重复执行。 - 输出明确区分“Node/npm 构建能力通过”与“本项目 Vite 构建通过”;任何一步失败保留可行动错误,不降级为预检成功。 -- 首页必须区分宿主预检阻塞与 Tauri IPC 调用失败:Rust 返回的安全错误码可透传到状态栏;无错误码的瞬态 IPC 失败只允许一次有界重试后显示独立的客户端连接故障,不得统一伪装成 Node/npm 或浏览器故障。预检仍保持失败关闭,不得因为展示错误变得可绕过。 +- 首页必须区分宿主预检阻塞与 Tauri IPC 调用失败:Rust 返回的安全错误码可透传到状态栏;无错误码的瞬态 IPC 失败只允许一次有界重试后显示独立的客户端连接故障,不得统一伪装成 Node/npm 或浏览器故障。预检仍保持失败关闭,不得因为展示错误变得可绕过。浏览器 WS 握手、WS 超时和 CDP 连接失败只允许在确认本轮 AGC 浏览器进程树已退出、Profile/owner/临时目录已按归属清理后使用新的隔离 Profile 自动恢复一次;清理未确认时不得重试,连续失败必须返回包含阶段、子进程退出确认、清理确认和是否重试的安全诊断。 - 安装载荷提供相同的安全预检 CLI,验证无系统 Node 的独立运行、缺包/篡改失败关闭。NSIS 解包载荷 smoke 与真实安装器注册流程分开报告,不覆盖当前用户的既有安装。 ### 跑酷固定基线 @@ -188,7 +188,7 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema ### 环境与工作流 - 客户端交付配套 Node/npm;发布包从本机已安装且与目标平台/架构一致的工具链制作受校验资源,保留许可并校验内容摘要。安装态不依赖系统 PATH 的 Node;开发态可使用已验证的宿主运行时。不得从项目或相对 PATH 加载伪造运行时。随包运行时是**单架构**官方发行版,因此 macOS 当前只构建 `aarch64-apple-darwin` 单架构包;要出 universal 必须先让 staging 支持按架构各带一份同版本运行时,在此之前 universal 目标失败关闭,不得只带宿主架构那一份糊过去。 -- 新建 Web 游戏在生图和大量实现前执行客户端环境预检,检查 Node/npm 的实际版本、浏览器启动和 CDP 可用性。报告只包含安全状态、版本、耗时和错误码;错误码必须按真实原因分流,浏览器验证只允许在确有证据时使用 `web-preflight-browser-missing` / `-launch-timeout` / `-launch-failed` / `-browser-cleanup-failed`,取消、证据写入、输入与页面校验各有独立码,未识别原因落回专用 `web-preflight-unclassified`,不得用一个具体子系统码兜底。缺失或异常必须尽早返回阻塞,不能指示模型改宿主环境、全盘搜索或自行下载一套运行时。编辑器工程不强制 Web 工具链。 +- 新建 Web 游戏在生图和大量实现前执行客户端环境预检,检查 Node/npm 的实际版本、浏览器启动和 CDP 可用性。报告只包含安全状态、版本、耗时和错误码;错误码必须按真实原因分流,浏览器验证只允许在确有证据时使用 `web-preflight-browser-missing` / `-launch-timeout` / `-launch-failed` / `-browser-cleanup-failed` / `-browser-recovery-failed`,取消、证据写入、输入与页面校验各有独立码,未识别原因落回专用 `web-preflight-unclassified`,不得用一个具体子系统码兜底。浏览器恢复诊断只保留阶段、进程退出、清理确认和重试状态等安全字段,不暴露命令行、路径或上游原文。缺失或异常必须尽早返回阻塞,不能指示模型改宿主环境、全盘搜索或自行下载一套运行时。编辑器工程不强制 Web 工具链。 - 预检不安装依赖、不修改项目 revision、不请求平台生成;构建仍执行项目自己的 npm 脚本。Codex 隔离 HOME 与平台凭据边界保持不变,客户端把已验证的运行时加入执行 PATH,不能把宿主凭据目录交给模型。 - 第一轮先明确本次必需玩法、素材和验收项。同批独立读取尽量合并,必需图片一次规划;已有且可用的资产复用。已有目标全部通过后给出交付结果,非阻塞的新点子列为后续工作,不在收尾时主动开启新的生产链。 From c833e30d735721ac7d737355672d111fbe7d8d45 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Sat, 3 Oct 2026 12:50:18 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Web=20=E9=A2=84?= =?UTF-8?q?=E6=A3=80=E6=B5=8F=E8=A7=88=E5=99=A8=E6=81=A2=E5=A4=8D=E4=B8=8E?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E6=94=B6=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 Windows Job 绑定窗口内子树未纳入的问题,无法确认时收束并 fail-closed。 使用 CommandLineToArgvW 校验含空格 Profile,补充 Job 子树与 Profile 回归测试。 补齐清理失败安全诊断和浏览器环境错误码契约。 --- .../src-tauri/Cargo.toml | 2 +- .../src-tauri/src/browser/process.rs | 82 +++++++--- .../src-tauri/src/browser/sweep.rs | 140 ++++++++++++++++-- .../src/environment_check/web_creation.rs | 15 +- .../src-tauri/src/process_session/model.rs | 35 +++++ ...ž施计划】Web预检浏览器失败恢复-2026-10-02.md | 6 +- ...¹案】AI游戏创作智能体App实施计划-2026-06-24.md | 2 +- 7 files changed, 240 insertions(+), 42 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/Cargo.toml b/apps/ai-game-creator-shell/src-tauri/Cargo.toml index fbe737fec..5f3f50505 100644 --- a/apps/ai-game-creator-shell/src-tauri/Cargo.toml +++ b/apps/ai-game-creator-shell/src-tauri/Cargo.toml @@ -86,7 +86,7 @@ maud = "0.27.0" libc = "0.2" [target.'cfg(windows)'.dependencies] -windows-sys = { version = "0.61", features = ["Wdk_Storage_FileSystem", "Win32_Foundation", "Win32_Storage_FileSystem", "Win32_System_Diagnostics_ToolHelp", "Win32_System_IO", "Win32_System_JobObjects", "Win32_System_Threading", "Win32_UI_WindowsAndMessaging"] } +windows-sys = { version = "0.61", features = ["Wdk_Storage_FileSystem", "Win32_Foundation", "Win32_Storage_FileSystem", "Win32_System_Diagnostics_ToolHelp", "Win32_System_IO", "Win32_System_JobObjects", "Win32_System_Threading", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] } [profile.dev] opt-level = 0 diff --git a/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs b/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs index 5d84d2c21..cda4b634b 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs @@ -411,21 +411,28 @@ impl OwnedBrowser { { return Ok(()); } - if !self.process.reap().await { + let subprocess_exited = self.process.reap().await; + if !subprocess_exited { // 进程退出未确认:保留目录与 owner.json,留待下次启动或 // 预检时由跨会话清扫收割,而不是删掉证据让清扫失明。 if let Some(temp) = self.temp.take() { std::mem::forget(temp); } - return Err("browser-cleanup-unconfirmed".into()); + return Err( + "browser-cleanup-unconfirmed: stage=shutdown subprocess-exited=false cleanup-confirmed=false recovery-retried=false" + .into(), + ); } - let confirmed = self.process.confirm_reaped().await; - if confirmed.is_err() { + if self.process.confirm_reaped().await.is_err() { if let Some(temp) = self.temp.take() { std::mem::forget(temp); } + return Err( + "browser-cleanup-unconfirmed: stage=shutdown subprocess-exited=true cleanup-confirmed=false recovery-retried=false" + .into(), + ); } - confirmed + Ok(()) } } @@ -441,9 +448,11 @@ async fn cleanup_failed_launch( mut process: BrowserProcessGuard, temp: TempDir, error: OwnedBrowserLaunchError, + tree_control_confirmed: bool, ) -> BrowserLaunchFailure { let subprocess_exited = process.reap().await; - let tree_reaped = subprocess_exited && process.confirm_reaped().await.is_ok(); + let tree_reaped = + tree_control_confirmed && subprocess_exited && process.confirm_reaped().await.is_ok(); drop(process); let cleanup_confirmed = if tree_reaped { temp.close().is_ok() @@ -455,11 +464,9 @@ async fn cleanup_failed_launch( BrowserLaunchFailure::from_launch_error(error, subprocess_exited, cleanup_confirmed) } -/// 自拉浏览器并完成 CDP 连接。spawn 与 Job 绑定之间存在极小的逸出 -/// 窗口:绑定前产生的子进程未入 Job——Unix 上随 root 死亡级联退出; -/// Windows 没有这种级联,但窗口只有毫秒级(Chrome 此时尚未拉起子 -/// 进程),真发生泄漏时临时目录因被占用而保留,留待系统或用户清理。 -/// 绑定之后的一切子进程由 Job 全覆盖。 +/// 自拉浏览器并完成 CDP 连接。Windows 先把 root 放入 KILL_ON_JOB_CLOSE +/// 的 Job,再把绑定瞬间已经出现的整棵子树纳入同一 Job;之后由 Job 自动 +/// 覆盖新建子进程。无法证明覆盖完整时先收束整棵已知进程树,不放行浏览器。 async fn launch_owned_browser( config: BrowserConfig, executable: &std::path::Path, @@ -475,15 +482,54 @@ async fn launch_owned_browser( )); } }; - // 无法证明整树可收割时拒绝放行浏览器;先收束 root,但不宣称 Job 子树已清空。 #[cfg(windows)] let job = match WindowsProcessJob::assign_tokio(&child.inner) { - Ok(job) => Some(job), + Ok(job) => { + let Some(root_pid) = child.inner.id() else { + let process = BrowserProcessGuard { + child, + job: Some(job), + }; + return Err(cleanup_failed_launch( + process, + temp, + OwnedBrowserLaunchError::SpawnFailed, + false, + ) + .await); + }; + if super::sweep::ensure_browser_tree_in_job(root_pid, &job).is_ok() { + Some(job) + } else { + let tree_reaped = + crate::process_identity::external_agent_runner_process_start_identity(root_pid) + .ok() + .flatten() + .is_some_and(|identity| { + super::sweep::kill_browser_process_tree(root_pid, &identity).is_ok() + }); + let process = BrowserProcessGuard { + child, + job: Some(job), + }; + return Err(cleanup_failed_launch( + process, + temp, + OwnedBrowserLaunchError::SpawnFailed, + tree_reaped, + ) + .await); + } + } Err(_) => { let process = BrowserProcessGuard { child, job: None }; - return Err( - cleanup_failed_launch(process, temp, OwnedBrowserLaunchError::SpawnFailed).await, - ); + return Err(cleanup_failed_launch( + process, + temp, + OwnedBrowserLaunchError::SpawnFailed, + false, + ) + .await); } }; let mut process = BrowserProcessGuard { @@ -499,7 +545,7 @@ async fn launch_owned_browser( { Ok(pair) => pair, Err(error) => { - return Err(cleanup_failed_launch(process, temp, error).await); + return Err(cleanup_failed_launch(process, temp, error, true).await); } }; let drain_task = spawn_stderr_drain(reader); @@ -516,6 +562,7 @@ async fn launch_owned_browser( process, temp, OwnedBrowserLaunchError::ConnectFailed, + true, ) .await); } @@ -525,6 +572,7 @@ async fn launch_owned_browser( process, temp, OwnedBrowserLaunchError::ConnectTimeout, + true, ) .await); } diff --git a/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs b/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs index f002db1b4..6bd43bbcf 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs @@ -12,6 +12,8 @@ use serde::{Deserialize, Serialize}; use super::discovery::system_browser_candidates; use super::process::{browser_process_temp_root, BROWSER_TEMP_PREFIX}; +#[cfg(windows)] +use crate::process_session::WindowsProcessJob; const OWNER_FILE: &str = "owner.json"; const OWNER_SCHEMA: &str = "agc-browser-process.v1"; @@ -182,23 +184,56 @@ fn windows_process_command_line(pid: u32) -> Option { String::from_utf16(text).ok() } +#[cfg(windows)] +fn windows_command_line_arguments(command_line: &str) -> Option> { + use windows_sys::Win32::Foundation::LocalFree; + use windows_sys::Win32::UI::Shell::CommandLineToArgvW; + + let wide = command_line + .encode_utf16() + .chain(std::iter::once(0)) + .collect::>(); + let mut count = 0; + let argv = unsafe { CommandLineToArgvW(wide.as_ptr(), &mut count) }; + if argv.is_null() || count < 0 { + if !argv.is_null() { + unsafe { LocalFree(argv.cast()) }; + } + return None; + } + let result = unsafe { std::slice::from_raw_parts(argv, count as usize) } + .iter() + .map(|argument| { + if argument.is_null() { + return None; + } + let mut length = 0; + unsafe { + while *argument.add(length) != 0 { + length += 1; + } + String::from_utf16(std::slice::from_raw_parts(*argument, length)).ok() + } + }) + .collect::>>(); + unsafe { LocalFree(argv.cast()) }; + result +} + #[cfg(windows)] fn command_line_contains_profile(command_line: &str, profile_dir: &Path) -> bool { const MARKER: &str = "--user-data-dir="; - let mut remaining = command_line; - while let Some(index) = remaining.find(MARKER) { - let value = remaining[index + MARKER.len()..].trim_start(); - let value = if let Some(quoted) = value.strip_prefix('"') { - quoted.split('"').next().unwrap_or_default() - } else { - value.split_whitespace().next().unwrap_or_default() - }; - if same_executable_path(Path::new(value), profile_dir) { - return true; - } - remaining = &remaining[index + MARKER.len()..]; - } - false + let Some(arguments) = windows_command_line_arguments(command_line) else { + return false; + }; + arguments.iter().enumerate().any(|(index, argument)| { + let value = argument.strip_prefix(MARKER).or_else(|| { + (argument == "--user-data-dir") + .then(|| arguments.get(index + 1).map(String::as_str)) + .flatten() + }); + value.is_some_and(|value| same_executable_path(Path::new(value), profile_dir)) + }) } #[cfg(windows)] @@ -260,7 +295,10 @@ fn directory_owned_by_current_user(dir: &Path) -> bool { .unwrap_or(false) } -fn kill_browser_process_tree(root_pid: u32, expected_identity: &str) -> Result<(), String> { +pub(super) fn kill_browser_process_tree( + root_pid: u32, + expected_identity: &str, +) -> Result<(), String> { #[cfg(windows)] { // 追踪所有经确认属于这棵树的 PID;只有它们全部从快照中消失才判 @@ -402,6 +440,37 @@ fn windows_process_tree_pids_from( Ok(tree) } +#[cfg(windows)] +pub(super) fn ensure_browser_tree_in_job( + root_pid: u32, + job: &WindowsProcessJob, +) -> Result<(), String> { + for _ in 0..TREE_KILL_MAX_PASSES { + let snapshot = windows_process_snapshot()?; + let tree = windows_process_tree_pids_from(&snapshot, root_pid)?; + if tree.is_empty() { + return Err("browser-job-root-exited-before-coverage".into()); + } + for pid in tree { + if !job.contains_pid(pid)? { + job.assign_pid(pid)?; + } + } + + let verified = windows_process_snapshot()?; + let verified_tree = windows_process_tree_pids_from(&verified, root_pid)?; + if !verified_tree.is_empty() + && verified_tree + .iter() + .all(|pid| job.contains_pid(*pid).unwrap_or(false)) + { + return Ok(()); + } + std::thread::sleep(TREE_KILL_PASS_INTERVAL); + } + Err("browser-job-tree-coverage-unconfirmed".into()) +} + #[cfg(windows)] fn windows_terminate_process(pid: u32) { use windows_sys::Win32::Foundation::CloseHandle; @@ -647,6 +716,10 @@ mod tests { r#"msedge.exe --headless --user-data-dir="C:\Users\tester\App Data\ga-browser-1\profile""#, profile )); + assert!(command_line_contains_profile( + r#""msedge.exe" "--user-data-dir=C:\Users\tester\App Data\ga-browser-1\profile""#, + profile + )); assert!(!command_line_contains_profile( r#"msedge.exe --headless --user-data-dir="C:\Users\tester\App Data\ga-browser-2\profile""#, profile @@ -657,6 +730,43 @@ mod tests { )); } + #[cfg(windows)] + #[test] + fn browser_job_adopts_children_created_before_assignment() { + use std::process::{Command, Stdio}; + + let mut child = Command::new("cmd.exe") + .args([ + "/c", + "ping", + "127.0.0.1", + "-n", + "60", + "&", + "ping", + "127.0.0.1", + "-n", + "60", + ]) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() + .expect("spawn fixture"); + let pid = child.id(); + std::thread::sleep(Duration::from_millis(500)); + let job = WindowsProcessJob::assign_std(&child).expect("assign fixture job"); + ensure_browser_tree_in_job(pid, &job).expect("adopt fixture tree"); + let snapshot = windows_process_snapshot().expect("snapshot after adoption"); + let tree = windows_process_tree_pids_from(&snapshot, pid).expect("tree after adoption"); + assert!(tree + .iter() + .all(|member| job.contains_pid(*member).expect("job membership"))); + job.terminate().expect("terminate fixture job"); + let _ = child.wait(); + assert!(job.is_empty().expect("fixture job empty")); + } + #[cfg(windows)] #[test] fn kill_browser_process_tree_reaps_fixture_tree() { diff --git a/apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs b/apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs index fc17d9f12..018e9ff92 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs @@ -350,8 +350,10 @@ fn browser_validation_failure_code(error: &str) -> &'static str { } fn browser_validation_diagnostic(error: &str) -> Option<&str> { - (error.starts_with("browser-recovery-") || error.starts_with("browser-launch-failed:")) - .then_some(error) + (error.starts_with("browser-recovery-") + || error.starts_with("browser-launch-failed:") + || error.starts_with("browser-cleanup-unconfirmed:")) + .then_some(error) } pub(crate) async fn host_web_creation_preflight() -> Value { @@ -632,12 +634,15 @@ mod tests { browser_validation_failure_code("宿主已停止本轮浏览器验证"), "web-preflight-cancelled" ); + let cleanup_diagnostic = "browser-cleanup-unconfirmed: stage=shutdown subprocess-exited=true cleanup-confirmed=false recovery-retried=false"; assert_eq!( - browser_validation_failure_code( - "browser-cleanup-unconfirmed: 浏览器收束后无法证明退出,请核对本轮验证进程" - ), + browser_validation_failure_code(cleanup_diagnostic), "web-preflight-browser-cleanup-failed" ); + assert_eq!( + browser_validation_diagnostic(cleanup_diagnostic), + Some(cleanup_diagnostic) + ); assert_eq!( browser_validation_failure_code("创建浏览器临时目录失败:拒绝访问"), "web-preflight-browser-environment-failed" diff --git a/apps/ai-game-creator-shell/src-tauri/src/process_session/model.rs b/apps/ai-game-creator-shell/src-tauri/src/process_session/model.rs index 6d086e49c..f8d02848c 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/process_session/model.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/process_session/model.rs @@ -236,7 +236,42 @@ impl WindowsProcessJob { .ok_or_else(|| "子进程缺少 Windows process handle".to_string())?; Self::assign_handle(handle as windows_sys::Win32::Foundation::HANDLE) } + pub(crate) fn contains_pid(&self, pid: u32) -> Result { + use windows_sys::Win32::Foundation::CloseHandle; + use windows_sys::Win32::System::JobObjects::IsProcessInJob; + use windows_sys::Win32::System::Threading::{ + OpenProcess, PROCESS_QUERY_LIMITED_INFORMATION, + }; + let process = unsafe { OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid) }; + if process.is_null() { + return Err("无法打开进程核对 Windows Job 归属".into()); + } + let mut in_job = 0; + let okay = unsafe { IsProcessInJob(process, self.0, &mut in_job) }; + unsafe { CloseHandle(process) }; + if okay == 0 { + return Err("无法核对进程 Windows Job 归属".into()); + } + Ok(in_job != 0) + } + pub(crate) fn assign_pid(&self, pid: u32) -> Result<(), String> { + use windows_sys::Win32::Foundation::CloseHandle; + use windows_sys::Win32::System::JobObjects::AssignProcessToJobObject; + use windows_sys::Win32::System::Threading::{ + OpenProcess, PROCESS_SET_QUOTA, PROCESS_TERMINATE, + }; + let process = unsafe { OpenProcess(PROCESS_SET_QUOTA | PROCESS_TERMINATE, 0, pid) }; + if process.is_null() { + return Err("无法打开进程加入 Windows Job".into()); + } + let okay = unsafe { AssignProcessToJobObject(self.0, process) }; + unsafe { CloseHandle(process) }; + if okay == 0 { + return Err("无法将进程加入 Windows Job".into()); + } + Ok(()) + } pub(crate) fn assign_tokio_named( child: &tokio::process::Child, name: &str, diff --git a/docs/project-memory/plans/【实施计划】Web预检浏览器失败恢复-2026-10-02.md b/docs/project-memory/plans/【实施计划】Web预检浏览器失败恢复-2026-10-02.md index b887524b2..aaa18517a 100644 --- a/docs/project-memory/plans/【实施计划】Web预检浏览器失败恢复-2026-10-02.md +++ b/docs/project-memory/plans/【实施计划】Web预检浏览器失败恢复-2026-10-02.md @@ -7,10 +7,10 @@ ## 实现顺序 -1. 将浏览器启动失败建模为带阶段、原因、子进程退出确认、清理确认的内部结果;失败收束必须复用本轮 `BrowserProcessGuard`,并在成功收束时确认 Windows Job 为空。 +1. 将浏览器启动失败建模为带阶段、原因、子进程退出确认、清理确认的内部结果;Windows root spawn 后立即绑定 Job,并把绑定瞬间已经出现的子树逐 PID 纳入同一 Job,失败收束必须复用本轮 `BrowserProcessGuard`,并在成功收束时确认 Windows Job 为空。 2. 在 Web 预检使用的一次浏览器启动入口加入一次有界恢复:仅 WS/CDP 瞬态失败且首次清理确认后创建新的临时目录/Profile 重试;其余失败直接失败关闭。 -3. 保留/加强 owner 与 sweep 的归属门禁,补齐 Windows 活进程 Profile 命令行标识核对;无 owner、身份未知、PID 退出或复用均不得按猜测杀进程。 -4. 将安全恢复诊断保留到预检 blocked 报告和 Tauri 错误中;稳定错误码独立于诊断文本,前端继续区分宿主阻塞与 IPC 故障。 +3. 保留/加强 owner 与 sweep 的归属门禁,使用 Windows argv 解析核对完整 Profile 参数;无 owner、身份未知、PID 退出或复用均不得按猜测杀进程。 +4. 将启动失败和清理失败的安全诊断保留到预检 blocked 报告和 Tauri 错误中;稳定错误码独立于诊断文本,前端继续区分宿主阻塞与 IPC 故障。 5. 补充 Rust 纯策略测试、清理边界测试和现有真实 Edge/Chromium ignored smoke;补充首页错误展示的定向测试。 ## 验证命令 diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index 74c74685f..bd5343da2 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -188,7 +188,7 @@ UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_sema ### 环境与工作流 - 客户端交付配套 Node/npm;发布包从本机已安装且与目标平台/架构一致的工具链制作受校验资源,保留许可并校验内容摘要。安装态不依赖系统 PATH 的 Node;开发态可使用已验证的宿主运行时。不得从项目或相对 PATH 加载伪造运行时。随包运行时是**单架构**官方发行版,因此 macOS 当前只构建 `aarch64-apple-darwin` 单架构包;要出 universal 必须先让 staging 支持按架构各带一份同版本运行时,在此之前 universal 目标失败关闭,不得只带宿主架构那一份糊过去。 -- 新建 Web 游戏在生图和大量实现前执行客户端环境预检,检查 Node/npm 的实际版本、浏览器启动和 CDP 可用性。报告只包含安全状态、版本、耗时和错误码;错误码必须按真实原因分流,浏览器验证只允许在确有证据时使用 `web-preflight-browser-missing` / `-launch-timeout` / `-launch-failed` / `-browser-cleanup-failed` / `-browser-recovery-failed`,取消、证据写入、输入与页面校验各有独立码,未识别原因落回专用 `web-preflight-unclassified`,不得用一个具体子系统码兜底。浏览器恢复诊断只保留阶段、进程退出、清理确认和重试状态等安全字段,不暴露命令行、路径或上游原文。缺失或异常必须尽早返回阻塞,不能指示模型改宿主环境、全盘搜索或自行下载一套运行时。编辑器工程不强制 Web 工具链。 +- 新建 Web 游戏在生图和大量实现前执行客户端环境预检,检查 Node/npm 的实际版本、浏览器启动和 CDP 可用性。报告只包含安全状态、版本、耗时和错误码;错误码必须按真实原因分流,浏览器验证只允许在确有证据时使用 `web-preflight-browser-missing` / `-launch-timeout` / `-launch-failed` / `-browser-environment-failed` / `-browser-cleanup-failed` / `-browser-recovery-failed`,取消、证据写入、输入与页面校验各有独立码,未识别原因落回专用 `web-preflight-unclassified`,不得用一个具体子系统码兜底。浏览器恢复诊断只保留阶段、进程退出、清理确认和重试状态等安全字段,不暴露命令行、路径或上游原文。缺失或异常必须尽早返回阻塞,不能指示模型改宿主环境、全盘搜索或自行下载一套运行时。编辑器工程不强制 Web 工具链。 - 预检不安装依赖、不修改项目 revision、不请求平台生成;构建仍执行项目自己的 npm 脚本。Codex 隔离 HOME 与平台凭据边界保持不变,客户端把已验证的运行时加入执行 PATH,不能把宿主凭据目录交给模型。 - 第一轮先明确本次必需玩法、素材和验收项。同批独立读取尽量合并,必需图片一次规划;已有且可用的资产复用。已有目标全部通过后给出交付结果,非阻塞的新点子列为后续工作,不在收尾时主动开启新的生产链。 From b6a3e8d5064b0414b5ce94d40b8a4dbf78ff4ed8 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Sat, 3 Oct 2026 16:31:40 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E5=99=A8=E8=BF=9B=E7=A8=8B=E5=BD=92=E5=B1=9E=E4=B8=8E=E6=B8=85?= =?UTF-8?q?=E7=90=86=E8=AF=8A=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 固定 Windows 浏览器 root 与子进程启动身份,Job 绑定失败时回收完整进程树并拒绝 PID 复用。 保留 Web 预检 shutdown 的结构化清理诊断,补充身份不匹配回归测试。 --- .../src-tauri/src/browser/process.rs | 47 +++++++++----- .../src-tauri/src/browser/sweep.rs | 64 +++++++++++++++++-- 2 files changed, 90 insertions(+), 21 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs b/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs index cda4b634b..712c41fbd 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs @@ -451,8 +451,18 @@ async fn cleanup_failed_launch( tree_control_confirmed: bool, ) -> BrowserLaunchFailure { let subprocess_exited = process.reap().await; - let tree_reaped = - tree_control_confirmed && subprocess_exited && process.confirm_reaped().await.is_ok(); + let tree_reaped = if tree_control_confirmed && subprocess_exited { + #[cfg(windows)] + { + process.job.is_none() || process.confirm_reaped().await.is_ok() + } + #[cfg(not(windows))] + { + process.confirm_reaped().await.is_ok() + } + } else { + false + }; drop(process); let cleanup_confirmed = if tree_reaped { temp.close().is_ok() @@ -483,9 +493,17 @@ async fn launch_owned_browser( } }; #[cfg(windows)] + let root_identity = child.inner.id().and_then(|pid| { + crate::process_identity::external_agent_runner_process_start_identity(pid) + .ok() + .flatten() + }); + #[cfg(windows)] let job = match WindowsProcessJob::assign_tokio(&child.inner) { Ok(job) => { - let Some(root_pid) = child.inner.id() else { + let (Some(root_pid), Some(root_identity)) = + (child.inner.id(), root_identity.as_deref()) + else { let process = BrowserProcessGuard { child, job: Some(job), @@ -498,16 +516,11 @@ async fn launch_owned_browser( ) .await); }; - if super::sweep::ensure_browser_tree_in_job(root_pid, &job).is_ok() { + if super::sweep::ensure_browser_tree_in_job(root_pid, root_identity, &job).is_ok() { Some(job) } else { let tree_reaped = - crate::process_identity::external_agent_runner_process_start_identity(root_pid) - .ok() - .flatten() - .is_some_and(|identity| { - super::sweep::kill_browser_process_tree(root_pid, &identity).is_ok() - }); + super::sweep::kill_browser_process_tree(root_pid, root_identity).is_ok(); let process = BrowserProcessGuard { child, job: Some(job), @@ -522,12 +535,18 @@ async fn launch_owned_browser( } } Err(_) => { + let tree_reaped = match (child.inner.id(), root_identity.as_deref()) { + (Some(root_pid), Some(root_identity)) => { + super::sweep::kill_browser_process_tree(root_pid, root_identity).is_ok() + } + _ => false, + }; let process = BrowserProcessGuard { child, job: None }; return Err(cleanup_failed_launch( process, temp, OwnedBrowserLaunchError::SpawnFailed, - false, + tree_reaped, ) .await); } @@ -709,10 +728,8 @@ pub(crate) async fn validate_local_preview_in_browser_with_cancellation( _=cancelled => Err("宿主已停止本轮浏览器验证".to_string()), }; - if owned.shutdown().await.is_err() { - return Err( - "browser-cleanup-unconfirmed: 浏览器收束后无法证明退出,请核对本轮验证进程".into(), - ); + if let Err(error) = owned.shutdown().await { + return Err(error); } let mut result = validation?; result.completed_at_unix_ms = unix_time_ms(); diff --git a/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs b/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs index 6bd43bbcf..0a66c5762 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs @@ -307,15 +307,17 @@ pub(super) fn kill_browser_process_tree( for _ in 0..TREE_KILL_MAX_PASSES { let snapshot = windows_process_snapshot()?; let root_present = snapshot.iter().any(|(pid, _)| *pid == root_pid); - if root_present && process_identity_matches(root_pid, expected_identity) { + if root_present { + if !process_identity_matches(root_pid, expected_identity) { + return Err("browser-sweep-root-identity-mismatch".into()); + } // root 仍是目标浏览器:发现并追踪当前整棵子树。 for pid in windows_process_tree_pids_from(&snapshot, root_pid)? { track_process(&mut tracked, pid); } - } else if !root_present { + } else { // root 已退出且 PID 未被复用:发现临终前才拉起、仍挂在旧父 - // PID 上的孤儿子进程。PID 已被复用时不做发现,避免误认 - // 复用者的子进程。 + // PID 上的孤儿子进程。PID 已被复用时不会进入此分支。 for (pid, ppid) in &snapshot { if *ppid == root_pid { track_process(&mut tracked, *pid); @@ -443,23 +445,48 @@ fn windows_process_tree_pids_from( #[cfg(windows)] pub(super) fn ensure_browser_tree_in_job( root_pid: u32, + root_identity: &str, job: &WindowsProcessJob, ) -> Result<(), String> { for _ in 0..TREE_KILL_MAX_PASSES { let snapshot = windows_process_snapshot()?; + if !snapshot.iter().any(|(pid, _)| *pid == root_pid) + || !process_identity_matches(root_pid, root_identity) + { + return Err("browser-job-root-identity-unconfirmed".into()); + } let tree = windows_process_tree_pids_from(&snapshot, root_pid)?; if tree.is_empty() { return Err("browser-job-root-exited-before-coverage".into()); } + let mut members = Vec::with_capacity(tree.len()); for pid in tree { + let identity = if pid == root_pid { + root_identity.to_string() + } else { + crate::process_identity::external_agent_runner_process_start_identity(pid) + .ok() + .flatten() + .ok_or_else(|| "browser-job-process-identity-unconfirmed".to_string())? + }; + members.push((pid, identity)); + } + for (pid, identity) in members { + if !process_identity_matches(pid, &identity) { + return Err("browser-job-process-identity-changed".into()); + } if !job.contains_pid(pid)? { job.assign_pid(pid)?; } + if !process_identity_matches(pid, &identity) { + return Err("browser-job-process-identity-changed".into()); + } } let verified = windows_process_snapshot()?; let verified_tree = windows_process_tree_pids_from(&verified, root_pid)?; - if !verified_tree.is_empty() + if process_identity_matches(root_pid, root_identity) + && !verified_tree.is_empty() && verified_tree .iter() .all(|pid| job.contains_pid(*pid).unwrap_or(false)) @@ -754,9 +781,12 @@ mod tests { .spawn() .expect("spawn fixture"); let pid = child.id(); + let identity = crate::process_identity::external_agent_runner_process_start_identity(pid) + .expect("fixture identity") + .expect("fixture identity present"); std::thread::sleep(Duration::from_millis(500)); let job = WindowsProcessJob::assign_std(&child).expect("assign fixture job"); - ensure_browser_tree_in_job(pid, &job).expect("adopt fixture tree"); + ensure_browser_tree_in_job(pid, &identity, &job).expect("adopt fixture tree"); let snapshot = windows_process_snapshot().expect("snapshot after adoption"); let tree = windows_process_tree_pids_from(&snapshot, pid).expect("tree after adoption"); assert!(tree @@ -767,6 +797,28 @@ mod tests { assert!(job.is_empty().expect("fixture job empty")); } + #[cfg(windows)] + #[test] + fn kill_browser_process_tree_rejects_root_identity_mismatch() { + use std::process::{Command, Stdio}; + + let mut child = Command::new("cmd.exe") + .args(["/c", "ping", "127.0.0.1", "-n", "60"]) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() + .expect("spawn fixture"); + let pid = child.id(); + let result = kill_browser_process_tree(pid, "not-the-fixture-identity"); + let _ = child.kill(); + let _ = child.wait(); + assert_eq!( + result.expect_err("identity mismatch must fail closed"), + "browser-sweep-root-identity-mismatch" + ); + } + #[cfg(windows)] #[test] fn kill_browser_process_tree_reaps_fixture_tree() { From 372b7d3a00c827d027495c3b7ab34f399f8a0679 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Sat, 3 Oct 2026 16:59:22 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20AGC=20=E6=A0=8F?= =?UTF-8?q?=E7=9B=AE=E7=94=BB=E5=B8=83=E4=B8=8A=E4=BC=A0=E7=B4=A0=E6=9D=90?= =?UTF-8?q?=E8=90=BD=E3=80=8C=E5=BE=85=E5=BD=92=E7=B1=BB=E3=80=8D=EF=BC=88?= =?UTF-8?q?Issue=20359=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AGC Rust `upload_local_asset` 新增可选 `targetCategory`,登记改走 `register_local_asset_entry_with_category`(非法值失败关闭,不回退 kind 派生);`upload_local_asset_at` 委托新的 `upload_local_asset_at_with_category`,既有调用点与单测不动 - 前端 `uploadProjectAssetFilesAndReadSnapshot` 透传 `targetCategory`;栏目画布底部工具栏上传带上工具栏自己的栏目,与生成入口的 `targetCategory` 同一口径 - 新增 Rust 单测 `upload_registers_into_the_explicit_entry_category`(显式栏目 → character / 不传 → unclassified / 非法 version 失败关闭且不新增登记)与 appSurface 用例(在「角色与对象」上传图片,载荷必须带 `targetCategory: 'character'`) - 同步 PRD §3.10、`docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md` §4 载荷表、V3 验收用例 S11a、decision-log 与 pitfalls --- .../src-tauri/src/assets.rs | 84 ++++++++++++++++++- .../src-tauri/src/commands/desktop.rs | 9 +- .../src/view/project-development/index.tsx | 16 +++- .../projectResourceLiveUpdateModel.ts | 14 +++- .../appSurface/project-development.suite.ts | 46 ++++++++++ ...AI游戏创作】项目开发工作台PRD-2026-07-20.md | 2 +- .../shared-memory/decision-log.md | 8 ++ docs/project-memory/shared-memory/pitfalls.md | 8 ++ ...C】栏目画布底部工具栏入口矩阵-2026-09-13.md | 2 +- ...用例】AGC资源工作台V3端到端验收-2026-09-11.md | 2 +- 10 files changed, 182 insertions(+), 9 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/assets.rs b/apps/ai-game-creator-shell/src-tauri/src/assets.rs index 214a360e5..c45f849b8 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/assets.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/assets.rs @@ -567,6 +567,23 @@ pub(crate) fn upload_local_asset_at( file_name: &str, media_type: &str, bytes: &[u8], +) -> Result { + upload_local_asset_at_with_category(root, file_name, media_type, bytes, None) +} + +/// 带**显式入口栏目**的上传:只给 GUI 工具栏上传用(前端 `targetCategory`)。 +/// +/// 上传的 manifest `kind` 只由内容证据推导(图片 / 视频 / 代码 → `unclassified`), +/// 与栏目不是同一套词汇:在栏目画布里上传素材时,用户选定的栏目才是归属真相, +/// 否则素材会落进「待归类」、在上传它的那一栏里看不见。 +/// 取值校验与失败关闭沿用 [`register_local_asset_entry_with_category`]: +/// 非法值报错、绝不回退到 kind 派生;其它调用方继续走 [`upload_local_asset_at`]。 +pub(crate) fn upload_local_asset_at_with_category( + root: &Path, + file_name: &str, + media_type: &str, + bytes: &[u8], + target_category: Option<&str>, ) -> Result { if bytes.is_empty() { return Err("上传文件不能为空".to_string()); @@ -584,7 +601,7 @@ pub(crate) fn upload_local_asset_at( } crate::write_game_creator_private_file(&absolute_path, bytes, "上传文件")?; - register_local_asset_entry( + register_local_asset_entry_with_category( root, &relative_path, uploaded_asset_kind(file_name, media_type), @@ -602,6 +619,7 @@ pub(crate) fn upload_local_asset_at( generation_kind: None, reference_resource_ids: Vec::new(), }, + target_category, ) } @@ -2375,6 +2393,70 @@ mod tests { ); } + /// Issue 359:工具栏上传带上入口栏目,素材才不会落进「待归类」。 + /// + /// 上传的 manifest `kind` 只由内容证据推导,图片 / 视频 / 代码都派生成 `unclassified`; + /// 在栏目画布(如「角色与对象」)里上传时栏目才是归属真相。不传时保持既有行为, + /// 非法值失败关闭且不留下半成品登记。 + #[test] + fn upload_registers_into_the_explicit_entry_category() { + fn upload_category(root: &Path, asset_id: &str) -> GameCreationAppAssetCategory { + read_existing_manifest_for_project(root) + .expect("read manifest") + .assets + .into_iter() + .find(|asset| asset.id == asset_id) + .expect("uploaded asset is registered") + .category + } + + let temporary = tempfile::tempdir().expect("tempdir"); + let root = temporary.path(); + crate::project::init_local_game_project_at(root, "upload-category-test", "上传入口栏目") + .expect("init project"); + + let uploaded = upload_local_asset_at_with_category( + root, + "hero.png", + "image/png", + b"png-bytes", + Some("character"), + ) + .expect("upload with an entry category"); + assert_eq!( + upload_category(root, &uploaded.id), + GameCreationAppAssetCategory::Character + ); + + let plain = upload_local_asset_at(root, "plain.png", "image/png", b"png-bytes") + .expect("upload without an entry category"); + assert_eq!( + upload_category(root, &plain.id), + GameCreationAppAssetCategory::Unclassified + ); + + // 非法入口栏目(栏目侧伪值 `version` 不在枚举里)失败关闭:不新增登记。 + let assets_before = read_existing_manifest_for_project(root) + .expect("read manifest") + .assets + .len(); + assert!(upload_local_asset_at_with_category( + root, + "bad.png", + "image/png", + b"png-bytes", + Some("version"), + ) + .is_err()); + assert_eq!( + read_existing_manifest_for_project(root) + .expect("read manifest") + .assets + .len(), + assets_before + ); + } + /// 画板导出推断出的 kind 必须已经是 canonical 值。 #[test] fn canvas_export_asset_kind_is_always_canonical() { diff --git a/apps/ai-game-creator-shell/src-tauri/src/commands/desktop.rs b/apps/ai-game-creator-shell/src-tauri/src/commands/desktop.rs index 57a598049..8b7da7ad0 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/commands/desktop.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/commands/desktop.rs @@ -493,12 +493,19 @@ pub(crate) fn upload_local_asset( file_name: String, media_type: String, bytes: Vec, + target_category: Option, ) -> Result { let root = Path::new(project_path.trim()); enforce_project_permission_policy(root, "asset.upload")?; let _lock = acquire_project_write_lock(root, "asset.upload")?; advance_agent_runtime_project_revision_locked(root)?; - upload_local_asset_at(root, file_name.trim(), media_type.trim(), &bytes) + upload_local_asset_at_with_category( + root, + file_name.trim(), + media_type.trim(), + &bytes, + target_category.as_deref(), + ) } #[tauri::command] diff --git a/apps/ai-game-creator-shell/src/view/project-development/index.tsx b/apps/ai-game-creator-shell/src/view/project-development/index.tsx index df69d90a0..cfabbccf2 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/index.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/index.tsx @@ -9062,9 +9062,15 @@ export default function ProjectDevelopmentView({ [selectResourceCanvasPage], ); - /** 工具栏「上传」:与资源面板上传同一条「上传 + 配对读清单」链路。 */ + /** + * 工具栏「上传」:与资源面板上传同一条「上传 + 配对读清单」链路。 + * + * 入口栏目随上传一起交给原生(`targetCategory`):上传的 kind 只由内容证据推导 + * (图片 / 视频 / 代码 → `unclassified`),不带上它,素材会落进「待归类」、 + * 在上传它的那一栏里看不见。取值就是工具栏自己的栏目,与生成入口同一口径。 + */ const uploadResourceCanvasToolbarFiles = useCallback( - async (files: readonly File[]) => { + async (files: readonly File[], targetCategory: ResourceCategory | null) => { const invoke = window.__TAURI__?.core?.invoke; if (!invoke) { setResourceWorkbenchNotice('上传素材需要在客户端内打开'); @@ -9088,6 +9094,7 @@ export default function ProjectDevelopmentView({ bytes: Array.from(new Uint8Array(await file.arrayBuffer())), })), ), + targetCategory, invoke, }); setResourceWorkbenchNotice(`已上传 ${uploadable.length} 个素材`); @@ -10548,7 +10555,10 @@ export default function ProjectDevelopmentView({ } onSelectAction={handleResourceBottomToolAction} onUploadFiles={(files) => { - void uploadResourceCanvasToolbarFiles(files); + void uploadResourceCanvasToolbarFiles( + files, + resourceCanvasBottomToolbarCategory, + ); }} uploading={resourceBottomToolbarUploading} /> diff --git a/apps/ai-game-creator-shell/src/view/project-development/projectResourceLiveUpdateModel.ts b/apps/ai-game-creator-shell/src/view/project-development/projectResourceLiveUpdateModel.ts index 79b322249..35b7163bd 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/projectResourceLiveUpdateModel.ts +++ b/apps/ai-game-creator-shell/src/view/project-development/projectResourceLiveUpdateModel.ts @@ -1,4 +1,7 @@ -import type { GameCreationAppManifest } from '../../../../../packages/shared/src/contracts/gameCreationApp'; +import type { + GameCreationAppManifest, + ProjectResourceCanvasCategory, +} from '../../../../../packages/shared/src/contracts/gameCreationApp'; export type ProjectManifestSnapshotSource = | 'initial' @@ -285,6 +288,14 @@ export async function uploadProjectAssetFilesAndReadSnapshot(input: { mediaType: string; bytes: number[]; }[]; + /** + * 入口栏目:栏目画布里上传时由调用方显式给出当前栏目,原生按它登记归类。 + * + * 上传的 manifest `kind` 只由内容证据推导(图片 / 视频 / 代码 → `unclassified`), + * 不传这一项时素材会落进「待归类」、在上传它的那一栏里看不见。 + * 判定与失败关闭都在原生:非法值报错,前端不做伪分类。 + */ + targetCategory?: ProjectResourceCanvasCategory | null; invoke(command: string, args: Record): Promise; }): Promise { for (const file of input.files) { @@ -293,6 +304,7 @@ export async function uploadProjectAssetFilesAndReadSnapshot(input: { fileName: file.fileName, mediaType: file.mediaType, bytes: file.bytes, + ...(input.targetCategory ? { targetCategory: input.targetCategory } : {}), }); } const fresh = await rereadAuthoritativeProjectManifestSnapshot({ diff --git a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts index fd8e5bebf..b66ab4c34 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts @@ -8839,6 +8839,52 @@ export function registerProjectAgentStatusTests() { ); }, 20_000); + it('uploads toolbar files into the entry column so they stay visible where they were uploaded', async () => { + // Issue 359:图片只由内容证据派生成 `unclassified`,在「角色与对象」栏目里上传后 + // 会落进「待归类」、在上传它的那一栏里看不见。工具栏上传必须把当前栏目交给原生。 + const manifest = createGameCreationAppManifest( + 'workbench-bottom-toolbar-upload-category', + '底部工具栏上传归类项目', + ); + const { calls } = installResourceBookBottomToolbarInvoke(manifest); + + render( + React.createElement(ProjectDevelopmentView, { + projectName: manifest.name, + projectPath: '/tmp/workbench-bottom-toolbar-upload-category', + manifest, + attachments: [], + recentRunStatus: null, + recentRunStopReason: null, + chat: React.createElement('div', null, '项目总控'), + onHomeOpen: vi.fn(), + onProjectsOpen: vi.fn(), + }), + ); + + await openResourceBookCategory('角色与对象'); + const uploadInput = screen.getByLabelText( + '上传素材文件', + ) as HTMLInputElement; + const file = new File(['png'], 'hero.png', { type: 'image/png' }); + if (typeof file.arrayBuffer !== 'function') { + Object.defineProperty(file, 'arrayBuffer', { + value: async () => new Uint8Array([112, 110, 103]).buffer, + }); + } + fireEvent.change(uploadInput, { target: { files: [file] } }); + + await waitFor(() => + expect(uploadCall(calls, 'hero.png')).toMatchObject({ + projectPath: '/tmp/workbench-bottom-toolbar-upload-category', + fileName: 'hero.png', + mediaType: 'image/png', + targetCategory: 'character', + bytes: [112, 110, 103], + }), + ); + }, 20_000); + it('keeps the bottom toolbar clear of the zoom dock and above the book scene', () => { const styles = readFileSync( repoPath('apps/ai-game-creator-shell/src/styles.css'), diff --git a/docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md b/docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md index 14b25c309..9e38ea713 100644 --- a/docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md +++ b/docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md @@ -164,7 +164,7 @@ - 位置与层级:画布左下角(`left: 14px; bottom: 14px; z-index: 40`)。右下角是既有的缩放 / 撤销 Dock(`right: 14px; bottom: 14px`),左下角是画布上唯一两者都不占的稳定空位。工具栏是管理区 `.game-resource-book-manager` 的**直接子节点**、与画本场景并列,不进带 `scale()` 的场景层;二级菜单与「入口不可用原因」都贴着工具栏上沿弹出,不做内嵌内容。 - 外壳用共享 chrome(`packages/image-canvas-react` 的 `CanvasToolbar / CanvasToolbarGroup / CanvasChromeButton`),样式落在 AGC 的 `resourceCanvasChrome.css`;共享包只承接通用表现,不含业务规则。 -- 接线:图片类入口走本地 IPC `start_local_project_asset_generation`(`kind` ∈ `image / character / spec / icon-spec / ui-prototype / art-spritesheet`;**提交即返回任务记录**,生成由 Rust 后台任务跑完写回项目,进度用 `list_local_project_asset_generations` 读回项目内账本 `.agent/runtime/asset-generation-tasks/tasks.json`);音频入口也走 `start_local_project_asset_generation`(同一份项目内任务账本;`kind` = `sound-effect` / `background-music`,并额外携带该次生成的请求身份 `idempotencyKey`,任务 id 即该次生成的 operation id;生成仍复用既有音频无源生成链路,`generationMode: 'create'`、`editKind` = `sound-effect` / `background-music`,不新增平台路由与请求体口径);「上传」复用 `upload_local_asset`。生成 / 上传成功后一律用「配对读 `(revision, manifest)`」交给 `onManifestChange`,走既有 manifest 刷新与资源投影链路,不重算依赖图、不另写布局。 +- 接线:图片类入口走本地 IPC `start_local_project_asset_generation`(`kind` ∈ `image / character / spec / icon-spec / ui-prototype / art-spritesheet`;**提交即返回任务记录**,生成由 Rust 后台任务跑完写回项目,进度用 `list_local_project_asset_generations` 读回项目内账本 `.agent/runtime/asset-generation-tasks/tasks.json`);音频入口也走 `start_local_project_asset_generation`(同一份项目内任务账本;`kind` = `sound-effect` / `background-music`,并额外携带该次生成的请求身份 `idempotencyKey`,任务 id 即该次生成的 operation id;生成仍复用既有音频无源生成链路,`generationMode: 'create'`、`editKind` = `sound-effect` / `background-music`,不新增平台路由与请求体口径);「上传」复用 `upload_local_asset`,并带上当前栏目 `targetCategory`(上传的 manifest `kind` 只由内容证据推导,图片 / 视频 / 代码都派生成 `unclassified`;不带入口栏目素材就落进「待归类」、在上传它的那一栏里看不见,Issue 359)。生成 / 上传成功后一律用「配对读 `(revision, manifest)`」交给 `onManifestChange`,走既有 manifest 刷新与资源投影链路,不重算依赖图、不另写布局。 - 本地排队与进度可见:AGC 本地 durable 输出槽已按**精确动作指纹**分槽(不同 prompt / 素材名各自独立成槽,具备并行能力),但本批前端仍按「同一时刻只派发一条」排队——真并行派发需要并发收口设计(配对读 + manifest CAS + 聚焦意图互不覆盖),留待下一批;所以第一条未终态时第二条提交停在**前端本地队列**里(不调用提交 IPC,显示本地排队的「排队中。」),前一条终态后自动补发;任务状态与阶段文案(后端 `phaseDetail`)由任务账本提供,前端不拼阶段、不做百分比。进度面是**画布上常驻的可折叠任务侧栏**(位置与开合形态照抄网页端美术画布的任务侧栏的右上角锚点,颜色与外形仍走 AGC 平台 token;2026-09-21 由「左侧贴边 + 工具条入口」改为「右上角锚点 + 常驻开关」):展开是两个分栏「排队/生成中」与「已完成」(各带条数,「已完成」封顶 20 条 + 列表滚动 + 高度有界),关闭入口只保留头部那一枚 ×(底部重复的关闭按钮与其分割线已删除)、折叠即整块让出画布、只留那一枚右上角开关(工具条上不再有重复入口),开合只走画布右上角那一枚「生成任务 · N」开关(两个页签下都在;**展开后开关让位、只留面板**,收起走面板头部 × 或点画布外部);锚点是画布那一格网格里的条目(不是写死 `top` 的绝对定位),工具条换行变高也不会压上去;每项显示状态徽标 / 阶段文案 / 已耗时 / 素材名,可「定位到素材」。侧栏非模态(不铺全屏遮罩、不做焦点陷阱、不参与模态遮挡判据),位置在画布右上角锚点里(照抄美术画布那一处)、**覆盖式**(不 reflow 挤窄画布视口),提交受理后自动展开。锚点按工作面分档:资源栏目画布与 UI 编辑器用画布顶边那一档,运行表现层下移让开右上角的版本入口;锚点是**画布那一格网格里的条目**(不是写死 `top` 的绝对定位),所以工具条换行变高也不会压上去。定位动作**每次点击都终局化**:能定位就定位并选中;素材在别的栏目先切栏目;不在投影里给「素材已不在项目里 / 已登记但尚未同步」的结论;3 秒内有界兜底,不允许提示条永久停在「正在定位生成的素材…」。 - 面板形态:独立浮层(`ThemedModal`),**不在当前面板下面追加内容**;面板内不写功能说明或规则解释文案。**点「生成」即同步关闭面板**(不等 IPC、不等排队、不等生成),面板里**不出现**「排队中。」「正在生成。」「提交中…」这类阶段文案——阶段文案的唯一去处是任务侧栏与工具栏提示条。**只有「点击瞬间就失败」**(校验不过、权限拒绝、start IPC 立即报错)才自动重开面板并带回草稿与原因;**受理之后才失败**只在侧栏把该任务收口为失败 + 原因,不重开面板。关闭 ≠ 取消请求(请求挂在任务与账本上,不挂在面板生命周期上)。 - 参数口径:比例 / 尺寸选项来自网页端美术画布的纯模型(`src/components/image-editor/ImageCanvasGenerationModel.ts`),并按本地 IPC 白名单收窄(本地通道明确拒绝 `4:3`);默认档 `1:1 · 1K`,生成 UI 设计图沿用网页端 UI 设计面板的默认 `16:9 · 1K`。本地 IPC 没有 `model` 入参,因此面板**不渲染模型选择器**(渲染一个改不了请求的控件就是假控件)。 diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index 29d76aed1..4aa91f9be 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -1,5 +1,13 @@ # 决策记录 +## 2026-10-03 AGC 栏目画布上传素材按入口栏目登记(Issue 359) + +- 背景:AGC 客户端在资源栏目子画布(「UI 交互 / 角色与对象 / 场景与环境 / 音频」)左下角工具栏点「上传」后,提示条给出「已上传 1 个素材」,但当前栏目计数不变(仍「0 项」)、素材出现在「待归类」,用户看到的是"上传成功了但它从这一页消失了"。原因是上传登记的 manifest `kind` 只由**内容证据**推导(`assets.rs::uploaded_asset_kind`:图片 / 视频 / 代码 → `unclassified`,音频 → `audio`,文档 / 字体 → `document`),kind 派生分类与栏目词汇(`ui-interaction` / `character` / `scene` / `audio`)不是同一套,而 `upload_local_asset` 原先不接受入口栏目。 +- 决策:`upload_local_asset` 增加可选 `targetCategory`,Rust 走既有的 `register_local_asset_entry_with_category`(与生成入口 `start_local_project_asset_generation` 的 `targetCategory` **同一口径**:GUI 完成登记以入口栏目为准);前端 `uploadProjectAssetFilesAndReadSnapshot` 透传该字段,栏目画布工具栏上传取工具栏自己的栏目(`resourceCanvasBottomToolbarCategory`)。取值只接受共享分类枚举,非法值由原生失败关闭,前端不做伪分类。 +- 边界:不传 `targetCategory` 时保持既有 kind 派生行为——资源面板(`ResourceCanvasPanelView`,跨栏目列表而不是栏目工具)、UI 编辑器图片导入(`import_ui_editor_local_files`)、聊天附件上传都不变。`upload_local_asset_at` 签名保持不变(委托到新的 `upload_local_asset_at_with_category`),既有约 25 处调用点与 Rust 单测零改动。 +- 影响范围:`apps/ai-game-creator-shell/src-tauri/src/{assets.rs,commands/desktop.rs}`、`apps/ai-game-creator-shell/src/view/project-development/{projectResourceLiveUpdateModel.ts,index.tsx}`、`apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts`、PRD §3.10、`docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md`(§4 载荷表)、`docs/technical/【测试用例】AGC资源工作台V3端到端验收-2026-09-11.md`(S11a)、`pitfalls.md`。 +- 验证:`cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --features=cocos-editor-execute,unity-editor-execute,godot-editor-execute --bin genarrative-ai-game-creator-shell assets::tests`(新增 `upload_registers_into_the_explicit_entry_category`:显式栏目 → `character`、不传 → `unclassified`、非法 `version` 失败关闭且不新增登记);`npx vitest run apps/ai-game-creator-shell/tests/appSurface.test.ts`(196 passed / 9 skipped,含新增「uploads toolbar files into the entry column so they stay visible where they were uploaded」断言工具栏上传载荷带 `targetCategory: 'character'`);`npm run agc:typecheck`、`npm run check:encoding`、`git diff --check`。 + ## 2026-10-03 生成绑定不再经 prettier:ts-rs 原始输出即提交形态 - 背景:`scripts/check-generated-bindings.mjs` 对 AGC 的 `chat/generated` / `services/generated` 在重生成后会就地跑一遍 `npx prettier --write` 再比较。这会直接改写生成文件,还把「Rust 声明真的变了」与「prettier 版本 / 配置造成的格式漂移」混在同一条告警里——本次报出的 `ThreadRequestKind.ts` / `TurnCompletedStatus.ts`「内容变化」无法复现为语义变化(已提交内容与当前 Rust 枚举一致),prettier 归一化把格式差异也报成了「与 Rust 声明不一致」;生成物被仓库格式化工具二次改写后,重跑 `cargo test export_bindings` 也不再幂等。 diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 521c0a27b..02594596b 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -2,6 +2,14 @@ 这里只记录对当前开发仍有用的症状、根因、排查方法和风险边界。同一事实保留一个当前口径;退役对象的专属过程与单轮测试结果由 Git 历史追溯。遇到旧路径或版本时,以现行代码和专题文档为准。 +## 2026-10-03 AGC 栏目画布上传素材落「待归类」:kind 派生分类不等于入口栏目 + +- **现象**(Issue 359):在 AGC 资源栏目子画布(如「UI 交互」「角色与对象」)左下角工具栏点「上传」选图片 / 视频 / 代码类文件,提示条给出「已上传 1 个素材」,但当前栏目计数纹丝不动(仍「0 项」),素材出现在「待归类」。用户看到的是"上传成功了,可它就消失在这个页面里"。 +- **原因**:上传登记的 manifest `kind` 只由**内容证据**推导(`assets.rs::uploaded_asset_kind`:图片 / 视频 / 代码 → `unclassified`,音频 → `audio`,文档 / 字体 → `document`),kind 派生分类与栏目词汇(`ui-interaction` / `character` / `scene` / `audio`)不是同一套;`upload_local_asset` 原先不接受入口栏目,GUI 工具栏上传只能落 kind 派生分类。 +- **处理(现行口径)**:`upload_local_asset` 增加可选 `targetCategory`,Rust 走既有的 `register_local_asset_entry_with_category`(非法值失败关闭,不回退 kind 派生);栏目画布工具栏上传时取工具栏自己的栏目(`resourceCanvasBottomToolbarCategory`)。生成入口 `start_local_project_asset_generation` 的 `targetCategory` 是同一口径——GUI 完成登记以入口栏目为准。 +- **判据/取证**:`cargo test --locked ... --bin genarrative-ai-game-creator-shell upload_` 的 `assets::tests::upload_registers_into_the_explicit_entry_category`(显式栏目 → `character`;不传 → `unclassified`;非法 `version` 失败关闭且不新增登记);appSurface「uploads toolbar files into the entry column so they stay visible where they were uploaded」断言工具栏上传载荷带 `targetCategory: 'character'`。 +- **边界**:资源面板(跨栏目列表)、UI 编辑器图片导入、聊天附件上传都**不带**入口栏目,保持 kind 派生。任何新增的「某个栏目里的上传入口」都必须显式带上当前栏目,否则又会复现本坑。 + ## 2026-10-01 用户输错一次密码被当成"客户端出问题了"引导上报 - **现象**:登录页密码输错(或密码长度不合规)后弹出「发现问题」,报告面板「错误事件(2)」列出 `密码长度需要在 6 到 128 位之间 — auth · 1 次` 与 `手机号或密码错误 — auth · 1 次`,默认全选,与 react-render / 5xx / agent-runtime 终态失败视觉等价。 diff --git a/docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md b/docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md index 1de78d7c0..b7da13037 100644 --- a/docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md +++ b/docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md @@ -42,7 +42,7 @@ | 生成 UI 设计图 | 同上 | `kind: 'ui-design'`,默认 `16:9 · 1K`;前置同上 | | 生成背景音乐 | `start_local_project_asset_generation` | `kind: 'background-music'`、`idempotencyKey`;任务 id 即该次生成的 operation id | | 生成音效 | `start_local_project_asset_generation` | `kind: 'sound-effect'`、其余同上 | -| 上传 | `upload_local_asset` | `{ projectPath, fileName, mediaType, bytes }` | +| 上传 | `upload_local_asset` | `{ projectPath, fileName, mediaType, bytes, targetCategory }`;`targetCategory` = 当前栏目(Issue 359) | `start_local_project_asset_generation` 的完整参数是 `{ projectPath, projectId, taskId, kind, prompt, aspectRatio, imageSize, assetName, outputPath, idempotencyKey }`(Rust `src-tauri/src/asset_generation_tasks.rs`);图片类入口沿用 `{ projectPath, projectId, taskId, kind, prompt, aspectRatio, imageSize, assetName, outputPath }` 逐字不变,音频入口只带 `{ projectPath, projectId, taskId, kind, prompt, assetName, idempotencyKey }`(`idempotencyKey` = 该次生成的幂等键,任务 id 即 operation id;原生命令内部仍复用既有音频无源生成链路,不新增平台路由与请求体口径),**提交即返回**一条任务记录(`taskId / status / phaseDetail / assetId / error` 等);生成在 `tauri::async_runtime::spawn` 出来的后台任务里跑,账本落在项目内 `.agent/runtime/asset-generation-tasks/tasks.json`,进度由 `list_local_project_asset_generations` 读回。截图面板不再「等生成结束」,所以**点「生成」即同步关闭面板**(不等 IPC),面板内不出现阶段文案;只有「点击瞬间就失败」才带草稿重开(关闭 ≠ 取消)。 diff --git a/docs/technical/【测试用例】AGC资源工作台V3端到端验收-2026-09-11.md b/docs/technical/【测试用例】AGC资源工作台V3端到端验收-2026-09-11.md index 08df2cc5f..07b6c5b88 100644 --- a/docs/technical/【测试用例】AGC资源工作台V3端到端验收-2026-09-11.md +++ b/docs/technical/【测试用例】AGC资源工作台V3端到端验收-2026-09-11.md @@ -57,7 +57,7 @@ | **S15** 删除 | 工具条 / 标签面板「删除」→ 确认弹窗 | 三分支:① 无引用→直接删;② 被引用未勾选→只删素材、版本保留**悬空绑定**、界面不合成幽灵资源卡;③ 勾选→素材与该批版本在**同一次 manifest 写入**内一起删 | L413(版本只追加的唯一例外)、L532–533;#309 C5 | 弹窗 `ariaLabel="确认删除资源"`;被引用时出现 `被 N 个游戏版本使用` + 版本列表 + checkbox `把相关游戏版本一并删除`;无引用时该 body 整块不渲染 | **只摘登记、不删磁盘文件**;读引用命令精确名是 `read_local_project_asset_references` | | **S15a** 替换素材(面板内选 + 画布点选目标) | 选中被**当前版本**绑定的素材 → 工具条「替换素材」→ 画布右上角出现非模态候选面板(面板内可筛可选)→ 直接在画布上点目标素材(或点面板里的候选)→ 面板「确认」 | 面板确认与画布点选是**同一条**写入链路(`replace_local_project_version_resource`,载荷逐字一致):改该版本绑定、不建新版本;画布点选只把目标落成面板的当前选择,确认后才写入 | PRD §5.3 / §7.8 第 8 条;#309「直接替换」口径 | 面板判据:`role="dialog"` 名为「选择替换素材」、挂 `.image-canvas-editor__project-asset-picker--floating`、**没有** `.platform-overlay` 遮罩;点画布候选后面板里该候选 `aria-selected="true"`、面板里的搜索词与分类筛选保持原样、零写入;非法目标(源素材本身 / 不在权威候选里 / 分类不同 / 未登记资源)在面板里出现 `role="alert"`(「替换素材与源素材相同」/「替换素材未登记或已被删除」/「替换素材不兼容:分类不同」)且零写入;面板关闭 = 卸载;Esc 只收面板(画布全局 Esc 的清选中不随之触发) | 点选只能点**当前画布上可见**的卡:目标在别的栏目时先切栏目(替换会话跨栏目存活,不因「收起资源」或切栏目结束);面板开着时空白处仍可框选 / 平移,卡片单击语义的恢复发生在面板关闭之后 | -| **S11a** 栏目画布底部工具栏 | 进「UI 交互 / 角色与对象 / 场景与环境 / 音频」任一栏目 → 点左下角工具栏里的入口生成 → 「收起资源」回总览看工具栏消失 | 工具栏只在矩阵四个栏目(功能画布)渲染;图片类入口走 `start_local_project_asset_generation`(提交即返回、生成在后台跑),音频入口走同一条命令的音频载荷,上传复用 `upload_local_asset`;生成 / 上传成功后走既有 manifest 刷新与资源定位 | PRD §3.10、§7.9 | DOM 判据 `[data-resource-bottom-toolbar=""]`(资源总览、「所有资源」展开态、文档、待归类、项目版本都**没有**这个节点);工具栏是 `.game-resource-book-manager` 的直接子节点(`closest('.game-resource-book-scene')` 为 `null`);每个入口一次 `start_local_project_asset_generation`:图片类载荷逐字为 `{ projectPath, projectId, taskId, kind, prompt, aspectRatio, imageSize, assetName, outputPath }`(`kind` 映射见 PRD §7.9 第 3 条;`taskId` 是前端每次提交新铸的本地任务 id),音频类载荷为 `{ projectPath, projectId, taskId, kind, prompt, assetName, idempotencyKey }`(`taskId` 即该次生成的 operation id,不发图片类那套比例 / 尺寸 / 参考 / 落点参数);该命令提交即返回,之后有 `list_local_project_asset_generations` 轮询与 `get_local_game_project_revision` + `get_local_game_manifest` 的配对读;点「生成」即把这次输入交给后台账本并**同步关闭**面板(不等 IPC、不等排队、不等生成,画布立即恢复可交互;面板 DOM 里没有阶段文案与「后台运行并关闭」这类在途按钮),关闭不等于取消,关闭后任务仍出现在「生成任务」面板(入口按钮 `aria-label="生成任务"`,非模态浮层、无 `aria-modal`)并显示后端 `phaseDetail`;第一条未终态时提交第二条 → 第二条显示「排队中。」且生成提交 IPC 次数仍为 1,第一条终态后自动补发(次数变 2);缺 `assets/art-spec.png` 时「生成图标素材 / 生成 UI 设计图」仍可点击(`aria-disabled="true"` 但**不是**原生 disabled)并给出含该路径的 `role="alert"` 原因、零生成请求;音频入口面板标题即「生成背景音乐」/「生成音效」且没有类型选择器 | ① 本地通道没有 `model` / `specType` / `replaceExisting` 入参:面板不渲染模型选择器,角色规范与自定义规范共用 `spec` 通道(靠 `assetName` 与提示词区分),「图标规范」在项目已有权威规范图时不再指向 `assets/art-spec.png`(否则会被 Rust 的防覆盖校验硬拒);② 本轮不做生成视频 / 宣发素材 / 生成游戏场景 / 选择工具 / 抓手工具;③ 既有「生成素材」浮层入口只保留生成视频,音频入口只在音频栏目工具栏出现 | +| **S11a** 栏目画布底部工具栏 | 进「UI 交互 / 角色与对象 / 场景与环境 / 音频」任一栏目 → 点左下角工具栏里的入口生成 → 「收起资源」回总览看工具栏消失 | 工具栏只在矩阵四个栏目(功能画布)渲染;图片类入口走 `start_local_project_asset_generation`(提交即返回、生成在后台跑),音频入口走同一条命令的音频载荷,上传复用 `upload_local_asset` 并带上当前栏目 `targetCategory`(素材落在上传它的那一栏,不落「待归类」);生成 / 上传成功后走既有 manifest 刷新与资源定位 | PRD §3.10、§7.9 | DOM 判据 `[data-resource-bottom-toolbar=""]`(资源总览、「所有资源」展开态、文档、待归类、项目版本都**没有**这个节点);工具栏是 `.game-resource-book-manager` 的直接子节点(`closest('.game-resource-book-scene')` 为 `null`);每个入口一次 `start_local_project_asset_generation`:图片类载荷逐字为 `{ projectPath, projectId, taskId, kind, prompt, aspectRatio, imageSize, assetName, outputPath }`(`kind` 映射见 PRD §7.9 第 3 条;`taskId` 是前端每次提交新铸的本地任务 id),音频类载荷为 `{ projectPath, projectId, taskId, kind, prompt, assetName, idempotencyKey }`(`taskId` 即该次生成的 operation id,不发图片类那套比例 / 尺寸 / 参考 / 落点参数);该命令提交即返回,之后有 `list_local_project_asset_generations` 轮询与 `get_local_game_project_revision` + `get_local_game_manifest` 的配对读;点「生成」即把这次输入交给后台账本并**同步关闭**面板(不等 IPC、不等排队、不等生成,画布立即恢复可交互;面板 DOM 里没有阶段文案与「后台运行并关闭」这类在途按钮),关闭不等于取消,关闭后任务仍出现在「生成任务」面板(入口按钮 `aria-label="生成任务"`,非模态浮层、无 `aria-modal`)并显示后端 `phaseDetail`;第一条未终态时提交第二条 → 第二条显示「排队中。」且生成提交 IPC 次数仍为 1,第一条终态后自动补发(次数变 2);缺 `assets/art-spec.png` 时「生成图标素材 / 生成 UI 设计图」仍可点击(`aria-disabled="true"` 但**不是**原生 disabled)并给出含该路径的 `role="alert"` 原因、零生成请求;音频入口面板标题即「生成背景音乐」/「生成音效」且没有类型选择器 | ① 本地通道没有 `model` / `specType` / `replaceExisting` 入参:面板不渲染模型选择器,角色规范与自定义规范共用 `spec` 通道(靠 `assetName` 与提示词区分),「图标规范」在项目已有权威规范图时不再指向 `assets/art-spec.png`(否则会被 Rust 的防覆盖校验硬拒);② 本轮不做生成视频 / 宣发素材 / 生成游戏场景 / 选择工具 / 抓手工具;③ 既有「生成素材」浮层入口只保留生成视频,音频入口只在音频栏目工具栏出现 | ### D 阶段 · 版本与运行 From 4b529a8952134913a6d1d567ef7f7575bdfbadaf Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Sat, 3 Oct 2026 17:17:40 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=8E=A5=E5=85=A5=E4=B8=8E=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=94=B6=E9=93=B6=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增支付应用、API Key 与外部产品订单接口 接入微信 Native 下单、二维码收银台与支付结果回调 新增后台支付订单与回调投递页面 补齐 SpacetimeDB 支付表、生成绑定、OpenAPI 与使用说明 --- apps/admin-web/src/api/adminApiClient.ts | 7 + apps/admin-web/src/api/adminApiTypes.ts | 33 + apps/admin-web/src/app/AdminApp.tsx | 7 + apps/admin-web/src/app/AdminShell.tsx | 1 + apps/admin-web/src/app/adminRoutes.ts | 2 + .../src/pages/AdminPaymentOrderPage.tsx | 198 +++ docs/README.md | 2 + .../genarrative-external-v1.openapi.json | 96 ++ ...®ž施计划】支付应用与订单收银台-2026-10-03.md | 52 + ...�里程碑】支付应用与订单收银台-2026-10-03.md | 59 + .../payment-checkout-mobile.png | Bin 0 -> 69497 bytes .../payment-checkout.png | Bin 0 -> 145057 bytes .../profile-payment-login.png | Bin 0 -> 572198 bytes ...明】支付服务接入与收银台使用说明-2026-10-03.md | 310 +++++ ...„】server-rs与SpacetimeDB数据契约-2026-05-15.md | 26 +- ...Š€术方案】外部产品支付服务接入-2026-10-03.md | 202 +++ packages/shared/src/contracts/payment.ts | 55 + packages/shared/src/index.ts | 1 + server-rs/crates/api-server/src/admin.rs | 10 + server-rs/crates/api-server/src/app.rs | 5 + .../api-server/src/external_api_auth.rs | 74 +- server-rs/crates/api-server/src/main.rs | 5 + .../crates/api-server/src/modules/admin.rs | 2 + .../api-server/src/modules/external_api.rs | 18 +- .../crates/api-server/src/modules/profile.rs | 27 + server-rs/crates/api-server/src/payment.rs | 556 ++++++++ .../crates/api-server/src/payment_admin.rs | 144 ++ .../crates/api-server/src/payment_webhook.rs | 135 ++ .../api-server/src/state/external_api_auth.rs | 21 +- server-rs/crates/api-server/src/wechat/pay.rs | 17 + server-rs/crates/module-runtime/src/lib.rs | 2 + .../crates/module-runtime/src/payment.rs | 532 ++++++++ server-rs/crates/platform-wechat/src/pay.rs | 5 +- server-rs/crates/shared-contracts/src/lib.rs | 1 + .../crates/shared-contracts/src/payment.rs | 106 ++ .../crates/spacetime-client/src/active.rs | 2 + .../spacetime-client/src/active/mapper.rs | 17 + .../src/active/mapper/payment.rs | 516 +++++++ .../spacetime-client/src/active/payment.rs | 324 +++++ .../spacetime-client/src/module_bindings.rs | 185 +++ ...te_payment_api_key_and_return_procedure.rs | 59 + ...m_payment_webhooks_and_return_procedure.rs | 59 + ...te_payment_webhook_and_return_procedure.rs | 59 + ...te_payment_api_key_and_return_procedure.rs | 59 + ...create_payment_app_and_return_procedure.rs | 59 + ...eate_payment_order_and_return_procedure.rs | 59 + ...ue_payment_webhook_and_return_procedure.rs | 59 + .../get_payment_order_and_return_procedure.rs | 59 + ..._by_checkout_token_and_return_procedure.rs | 59 + ...t_payment_api_keys_and_return_procedure.rs | 59 + .../list_payment_apps_and_return_procedure.rs | 59 + ...ist_payment_orders_and_return_procedure.rs | 59 + ...payment_order_paid_and_return_procedure.rs | 59 + ...provider_attempted_and_return_procedure.rs | 62 + ...payment_api_key_authenticate_input_type.rs | 16 + .../payment_api_key_create_input_type.rs | 22 + .../payment_api_key_list_input_type.rs | 15 + .../payment_api_key_revoke_input_type.rs | 17 + .../payment_api_key_snapshot_type.rs | 24 + .../module_bindings/payment_api_key_table.rs | 259 ++++ .../module_bindings/payment_api_key_type.rs | 85 ++ .../payment_app_create_input_type.rs | 19 + .../payment_app_list_input_type.rs | 15 + .../payment_app_procedure_result_type.rs | 23 + .../payment_app_snapshot_type.rs | 21 + .../src/module_bindings/payment_app_table.rs | 228 ++++ .../src/module_bindings/payment_app_type.rs | 69 + .../payment_app_update_input_type.rs | 18 + .../payment_order_checkout_get_input_type.rs | 15 + .../payment_order_create_input_type.rs | 31 + .../payment_order_get_input_type.rs | 16 + .../payment_order_list_input_type.rs | 17 + .../payment_order_mark_paid_input_type.rs | 18 + .../payment_order_procedure_result_type.rs | 20 + ...yment_order_provider_attempt_input_type.rs | 16 + .../payment_order_provider_code_input_type.rs | 17 + .../payment_order_snapshot_type.rs | 38 + .../payment_order_status_type.rs | 26 + .../module_bindings/payment_order_table.rs | 328 +++++ .../src/module_bindings/payment_order_type.rs | 142 ++ .../module_bindings/payment_provider_type.rs | 16 + .../payment_webhook_claim_input_type.rs | 18 + .../payment_webhook_complete_input_type.rs | 21 + .../payment_webhook_delivery_snapshot_type.rs | 29 + .../payment_webhook_delivery_table.rs | 231 ++++ .../payment_webhook_delivery_type.rs | 96 ++ .../payment_webhook_enqueue_input_type.rs | 18 + .../payment_webhook_procedure_result_type.rs | 20 + ...ke_payment_api_key_and_return_procedure.rs | 59 + ...rder_provider_code_and_return_procedure.rs | 59 + ...update_payment_app_and_return_procedure.rs | 59 + .../crates/spacetime-module/src/active.rs | 2 + .../crates/spacetime-module/src/migration.rs | 4 + .../spacetime-module/src/payment_storage.rs | 1199 +++++++++++++++++ .../platform-entry/PaymentCheckoutView.tsx | 199 +++ .../PlatformActiveProfileView.tsx | 8 + .../PlatformEntryActiveFlowShell.tsx | 24 +- .../PlatformPaymentServiceView.tsx | 347 +++++ .../platformEntryActiveTypes.ts | 2 + src/index.css | 65 + src/routing/activeAppPageRoutes.test.ts | 7 + src/routing/activeAppPageRoutes.ts | 8 +- src/services/activeAppTitle.ts | 2 + src/services/payment/paymentCheckoutClient.ts | 11 + .../platform-entry/platformProfileClient.ts | 63 + 105 files changed, 8656 insertions(+), 10 deletions(-) create mode 100644 apps/admin-web/src/pages/AdminPaymentOrderPage.tsx create mode 100644 docs/project-memory/plans/【实施计划】支付应用与订单收银台-2026-10-03.md create mode 100644 docs/project-memory/plans/【里程碑】支付应用与订单收银台-2026-10-03.md create mode 100644 docs/technical/assets/payment-service-20261003/payment-checkout-mobile.png create mode 100644 docs/technical/assets/payment-service-20261003/payment-checkout.png create mode 100644 docs/technical/assets/payment-service-20261003/profile-payment-login.png create mode 100644 docs/【使用说明】支付服务接入与收银台使用说明-2026-10-03.md create mode 100644 docs/【技术方案】外部产品支付服务接入-2026-10-03.md create mode 100644 packages/shared/src/contracts/payment.ts create mode 100644 server-rs/crates/api-server/src/payment.rs create mode 100644 server-rs/crates/api-server/src/payment_admin.rs create mode 100644 server-rs/crates/api-server/src/payment_webhook.rs create mode 100644 server-rs/crates/module-runtime/src/payment.rs create mode 100644 server-rs/crates/shared-contracts/src/payment.rs create mode 100644 server-rs/crates/spacetime-client/src/active/mapper/payment.rs create mode 100644 server-rs/crates/spacetime-client/src/active/payment.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/authenticate_payment_api_key_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/claim_payment_webhooks_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/complete_payment_webhook_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/create_payment_api_key_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/create_payment_app_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/create_payment_order_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/enqueue_payment_webhook_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/get_payment_order_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/get_payment_order_by_checkout_token_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/list_payment_api_keys_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/list_payment_apps_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/list_payment_orders_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/mark_payment_order_paid_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/mark_payment_order_provider_attempted_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_authenticate_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_create_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_list_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_revoke_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_snapshot_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_table.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_app_create_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_app_list_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_app_procedure_result_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_app_snapshot_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_app_table.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_app_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_app_update_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_checkout_get_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_create_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_get_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_list_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_mark_paid_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_procedure_result_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_provider_attempt_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_provider_code_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_snapshot_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_status_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_table.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_order_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_provider_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_claim_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_complete_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_snapshot_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_table.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_enqueue_input_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_procedure_result_type.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/revoke_payment_api_key_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/set_payment_order_provider_code_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-client/src/module_bindings/update_payment_app_and_return_procedure.rs create mode 100644 server-rs/crates/spacetime-module/src/payment_storage.rs create mode 100644 src/components/platform-entry/PaymentCheckoutView.tsx create mode 100644 src/components/platform-entry/PlatformPaymentServiceView.tsx create mode 100644 src/services/payment/paymentCheckoutClient.ts diff --git a/apps/admin-web/src/api/adminApiClient.ts b/apps/admin-web/src/api/adminApiClient.ts index ec574237d..e068b3adb 100644 --- a/apps/admin-web/src/api/adminApiClient.ts +++ b/apps/admin-web/src/api/adminApiClient.ts @@ -49,6 +49,7 @@ import type { AdminLoginResponse, AdminMeResponse, AdminOverviewResponse, + AdminPaymentOrderListResponse, AdminProjectSnapshotChannelsResponse, AdminProjectSnapshotListQuery, AdminProjectSnapshotListResponse, @@ -801,6 +802,12 @@ export function listAdminRechargeOrders( ); } +export function listAdminPaymentOrders(token: string) { + return request('/admin/api/payment/orders', { + token, + }); +} + export function getAdminUserDetail(token: string, query: AdminUserDetailQuery) { return request( `/admin/api/profile/users/detail${buildAdminUserDetailQuery(query)}`, diff --git a/apps/admin-web/src/api/adminApiTypes.ts b/apps/admin-web/src/api/adminApiTypes.ts index 1f7ffeec2..1e540beae 100644 --- a/apps/admin-web/src/api/adminApiTypes.ts +++ b/apps/admin-web/src/api/adminApiTypes.ts @@ -1054,6 +1054,39 @@ export interface AdminWechatPaymentCheckPayload { knownRefundsRefreshed: number; } +export interface AdminPaymentOrderEntry { + orderId: string; + appId: string; + ownerUserId: string; + merchantOrderId: string; + title: string; + amountCents: number; + currency: string; + provider: string; + providerTradeNo: string | null; + status: string; + createdAt: string; + expiresAt: string; + paidAt: string | null; +} + +export interface AdminPaymentOrderListResponse { + entries: AdminPaymentOrderEntry[]; + webhooks: AdminPaymentWebhookEntry[]; +} + +export interface AdminPaymentWebhookEntry { + deliveryId: string; + orderId: string; + appId: string; + callbackUrl: string; + status: string; + attemptCount: number; + availableAt: string; + lastErrorMessage: string | null; + updatedAt: string; +} + export interface AdminRechargeRefundPreviewResponse { order: AdminRechargeOrderEntryPayload; paymentCheck: AdminWechatPaymentCheckPayload; diff --git a/apps/admin-web/src/app/AdminApp.tsx b/apps/admin-web/src/app/AdminApp.tsx index 374bc8e45..52957c245 100644 --- a/apps/admin-web/src/app/AdminApp.tsx +++ b/apps/admin-web/src/app/AdminApp.tsx @@ -36,6 +36,7 @@ import { AdminGrayReleaseConfigPage } from '../pages/AdminGrayReleaseConfigPage' import { AdminInviteCodePage } from '../pages/AdminInviteCodePage'; import { AdminLoginPage } from '../pages/AdminLoginPage'; import { AdminOverviewPage } from '../pages/AdminOverviewPage'; +import { AdminPaymentOrderPage } from '../pages/AdminPaymentOrderPage'; import { AdminProfileWalletConfigPage } from '../pages/AdminProfileWalletConfigPage'; import { AdminProjectSnapshotsPage } from '../pages/AdminProjectSnapshotsPage'; import { AdminRechargeOrderPage } from '../pages/AdminRechargeOrderPage'; @@ -297,6 +298,12 @@ export function AdminApp() { onUnauthorized={handleUnauthorized} /> ) : null} + {activeRouteId === 'payment-orders' ? ( + + ) : null} {activeRouteId === 'editor-generation-pricing' ? ( void; +}; + +function statusTone(status: string): 'ok' | 'pending' | 'error' { + if (status === 'paid') return 'ok'; + if (status === 'closed' || status === 'expired') return 'error'; + return 'pending'; +} + +export function AdminPaymentOrderPage({ + token, + onUnauthorized, +}: AdminPaymentOrderPageProps) { + const [entries, setEntries] = useState([]); + const [webhooks, setWebhooks] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(''); + + const load = useCallback(() => { + setIsLoading(true); + setError(''); + void listAdminPaymentOrders(token) + .then((response) => { + setEntries(response.entries ?? []); + setWebhooks(response.webhooks ?? []); + }) + .catch((nextError: unknown) => { + handlePageError(nextError, onUnauthorized, (message) => + setError(message || formatAdminApiError(nextError)), + ); + }) + .finally(() => setIsLoading(false)); + }, [onUnauthorized, token]); + + useEffect(() => { + load(); + }, [load]); + + return ( + + + 刷新 + + } + /> + 暂无外部回调记录。} + columns={[ + { + key: 'delivery', + label: '投递', + render: (entry) => ( + <> + {entry.deliveryId} + {entry.orderId} + + ), + }, + { key: 'app', label: '应用', render: (entry) => entry.appId }, + { + key: 'callback', + label: '回调地址', + render: (entry) => entry.callbackUrl, + }, + { + key: 'status', + label: '状态', + render: (entry) => ( + + {entry.status} + + ), + }, + { + key: 'attempts', + label: '尝试次数', + render: (entry) => entry.attemptCount, + }, + { + key: 'error', + label: '最近错误', + render: (entry) => entry.lastErrorMessage ?? '-', + }, + { + key: 'updated', + label: '更新时间', + render: (entry) => entry.updatedAt, + }, + ]} + rows={webhooks} + rowKey={(entry) => entry.deliveryId} + /> + {error ? ( +
{error}
+ ) : null} + + 暂无支付订单,外部产品创建订单后会显示在这里。 + + } + columns={[ + { + key: 'order', + label: '订单', + render: (entry) => ( + <> + {entry.merchantOrderId} + {entry.orderId} + + ), + }, + { + key: 'app', + label: '应用', + render: (entry) => ( + <> + {entry.title} + {entry.appId} + + ), + }, + { + key: 'amount', + label: '金额', + render: (entry) => + `${entry.currency} ${(entry.amountCents / 100).toFixed(2)}`, + }, + { key: 'provider', label: '渠道', render: (entry) => entry.provider }, + { + key: 'status', + label: '状态', + render: (entry) => ( + + {entry.status} + + ), + }, + { + key: 'created', + label: '创建时间', + render: (entry) => entry.createdAt, + }, + { + key: 'paid', + label: '支付时间', + render: (entry) => entry.paidAt ?? '-', + }, + ]} + rows={entries} + rowKey={(entry) => entry.orderId} + /> +
+ ); +} diff --git a/docs/README.md b/docs/README.md index 3a24aad02..07185677f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -128,6 +128,8 @@ - [预览画布缩放滑杆](./【交互设计】预览画布缩放滑杆-2026-09-05.md) - [图片画布撤销、恢复范围与操作提示方案](./【图片画布】撤销范围与操作提示方案-2026-07-17.md) - [微信虚拟支付接入](./【技术方案】微信虚拟支付接入-2026-05-26.md) +- [外部产品支付服务接入](./【技术方案】外部产品支付服务接入-2026-10-03.md) +- [支付服务接入与收银台使用说明](./【使用说明】支付服务接入与收银台使用说明-2026-10-03.md) - [SSE 客户端传输层收口约定](./technical/【前端架构】SSE客户端传输层收口约定-2026-06-03.md) - [全站客服悬浮入口接入约定](./technical/【前端架构】全站客服悬浮入口接入约定-2026-06-23.md) - [图片画布素材导出方案](./technical/【前端架构】图片画布素材导出方案-2026-06-15.md) diff --git a/docs/openapi/genarrative-external-v1.openapi.json b/docs/openapi/genarrative-external-v1.openapi.json index aea0588eb..c5a7b82bc 100644 --- a/docs/openapi/genarrative-external-v1.openapi.json +++ b/docs/openapi/genarrative-external-v1.openapi.json @@ -43,6 +43,10 @@ { "name": "Agent Integration", "description": "远程 MCP、OpenAPI 和完整 Skill 包发现" + }, + { + "name": "Payment", + "description": "平台统一收款与 Web 收银台" } ], "paths": { @@ -1614,6 +1618,52 @@ } } } + }, + "/api/external/v1/payment/orders": { + "post": { + "tags": ["Payment"], + "operationId": "createExternalPaymentOrder", + "summary": "创建支付订单并返回收银台地址", + "description": "使用支付应用 API Key 创建平台统一收款订单。支付金额按整数分传入;支付成功必须以平台通知或服务端查单为准。", + "security": [{"PaymentApiKey": []}], + "parameters": [{"$ref": "#/components/parameters/IdempotencyKey"}], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/PaymentOrderCreateRequest"} + } + } + }, + "responses": { + "200": { + "description": "支付订单与收银台信息", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaymentOrderCreateResponse"}}} + }, + "400": {"$ref": "#/components/responses/BadRequest"}, + "401": {"$ref": "#/components/responses/Unauthorized"}, + "403": {"$ref": "#/components/responses/Forbidden"}, + "502": {"$ref": "#/components/responses/UpstreamError"} + } + } + }, + "/api/external/v1/payment/orders/{orderId}": { + "get": { + "tags": ["Payment"], + "operationId": "getExternalPaymentOrder", + "summary": "查询支付订单", + "security": [{"PaymentApiKey": []}], + "parameters": [{"name": "orderId", "in": "path", "required": true, "schema": {"type": "string"}}], + "responses": { + "200": { + "description": "支付订单", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaymentOrderCreateResponse"}}} + }, + "401": {"$ref": "#/components/responses/Unauthorized"}, + "403": {"$ref": "#/components/responses/Forbidden"}, + "404": {"$ref": "#/components/responses/NotFound"} + } + } } }, "components": { @@ -1622,6 +1672,11 @@ "type": "http", "scheme": "bearer", "bearerFormat": "tnr_sk" + }, + "PaymentApiKey": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "tnr_pay" } }, "parameters": { @@ -1747,6 +1802,47 @@ } }, "schemas": { + "PaymentOrderCreateRequest": { + "type": "object", + "required": ["merchantOrderId", "title", "amountCents"], + "properties": { + "merchantOrderId": {"type": "string", "minLength": 1, "maxLength": 96}, + "title": {"type": "string", "minLength": 1, "maxLength": 128}, + "items": {"type": "array", "items": {"type": "object", "additionalProperties": true}}, + "amountCents": {"type": "integer", "minimum": 1}, + "currency": {"type": "string", "default": "CNY"}, + "provider": {"type": "string", "enum": ["wechat_native"], "default": "wechat_native"} + }, + "additionalProperties": false + }, + "PaymentOrder": { + "type": "object", + "required": ["orderId", "appId", "merchantOrderId", "title", "items", "amountCents", "currency", "provider", "checkoutToken", "status", "checkoutUrl", "createdAt", "expiresAt", "updatedAt"], + "properties": { + "orderId": {"type": "string"}, + "appId": {"type": "string"}, + "merchantOrderId": {"type": "string"}, + "title": {"type": "string"}, + "items": {"type": "array", "items": {"type": "object", "additionalProperties": true}}, + "amountCents": {"type": "integer", "minimum": 1}, + "currency": {"type": "string"}, + "provider": {"type": "string", "enum": ["wechat_native"]}, + "providerTradeNo": {"type": ["string", "null"]}, + "checkoutToken": {"type": "string"}, + "status": {"type": "string", "enum": ["pending", "paying", "paid", "expired", "closed", "refunded"]}, + "checkoutUrl": {"type": "string"}, + "providerQrCode": {"type": ["string", "null"]}, + "createdAt": {"type": "string", "format": "date-time"}, + "expiresAt": {"type": "string", "format": "date-time"}, + "paidAt": {"type": ["string", "null"], "format": "date-time"}, + "updatedAt": {"type": "string", "format": "date-time"} + } + }, + "PaymentOrderCreateResponse": { + "type": "object", + "required": ["order"], + "properties": {"order": {"$ref": "#/components/schemas/PaymentOrder"}} + }, "ExternalEditorProjectCreateRequest": { "type": "object", "properties": { diff --git a/docs/project-memory/plans/【实施计划】支付应用与订单收银台-2026-10-03.md b/docs/project-memory/plans/【实施计划】支付应用与订单收银台-2026-10-03.md new file mode 100644 index 000000000..8694d80bb --- /dev/null +++ b/docs/project-memory/plans/【实施计划】支付应用与订单收银台-2026-10-03.md @@ -0,0 +1,52 @@ +# 【实施计划】支付应用与订单收银台 + +| 字段 | 值 | +| --- | --- | +| Milestone | `docs/project-memory/plans/【里程碑】支付应用与订单收银台-2026-10-03.md` | +| Status | completed | +| Owner | Codex | + +## 修改边界 + +允许修改: + +- 主规范、shared-contracts、OpenAPI、支付领域 module、spacetime-module / migration / bindings、spacetime-client facade、api-server payment module、platform-wechat provider。 +- `src` 的 profile 支付入口、收银台页面、支付客户端和页面样式。 +- `apps/admin-web` 的支付 API 类型、路由、页面和后台样式。 +- 与本里程碑直接相关的测试和文档索引。 + +明确不修改: + +- 现有个人钱包充值、微信虚拟支付和退款状态机的行为。 +- 生产商户密钥、环境文件、个人配置和构建产物。 +- 支付宝 provider、分账、提现、手续费和自动结算。 + +## 实现顺序 + +1. 从现有充值订单、微信 Native provider、外部 API Key、profile 路由和后台列表组件提取可复用边界,确认没有重复的公开订单模型。 +2. 冻结支付 DTO、状态枚举、错误码、幂等语义和 OpenAPI,然后补契约测试。 +3. 增加支付领域表、migration、procedure / facade 和 schema 绑定,先完成订单创建、查询、关闭与幂等。 +4. 在 `platform-wechat` 增加支付服务需要的 Native 请求 / 响应和通知确认复用,保持商户配置只在服务端。 +5. 在 `api-server` 接入外部 API、收银台 read model、微信通知、查单和外部回调 outbox;所有到账入口复用统一确认事务。 +6. 增加个人中心支付应用 / Key / 订单页面和公共收银台,按截图参考实现桌面双栏与移动端纵向布局。 +7. 增加后台支付概览、应用、订单、通知和回调投递页面,复用 `packages/shared` 后台公共组件。 +8. 运行定向测试、schema / OpenAPI / 编码检查,启动 api-server 做 healthz 和 mock provider smoke;条件具备时执行真实沙箱二维码 smoke。 + +## 验证命令 + +1. `npm run check:encoding` +2. `git diff --check` +3. `npm run check:spacetime-schema` +4. `npm run typecheck` +5. `npm run admin-web:typecheck` +6. 支付领域和 api-server 定向 `cargo test` +7. 外部 API、profile、收银台和 admin 页面定向 Vitest +8. `npm run dev:api-server` 后检查 `/healthz` +9. mock provider + Playwright 收银台 smoke;真实商户沙箱可用时再补动态二维码验证 + +## 风险与回滚点 + +- 商户 API 证书或通知地址不可用时,保留 provider mock 证据,不把 mock 结果标成真实支付通过。 +- schema 变更失败时停止在绑定生成前,保留主规范和计划,不能通过删除数据绕过迁移。 +- 订单确认事务或回调 outbox 未完成时,关闭新支付渠道开关,不影响现有充值渠道。 +- 发现需要余额、提现、分账或支付宝真实接入时,先更新主规范和后续里程碑,再扩展实现。 diff --git a/docs/project-memory/plans/【里程碑】支付应用与订单收银台-2026-10-03.md b/docs/project-memory/plans/【里程碑】支付应用与订单收银台-2026-10-03.md new file mode 100644 index 000000000..7cf9e4f34 --- /dev/null +++ b/docs/project-memory/plans/【里程碑】支付应用与订单收银台-2026-10-03.md @@ -0,0 +1,59 @@ +# 【里程碑】支付应用与订单收银台 + +| 字段 | 值 | +| --- | --- | +| Version | 1.0 | +| Status | completed | +| Date | 2026-10-03 | +| Parent Spec | `docs/【技术方案】外部产品支付服务接入-2026-10-03.md` | + +## 目标 + +建立首个可运行的支付服务闭环:账号创建支付应用并管理 API Key,客户端或外部产品创建订单,用户进入 Web 收银台,平台通过微信 Native provider 生成动态二维码,通知 / 查单确认订单,之后通过签名回调通知接入方,后台可查询应用和订单。 + +## 范围 + +- 支付应用、API Key 元数据和账号归属。 +- 外部支付订单、商品快照、支付尝试和状态机。 +- 微信 Native 动态二维码 provider 适配;支付宝只保留渠道扩展结构,不纳入本里程碑的可用渠道。 +- 公共收银台和移动端纵向布局。 +- 支付平台通知、主动查单、确认幂等和接入方回调 outbox。 +- 个人中心支付服务入口、应用配置页和订单列表。 +- 后台支付总览、应用列表、订单列表、通知 / 回调失败列表。 +- `/api/external/v1/payment/*` OpenAPI、共享 DTO、契约测试和支付领域 schema。 + +## 不在范围内 + +- 支付宝真实下单、退款、分账和沙箱联调。 +- 外部产品余额、手续费、提现、自动结算和自动分账。 +- 用户钱包充值商品的迁移或现有微信虚拟支付协议改造。 +- 自动履约发货、数字权益回收和支付争议处理。 + +## 依赖与前置条件 + +- 平台微信 Native 商户号、API 证书 / 密钥和正式或沙箱通知地址可由部署环境注入。 +- 当前微信支付 Native provider、充值订单状态与验签测试可复用。 +- 外部回调域名必须通过应用配置的 HTTPS 和白名单校验。 +- SpacetimeDB schema、migration、生成绑定和 API OpenAPI 可以在同一里程碑同步更新。 + +## 验收标准 + +- [x] 账号能创建、停用支付应用,API Key 仅在创建响应中展示一次,撤销后立即拒绝请求。 +- [x] 外部 API 使用 `Idempotency-Key` 创建订单,重放返回原订单,字段冲突返回业务错误。 +- [x] 订单金额以整数分保存,商品和金额快照创建后不可被应用配置改写。 +- [x] 收银台使用不可猜测 token,桌面端双栏、移动端纵向显示商品、金额、二维码、过期和状态。 +- [x] 微信 Native 下单返回的二维码对应当前本地平台订单号和金额。 +- [x] 支付平台通知 / 查单确认前,客户端轮询或伪造回调不能把订单改为 `paid`。 +- [x] 重复、乱序、错误金额、错误签名、错误应用归属的通知不会重复确认或改变订单。 +- [x] 接入方回调异步投递、签名、重试和失败状态可查询。 +- [x] 个人中心和后台均能按归属和权限查看应用、订单及失败记录。 +- [x] `shared-contracts`、OpenAPI、schema 绑定和契约测试同步通过。 + +## 证据要求 + +2026-10-03 验收复核:支付专用 schema、typed facade、API、应用管理、provider-attempt claim、通知确认、签名回调 outbox、后台投递状态、profile/payment 路由和前端 build 已完成。项目 dev stack 发布后 `GET /healthz` 返回 HTTP 200,live schema 包含 `payment_order` / `payment_webhook_delivery`;真实商户沙箱二维码和真实微信通知因环境未注入商户凭据未验证,按“有可用沙箱时补充”处理。 + +- 自动化:Rust 领域 / API / provider 测试、前端页面与契约测试、schema 检查、OpenAPI 检查、编码和 diff 检查。 +- 运行时:项目 dev stack 发布当前 schema 后,api-server 使用正确端口和 bootstrap 配置,`GET /healthz` 返回 HTTP 200;live schema 已包含 `payment_order` 与 `payment_webhook_delivery`;微信 provider mock 由现有 provider 测试覆盖。 +- 未验证:真实商户沙箱动态二维码和真实微信通知,当前环境没有可安全使用的商户凭据;代码保留 provider 配置失败和支付状态失败关闭语义。 +- 边界:权限、幂等、重放、金额不一致、回调失败、过期、未知通知和敏感日志检查。 diff --git a/docs/technical/assets/payment-service-20261003/payment-checkout-mobile.png b/docs/technical/assets/payment-service-20261003/payment-checkout-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..999f6e55ca3c7e36112f43f4f7d92d5e549f98f2 GIT binary patch literal 69497 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 JPDHLkV1h1KEqDL` literal 0 HcmV?d00001 diff --git a/docs/technical/assets/payment-service-20261003/payment-checkout.png b/docs/technical/assets/payment-service-20261003/payment-checkout.png new file mode 100644 index 0000000000000000000000000000000000000000..84956ac720dccaf49aead4123710dc67d08ef737 GIT binary patch literal 145057 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

Yd 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

#`NzMP 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 literal 0 HcmV?d00001 diff --git a/docs/【使用说明】支付服务接入与收银台使用说明-2026-10-03.md b/docs/【使用说明】支付服务接入与收银台使用说明-2026-10-03.md new file mode 100644 index 000000000..5083fc382 --- /dev/null +++ b/docs/【使用说明】支付服务接入与收银台使用说明-2026-10-03.md @@ -0,0 +1,310 @@ +# 支付服务接入与收银台使用说明 + +> 适用版本:2026-10-03 支付应用与订单收银台里程碑 +> +> 本说明面向三类使用者:平台账户管理员、接入平台支付的游戏或外部产品开发者、负责查看订单与回调的后台运营人员。 + +## 1. 服务范围 + +平台提供一套统一支付服务:接入方提交商品、订单和金额,平台使用已配置的微信支付商户号创建 Native 支付订单,并返回网页收银台地址与动态二维码。用户在网页中扫码付款,平台收到微信支付结果后更新订单,再向接入方配置的回调地址通知。 + +当前里程碑的边界如下: + +| 能力 | 当前状态 | +| --- | --- | +| 微信 Native 扫码支付 | 已支持 | +| 游戏客户端或外部产品接入 | 已支持,统一使用 External v1 API | +| 网页收银台 | 已支持,桌面端双栏、移动端上下布局 | +| 订单记账、查单、回调通知 | 已支持 | +| 后台订单与回调投递记录 | 已支持 | +| 自动分账、自动提现、人工结算工作流 | 本里程碑不包含,暂由平台人工处理 | +| 支付宝、退款、周期扣款 | 本里程碑不包含 | + +金额以整数分传递,默认币种为 `CNY`。生产环境必须使用平台已经开通接口的微信支付商户号;前端和外部产品都不能直接持有商户证书或调用微信支付接口。 + +## 2. 一次完整支付流程 + +1. 平台账户管理员在“我的 → 支付服务”创建一个支付应用。 +2. 平台生成该应用的支付 API Key。完整 Key 只在创建成功时显示一次,应立即复制到接入方服务端的密钥管理系统。 +3. 外部产品服务端使用 API Key 和 `Idempotency-Key` 创建订单。 +4. 平台服务端向微信支付商户号下单,返回 `checkoutUrl` 和 `providerQrCode`。 +5. 外部产品将用户跳转到 `checkoutUrl`,或在自己的客户端中打开该网页。 +6. 用户使用微信扫描收银台二维码付款。 +7. 微信支付通知平台,平台校验订单号、金额和支付状态后将订单改为 `paid`。 +8. 如果应用配置了成功回调地址,平台通过回调投递器通知外部产品;外部产品再按自己的业务规则发放道具、虚拟币或权益。 +9. 外部产品遇到网络超时或回调延迟时,使用查单接口恢复订单状态,不要换一个幂等键重新下单。 + +## 3. 创建和管理支付应用 + +### 3.1 打开入口 + +登录平台后进入“我的”,选择“支付服务”。未登录时会看到登录入口: + +![支付服务未登录入口](technical/assets/payment-service-20261003/profile-payment-login.png) + +图 1:支付服务入口截图。截图来自本地前端预览环境,未登录状态不会读取或展示任何支付应用。 + +### 3.2 创建应用 + +在“创建接入应用”中填写: + +| 字段 | 填写规则 | +| --- | --- | +| 应用名称 | 用于区分游戏或外部产品,例如“星港商城”或“我的游戏支付” | +| 支付成功回调地址 | 可选。建议填写接入方服务端的 HTTPS 地址,例如 `https://game.example.com/payment/callback` | + +回调地址必须使用 HTTPS;本地开发可以使用 loopback HTTP 地址。不能包含用户名、密码或 URL fragment。保存后平台会创建应用和默认支付 API Key。 + +### 3.3 保存 API Key + +创建成功后页面会显示完整 API Key,并提示“完整 API Key 只显示这一次”。操作要求: + +1. 立即点击复制按钮。 +2. 只保存到接入方服务端的环境变量或密钥管理服务。 +3. 不要提交到 Git、客户端安装包、网页源码、截图或工单。 +4. API Key 泄露时,在“支付 API Key”区域撤销旧 Key,再创建新的支付应用 Key。 + +页面只展示 Key 前缀、所属应用、权限、创建时间、最后使用时间和撤销状态,不再次展示完整密钥。 + +### 3.4 停用应用和撤销 Key + +- “我的支付应用”中的“停用”会阻止该应用继续创建支付订单;历史订单和后台记录保留。 +- “支付 API Key”中的“撤销 Key”会使该 Key 立即失效;已经创建的订单不因撤销 Key 自动取消。 +- 更换 Key 后,必须同步更新接入方服务端配置,并保留一次查单验证。 + +## 4. 外部产品接入 + +### 4.1 公共地址和鉴权 + +以部署域名作为 API 根地址,以下示例中的 `$BASE_URL` 替换为实际地址: + +```text +$BASE_URL/api/external/v1/payment/orders +``` + +请求头: + +```http +Authorization: Bearer tnr_pay_xxxxxxxxxxxxxxxxx +Content-Type: application/json +Idempotency-Key: game-order-20261003-000001 +``` + +支付 API Key 的格式前缀为 `tnr_pay_`。`Idempotency-Key` 要求为 1-128 个可打印 ASCII 字符且不能包含空格;它代表一次业务下单意图。网络结果不确定时,必须复用原值。 + +### 4.2 创建订单 + +```bash +curl -X POST "$BASE_URL/api/external/v1/payment/orders" \ + -H "Authorization: Bearer $PAYMENT_API_KEY" \ + -H "Content-Type: application/json" \ + -H "Idempotency-Key: game-order-20261003-000001" \ + -d '{ + "merchantOrderId": "game-order-20261003-000001", + "title": "星港商城 - 600 水晶", + "items": [ + {"sku": "crystal-600", "name": "600 水晶", "quantity": 1} + ], + "amountCents": 19600, + "currency": "CNY", + "provider": "wechat_native" + }' +``` + +请求字段: + +| 字段 | 必填 | 说明 | +| --- | --- | --- | +| `merchantOrderId` | 是 | 接入方自己的订单号;建议使用可追踪的 ASCII 字符串,微信 Native 外部订单号最终不超过 32 个字符 | +| `title` | 是 | 收银台展示的商品或订单标题 | +| `items` | 否 | 商品明细,会被原样记账;不参与平台金额计算 | +| `amountCents` | 是 | 应付金额,整数分;例如 `19600` 表示人民币 `196.00` | +| `currency` | 否 | 当前使用 `CNY` | +| `provider` | 否 | 当前使用 `wechat_native` | + +金额由服务端订单快照决定。客户端传来的商品明细不能作为最终收款金额,接入方应在自己的服务端完成价格校验后再调用创建订单。 + +### 4.3 创建响应 + +成功响应为 HTTP `200`,核心字段如下: + +```json +{ + "order": { + "orderId": "6e7d8c9a0b1c4d2e9f8a7b6c5d4e3f2a", + "merchantOrderId": "game-order-20261003-000001", + "title": "星港商城 - 600 水晶", + "amountCents": 19600, + "currency": "CNY", + "provider": "wechat_native", + "status": "paying", + "checkoutToken": "pay_xxxxxxxxx", + "checkoutUrl": "/pay/pay_xxxxxxxxx", + "providerQrCode": "weixin://wxpay/bizpayurl?...", + "expiresAt": "2026-10-03T07:05:00Z" + } +} +``` + +接入方应优先使用完整部署域名拼接 `checkoutUrl`,例如 `https://www.example.com/pay/pay_xxxxxxxxx`。不要把 `providerQrCode` 直接当作支付成功依据;它只是动态二维码内容,支付状态仍以平台订单为准。 + +### 4.4 查询订单 + +```bash +curl "$BASE_URL/api/external/v1/payment/orders/6e7d8c9a0b1c4d2e9f8a7b6c5d4e3f2a" \ + -H "Authorization: Bearer $PAYMENT_API_KEY" +``` + +建议在收银台打开后每 3-5 秒查询一次,直到状态进入终态: + +| 状态 | 含义 | 接入方动作 | +| --- | --- | --- | +| `pending` | 已创建,尚未完成支付平台下单 | 继续查单;如长时间不变,查看后台或服务日志 | +| `paying` | 已拿到支付平台二维码,等待用户付款 | 展示收银台并等待通知或查单 | +| `paid` | 已确认到账 | 只在此状态发放游戏商品或权益 | +| `expired` | 订单超过有效期 | 不发货,提示用户重新下单 | +| `closed` | 订单已关闭 | 不发货 | +| `refunded` | 已退款 | 按接入方规则撤销或冻结权益 | + +同一个 `Idempotency-Key` 携带相同请求体会返回首次订单;同一个 Key 携带不同请求体会返回 `409`。遇到连接超时,不要生成新 Key 盲目重试。 + +## 5. 网页收银台 + +外部产品拿到 `checkoutUrl` 后,可以: + +- 游戏客户端使用系统浏览器或内嵌 WebView 打开。 +- Web 产品使用新窗口、弹窗或当前页面跳转。 +- 自己展示商品说明,但最终金额应以平台收银台显示金额为准。 + +桌面端收银台左侧展示订单号、商品标题、付款提示和等待状态,右侧展示应付金额、微信 Native 动态二维码和支付渠道: + +![支付收银台桌面版](technical/assets/payment-service-20261003/payment-checkout.png) + +图 2:支付收银台桌面版。此图使用浏览器会话内的模拟订单 `测试游戏道具 / ¥196.00`,用于说明布局,不对应真实商户订单。 + +移动端会自动改为上下布局,用户可以在较窄屏幕中滚动查看金额、二维码和支付说明: + +![支付收银台移动版](technical/assets/payment-service-20261003/payment-checkout-mobile.png) + +图 3:支付收银台移动版。二维码内容由页面的 QR 组件根据模拟支付链接生成;生产环境二维码由微信支付商户接口返回。 + +收银台的支付提示: + +1. 用户必须完全按照页面显示金额付款,少付或多付都可能无法自动确认。 +2. 付款后页面会轮询订单并自动更新状态,但接入方仍应以服务端查单或回调为最终依据。 +3. 订单过期后不要继续使用旧二维码,应重新创建订单。 + +## 6. 支付成功回调 + +### 6.1 平台支付通知 + +微信支付通知地址由平台环境变量 `WECHAT_PAYMENT_NOTIFY_URL` 配置,生产环境必须是外网可访问的 HTTPS 地址,例如: + +```text +https://www.example.com/api/payment/wechat/notify +``` + +该地址接收微信支付商户通知。平台会校验微信通知签名、商户订单号、金额、支付状态和交易号,校验通过后才把本地订单改为 `paid`。 + +### 6.2 外部产品回调 + +如果创建支付应用时填写了“支付成功回调地址”,平台会向该地址投递 JSON: + +```json +{ + "event": "payment.paid", + "orderId": "6e7d8c9a0b1c4d2e9f8a7b6c5d4e3f2a", + "appId": "payapp_xxxxxxxxx", + "merchantOrderId": "game-order-20261003-000001", + "amountCents": 19600, + "currency": "CNY", + "provider": "wechat_native", + "providerTradeNo": "4200000000000000000000000000", + "status": "paid", + "paidAt": "2026-10-03T07:01:12Z" +} +``` + +回调请求头: + +```http +X-Genarrative-Signature: sha256= +X-Genarrative-Event: payment.paid +X-Genarrative-Delivery-Id: delivery_xxxxxxxxx +``` + +首期签名规则为:使用创建该支付应用时生成的 API Key 哈希作为 HMAC 密钥,对原始请求体字节执行 `HMAC-SHA256`,并将结果编码为小写十六进制;请求头值为 `sha256=` 加十六进制结果。接入方必须使用原始 body 验签,不要先反序列化再重新序列化。独立可轮换的 callback secret 属于后续安全增强,不要在当前版本按未实现字段接入。 + +回调处理要求: + +1. 先验签,再按 `orderId` 或 `merchantOrderId` 查询自己的订单。 +2. 对 `deliveryId` 和业务订单号做幂等处理,重复通知返回成功,不重复发货。 +3. 成功处理后返回任意 HTTP `2xx`,建议返回 `204`。 +4. 非 `2xx` 会进入平台回调重试;平台最多尝试 8 次,最终失败会出现在后台“外部回调投递”表中。 + +## 7. 后台查看订单和回调 + +管理员进入后台,在侧边栏选择“支付订单”,或打开后台路由 `#payment-orders`。页面分为两张表: + +### 7.1 外部回调投递 + +用于确认平台是否成功通知了接入方,包含:投递 ID、订单号、应用、回调地址、投递状态、尝试次数、最近错误和更新时间。 + +常见状态: + +- `pending`:等待投递或等待下一次重试。 +- `delivered`:接入方返回了成功状态码。 +- `failed`:达到重试上限,需人工排查回调地址、验签和接入方服务状态。 + +### 7.2 订单记录 + +用于查看外部订单号、平台订单号、应用、商品标题、金额、渠道、订单状态、创建时间和支付时间。金额显示为币种和两位小数,订单状态以服务端记录为准。 + +本阶段后台用于收款记账和通知核对,不提供自动给外部产品打款或分账按钮。需要结算时,按订单记录和商户账单人工处理。 + +## 8. 生产配置清单 + +部署前由后端运维配置,不要把下列值写入前端: + +```text +WECHAT_PAY_ENABLED=true +WECHAT_PAY_PROVIDER=real +WECHAT_PAYMENT_NOTIFY_URL=https://<公开域名>/api/payment/wechat/notify +``` + +同时配置现有微信支付 V3 商户信息、商户证书、私钥、平台证书或平台证书密钥等环境变量。真实商户配置必须通过部署系统的密钥注入完成。`WECHAT_PAY_PROVIDER=mock` 只用于本地开发和页面联调,不能用于生产收款。 + +上线前至少验证: + +1. 使用真实商户沙箱或小额测试单创建 Native 订单。 +2. 微信扫码后平台订单能变为 `paid`。 +3. `WECHAT_PAYMENT_NOTIFY_URL` 能收到并确认微信通知。 +4. 接入方回调能通过验签,并且重复回调不会重复发货。 +5. 后台订单表和回调投递表都有对应记录。 + +## 9. 常见问题 + +| 现象 | 优先检查 | +| --- | --- | +| 返回 `401` | Authorization 是否是支付应用的 Key;Key 是否已撤销;是否误用了普通 External API Key | +| 返回 `403` | 支付应用是否已停用;Key 是否具备订单创建或查询 scope | +| 返回 `409` | 是否复用了已有 `Idempotency-Key` 但请求体不同;网络超时场景应复用原请求体和原 Key | +| 返回“缺少 `WECHAT_PAYMENT_NOTIFY_URL`” | 生产真实 provider 必须配置公开 HTTPS 通知地址;本地 mock 才使用默认 loopback 地址 | +| 一直是 `pending` | 查看微信下单是否成功、后台订单是否有 provider 码、部署日志和商户配置;不要直接给用户发货 | +| 用户已付款但接入方未发货 | 先调用查单接口;再看后台“外部回调投递”的状态和最近错误;必要时人工补偿,但要保留幂等记录 | +| 二维码无法识别 | 检查是否把 `providerQrCode` 原样交给 QR 组件;不要对内容做 URL 编码或截断 | +| 本地截图能显示、生产无二维码 | 截图使用的是 mock 数据;生产必须确认微信商户接口返回了 `code_url`,并检查支付服务配置 | + +## 10. 安全与责任边界 + +- API Key 只能放在外部产品服务端,不能放进游戏客户端、浏览器 localStorage 或公开仓库。 +- 客户端传回的“支付成功”事件只能作为 UI 提示,不能作为发货凭据。 +- 发货必须由外部产品服务端根据平台查单或验签回调执行,并以订单号做幂等。 +- 不要记录完整 API Key、微信商户私钥、微信通知原文中的敏感字段或用户支付凭据。 +- 截图中的订单号、金额和二维码均为演示数据;生产环境会由后端订单和平台微信商户接口动态生成。 + +## 11. 相关契约 + +- [外部产品支付服务接入技术方案](./【技术方案】外部产品支付服务接入-2026-10-03.md) +- [External v1 OpenAPI](./openapi/genarrative-external-v1.openapi.json) +- [支付应用与订单收银台里程碑](./project-memory/plans/【里程碑】支付应用与订单收银台-2026-10-03.md) diff --git a/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md b/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md index 1a743e4d6..64db5e8fe 100644 --- a/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md +++ b/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md @@ -59,7 +59,7 @@ npm run check:server-rs-ddd `spacetime-client` 的 Cargo `lib.path` 指向 `src/active.rs`,现役 mapper 聚合入口是 `src/active/mapper.rs`;原旧 facade 和 mapper 已删除。 -当前 mapper 按现役调用领域拆分为 `admin_account.rs`、`admin_dashboard.rs`、`ai.rs`、`assets.rs`、`auth.rs`、`editor_agent.rs`、`editor_project.rs`、`error_reports.rs`、`external_api_key.rs`、`external_generation.rs`、`game_distribution.rs`、`llm_router_account.rs`、`runtime.rs`、`runtime_profile.rs` 和 `story.rs`;每个模块只承接对应现役 procedure / result 类型的映射。跨领域轻量 helper 和共享 record 放在 `common.rs`;不得把领域聚合或跨层 JSON 兼容结构放入 mapper。 +当前 mapper 按现役调用领域拆分为 `admin_account.rs`、`admin_dashboard.rs`、`ai.rs`、`assets.rs`、`auth.rs`、`editor_agent.rs`、`editor_project.rs`、`error_reports.rs`、`external_api_key.rs`、`external_generation.rs`、`game_distribution.rs`、`llm_router_account.rs`、`payment.rs`、`runtime.rs`、`runtime_profile.rs` 和 `story.rs`;每个模块只承接对应现役 procedure / result 类型的映射。跨领域轻量 helper 和共享 record 放在 `common.rs`;不得把领域聚合或跨层 JSON 兼容结构放入 mapper。 ## API 路由分组 @@ -451,6 +451,30 @@ Responses 的终态载荷既是工具调用的恢复源,也是正文的恢复 - 2026-09-01 修订:每次账号认证、Router Key 准备或 LLM 请求解析既有账号时,api-server 都会在同一 owner 级 provisioning 锁内检查固定套餐 `plan_id=1`。没有 active 订阅、订阅已过期或 `end_time` 距当前 Unix 秒不超过 24 小时时,使用管理员接口新建一条订阅;超过 24 小时则复用现有订阅。订阅检查不进入 Responses 流式 chunk,管理员 Token 缺失时仅保留启动告警并跳过续期检查。 - LLM Router 计费:读取 Router 用户 `used_quota`,以 `50000 quota = 1 泥点` 结算(`500000 quota = 1 USD`,美元数值直接乘 10,不乘汇率)。上游调用前建立首次基线并补结算,成功响应后同步;不足整数部分、扣费失败和余额不足未支付部分留到后续累计同步。扣钱包、写 `llm_router_consume` 流水与推进 checkpoint 在同一事务完成;流水展示“LLM 调用消耗”。历史费用不追扣。详细契约见 `technical/【技术方案】LLM累计额度结算-2026-09-05.md`。 - 2026-09-05 修订:`/api/llm/responses` 与 `/api/llm/chat/completions` 仍在 Router provisioning 前用钱包总余额阻止零余额账号创建或续期;解析凭据后、上游调用前再执行累计额度同步,以扣除退款占用后的剩余可消费余额为准。余额为 `0` 时返回 `409 MUD_POINTS_INSUFFICIENT`;余额或额度同步失败时失败关闭。上游已成功时,后置同步失败只记录错误并留待下次调用前补结算,不把成功模型响应改写为失败。 + +### `payment_app` + +- Rust 结构体:`PaymentApp`;源码:`server-rs/crates/spacetime-module/src/payment_storage.rs`。 +- 作用:平台账号创建的外部支付应用,保存应用归属、展示名称、回调地址、启用状态和更新时间。应用使用平台统一商户主体,不保存支付平台私钥。 +- 索引:`by_payment_app_owner_user_id` 用于个人中心应用列表。 + +### `payment_api_key` + +- Rust 结构体:`PaymentApiKey`;源码:`server-rs/crates/spacetime-module/src/payment_storage.rs`。 +- 作用:支付应用 API Key 元数据。明文只在创建支付应用响应中返回一次,表内仅保存摘要、可见前缀、作用域、使用时间和撤销状态。 +- 索引:`by_payment_api_key_app_id`、`by_payment_api_key_owner_user_id`;`key_hash` 唯一用于支付 API 鉴权。 + +### `payment_order` + +- Rust 结构体:`PaymentOrder`;源码:`server-rs/crates/spacetime-module/src/payment_storage.rs`。 +- 作用:客户端游戏和外部产品的统一收款订单。保存不可变商品 / 金额快照、应用归属、接入方订单号、幂等查找键、微信 Native `code_url`、平台交易号、支付状态、过期时间和到账时间。订单确认只能由验签通知或服务端查单进入 `paid`,不与 `profile_recharge_order` 共享入账路径。 +- 索引:`by_payment_order_app_id`、`by_payment_order_owner_user_id`、`by_payment_order_status`;`idempotency_lookup`、`merchant_order_lookup`、`checkout_token` 唯一用于幂等和公共收银台访问。 + +### `payment_webhook_delivery` + +- Rust 结构体:`PaymentWebhookDelivery`;源码:`server-rs/crates/spacetime-module/src/payment_storage.rs`。 +- 作用:支付成功后的外部回调 durable outbox。保存 callback URL、签名、固定 payload、租约、尝试次数、下次可投递时间、最近错误和 delivered / failed 终态;api-server worker 通过 claim / complete procedure 投递。 +- 索引:`by_payment_webhook_delivery_status_available`、`by_payment_webhook_delivery_owner_user_id`、`by_payment_webhook_delivery_order_id`;`delivery_id` 按订单唯一幂等。 - Windows 私有文件准备:AGC 自有 AppData、凭据目录和 `.agent` 运行态继续使用 managed 范围;用户通过原生选择器明确选中的项目根或文件,若 owner/DACL 仅因权限不足无法读取,则由一次性 UAC helper 在严格复核普通文件/目录、非 reparse/symlink、路径类型和目标 TokenUser 后接管并收紧为当前用户私有 DACL。项目放在当前 profile 之外(例如其他磁盘)不再因为路径位置被拒绝;未经过原生选择器或 AGC 项目根入口的内部路径仍不获得任意提权资格。 ### `game_distribution_game` diff --git a/docs/【技术方案】外部产品支付服务接入-2026-10-03.md b/docs/【技术方案】外部产品支付服务接入-2026-10-03.md new file mode 100644 index 000000000..00143f3bb --- /dev/null +++ b/docs/【技术方案】外部产品支付服务接入-2026-10-03.md @@ -0,0 +1,202 @@ +# 外部产品支付服务接入 + +更新时间:`2026-10-03` + +## 目标 + +为 Genarrative 提供一套由平台统一收款的支付服务,支持: + +- 客户端制作的游戏通过公开接口创建订单并打开 Web 收银台。 +- 外部产品通过应用身份、API Key 和签名调用同一套订单接口。 +- 平台使用已开通的微信支付 / 支付宝商户接口生成动态支付二维码,并以服务端验签、查单或支付通知确认到账。 +- 用户在自己的账户中查看支付服务,创建和配置接入应用,管理 API Key、回调地址和订单。 +- 后台查看支付应用、订单、支付通知、回调投递和异常状态。 +- 首期只负责收款、记账和结果通知;外部产品的余额、手续费、提现和自动分账不在首期范围内,人工结算依据后台账单处理。 + +## 非目标 + +- 不把外部产品订单记入现有的个人钱包充值订单,不向购买者自动发放泥点或会员权益。 +- 不允许客户端或外部产品直接声明“支付成功”改变订单状态。 +- 不保存或向前端下发商户私钥、API v3 密钥、支付宝应用私钥、支付平台 access token 等敏感凭据。 +- 不在首期实现平台余额、外部产品提现、手续费规则、自动分账、佣金和税务结算。 +- 不使用个人收款码、静态收款码或无法验签查单的人工转账作为支付服务正式渠道。 + +## 入口与边界 + +### 参与方 + +- 平台:持有并配置自己的微信支付 / 支付宝商户账户,维护支付服务、订单和通知。 +- 接入方:平台账号下创建的游戏或外部产品应用,使用平台发放的 API Key 创建订单。 +- 购买者:在公共 Web 收银台查看商品信息并完成扫码支付,可不登录平台账号。 +- 支付平台:微信支付 Native、支付宝当面付等已开通的商户 API,负责实际收款、通知和查单。 + +### 入口 + +- 账号侧:`/profile/payment`,展示支付服务状态、应用列表、API Key、回调配置和订单入口。 +- 公共收银台:`/pay/{checkoutToken}`,由服务端返回订单快照、可用支付方式和动态二维码。 +- 外部 API:`/api/external/v1/payment/orders` 及同一资源下的查单、关闭和收银台地址接口。 +- 支付平台通知:按渠道配置独立的 HTTPS 通知入口,统一进入支付订单确认流程。 +- 后台:增加支付服务概览、接入应用、支付订单、通知与回调投递页面,并受现有后台 Tab 权限控制。 + +### 职责边界 + +- `api-server`:HTTP 鉴权、公开 API、收银台 BFF、支付平台通知、回调投递编排和错误 envelope。 +- `module-*`:金额、订单状态、幂等、归属、回调重放和人工复核等领域规则。 +- `spacetime-module`:支付应用、订单、支付尝试、通知观察和投递 outbox 的持久化与原子事务。 +- `spacetime-client`:为 api-server 提供支付领域 procedure 的 typed facade。 +- `platform-*`:微信 / 支付宝的下单、二维码、验签、解密、查单和响应解析。 +- `shared-contracts` / `packages/shared`:账号页、后台页和外部 API 共用的 DTO,不保存业务真相。 +- 前端:展示后端返回的订单状态,收银台轮询或 SSE 只用于刷新,不自行判定到账。 + +## 接入应用与账户配置 + +### 应用 + +每个应用属于一个平台账号,至少包含: + +- `appId`、应用名称、产品类型、启用状态和创建 / 更新时间。 +- 允许使用的支付渠道和金额上下限。 +- 支付成功回调地址、回调签名密钥版本、回调重试策略。 +- 可选的返回地址;必须按 HTTPS、域名白名单和协议校验,不能接受任意用户提交的跳转地址。 +- 应用级订单前缀和展示品牌信息,不能覆盖平台商户主体。 + +### API Key + +- 创建时只展示一次完整 secret,数据库只保存 hash、可见前缀、scope、创建时间、最后使用时间、撤销时间和版本。 +- 首期 scope 至少区分 `payment:orders:create`、`payment:orders:read`、`payment:orders:close`。 +- Key 只属于一个应用,撤销后立即禁止创建订单、查单和关闭操作。 +- 请求使用 `Authorization: Bearer` 或约定的 API Key 头,并要求 `Idempotency-Key`。 +- 管理员页面可以查看安全元数据,不能查看完整 secret。 + +### 商户配置 + +- 商户号、应用 ID、证书序列号、通知地址和支付平台密钥只由服务端环境变量或受控密文配置提供。 +- 用户账户页面只展示已启用的支付渠道和配置状态,不允许用户上传或读取平台级商户私钥。 +- 后台只展示脱敏的商户配置和连通性状态;密钥写入日志、追踪事件和错误响应均禁止。 +- 每个渠道必须明确 `enabled / unavailable / misconfigured` 状态,未完成配置的渠道不出现在收银台可选项。 + +## 订单与金额契约 + +### 创建订单 + +接入方提交: + +- 应用 API Key、幂等键和接入方订单号。 +- 商品标题、商品明细、商品数量、币种和金额,金额使用整数分。 +- 接入方用户标识和可选的业务 metadata;metadata 有字节上限,禁止放入凭据、Data URL 或大段正文。 +- 支付成功后的业务回调要求由应用配置提供,不能在每次请求中绕过已审核的地址白名单。 + +服务端执行: + +1. 校验应用、API Key、scope、幂等键、金额范围、币种和商品字段。 +2. 以 `appId + idempotencyKey` 建立唯一幂等记录;相同请求重放返回原订单,相同幂等键但字段不一致则失败。 +3. 生成平台订单号、不可猜测的 `checkoutToken` 和过期时间,保存不可变商品与金额快照。 +4. 调用选定的支付平台创建订单,要求平台返回的商户订单号、金额和渠道与本地快照一致。 +5. 返回平台无关的订单摘要、收银台 URL、过期时间和可用渠道,不返回商户请求签名或支付平台敏感字段。 + +### 状态 + +订单状态为: + +`pending → paying → paid` + +并允许从 `pending / paying` 进入 `expired / closed`,从 `paid` 进入 `refunded`(退款能力在后续里程碑接入)。支付通知、查单和人工复核只能按允许的状态转移推进;重复通知、乱序通知和重复查单必须幂等。 + +本地 `paid` 必须同时满足: + +- 平台通知验签或主动查单成功。 +- 商户订单号、平台交易号、应用、渠道、金额和币种与本地订单一致。 +- 支付平台确认时间合法且来自平台响应,不能使用服务器当前时间补齐。 + +## Web 收银台 + +收银台使用服务端生成的 `checkoutToken`,页面展示: + +- 商品名称、商品明细、订单号、应付金额和过期时间。 +- 可用支付渠道,例如“微信支付 / 支付宝”,渠道由商户配置和订单约束共同决定。 +- 当前渠道的动态二维码。二维码由平台商户 API 以当前订单金额和平台订单号生成,不复用静态码。 +- “待支付、支付确认中、支付成功、已关闭、已过期、支付异常”等后端状态。 +- 查询状态、复制金额、返回应用等操作;返回地址只使用应用白名单中的地址。 + +收银台不展示平台密钥、用户 API Key、完整回调地址和内部错误文本。浏览器轮询或 SSE 只能读取公开订单状态;出现“支付成功”页面前仍需经过平台回调或服务端查单确认。 + +页面视觉采用截图中的双栏收银台结构作为参考:左侧是订单信息和金额提示,右侧是二维码和渠道状态;移动端改为纵向布局。截图只作为布局参考,不作为支付协议、金额或商户身份依据。 + +## 通知、查单与外部回调 + +- 平台支付通知入口按渠道独立配置,先验签 / 解密,再解析订单和金额,再进入统一的订单确认事务。 +- 通知成功后快速返回平台要求的成功响应;外部产品回调通过 outbox 异步投递,不能让第三方回调慢速阻塞支付平台通知。 +- 外部回调 payload 至少包含平台订单号、接入方订单号、应用 ID、支付状态、金额、币种、平台交易号和确认时间。 +- 首期回调签名使用 `HMAC-SHA256(sha256(rawApiKey), rawBody)`,HTTP 头为 `X-Genarrative-Signature: sha256=`、`X-Genarrative-Event` 和 `X-Genarrative-Delivery-Id`;接入方验签后按订单号和 delivery id 幂等消费。独立可轮换 callback secret 作为后续安全增强项,不在本里程碑伪称已实现。 +- 投递按有限次数退避重试,记录 HTTP 状态、响应摘要、下一次重试时间和最终失败原因;不得记录完整 secret、签名原文或敏感请求体。 +- 查询订单只返回应用归属范围内的订单;公共收银台只返回公开展示字段和状态。 +- 支付确认与唯一回调 outbox 在同一数据库事务提交,回调 payload 从已确认订单构建;失败不会留下 paid 但缺 outbox 的半完成状态。每个投递使用唯一租约代次,过期 worker 不能覆盖新 worker 结果。 +- 外部下单使用不超过 32 字符的平台订单号和冻结的过期时间,独立通知 URL 为 `/api/payment/wechat/notify`;下单 claim 在库内完成,结果不确定时先查单,同一商户单号不因重试更换。 +- 应用、订单、回调 procedure 都要求已注册后端运行服务身份,匿名 SpacetimeDB 调用不得创建或确认订单。回调地址要求 HTTPS、禁止凭据和内网地址,发送时再次检查解析地址且禁止跳转;仅隔离测试环境可以允许 loopback fixture。 +- 支付平台通知、主动查单和后台人工重试全部复用同一条幂等确认路径,不各自实现入账。 + +## 后台数据页 + +后台新增支付服务入口,至少包含: + +- 总览:订单数、已支付金额、待确认订单、通知失败、外部回调失败和按渠道统计。 +- 接入应用:应用状态、所属账号、渠道、回调地址脱敏、Key 状态和最近使用时间。 +- 支付订单:应用、商品、接入方订单号、平台订单号、金额、渠道、状态、创建 / 支付时间和平台交易号。 +- 通知与投递:验签结果、通知类型、订单关联、重复次数、投递状态和下次重试时间。 +- 详情与人工处理:展示本地快照和平台事实的对照;人工操作必须记录管理员、原因、时间和期望状态,不能直接改订单金额或伪造支付成功。 + +分页列表必须使用后端分页和排序参数;金额使用整数分并在展示层格式化,时间统一转成人可读时间,不能把 SATS enum、Option 或微秒 Timestamp 原样展示。 + +## 安全、幂等与失败关闭 + +- 所有金额和商品快照以服务端持久化值为准,客户端传回的金额只作为展示输入,不能作为支付成功依据。 +- 订单创建、支付平台下单、通知确认和外部回调投递分别设置幂等键,重放不会重复创建订单、记账或发放商品。 +- 支付平台超时、网络断开、响应解析失败或结果不确定时,订单保持待确认并进入查单 / 人工复核,不自动标记失败或再次创建新订单。 +- 未知通知、金额不一致、订单归属不一致、签名失败和平台交易号冲突必须拒绝确认,并保留脱敏诊断事实。 +- 日志只记录稳定 HMAC 引用、状态、金额、渠道、阶段和错误分类,不记录二维码原文、密钥、签名、完整订单请求或敏感 metadata。 +- 所有用户、应用、订单、回调和后台查询都检查归属和权限;外部 API 不允许通过猜测订单号访问其它应用数据。 + +## 契约与迁移 + +### API / DTO / OpenAPI + +- 新增支付服务公开 API 时同步更新 `docs/openapi/genarrative-external-v1.openapi.json`、`shared-contracts`、契约测试和公开发现文档。 +- 内部账号接口放在 `/api/profile/payment/*`,后台接口放在 `/admin/api/payment/*`,支付平台通知不走用户鉴权。 +- 公开 DTO 不暴露 provider 原始响应、密钥、完整二维码 payload 或内部数据库 ID。 + +### SpacetimeDB + +计划增加独立的支付领域表,具体表结构在里程碑实施前冻结: + +- 支付接入应用和 API Key 元数据。 +- 平台支付订单和不可变商品快照。 +- 渠道支付尝试与平台交易号。 +- 支付通知观察记录。 +- `payment_webhook_delivery` 外部回调投递 outbox 与投递结果。 + +新增字段必须追加到已有 Rust 表结构体末尾并设置明确默认值;不得重排、改名或删除现有充值表字段。修改 schema 时同步 migration、表目录、生成绑定并运行 `npm run check:spacetime-schema`。 + +### 兼容策略 + +现有个人钱包充值、微信虚拟支付和充值退款链路保持原契约。支付服务用独立订单前缀、表和 API namespace 标识,不把历史充值订单迁移成外部支付订单。 + +## 首期验收标准 + +| 条款 | 验收方式 | 证据 | +| --- | --- | --- | +| 账号可创建支付应用并管理 API Key | 浏览器 smoke、接口测试 | 个人中心页面、Key 只展示一次、撤销立即生效 | +| 客户端游戏和外部产品可创建订单 | API 契约测试 | 同一幂等键返回原订单,字段冲突被拒绝 | +| 收银台展示不可篡改的商品和金额 | 浏览器 smoke | `checkoutToken` 只能读取公开字段,金额来自服务端快照 | +| 商户账户生成动态二维码 | provider mock + 真实沙箱 smoke | 二维码订单号和金额与本地订单一致 | +| 支付结果以服务端事实确认 | 通知 / 查单测试 | 客户端伪造成功不会改变订单,通知重放不重复确认 | +| 外部产品收到成功通知 | outbox 测试与回调 smoke | 签名、重试、最终失败和幂等投递可观测 | +| 后台可查看运营数据 | 后台页面测试 | 应用、订单、通知和回调列表分页、筛选、详情可用 | +| 权限与敏感数据安全 | 负向测试、日志检查 | 跨应用访问、失效 Key、错误金额、错误签名均失败且无密钥泄漏 | +| 首期不产生自动分账 | 领域测试与文档核对 | 没有余额、提现或自动分账写路径 | + +## 未决问题与决策 + +- 首期接入渠道:优先复用现有微信 Native 动态二维码链路;支付宝作为同一收银台的第二个 provider,只有商户 API 配置和验签协议完成后才显示。 +- 首期结算:平台收款、记账、通知,外部产品人工结算;手续费、余额和提现另立规范。 +- 商户主体:使用平台自己的商户号;接入应用不能选择或替换商户主体。 +- 退款:首期只展示支付事实和人工处理入口,正式退款与外部产品权益回收另立里程碑。 diff --git a/packages/shared/src/contracts/payment.ts b/packages/shared/src/contracts/payment.ts new file mode 100644 index 000000000..4683dd077 --- /dev/null +++ b/packages/shared/src/contracts/payment.ts @@ -0,0 +1,55 @@ +export type PaymentApp = { + appId: string; + name: string; + callbackUrl: string | null; + enabled: boolean; + createdAt: string; + updatedAt: string; +}; + +export type PaymentApiKey = { + keyId: string; + appId: string; + name: string; + keyPrefix: string; + scopes: string[]; + createdAt: string; + lastUsedAt: string | null; + revokedAt: string | null; + updatedAt: string; +}; + +export type PaymentAppCreateResponse = { + app: PaymentApp; + apiKey: string; + key: PaymentApiKey; +}; + +export type PaymentAppListResponse = { + apps: PaymentApp[]; + keys: PaymentApiKey[]; +}; + +export type PaymentOrder = { + orderId: string; + appId: string; + merchantOrderId: string; + title: string; + items: unknown[]; + amountCents: number; + currency: string; + provider: string; + providerTradeNo: string | null; + checkoutToken: string; + status: 'pending' | 'paying' | 'paid' | 'expired' | 'closed' | 'refunded'; + checkoutUrl: string; + providerQrCode: string | null; + createdAt: string; + expiresAt: string; + paidAt: string | null; + updatedAt: string; +}; + +export type PaymentOrderCreateResponse = { + order: PaymentOrder; +}; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 87fb5dc00..568bb3382 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -7,6 +7,7 @@ export * from './contracts/editorScene'; export * from './contracts/externalGeneration'; export * from './contracts/gameDistribution'; export type * from './contracts/hyper3d'; +export * from './contracts/payment'; export * from './contracts/runtime'; export * from './http'; export * from './llm/narrativeLanguage'; diff --git a/server-rs/crates/api-server/src/admin.rs b/server-rs/crates/api-server/src/admin.rs index eb4b766ac..33140ee88 100644 --- a/server-rs/crates/api-server/src/admin.rs +++ b/server-rs/crates/api-server/src/admin.rs @@ -2201,6 +2201,7 @@ fn admin_permission_requirement(_method: &Method, path: &str) -> AdminPermission path if path.starts_with("/admin/api/agc-templates/") => AnyTab(&["agc-templates"]), "/admin/api/dashboard" => AnyTab(&["dashboard"]), "/admin/api/overview" => AnyTab(&["overview"]), + "/admin/api/payment/orders" => AnyTab(&["payment-orders"]), "/admin/api/external-api-keys" => AnyTab(&["tables"]), "/admin/api/debug/http" => AnyTab(&["debug"]), "/admin/api/tracking/events" => AnyTab(&["tracking"]), @@ -2856,6 +2857,15 @@ async fn fetch_admin_dashboard_rows(state: &AppState, sql: &str) -> Result Result, AppError> { + fetch_admin_dashboard_rows(state, sql) + .await + .map_err(|message| AppError::from_status(StatusCode::BAD_GATEWAY).with_message(message)) +} + /// 用户详情累计充值的单次读取上限:单个用户的历史订单远少于该值。 const ADMIN_USER_RECHARGE_SUMMARY_ROW_LIMIT: u32 = 500; diff --git a/server-rs/crates/api-server/src/app.rs b/server-rs/crates/api-server/src/app.rs index 659686d1f..390031ef9 100644 --- a/server-rs/crates/api-server/src/app.rs +++ b/server-rs/crates/api-server/src/app.rs @@ -23,6 +23,7 @@ use crate::{ external_api_auth::ExternalApiPrincipal, http_error::AppError, modules, + payment::handle_payment_wechat_notify, request_context::{RequestContext, attach_request_context, resolve_request_id}, response_headers::propagate_request_id_header, state::{AppState, BackpressureState}, @@ -71,6 +72,10 @@ pub fn build_router(state: AppState) -> Router { get(handle_wechat_virtual_payment_message_push_verify) .post(handle_wechat_virtual_payment_notify), ) + .route( + "/api/payment/wechat/notify", + post(handle_payment_wechat_notify), + ) // HTTP 背压在业务路由外侧快拒绝,避免过载请求继续占用 SpacetimeDB facade 与业务执行资源。 .layer(middleware::from_fn_with_state( BackpressureState::from_ref(&state), diff --git a/server-rs/crates/api-server/src/external_api_auth.rs b/server-rs/crates/api-server/src/external_api_auth.rs index 307203bb1..54f349b53 100644 --- a/server-rs/crates/api-server/src/external_api_auth.rs +++ b/server-rs/crates/api-server/src/external_api_auth.rs @@ -8,7 +8,9 @@ use axum::{ response::Response, }; use serde_json::json; -use spacetime_client::ExternalApiKeyAuthenticateRecordInput; +use spacetime_client::{ + ExternalApiKeyAuthenticateRecordInput, PaymentApiKeyAuthenticateRecordInput, +}; use tracing::warn; use crate::{ @@ -24,6 +26,9 @@ pub struct ExternalApiPrincipal { owner_user_id: String, key_id: String, scopes: Vec, + payment_app_id: Option, + callback_url: Option, + key_hash: String, } impl ExternalApiPrincipal { @@ -33,6 +38,9 @@ impl ExternalApiPrincipal { owner_user_id: owner_user_id.to_string(), key_id: "external-api-key-test".to_string(), scopes: scopes.iter().map(|scope| (*scope).to_string()).collect(), + payment_app_id: None, + callback_url: None, + key_hash: String::new(), } } @@ -44,9 +52,21 @@ impl ExternalApiPrincipal { self.key_id.as_str() } + pub fn payment_app_id(&self) -> Option<&str> { + self.payment_app_id.as_deref() + } + pub fn has_scope(&self, scope: &str) -> bool { self.scopes.iter().any(|item| item == scope) } + + pub fn payment_callback_url(&self) -> Option<&str> { + self.callback_url.as_deref() + } + + pub fn payment_key_hash(&self) -> &str { + self.key_hash.as_str() + } } pub async fn require_external_api_key( @@ -60,10 +80,11 @@ pub async fn require_external_api_key( .map(|context| context.request_id().to_string()) .unwrap_or_else(|| "unknown".to_string()); let raw_key = extract_external_api_bearer(request.headers())?; + let key_hash = hash_external_api_key(raw_key.as_str()); let key = state .authenticator() .authenticate_external_api_key(ExternalApiKeyAuthenticateRecordInput { - key_hash: hash_external_api_key(raw_key.as_str()), + key_hash: key_hash.clone(), used_at_micros: current_utc_micros(), }) .await @@ -79,6 +100,55 @@ pub async fn require_external_api_key( owner_user_id: key.owner_user_id, key_id: key.key_id, scopes: key.scopes, + payment_app_id: None, + callback_url: None, + key_hash: String::new(), + }; + request.extensions_mut().insert(principal.clone()); + + let mut response = next.run(request).await; + response.extensions_mut().insert(principal); + Ok(response) +} + +pub async fn require_payment_api_key( + State(state): State, + mut request: Request, + next: Next, +) -> Result { + let request_id = request + .extensions() + .get::() + .map(|context| context.request_id().to_string()) + .unwrap_or_else(|| "unknown".to_string()); + let raw_key = extract_external_api_bearer(request.headers())?; + let key_hash = hash_external_api_key(raw_key.as_str()); + let (app, key) = state + .authenticator() + .authenticate_payment_api_key(PaymentApiKeyAuthenticateRecordInput { + key_hash: key_hash.clone(), + used_at_micros: current_utc_micros(), + }) + .await + .map_err(|error| { + warn!( + %request_id, + error = %error, + "支付 API Key 校验失败" + ); + AppError::from_status(StatusCode::UNAUTHORIZED) + .with_message("支付 API Key 不存在或已失效") + })?; + let scopes = serde_json::from_str::>(key.scopes_json.as_str()).map_err(|_| { + AppError::from_status(StatusCode::UNAUTHORIZED).with_message("支付 API Key 权限配置无效") + })?; + let principal = ExternalApiPrincipal { + owner_user_id: app.owner_user_id, + key_id: key.key_id, + scopes, + payment_app_id: Some(app.app_id), + callback_url: app.callback_url, + key_hash, }; request.extensions_mut().insert(principal.clone()); diff --git a/server-rs/crates/api-server/src/main.rs b/server-rs/crates/api-server/src/main.rs index 8515721f5..477b7df9c 100644 --- a/server-rs/crates/api-server/src/main.rs +++ b/server-rs/crates/api-server/src/main.rs @@ -63,6 +63,9 @@ mod modules; mod openai_image_generation; mod password_entry; mod password_management; +mod payment; +mod payment_admin; +mod payment_webhook; mod phone_auth; mod platform_errors; mod process_metrics; @@ -694,6 +697,8 @@ fn spawn_common_app_state_background_workers(state: &AppState) { fn spawn_http_app_state_background_workers(state: &AppState, process_role: ProcessRole) { spawn_common_app_state_background_workers(state); + crate::payment_webhook::PaymentWebhookWorker::new(state.spacetime_client().clone()) + .spawn_worker(); crate::error_reports::spawn_cleanup_worker(state.clone()); if should_start_profile_recharge_expiration_listener(process_role) { spawn_profile_recharge_expiration_listener(state.clone()); diff --git a/server-rs/crates/api-server/src/modules/admin.rs b/server-rs/crates/api-server/src/modules/admin.rs index e16b4a82b..8e40ebb3c 100644 --- a/server-rs/crates/api-server/src/modules/admin.rs +++ b/server-rs/crates/api-server/src/modules/admin.rs @@ -25,6 +25,7 @@ use crate::{ admin_register_recharge_refund, admin_resolve_recharge_refund_manual_review, admin_update_wallet_restriction, }, + payment_admin::admin_list_payment_orders, runtime_profile::{ admin_disable_profile_redeem_code, admin_disable_profile_task_config, admin_get_profile_wallet_config, admin_list_profile_invite_codes, @@ -83,6 +84,7 @@ pub fn router(state: AppState) -> Router { ), ("/admin/api/me", get(admin_me)), ("/admin/api/overview", get(admin_overview)), + ("/admin/api/payment/orders", get(admin_list_payment_orders)), ("/admin/api/dashboard", get(admin_dashboard)), ( "/admin/api/debug/http", diff --git a/server-rs/crates/api-server/src/modules/external_api.rs b/server-rs/crates/api-server/src/modules/external_api.rs index 415a20777..f88171505 100644 --- a/server-rs/crates/api-server/src/modules/external_api.rs +++ b/server-rs/crates/api-server/src/modules/external_api.rs @@ -7,7 +7,9 @@ use axum::{ use crate::{ editor_project::EDITOR_LAYOUT_REQUEST_BODY_MAX_BYTES, - external_api_auth::{require_external_api_key, require_external_mcp_api_key}, + external_api_auth::{ + require_external_api_key, require_external_mcp_api_key, require_payment_api_key, + }, external_assets_api::{ confirm_external_asset_object, create_external_direct_upload_ticket, get_external_asset_read_url, @@ -33,6 +35,7 @@ use crate::{ download_external_skill_archive, get_external_agent_integration_manifest, get_external_skill_entry, }, + payment::{create_external_payment_order, get_external_payment_order}, state::AppState, }; @@ -45,7 +48,8 @@ pub fn router(state: AppState) -> Router { require_external_mcp_api_key, )); - let auth = middleware::from_fn_with_state(state, require_external_api_key); + let auth = middleware::from_fn_with_state(state.clone(), require_external_api_key); + let payment_auth = middleware::from_fn_with_state(state.clone(), require_payment_api_key); let protected_routes = [ ( "/api/external/v1/assets/direct-upload-tickets", @@ -157,6 +161,15 @@ pub fn router(state: AppState) -> Router { .fold(Router::new(), |router, (path, methods)| { router.route(path, methods.route_layer(auth.clone())) }); + let payment_router = Router::new() + .route( + "/api/external/v1/payment/orders", + post(create_external_payment_order).route_layer(payment_auth.clone()), + ) + .route( + "/api/external/v1/payment/orders/{order_id}", + get(get_external_payment_order).route_layer(payment_auth), + ); Router::new() .route("/api/external/v1/openapi.json", get(openapi_json)) @@ -173,6 +186,7 @@ pub fn router(state: AppState) -> Router { get(download_external_skill_archive), ) .merge(protected_router) + .merge(payment_router) .merge(mcp_router) } diff --git a/server-rs/crates/api-server/src/modules/profile.rs b/server-rs/crates/api-server/src/modules/profile.rs index de6768102..e558fe7a1 100644 --- a/server-rs/crates/api-server/src/modules/profile.rs +++ b/server-rs/crates/api-server/src/modules/profile.rs @@ -9,6 +9,10 @@ use crate::{ create_external_api_key, ensure_llm_router_api_key, list_external_api_keys, revoke_external_api_key, }, + payment::{ + create_payment_app, get_public_payment_checkout, list_payment_apps, revoke_payment_api_key, + update_payment_app, + }, profile_identity::update_profile_identity, runtime_profile::{ claim_profile_task_reward, confirm_wechat_profile_recharge_order, @@ -59,6 +63,29 @@ pub fn router(state: AppState) -> Router { require_bearer_auth, )), ) + .route( + "/api/profile/payment/apps", + get(list_payment_apps).post(create_payment_app).route_layer( + middleware::from_fn_with_state(state.clone(), require_bearer_auth), + ), + ) + .route( + "/api/profile/payment/apps/{app_id}", + axum::routing::patch(update_payment_app).route_layer(middleware::from_fn_with_state( + state.clone(), + require_bearer_auth, + )), + ) + .route( + "/api/profile/payment/keys/{key_id}", + axum::routing::delete(revoke_payment_api_key).route_layer( + middleware::from_fn_with_state(state.clone(), require_bearer_auth), + ), + ) + .route( + "/api/payment/checkout/{checkout_token}", + get(get_public_payment_checkout), + ) .route( "/api/profile/wallet-ledger", get(get_profile_wallet_ledger).route_layer(middleware::from_fn_with_state( diff --git a/server-rs/crates/api-server/src/payment.rs b/server-rs/crates/api-server/src/payment.rs new file mode 100644 index 000000000..666edb588 --- /dev/null +++ b/server-rs/crates/api-server/src/payment.rs @@ -0,0 +1,556 @@ +use axum::{ + Extension, Json, + body::Bytes, + extract::{Path, State}, + http::{HeaderMap, StatusCode}, +}; +use hmac::{Hmac, Mac}; +use serde::Deserialize; +use serde_json::{Value, json}; +use sha2::Sha256; +use shared_contracts::payment::{ + PaymentApiKeyResponse, PaymentAppCreateRequest, PaymentAppCreateResponse, + PaymentAppListResponse, PaymentAppResponse, PaymentOrderCreateRequest, + PaymentOrderCreateResponse, PaymentOrderResponse, +}; +use shared_kernel::{build_prefixed_uuid_id, offset_datetime_to_unix_micros, parse_rfc3339}; +use spacetime_client::{ + PaymentApiKeyCreateRecordInput, PaymentAppCreateRecordInput, PaymentOrderCreateRecordInput, + PaymentOrderGetRecordInput, PaymentOrderMarkPaidRecordInput, + PaymentOrderProviderAttemptRecordInput, PaymentOrderProviderCodeRecordInput, + PaymentOrderRecord, +}; + +use crate::{ + api_response::json_success_body, + auth::AuthenticatedAccessToken, + editor_project::current_utc_micros, + external_api_auth::ExternalApiPrincipal, + external_api_keys::hash_external_api_key, + http_error::AppError, + request_context::RequestContext, + state::AppState, + wechat::pay::{build_wechat_payment_service_order_request, map_wechat_pay_error}, +}; + +const PAYMENT_APP_ID_PREFIX: &str = "payment-app-"; +const PAYMENT_KEY_ID_PREFIX: &str = "payment-key-"; +const PAYMENT_CHECKOUT_TOKEN_PREFIX: &str = "checkout-"; +const PAYMENT_RAW_KEY_PREFIX: &str = "tnr_pay_"; +const PAYMENT_CHECKOUT_EXPIRATION_SECONDS: i64 = 5 * 60; +const PAYMENT_IDEMPOTENCY_HEADER: &str = "idempotency-key"; + +pub async fn list_payment_apps( + State(state): State, + Extension(request_context): Extension, + Extension(authenticated): Extension, +) -> Result, AppError> { + let apps = state + .spacetime_client() + .list_payment_apps(authenticated.claims().user_id().to_string()) + .await + .map_err(map_payment_client_error)? + .into_iter() + .map(payment_app_response) + .collect(); + let keys = state + .spacetime_client() + .list_payment_api_keys(authenticated.claims().user_id().to_string()) + .await + .map_err(map_payment_client_error)? + .into_iter() + .map(payment_api_key_response) + .collect(); + + Ok(json_success_body( + Some(&request_context), + PaymentAppListResponse { apps, keys }, + )) +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PaymentAppUpdateRequest { + pub enabled: bool, +} + +pub async fn update_payment_app( + State(state): State, + Extension(request_context): Extension, + Extension(authenticated): Extension, + Path(app_id): Path, + Json(payload): Json, +) -> Result, AppError> { + let app = state + .spacetime_client() + .update_payment_app(spacetime_client::PaymentAppUpdateRecordInput { + app_id, + owner_user_id: authenticated.claims().user_id().to_string(), + enabled: payload.enabled, + updated_at_micros: current_utc_micros(), + }) + .await + .map_err(map_payment_client_error)?; + Ok(json_success_body( + Some(&request_context), + PaymentAppResponse { + app_id: app.app_id, + name: app.name, + callback_url: app.callback_url, + enabled: app.enabled, + created_at: module_runtime::format_utc_micros(app.created_at_micros), + updated_at: module_runtime::format_utc_micros(app.updated_at_micros), + }, + )) +} + +pub async fn revoke_payment_api_key( + State(state): State, + Extension(request_context): Extension, + Extension(authenticated): Extension, + Path(key_id): Path, +) -> Result, AppError> { + let key = state + .spacetime_client() + .revoke_payment_api_key(spacetime_client::PaymentApiKeyRevokeRecordInput { + key_id, + owner_user_id: authenticated.claims().user_id().to_string(), + revoked_at_micros: current_utc_micros(), + }) + .await + .map_err(map_payment_client_error)?; + Ok(json_success_body( + Some(&request_context), + payment_api_key_response(key), + )) +} + +pub async fn create_payment_app( + State(state): State, + Extension(request_context): Extension, + Extension(authenticated): Extension, + Json(payload): Json, +) -> Result, AppError> { + let user_id = authenticated.claims().user_id().to_string(); + let now_micros = current_utc_micros(); + let app = state + .spacetime_client() + .create_payment_app(PaymentAppCreateRecordInput { + app_id: build_prefixed_uuid_id(PAYMENT_APP_ID_PREFIX), + owner_user_id: user_id.clone(), + name: payload.name, + callback_url: payload.callback_url, + now_micros, + }) + .await + .map_err(map_payment_client_error)?; + + let raw_key = format!( + "{PAYMENT_RAW_KEY_PREFIX}{}.{}", + shared_kernel::new_uuid_simple_string(), + shared_kernel::new_uuid_simple_string() + ); + let key = state + .spacetime_client() + .create_payment_api_key(PaymentApiKeyCreateRecordInput { + key_id: build_prefixed_uuid_id(PAYMENT_KEY_ID_PREFIX), + app_id: app.app_id.clone(), + owner_user_id: user_id, + name: "支付服务默认 Key".to_string(), + key_prefix: raw_key.chars().take(18).collect(), + key_hash: hash_external_api_key(raw_key.as_str()), + scopes: vec![ + module_runtime::PAYMENT_SCOPE_ORDERS_CREATE.to_string(), + module_runtime::PAYMENT_SCOPE_ORDERS_READ.to_string(), + module_runtime::PAYMENT_SCOPE_ORDERS_CLOSE.to_string(), + ], + now_micros, + }) + .await + .map_err(map_payment_client_error)?; + + Ok(json_success_body( + Some(&request_context), + PaymentAppCreateResponse { + app: payment_app_response(app), + api_key: raw_key, + key: payment_api_key_response(key), + }, + )) +} + +pub async fn create_external_payment_order( + State(state): State, + Extension(request_context): Extension, + Extension(principal): Extension, + headers: HeaderMap, + Json(payload): Json, +) -> Result, AppError> { + require_payment_scope(&principal, module_runtime::PAYMENT_SCOPE_ORDERS_CREATE)?; + let app_id = principal.payment_app_id().ok_or_else(|| { + AppError::from_status(StatusCode::FORBIDDEN).with_message("该 Key 不是支付应用 Key") + })?; + let idempotency_key = headers + .get(PAYMENT_IDEMPOTENCY_HEADER) + .and_then(|value| value.to_str().ok()) + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| { + AppError::from_status(StatusCode::BAD_REQUEST).with_message("缺少 Idempotency-Key") + })? + .to_string(); + if payload.provider != module_runtime::PAYMENT_PROVIDER_WECHAT_NATIVE { + return Err(AppError::from_status(StatusCode::BAD_REQUEST) + .with_message("当前仅支持微信 Native 支付")); + } + let now_micros = current_utc_micros(); + let expires_at_micros = now_micros + .checked_add(PAYMENT_CHECKOUT_EXPIRATION_SECONDS * 1_000_000) + .ok_or_else(|| { + AppError::from_status(StatusCode::BAD_REQUEST).with_message("订单有效期无效") + })?; + let items_json = serde_json::to_string(&payload.items).map_err(|_| { + AppError::from_status(StatusCode::BAD_REQUEST).with_message("商品明细格式无效") + })?; + let order = state + .spacetime_client() + .create_payment_order(PaymentOrderCreateRecordInput { + order_id: shared_kernel::new_uuid_simple_string(), + app_id: app_id.to_string(), + owner_user_id: principal.owner_user_id().to_string(), + merchant_order_id: payload.merchant_order_id, + idempotency_lookup: format!("{app_id}:{idempotency_key}"), + title: payload.title, + items_json, + amount_cents: payload.amount_cents, + currency: payload.currency, + provider: module_runtime::PaymentProvider::WechatNative, + checkout_token: format!( + "{PAYMENT_CHECKOUT_TOKEN_PREFIX}{}", + shared_kernel::new_uuid_simple_string() + ), + now_micros, + expires_at_micros, + callback_url: principal.payment_callback_url().map(str::to_string), + callback_signing_key_hash: Some(principal.payment_key_hash().to_string()), + }) + .await + .map_err(map_payment_client_error)?; + + if order.provider_code_url.is_some() + || matches!( + order.status, + module_runtime::PaymentOrderStatus::Paid + | module_runtime::PaymentOrderStatus::Closed + | module_runtime::PaymentOrderStatus::Expired + ) + { + return Ok(json_success_body( + Some(&request_context), + PaymentOrderCreateResponse { + order: payment_order_response(order), + }, + )); + } + + let order = state + .spacetime_client() + .mark_payment_order_provider_attempted(PaymentOrderProviderAttemptRecordInput { + order_id: order.order_id, + attempted_at_micros: current_utc_micros(), + }) + .await + .map_err(map_payment_client_error)?; + let provider_payment = state + .wechat_pay_client() + .create_native_order(build_wechat_payment_service_order_request( + order.order_id.clone(), + order.title.clone(), + order.amount_cents, + resolve_payment_client_ip(&headers), + resolve_payment_notify_url()?, + )) + .await + .map_err(map_wechat_pay_error)?; + let order = state + .spacetime_client() + .set_payment_order_provider_code(PaymentOrderProviderCodeRecordInput { + order_id: order.order_id, + provider_code_url: provider_payment.code_url, + updated_at_micros: current_utc_micros(), + }) + .await + .map_err(map_payment_client_error)?; + + Ok(json_success_body( + Some(&request_context), + PaymentOrderCreateResponse { + order: payment_order_response(order), + }, + )) +} + +pub async fn get_external_payment_order( + State(state): State, + Extension(request_context): Extension, + Extension(principal): Extension, + Path(order_id): Path, +) -> Result, AppError> { + require_payment_scope(&principal, module_runtime::PAYMENT_SCOPE_ORDERS_READ)?; + let order = state + .spacetime_client() + .get_payment_order(PaymentOrderGetRecordInput { + order_id, + owner_user_id: Some(principal.owner_user_id().to_string()), + }) + .await + .map_err(map_payment_client_error)?; + Ok(json_success_body( + Some(&request_context), + PaymentOrderCreateResponse { + order: payment_order_response(order), + }, + )) +} + +pub async fn get_public_payment_checkout( + State(state): State, + Extension(request_context): Extension, + Path(checkout_token): Path, +) -> Result, AppError> { + let order = state + .spacetime_client() + .get_payment_order_by_checkout_token(checkout_token) + .await + .map_err(map_payment_client_error)?; + Ok(json_success_body( + Some(&request_context), + PaymentOrderCreateResponse { + order: payment_order_response(order), + }, + )) +} + +pub async fn handle_payment_wechat_notify( + State(state): State, + headers: HeaderMap, + body: Bytes, +) -> Result { + let notify = state + .wechat_pay_client() + .parse_notify(&headers, &body) + .map_err(map_wechat_pay_error)?; + if notify.trade_state != "SUCCESS" { + return Ok(StatusCode::NO_CONTENT); + } + let transaction_id = notify.transaction_id.ok_or_else(|| { + AppError::from_status(StatusCode::BAD_REQUEST) + .with_message("微信支付成功通知缺少 transaction_id") + })?; + let amount_cents = notify.amount_total_cents.ok_or_else(|| { + AppError::from_status(StatusCode::BAD_REQUEST).with_message("微信支付成功通知缺少金额") + })?; + let paid_at_micros = notify + .success_time + .as_deref() + .ok_or_else(|| { + AppError::from_status(StatusCode::BAD_REQUEST) + .with_message("微信支付成功通知缺少 success_time") + }) + .and_then(|value| { + parse_rfc3339(value) + .map(offset_datetime_to_unix_micros) + .map_err(|_| { + AppError::from_status(StatusCode::BAD_REQUEST) + .with_message("微信支付成功通知 success_time 无效") + }) + })?; + let order = state + .spacetime_client() + .get_payment_order(PaymentOrderGetRecordInput { + order_id: notify.out_trade_no, + owner_user_id: None, + }) + .await + .map_err(map_payment_client_error)?; + if order.provider != module_runtime::PaymentProvider::WechatNative + || order.amount_cents != amount_cents + { + return Err(AppError::from_status(StatusCode::BAD_REQUEST) + .with_message("微信支付通知与本地支付订单不一致")); + } + let paid_order = state + .spacetime_client() + .mark_payment_order_paid(PaymentOrderMarkPaidRecordInput { + order_id: order.order_id, + provider_trade_no: transaction_id, + amount_cents, + paid_at_micros, + }) + .await + .map_err(map_payment_client_error)?; + if paid_order.callback_url.is_some() { + let callback_key = paid_order + .callback_signing_key_hash + .as_deref() + .filter(|value| !value.is_empty()) + .ok_or_else(|| { + AppError::from_status(StatusCode::BAD_GATEWAY) + .with_message("支付订单缺少外部回调签名配置") + })?; + let payload_json = serde_json::to_string(&json!({ + "event": "payment.paid", + "orderId": paid_order.order_id, + "appId": paid_order.app_id, + "merchantOrderId": paid_order.merchant_order_id, + "amountCents": paid_order.amount_cents, + "currency": paid_order.currency, + "provider": paid_order.provider.as_str(), + "providerTradeNo": paid_order.provider_trade_no, + "status": "paid", + "paidAt": paid_order.paid_at_micros.map(module_runtime::format_utc_micros), + })) + .map_err(|_| { + AppError::from_status(StatusCode::BAD_GATEWAY).with_message("支付回调内容序列化失败") + })?; + let signature = payment_webhook_signature(callback_key, payload_json.as_bytes()); + state + .spacetime_client() + .enqueue_payment_webhook(spacetime_client::PaymentWebhookEnqueueRecordInput { + order_id: paid_order.order_id, + payload_json, + signature, + now_micros: current_utc_micros(), + }) + .await + .map_err(map_payment_client_error)?; + } + Ok(StatusCode::NO_CONTENT) +} + +fn payment_webhook_signature(key_hash: &str, payload: &[u8]) -> String { + let mut mac = Hmac::::new_from_slice(key_hash.as_bytes()) + .expect("HMAC accepts a non-empty SHA-256 key hash"); + mac.update(payload); + format!("sha256={}", hex::encode(mac.finalize().into_bytes())) +} + +fn payment_app_response(record: spacetime_client::PaymentAppRecord) -> PaymentAppResponse { + PaymentAppResponse { + app_id: record.app_id, + name: record.name, + callback_url: record.callback_url, + enabled: record.enabled, + created_at: module_runtime::format_utc_micros(record.created_at_micros), + updated_at: module_runtime::format_utc_micros(record.updated_at_micros), + } +} + +fn payment_api_key_response( + record: spacetime_client::PaymentApiKeyRecord, +) -> PaymentApiKeyResponse { + PaymentApiKeyResponse { + key_id: record.key_id, + app_id: record.app_id, + name: record.name, + key_prefix: record.key_prefix, + scopes: serde_json::from_str(&record.scopes_json).unwrap_or_default(), + created_at: module_runtime::format_utc_micros(record.created_at_micros), + last_used_at: record + .last_used_at_micros + .map(module_runtime::format_utc_micros), + revoked_at: record + .revoked_at_micros + .map(module_runtime::format_utc_micros), + updated_at: module_runtime::format_utc_micros(record.updated_at_micros), + } +} + +fn payment_order_response(record: PaymentOrderRecord) -> PaymentOrderResponse { + let items = serde_json::from_str::>(&record.items_json).unwrap_or_default(); + PaymentOrderResponse { + order_id: record.order_id, + app_id: record.app_id, + merchant_order_id: record.merchant_order_id, + title: record.title, + items, + amount_cents: record.amount_cents, + currency: record.currency, + provider: record.provider.as_str().to_string(), + provider_trade_no: record.provider_trade_no, + checkout_token: record.checkout_token.clone(), + status: payment_order_status_text(record.status).to_string(), + checkout_url: format!("/pay/{}", record.checkout_token), + provider_qr_code: record.provider_code_url, + created_at: module_runtime::format_utc_micros(record.created_at_micros), + expires_at: module_runtime::format_utc_micros(record.expires_at_micros), + paid_at: record.paid_at_micros.map(module_runtime::format_utc_micros), + updated_at: module_runtime::format_utc_micros(record.updated_at_micros), + } +} + +fn payment_order_status_text(status: module_runtime::PaymentOrderStatus) -> &'static str { + match status { + module_runtime::PaymentOrderStatus::Pending => "pending", + module_runtime::PaymentOrderStatus::Paying => "paying", + module_runtime::PaymentOrderStatus::Paid => "paid", + module_runtime::PaymentOrderStatus::Expired => "expired", + module_runtime::PaymentOrderStatus::Closed => "closed", + module_runtime::PaymentOrderStatus::Refunded => "refunded", + } +} + +fn require_payment_scope(principal: &ExternalApiPrincipal, scope: &str) -> Result<(), AppError> { + if principal.payment_app_id().is_some() && principal.has_scope(scope) { + return Ok(()); + } + Err(AppError::from_status(StatusCode::FORBIDDEN) + .with_message("支付 API Key 没有当前操作权限") + .with_details(json!({ "scope": scope }))) +} + +fn resolve_payment_client_ip(headers: &HeaderMap) -> String { + headers + .get("x-forwarded-for") + .and_then(|value| value.to_str().ok()) + .and_then(|value| value.split(',').next()) + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or("127.0.0.1") + .to_string() +} + +fn resolve_payment_notify_url() -> Result { + let value = std::env::var("WECHAT_PAYMENT_NOTIFY_URL") + .ok() + .map(|value| value.trim().to_string()) + .filter(|value| !value.is_empty()); + if let Some(value) = value { + return Ok(value); + } + if std::env::var("WECHAT_PAY_PROVIDER").ok().as_deref() == Some("mock") { + return Ok("http://127.0.0.1/api/payment/wechat/notify".to_string()); + } + Err(AppError::from_status(StatusCode::SERVICE_UNAVAILABLE) + .with_message("缺少 WECHAT_PAYMENT_NOTIFY_URL,无法创建支付服务订单")) +} + +fn map_payment_client_error(error: spacetime_client::SpacetimeClientError) -> AppError { + match error { + spacetime_client::SpacetimeClientError::Procedure(message) + if message.contains("PAYMENT_PROVIDER_PENDING") => + { + AppError::from_status(StatusCode::CONFLICT) + .with_message("支付平台下单处理中,请稍后查单") + } + spacetime_client::SpacetimeClientError::Procedure(message) + | spacetime_client::SpacetimeClientError::Runtime(message) => { + AppError::from_status(StatusCode::BAD_REQUEST) + .with_message("支付服务请求未通过") + .with_details(json!({ "message": message })) + } + other => AppError::from_status(StatusCode::BAD_GATEWAY) + .with_message("支付服务暂时不可用") + .with_details(json!({ "message": other.to_string() })), + } +} diff --git a/server-rs/crates/api-server/src/payment_admin.rs b/server-rs/crates/api-server/src/payment_admin.rs new file mode 100644 index 000000000..3a08bc206 --- /dev/null +++ b/server-rs/crates/api-server/src/payment_admin.rs @@ -0,0 +1,144 @@ +use crate::{ + admin::{AuthenticatedAdmin, fetch_admin_payment_rows}, + http_error::AppError, + request_context::RequestContext, + state::AppState, +}; +use axum::{Extension, Json, extract::State}; +use serde::Serialize; +use serde_json::Value; + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct AdminPaymentOrderEntry { + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub merchant_order_id: String, + pub title: String, + pub amount_cents: u64, + pub currency: String, + pub provider: String, + pub provider_trade_no: Option, + pub status: String, + pub created_at: String, + pub expires_at: String, + pub paid_at: Option, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct AdminPaymentOrderListResponse { + pub entries: Vec, + pub webhooks: Vec, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct AdminPaymentWebhookEntry { + pub delivery_id: String, + pub order_id: String, + pub app_id: String, + pub callback_url: String, + pub status: String, + pub attempt_count: u32, + pub available_at: String, + pub last_error_message: Option, + pub updated_at: String, +} + +pub async fn admin_list_payment_orders( + State(state): State, + Extension(_admin): Extension, + Extension(_request_context): Extension, +) -> Result, AppError> { + let rows = fetch_admin_payment_rows( + &state, + "SELECT order_id, app_id, owner_user_id, merchant_order_id, title, amount_cents, currency, provider, provider_trade_no, status, created_at, expires_at, paid_at FROM payment_order ORDER BY created_at DESC LIMIT 200", + ) + .await?; + let entries = rows + .into_iter() + .filter_map(parse_payment_order_row) + .collect(); + let webhook_rows = fetch_admin_payment_rows( + &state, + "SELECT delivery_id, order_id, app_id, callback_url, status, attempt_count, available_at, last_error_message, updated_at FROM payment_webhook_delivery ORDER BY updated_at DESC LIMIT 200", + ) + .await?; + let webhooks = webhook_rows + .into_iter() + .filter_map(parse_payment_webhook_row) + .collect(); + Ok(Json(AdminPaymentOrderListResponse { entries, webhooks })) +} + +fn parse_payment_webhook_row(row: Value) -> Option { + let cells = row.as_array()?; + Some(AdminPaymentWebhookEntry { + delivery_id: cell_text(cells.get(0)?)?, + order_id: cell_text(cells.get(1)?)?, + app_id: cell_text(cells.get(2)?)?, + callback_url: cell_text(cells.get(3)?)?, + status: cell_text(cells.get(4)?)?, + attempt_count: cell_u64(cells.get(5)?)? as u32, + available_at: cell_timestamp(cells.get(6)?), + last_error_message: cell_option_text(cells.get(7)?), + updated_at: cell_timestamp(cells.get(8)?), + }) +} + +fn parse_payment_order_row(row: Value) -> Option { + let cells = row.as_array()?; + Some(AdminPaymentOrderEntry { + order_id: cell_text(cells.get(0)?)?, + app_id: cell_text(cells.get(1)?)?, + owner_user_id: cell_text(cells.get(2)?)?, + merchant_order_id: cell_text(cells.get(3)?)?, + title: cell_text(cells.get(4)?)?, + amount_cents: cell_u64(cells.get(5)?)?, + currency: cell_text(cells.get(6)?)?, + provider: cell_text(cells.get(7)?)?, + provider_trade_no: cell_option_text(cells.get(8)?), + status: cell_text(cells.get(9)?)?, + created_at: cell_timestamp(cells.get(10)?), + expires_at: cell_timestamp(cells.get(11)?), + paid_at: cell_option_timestamp(cells.get(12)?), + }) +} + +fn cell_text(value: &Value) -> Option { + match value { + Value::String(text) => Some(text.clone()), + Value::Number(number) => Some(number.to_string()), + Value::Array(values) if values.len() == 2 => cell_text(values.get(1)?), + Value::Array(values) if values.len() == 1 => cell_text(values.first()?), + Value::Object(object) if object.len() == 1 => cell_text(object.values().next()?), + _ => Some(value.to_string()), + } +} + +fn cell_option_text(value: &Value) -> Option { + if matches!(value, Value::Array(values) if values.first().and_then(Value::as_u64) == Some(1)) { + return None; + } + cell_text(value).filter(|text| !text.is_empty() && text != "null") +} + +fn cell_u64(value: &Value) -> Option { + cell_text(value)?.parse().ok() +} + +fn cell_timestamp(value: &Value) -> String { + cell_text(value) + .and_then(|text| text.parse::().ok()) + .map(module_runtime::format_utc_micros) + .unwrap_or_else(|| "-".to_string()) +} + +fn cell_option_timestamp(value: &Value) -> Option { + if matches!(value, Value::Array(values) if values.first().and_then(Value::as_u64) == Some(1)) { + return None; + } + Some(cell_timestamp(value)) +} diff --git a/server-rs/crates/api-server/src/payment_webhook.rs b/server-rs/crates/api-server/src/payment_webhook.rs new file mode 100644 index 000000000..ae6ba9692 --- /dev/null +++ b/server-rs/crates/api-server/src/payment_webhook.rs @@ -0,0 +1,135 @@ +use std::sync::Arc; +use std::time::Duration; + +use reqwest::header::{CONTENT_TYPE, HeaderName, HeaderValue}; +use spacetime_client::{ + PaymentWebhookClaimRecordInput, PaymentWebhookCompleteRecordInput, + PaymentWebhookDeliveryRecord, SpacetimeClient, +}; +use tokio::time::sleep; +use tracing::{debug, warn}; + +use crate::editor_project::current_utc_micros; + +const PAYMENT_WEBHOOK_WORKER_ID: &str = "api-server-payment-webhook"; +const PAYMENT_WEBHOOK_BATCH_SIZE: u32 = 20; +const PAYMENT_WEBHOOK_INTERVAL: Duration = Duration::from_secs(5); +const PAYMENT_WEBHOOK_REQUEST_TIMEOUT: Duration = Duration::from_secs(10); + +#[derive(Clone)] +pub struct PaymentWebhookWorker { + spacetime_client: SpacetimeClient, + http_client: reqwest::Client, +} + +impl PaymentWebhookWorker { + pub fn new(spacetime_client: SpacetimeClient) -> Arc { + Arc::new(Self { + spacetime_client, + http_client: reqwest::Client::builder() + .connect_timeout(Duration::from_secs(3)) + .timeout(PAYMENT_WEBHOOK_REQUEST_TIMEOUT) + .build() + .expect("payment webhook client should build"), + }) + } + + pub fn spawn_worker(self: Arc) { + tokio::spawn(async move { + loop { + if let Err(error) = self.process_once().await { + warn!(error = %error, "支付外部回调 worker 处理失败,将继续重试"); + } + sleep(PAYMENT_WEBHOOK_INTERVAL).await; + } + }); + } + + async fn process_once(&self) -> Result<(), String> { + let now_micros = current_utc_micros(); + let lease_expires_at_micros = now_micros.saturating_add(60_000_000); + let deliveries = self + .spacetime_client + .claim_payment_webhooks(PaymentWebhookClaimRecordInput { + worker_id: PAYMENT_WEBHOOK_WORKER_ID.to_string(), + limit: PAYMENT_WEBHOOK_BATCH_SIZE, + now_micros, + lease_expires_at_micros, + }) + .await + .map_err(|error| error.to_string())?; + + for delivery in deliveries { + self.deliver_one(delivery).await; + } + Ok(()) + } + + async fn deliver_one(&self, delivery: PaymentWebhookDeliveryRecord) { + let result = self + .http_client + .post(&delivery.callback_url) + .header(CONTENT_TYPE, "application/json") + .header( + HeaderName::from_static("x-genarrative-signature"), + HeaderValue::from_str(delivery.signature.as_str()) + .unwrap_or_else(|_| HeaderValue::from_static("invalid")), + ) + .header( + HeaderName::from_static("x-genarrative-event"), + "payment.paid", + ) + .header( + HeaderName::from_static("x-genarrative-delivery-id"), + delivery.delivery_id.as_str(), + ) + .body(delivery.payload_json.clone()) + .send() + .await; + + let (success, error_message) = match result { + Ok(response) if response.status().is_success() => (true, None), + Ok(response) => ( + false, + Some(format!("callback HTTP {}", response.status().as_u16())), + ), + Err(error) => (false, Some(format!("callback request failed: {error}"))), + }; + let now_micros = current_utc_micros(); + let next_available_at_micros = if success { + now_micros + } else { + let delay_seconds = 2_i64 + .saturating_pow(delivery.attempt_count.min(7)) + .saturating_mul(5) + .min(300); + now_micros.saturating_add(delay_seconds.saturating_mul(1_000_000)) + }; + if let Err(error) = self + .spacetime_client + .complete_payment_webhook(PaymentWebhookCompleteRecordInput { + delivery_id: delivery.delivery_id.clone(), + worker_id: PAYMENT_WEBHOOK_WORKER_ID.to_string(), + success, + error_message, + now_micros, + next_available_at_micros, + attempt_count: delivery.attempt_count, + }) + .await + { + warn!( + delivery_id = %delivery.delivery_id, + error = %error, + "支付外部回调结果写回失败" + ); + } else { + debug!( + delivery_id = %delivery.delivery_id, + success, + attempt_count = delivery.attempt_count, + "支付外部回调处理完成" + ); + } + } +} diff --git a/server-rs/crates/api-server/src/state/external_api_auth.rs b/server-rs/crates/api-server/src/state/external_api_auth.rs index 2e7f7cb85..93b6d14ac 100644 --- a/server-rs/crates/api-server/src/state/external_api_auth.rs +++ b/server-rs/crates/api-server/src/state/external_api_auth.rs @@ -3,7 +3,8 @@ use std::sync::Arc; use axum::extract::FromRef; use futures_util::future::BoxFuture; use spacetime_client::{ - ExternalApiKeyAuthenticateRecordInput, ExternalApiKeyRecord, SpacetimeClient, + ExternalApiKeyAuthenticateRecordInput, ExternalApiKeyRecord, + PaymentApiKeyAuthenticateRecordInput, PaymentApiKeyRecord, PaymentAppRecord, SpacetimeClient, SpacetimeClientError, }; @@ -14,6 +15,17 @@ pub(crate) trait ExternalApiKeyAuthenticator: Send + Sync { &self, input: ExternalApiKeyAuthenticateRecordInput, ) -> BoxFuture<'_, Result>; + + fn authenticate_payment_api_key( + &self, + _input: PaymentApiKeyAuthenticateRecordInput, + ) -> BoxFuture<'_, Result<(PaymentAppRecord, PaymentApiKeyRecord), SpacetimeClientError>> { + Box::pin(async { + Err(SpacetimeClientError::Procedure( + "支付 API Key 认证未配置".to_string(), + )) + }) + } } impl ExternalApiKeyAuthenticator for SpacetimeClient { @@ -23,6 +35,13 @@ impl ExternalApiKeyAuthenticator for SpacetimeClient { ) -> BoxFuture<'_, Result> { Box::pin(SpacetimeClient::authenticate_external_api_key(self, input)) } + + fn authenticate_payment_api_key( + &self, + input: PaymentApiKeyAuthenticateRecordInput, + ) -> BoxFuture<'_, Result<(PaymentAppRecord, PaymentApiKeyRecord), SpacetimeClientError>> { + Box::pin(SpacetimeClient::authenticate_payment_api_key(self, input)) + } } #[derive(Clone)] diff --git a/server-rs/crates/api-server/src/wechat/pay.rs b/server-rs/crates/api-server/src/wechat/pay.rs index 3cc839884..85ebf9583 100644 --- a/server-rs/crates/api-server/src/wechat/pay.rs +++ b/server-rs/crates/api-server/src/wechat/pay.rs @@ -1089,6 +1089,23 @@ pub fn build_wechat_web_payment_request( description: format!("陶泥儿 - {product_title}"), amount_cents, payer_client_ip, + notify_url: None, + } +} + +pub fn build_wechat_payment_service_order_request( + order_id: String, + product_title: String, + amount_cents: u64, + payer_client_ip: String, + notify_url: String, +) -> WechatWebOrderRequest { + WechatWebOrderRequest { + order_id, + description: format!("陶泥儿 - {product_title}"), + amount_cents, + payer_client_ip, + notify_url: Some(notify_url), } } diff --git a/server-rs/crates/module-runtime/src/lib.rs b/server-rs/crates/module-runtime/src/lib.rs index c6698f7a6..fd5f7252c 100644 --- a/server-rs/crates/module-runtime/src/lib.rs +++ b/server-rs/crates/module-runtime/src/lib.rs @@ -2,6 +2,8 @@ pub mod agc_analytics; mod agc_models; mod llm_billing; pub use llm_billing::*; +mod payment; +pub use payment::*; mod application; pub use agc_models::*; mod commands; diff --git a/server-rs/crates/module-runtime/src/payment.rs b/server-rs/crates/module-runtime/src/payment.rs new file mode 100644 index 000000000..2a08a934a --- /dev/null +++ b/server-rs/crates/module-runtime/src/payment.rs @@ -0,0 +1,532 @@ +use serde::{Deserialize, Serialize}; +use url::Url; + +#[cfg(feature = "spacetime-types")] +use spacetimedb::SpacetimeType; + +pub const PAYMENT_PROVIDER_WECHAT_NATIVE: &str = "wechat_native"; +pub const PAYMENT_SCOPE_ORDERS_CREATE: &str = "payment:orders:create"; +pub const PAYMENT_SCOPE_ORDERS_READ: &str = "payment:orders:read"; +pub const PAYMENT_SCOPE_ORDERS_CLOSE: &str = "payment:orders:close"; +pub const PAYMENT_APP_NAME_MAX_CHARS: usize = 80; +pub const PAYMENT_ORDER_TITLE_MAX_CHARS: usize = 128; +pub const PAYMENT_MERCHANT_ORDER_ID_MAX_CHARS: usize = 96; +pub const PAYMENT_IDEMPOTENCY_KEY_MAX_CHARS: usize = 128; +pub const PAYMENT_CURRENCY_MAX_CHARS: usize = 16; +pub const PAYMENT_ITEMS_MAX_BYTES: usize = 16 * 1024; +pub const PAYMENT_CALLBACK_URL_MAX_CHARS: usize = 512; +pub const PAYMENT_ORDER_MIN_AMOUNT_CENTS: u64 = 1; +pub const PAYMENT_ORDER_MAX_AMOUNT_CENTS: u64 = 9_999_999_999; +pub const PAYMENT_WEBHOOK_MAX_ATTEMPTS: u32 = 8; + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum PaymentOrderStatus { + Pending, + Paying, + Paid, + Expired, + Closed, + Refunded, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum PaymentProvider { + WechatNative, +} + +impl PaymentProvider { + pub fn as_str(self) -> &'static str { + match self { + Self::WechatNative => PAYMENT_PROVIDER_WECHAT_NATIVE, + } + } +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentAppSnapshot { + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub callback_url: Option, + pub enabled: bool, + pub created_at_micros: i64, + pub updated_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentApiKeySnapshot { + pub key_id: String, + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub key_prefix: String, + pub scopes_json: String, + pub created_at_micros: i64, + pub last_used_at_micros: Option, + pub revoked_at_micros: Option, + pub updated_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentOrderSnapshot { + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub merchant_order_id: String, + pub idempotency_lookup: String, + pub title: String, + pub items_json: String, + pub amount_cents: u64, + pub currency: String, + pub provider: PaymentProvider, + pub provider_trade_no: Option, + pub provider_code_url: Option, + pub callback_url: Option, + pub callback_signing_key_hash: Option, + pub provider_attempted_at_micros: Option, + pub checkout_token: String, + pub status: PaymentOrderStatus, + pub created_at_micros: i64, + pub expires_at_micros: i64, + pub paid_at_micros: Option, + pub updated_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentAppCreateInput { + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub callback_url: Option, + pub now_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentApiKeyCreateInput { + pub key_id: String, + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub key_prefix: String, + pub key_hash: String, + pub scopes_json: String, + pub now_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentAppListInput { + pub owner_user_id: String, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentAppUpdateInput { + pub app_id: String, + pub owner_user_id: String, + pub enabled: bool, + pub updated_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentApiKeyListInput { + pub owner_user_id: String, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentApiKeyRevokeInput { + pub key_id: String, + pub owner_user_id: String, + pub revoked_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentApiKeyAuthenticateInput { + pub key_hash: String, + pub used_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentOrderCreateInput { + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub merchant_order_id: String, + pub idempotency_lookup: String, + pub title: String, + pub items_json: String, + pub amount_cents: u64, + pub currency: String, + pub provider: PaymentProvider, + pub checkout_token: String, + pub now_micros: i64, + pub expires_at_micros: i64, + pub callback_url: Option, + pub callback_signing_key_hash: Option, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentOrderGetInput { + pub order_id: String, + pub owner_user_id: Option, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentOrderCheckoutGetInput { + pub checkout_token: String, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentOrderListInput { + pub app_id: Option, + pub owner_user_id: String, + pub limit: u32, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentOrderMarkPaidInput { + pub order_id: String, + pub provider_trade_no: String, + pub amount_cents: u64, + pub paid_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentOrderProviderCodeInput { + pub order_id: String, + pub provider_code_url: String, + pub updated_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentOrderProviderAttemptInput { + pub order_id: String, + pub attempted_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentWebhookDeliverySnapshot { + pub delivery_id: String, + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub callback_url: String, + pub payload_json: String, + pub signature: String, + pub status: String, + pub attempt_count: u32, + pub available_at_micros: i64, + pub lease_worker_id: Option, + pub lease_expires_at_micros: Option, + pub last_error_message: Option, + pub created_at_micros: i64, + pub updated_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentWebhookEnqueueInput { + pub order_id: String, + pub payload_json: String, + pub signature: String, + pub now_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentWebhookClaimInput { + pub worker_id: String, + pub limit: u32, + pub now_micros: i64, + pub lease_expires_at_micros: i64, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentWebhookCompleteInput { + pub delivery_id: String, + pub worker_id: String, + pub success: bool, + pub error_message: Option, + pub now_micros: i64, + pub next_available_at_micros: i64, + pub attempt_count: u32, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentWebhookProcedureResult { + pub ok: bool, + pub delivery: Option, + pub deliveries: Vec, + pub error_message: Option, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentAppProcedureResult { + pub ok: bool, + pub app: Option, + pub key: Option, + pub apps: Vec, + pub keys: Vec, + pub error_message: Option, +} + +#[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaymentOrderProcedureResult { + pub ok: bool, + pub order: Option, + pub orders: Vec, + pub error_message: Option, +} + +pub fn build_payment_app_create_input( + app_id: String, + owner_user_id: String, + name: String, + callback_url: Option, + now_micros: i64, +) -> Result { + let app_id = required(app_id, "payment_app.app_id")?; + let owner_user_id = required(owner_user_id, "payment_app.owner_user_id")?; + let name = bounded(name, "payment_app.name", PAYMENT_APP_NAME_MAX_CHARS)?; + let callback_url = callback_url + .map(|value| { + let value = bounded( + value, + "payment_app.callback_url", + PAYMENT_CALLBACK_URL_MAX_CHARS, + )?; + let parsed = Url::parse(value.as_str()) + .map_err(|_| "payment_app.callback_url 格式无效".to_string())?; + let host = parsed + .host_str() + .ok_or_else(|| "payment_app.callback_url 缺少主机名".to_string())?; + let loopback_http = parsed.scheme() == "http" + && (host.eq_ignore_ascii_case("localhost") + || host + .parse::() + .is_ok_and(|address| address.is_loopback())); + if parsed.scheme() != "https" && !loopback_http { + return Err("payment_app.callback_url 必须使用 HTTPS".to_string()); + } + if parsed.username() != "" || parsed.password().is_some() || parsed.fragment().is_some() + { + return Err("payment_app.callback_url 不得包含凭据或 fragment".to_string()); + } + Ok(value) + }) + .transpose()?; + Ok(PaymentAppCreateInput { + app_id, + owner_user_id, + name, + callback_url, + now_micros, + }) +} + +pub fn build_payment_api_key_create_input( + key_id: String, + app_id: String, + owner_user_id: String, + name: String, + key_prefix: String, + key_hash: String, + scopes_json: String, + now_micros: i64, +) -> Result { + Ok(PaymentApiKeyCreateInput { + key_id: required(key_id, "payment_api_key.key_id")?, + app_id: required(app_id, "payment_api_key.app_id")?, + owner_user_id: required(owner_user_id, "payment_api_key.owner_user_id")?, + name: bounded(name, "payment_api_key.name", PAYMENT_APP_NAME_MAX_CHARS)?, + key_prefix: required(key_prefix, "payment_api_key.key_prefix")?, + key_hash: required(key_hash, "payment_api_key.key_hash")?, + scopes_json: bounded(scopes_json, "payment_api_key.scopes_json", 512)?, + now_micros, + }) +} + +pub fn build_payment_order_create_input( + order_id: String, + app_id: String, + owner_user_id: String, + merchant_order_id: String, + idempotency_lookup: String, + title: String, + items_json: String, + amount_cents: u64, + currency: String, + provider: PaymentProvider, + checkout_token: String, + now_micros: i64, + expires_at_micros: i64, + callback_url: Option, + callback_signing_key_hash: Option, +) -> Result { + if !(PAYMENT_ORDER_MIN_AMOUNT_CENTS..=PAYMENT_ORDER_MAX_AMOUNT_CENTS).contains(&amount_cents) { + return Err("payment_order.amount_cents 超出允许范围".to_string()); + } + if currency != "CNY" { + return Err("PAYMENT_INVALID_AMOUNT_OR_CURRENCY".to_string()); + } + let items: serde_json::Value = + serde_json::from_str(&items_json).map_err(|_| "PAYMENT_INVALID_ITEMS".to_string())?; + if !items.is_array() + || items + .as_array() + .is_some_and(|rows| rows.iter().any(|v| !v.is_object())) + || items_json.to_lowercase().contains("data:") + || items_json.to_lowercase().contains("blob:") + { + return Err("PAYMENT_INVALID_ITEMS".to_string()); + } + if items_json.len() > PAYMENT_ITEMS_MAX_BYTES { + return Err("payment_order.items_json 超出大小限制".to_string()); + } + if expires_at_micros <= now_micros { + return Err("payment_order.expires_at_micros 必须晚于创建时间".to_string()); + } + Ok(PaymentOrderCreateInput { + order_id: required(order_id, "payment_order.order_id")?, + app_id: required(app_id, "payment_order.app_id")?, + owner_user_id: required(owner_user_id, "payment_order.owner_user_id")?, + merchant_order_id: bounded( + merchant_order_id, + "payment_order.merchant_order_id", + PAYMENT_MERCHANT_ORDER_ID_MAX_CHARS, + )?, + idempotency_lookup: bounded( + idempotency_lookup, + "payment_order.idempotency_lookup", + PAYMENT_IDEMPOTENCY_KEY_MAX_CHARS + 128, + )?, + title: bounded(title, "payment_order.title", PAYMENT_ORDER_TITLE_MAX_CHARS)?, + items_json, + amount_cents, + currency: bounded( + currency, + "payment_order.currency", + PAYMENT_CURRENCY_MAX_CHARS, + )?, + provider, + checkout_token: required(checkout_token, "payment_order.checkout_token")?, + now_micros, + expires_at_micros, + callback_url: callback_url + .map(|value| { + bounded( + value, + "payment_order.callback_url", + PAYMENT_CALLBACK_URL_MAX_CHARS, + ) + }) + .transpose()?, + callback_signing_key_hash: callback_signing_key_hash + .map(|value| required(value, "payment_order.callback_signing_key_hash")) + .transpose()?, + }) +} + +pub fn build_payment_order_mark_paid_input( + order_id: String, + provider_trade_no: String, + amount_cents: u64, + paid_at_micros: i64, +) -> Result { + if paid_at_micros <= 0 || amount_cents == 0 { + return Err("PAYMENT_INVALID_PROVIDER_FACT".to_string()); + } + Ok(PaymentOrderMarkPaidInput { + order_id: required(order_id, "payment_order.order_id")?, + provider_trade_no: required(provider_trade_no, "payment_order.provider_trade_no")?, + amount_cents, + paid_at_micros, + }) +} + +fn required(value: String, field: &str) -> Result { + let value = value.trim().to_string(); + if value.is_empty() { + return Err(format!("{field} 不能为空")); + } + Ok(value) +} + +fn bounded(value: String, field: &str, max_chars: usize) -> Result { + let value = required(value, field)?; + if value.chars().count() > max_chars { + return Err(format!("{field} 超出长度限制")); + } + Ok(value) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn payment_order_validation_rejects_zero_amount_and_expired_order() { + assert!( + build_payment_order_create_input( + "order".into(), + "app".into(), + "owner".into(), + "merchant".into(), + "lookup".into(), + "商品".into(), + "[]".into(), + 0, + "CNY".into(), + PaymentProvider::WechatNative, + "checkout".into(), + 10, + 20, + None, + None, + ) + .is_err() + ); + assert!( + build_payment_order_create_input( + "order".into(), + "app".into(), + "owner".into(), + "merchant".into(), + "lookup".into(), + "商品".into(), + "[]".into(), + 100, + "CNY".into(), + PaymentProvider::WechatNative, + "checkout".into(), + 20, + 20, + None, + None, + ) + .is_err() + ); + } +} diff --git a/server-rs/crates/platform-wechat/src/pay.rs b/server-rs/crates/platform-wechat/src/pay.rs index d3d862883..075c163ce 100644 --- a/server-rs/crates/platform-wechat/src/pay.rs +++ b/server-rs/crates/platform-wechat/src/pay.rs @@ -192,6 +192,7 @@ pub struct WechatWebOrderRequest { pub description: String, pub amount_cents: u64, pub payer_client_ip: String, + pub notify_url: Option, } #[derive(Clone, Debug)] @@ -985,7 +986,7 @@ impl RealWechatPayClient { description: &request.description, out_trade_no: &request.order_id, time_expire: &expires_at_text, - notify_url: &self.notify_url, + notify_url: request.notify_url.as_deref().unwrap_or(&self.notify_url), amount: WechatJsapiAmount { total: amount_total, currency: "CNY", @@ -1040,7 +1041,7 @@ impl RealWechatPayClient { description: &request.description, out_trade_no: &request.order_id, time_expire: &expires_at_text, - notify_url: &self.notify_url, + notify_url: request.notify_url.as_deref().unwrap_or(&self.notify_url), amount: WechatJsapiAmount { total: amount_total, currency: "CNY", diff --git a/server-rs/crates/shared-contracts/src/lib.rs b/server-rs/crates/shared-contracts/src/lib.rs index 07fbbdf11..ed92100fb 100644 --- a/server-rs/crates/shared-contracts/src/lib.rs +++ b/server-rs/crates/shared-contracts/src/lib.rs @@ -23,4 +23,5 @@ pub mod game_creation_app; pub mod game_distribution; pub mod hyper3d; pub mod llm; +pub mod payment; pub mod runtime; diff --git a/server-rs/crates/shared-contracts/src/payment.rs b/server-rs/crates/shared-contracts/src/payment.rs new file mode 100644 index 000000000..866a4d940 --- /dev/null +++ b/server-rs/crates/shared-contracts/src/payment.rs @@ -0,0 +1,106 @@ +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentAppCreateRequest { + pub name: String, + #[serde(default)] + pub callback_url: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentAppResponse { + pub app_id: String, + pub name: String, + pub callback_url: Option, + pub enabled: bool, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentApiKeyResponse { + pub key_id: String, + pub app_id: String, + pub name: String, + pub key_prefix: String, + pub scopes: Vec, + pub created_at: String, + pub last_used_at: Option, + pub revoked_at: Option, + pub updated_at: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentAppCreateResponse { + pub app: PaymentAppResponse, + pub api_key: String, + pub key: PaymentApiKeyResponse, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentAppListResponse { + pub apps: Vec, + pub keys: Vec, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentOrderCreateRequest { + pub merchant_order_id: String, + pub title: String, + #[serde(default)] + pub items: Vec, + pub amount_cents: u64, + #[serde(default = "default_payment_currency")] + pub currency: String, + #[serde(default = "default_payment_provider")] + pub provider: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentOrderResponse { + pub order_id: String, + pub app_id: String, + pub merchant_order_id: String, + pub title: String, + pub items: Vec, + pub amount_cents: u64, + pub currency: String, + pub provider: String, + pub provider_trade_no: Option, + pub checkout_token: String, + pub status: String, + pub checkout_url: String, + pub provider_qr_code: Option, + pub created_at: String, + pub expires_at: String, + pub paid_at: Option, + pub updated_at: String, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentOrderCreateResponse { + pub order: PaymentOrderResponse, +} + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct PaymentOrderListResponse { + pub orders: Vec, +} + +pub fn default_payment_currency() -> String { + "CNY".to_string() +} + +pub fn default_payment_provider() -> String { + "wechat_native".to_string() +} diff --git a/server-rs/crates/spacetime-client/src/active.rs b/server-rs/crates/spacetime-client/src/active.rs index b0ee057ca..7a1651ae4 100644 --- a/server-rs/crates/spacetime-client/src/active.rs +++ b/server-rs/crates/spacetime-client/src/active.rs @@ -35,6 +35,8 @@ pub use game_distribution::{ #[path = "active/external_generation.rs"] pub mod external_generation; pub mod llm_router_account; +#[path = "active/payment.rs"] +pub mod payment; pub use external_generation::{ ExternalGenerationJobPhaseUpdateError, ExternalGenerationQueueWakeSubscription, }; diff --git a/server-rs/crates/spacetime-client/src/active/mapper.rs b/server-rs/crates/spacetime-client/src/active/mapper.rs index a12c42531..07b1a9cf8 100644 --- a/server-rs/crates/spacetime-client/src/active/mapper.rs +++ b/server-rs/crates/spacetime-client/src/active/mapper.rs @@ -24,6 +24,8 @@ mod external_generation; mod game_distribution; #[path = "mapper/llm_router_account.rs"] pub(crate) mod llm_router_account; +#[path = "mapper/payment.rs"] +mod payment; #[path = "mapper/runtime.rs"] mod runtime; #[path = "mapper/runtime_profile.rs"] @@ -103,6 +105,15 @@ pub use self::game_distribution::{ GameDistributionVersionRecord, }; pub use self::llm_router_account::{LlmRouterAccountRecord, LlmRouterAccountUpsertRecordInput}; +pub use self::payment::{ + PaymentApiKeyAuthenticateRecordInput, PaymentApiKeyCreateRecordInput, PaymentApiKeyRecord, + PaymentApiKeyRevokeRecordInput, PaymentAppCreateRecordInput, PaymentAppRecord, + PaymentAppUpdateRecordInput, PaymentOrderCreateRecordInput, PaymentOrderGetRecordInput, + PaymentOrderListRecordInput, PaymentOrderMarkPaidRecordInput, + PaymentOrderProviderAttemptRecordInput, PaymentOrderProviderCodeRecordInput, + PaymentOrderRecord, PaymentWebhookClaimRecordInput, PaymentWebhookCompleteRecordInput, + PaymentWebhookDeliveryRecord, PaymentWebhookEnqueueRecordInput, +}; pub use self::runtime::FeatureGateConfigRecord; pub(crate) use self::admin_account::{ @@ -161,6 +172,12 @@ pub(crate) use self::game_distribution::{ map_game_distribution_public_game_result, map_game_distribution_review_list_result, map_game_distribution_version_result, map_review_moderation_operation, map_user_review, }; +pub(crate) use self::payment::{ + map_payment_api_key_list_result, map_payment_api_key_result, map_payment_app_list_result, + map_payment_app_result, map_payment_authenticate_result, map_payment_order_list_result, + map_payment_order_result, map_payment_webhook_claim_result, + map_payment_webhook_complete_result, map_payment_webhook_enqueue_result, +}; pub(crate) use self::runtime::{ map_feature_gate_config_procedure_result, map_runtime_setting_procedure_result, map_runtime_tracking_event_batch_procedure_result, map_runtime_tracking_event_procedure_result, diff --git a/server-rs/crates/spacetime-client/src/active/mapper/payment.rs b/server-rs/crates/spacetime-client/src/active/mapper/payment.rs new file mode 100644 index 000000000..43c482d36 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/active/mapper/payment.rs @@ -0,0 +1,516 @@ +use super::*; + +pub type PaymentAppRecord = module_runtime::PaymentAppSnapshot; +pub type PaymentApiKeyRecord = module_runtime::PaymentApiKeySnapshot; +pub type PaymentOrderRecord = module_runtime::PaymentOrderSnapshot; +pub type PaymentWebhookDeliveryRecord = module_runtime::PaymentWebhookDeliverySnapshot; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentAppCreateRecordInput { + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub callback_url: Option, + pub now_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentApiKeyCreateRecordInput { + pub key_id: String, + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub key_prefix: String, + pub key_hash: String, + pub scopes: Vec, + pub now_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentAppUpdateRecordInput { + pub app_id: String, + pub owner_user_id: String, + pub enabled: bool, + pub updated_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentApiKeyRevokeRecordInput { + pub key_id: String, + pub owner_user_id: String, + pub revoked_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentApiKeyAuthenticateRecordInput { + pub key_hash: String, + pub used_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentOrderCreateRecordInput { + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub merchant_order_id: String, + pub idempotency_lookup: String, + pub title: String, + pub items_json: String, + pub amount_cents: u64, + pub currency: String, + pub provider: module_runtime::PaymentProvider, + pub checkout_token: String, + pub now_micros: i64, + pub expires_at_micros: i64, + pub callback_url: Option, + pub callback_signing_key_hash: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentOrderGetRecordInput { + pub order_id: String, + pub owner_user_id: Option, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentOrderListRecordInput { + pub app_id: Option, + pub owner_user_id: String, + pub limit: u32, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentOrderMarkPaidRecordInput { + pub order_id: String, + pub provider_trade_no: String, + pub amount_cents: u64, + pub paid_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentOrderProviderCodeRecordInput { + pub order_id: String, + pub provider_code_url: String, + pub updated_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentOrderProviderAttemptRecordInput { + pub order_id: String, + pub attempted_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentWebhookEnqueueRecordInput { + pub order_id: String, + pub payload_json: String, + pub signature: String, + pub now_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentWebhookClaimRecordInput { + pub worker_id: String, + pub limit: u32, + pub now_micros: i64, + pub lease_expires_at_micros: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PaymentWebhookCompleteRecordInput { + pub delivery_id: String, + pub worker_id: String, + pub success: bool, + pub error_message: Option, + pub now_micros: i64, + pub next_available_at_micros: i64, + pub attempt_count: u32, +} + +impl From for PaymentAppCreateInput { + fn from(input: PaymentAppCreateRecordInput) -> Self { + Self { + app_id: input.app_id, + owner_user_id: input.owner_user_id, + name: input.name, + callback_url: input.callback_url, + now_micros: input.now_micros, + } + } +} + +impl From for PaymentApiKeyCreateInput { + fn from(input: PaymentApiKeyCreateRecordInput) -> Self { + Self { + key_id: input.key_id, + app_id: input.app_id, + owner_user_id: input.owner_user_id, + name: input.name, + key_prefix: input.key_prefix, + key_hash: input.key_hash, + scopes_json: serde_json::to_string(&input.scopes).unwrap_or_else(|_| "[]".to_string()), + now_micros: input.now_micros, + } + } +} + +impl From for PaymentAppUpdateInput { + fn from(input: PaymentAppUpdateRecordInput) -> Self { + Self { + app_id: input.app_id, + owner_user_id: input.owner_user_id, + enabled: input.enabled, + updated_at_micros: input.updated_at_micros, + } + } +} + +impl From for PaymentApiKeyRevokeInput { + fn from(input: PaymentApiKeyRevokeRecordInput) -> Self { + Self { + key_id: input.key_id, + owner_user_id: input.owner_user_id, + revoked_at_micros: input.revoked_at_micros, + } + } +} + +impl From for PaymentApiKeyAuthenticateInput { + fn from(input: PaymentApiKeyAuthenticateRecordInput) -> Self { + Self { + key_hash: input.key_hash, + used_at_micros: input.used_at_micros, + } + } +} + +impl From for PaymentOrderCreateInput { + fn from(input: PaymentOrderCreateRecordInput) -> Self { + Self { + order_id: input.order_id, + app_id: input.app_id, + owner_user_id: input.owner_user_id, + merchant_order_id: input.merchant_order_id, + idempotency_lookup: input.idempotency_lookup, + title: input.title, + items_json: input.items_json, + amount_cents: input.amount_cents, + currency: input.currency, + provider: map_payment_provider(input.provider), + checkout_token: input.checkout_token, + now_micros: input.now_micros, + expires_at_micros: input.expires_at_micros, + callback_url: input.callback_url, + callback_signing_key_hash: input.callback_signing_key_hash, + } + } +} + +impl From for PaymentOrderGetInput { + fn from(input: PaymentOrderGetRecordInput) -> Self { + Self { + order_id: input.order_id, + owner_user_id: input.owner_user_id, + } + } +} + +impl From for PaymentOrderListInput { + fn from(input: PaymentOrderListRecordInput) -> Self { + Self { + app_id: input.app_id, + owner_user_id: input.owner_user_id, + limit: input.limit, + } + } +} + +impl From for PaymentOrderMarkPaidInput { + fn from(input: PaymentOrderMarkPaidRecordInput) -> Self { + Self { + order_id: input.order_id, + provider_trade_no: input.provider_trade_no, + amount_cents: input.amount_cents, + paid_at_micros: input.paid_at_micros, + } + } +} + +impl From for PaymentOrderProviderCodeInput { + fn from(input: PaymentOrderProviderCodeRecordInput) -> Self { + Self { + order_id: input.order_id, + provider_code_url: input.provider_code_url, + updated_at_micros: input.updated_at_micros, + } + } +} + +impl From for PaymentOrderProviderAttemptInput { + fn from(input: PaymentOrderProviderAttemptRecordInput) -> Self { + Self { + order_id: input.order_id, + attempted_at_micros: input.attempted_at_micros, + } + } +} + +impl From for PaymentWebhookEnqueueInput { + fn from(input: PaymentWebhookEnqueueRecordInput) -> Self { + Self { + order_id: input.order_id, + payload_json: input.payload_json, + signature: input.signature, + now_micros: input.now_micros, + } + } +} + +impl From for PaymentWebhookClaimInput { + fn from(input: PaymentWebhookClaimRecordInput) -> Self { + Self { + worker_id: input.worker_id, + limit: input.limit, + now_micros: input.now_micros, + lease_expires_at_micros: input.lease_expires_at_micros, + } + } +} + +impl From for PaymentWebhookCompleteInput { + fn from(input: PaymentWebhookCompleteRecordInput) -> Self { + Self { + delivery_id: input.delivery_id, + worker_id: input.worker_id, + success: input.success, + error_message: input.error_message, + now_micros: input.now_micros, + next_available_at_micros: input.next_available_at_micros, + attempt_count: input.attempt_count, + } + } +} + +pub(crate) fn map_payment_app_result( + result: PaymentAppProcedureResult, +) -> Result { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + result + .app + .map(map_payment_app_snapshot) + .ok_or_else(|| SpacetimeClientError::missing_snapshot("支付应用快照")) +} + +pub(crate) fn map_payment_app_list_result( + result: PaymentAppProcedureResult, +) -> Result, SpacetimeClientError> { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + Ok(result + .apps + .into_iter() + .map(map_payment_app_snapshot) + .collect()) +} + +pub(crate) fn map_payment_api_key_result( + result: PaymentAppProcedureResult, +) -> Result { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + result + .key + .map(map_payment_api_key_snapshot) + .ok_or_else(|| SpacetimeClientError::missing_snapshot("支付 API Key 快照")) +} + +pub(crate) fn map_payment_api_key_list_result( + result: PaymentAppProcedureResult, +) -> Result, SpacetimeClientError> { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + Ok(result + .keys + .into_iter() + .map(map_payment_api_key_snapshot) + .collect()) +} + +pub(crate) fn map_payment_authenticate_result( + result: PaymentAppProcedureResult, +) -> Result<(PaymentAppRecord, PaymentApiKeyRecord), SpacetimeClientError> { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + let app = result + .app + .map(map_payment_app_snapshot) + .ok_or_else(|| SpacetimeClientError::missing_snapshot("支付应用快照"))?; + let key = result + .key + .map(map_payment_api_key_snapshot) + .ok_or_else(|| SpacetimeClientError::missing_snapshot("支付 API Key 快照"))?; + Ok((app, key)) +} + +pub(crate) fn map_payment_order_result( + result: PaymentOrderProcedureResult, +) -> Result { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + result + .order + .map(map_payment_order_snapshot) + .ok_or_else(|| SpacetimeClientError::missing_snapshot("支付订单快照")) +} + +pub(crate) fn map_payment_order_list_result( + result: PaymentOrderProcedureResult, +) -> Result, SpacetimeClientError> { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + Ok(result + .orders + .into_iter() + .map(map_payment_order_snapshot) + .collect()) +} + +fn map_payment_app_snapshot(snapshot: PaymentAppSnapshot) -> PaymentAppRecord { + module_runtime::PaymentAppSnapshot { + app_id: snapshot.app_id, + owner_user_id: snapshot.owner_user_id, + name: snapshot.name, + callback_url: snapshot.callback_url, + enabled: snapshot.enabled, + created_at_micros: snapshot.created_at_micros, + updated_at_micros: snapshot.updated_at_micros, + } +} + +fn map_payment_api_key_snapshot(snapshot: PaymentApiKeySnapshot) -> PaymentApiKeyRecord { + module_runtime::PaymentApiKeySnapshot { + key_id: snapshot.key_id, + app_id: snapshot.app_id, + owner_user_id: snapshot.owner_user_id, + name: snapshot.name, + key_prefix: snapshot.key_prefix, + scopes_json: snapshot.scopes_json, + created_at_micros: snapshot.created_at_micros, + last_used_at_micros: snapshot.last_used_at_micros, + revoked_at_micros: snapshot.revoked_at_micros, + updated_at_micros: snapshot.updated_at_micros, + } +} + +fn map_payment_order_snapshot(snapshot: PaymentOrderSnapshot) -> PaymentOrderRecord { + module_runtime::PaymentOrderSnapshot { + order_id: snapshot.order_id, + app_id: snapshot.app_id, + owner_user_id: snapshot.owner_user_id, + merchant_order_id: snapshot.merchant_order_id, + idempotency_lookup: snapshot.idempotency_lookup, + title: snapshot.title, + items_json: snapshot.items_json, + amount_cents: snapshot.amount_cents, + currency: snapshot.currency, + provider: map_payment_provider_back(snapshot.provider), + provider_trade_no: snapshot.provider_trade_no, + provider_code_url: snapshot.provider_code_url, + callback_url: snapshot.callback_url, + callback_signing_key_hash: snapshot.callback_signing_key_hash, + provider_attempted_at_micros: snapshot.provider_attempted_at_micros, + checkout_token: snapshot.checkout_token, + status: map_payment_order_status_back(snapshot.status), + created_at_micros: snapshot.created_at_micros, + expires_at_micros: snapshot.expires_at_micros, + paid_at_micros: snapshot.paid_at_micros, + updated_at_micros: snapshot.updated_at_micros, + } +} + +fn map_payment_provider(value: module_runtime::PaymentProvider) -> PaymentProvider { + match value { + module_runtime::PaymentProvider::WechatNative => PaymentProvider::WechatNative, + } +} + +fn map_payment_provider_back(value: PaymentProvider) -> module_runtime::PaymentProvider { + match value { + PaymentProvider::WechatNative => module_runtime::PaymentProvider::WechatNative, + } +} + +fn map_payment_order_status_back(value: PaymentOrderStatus) -> module_runtime::PaymentOrderStatus { + match value { + PaymentOrderStatus::Pending => module_runtime::PaymentOrderStatus::Pending, + PaymentOrderStatus::Paying => module_runtime::PaymentOrderStatus::Paying, + PaymentOrderStatus::Paid => module_runtime::PaymentOrderStatus::Paid, + PaymentOrderStatus::Expired => module_runtime::PaymentOrderStatus::Expired, + PaymentOrderStatus::Closed => module_runtime::PaymentOrderStatus::Closed, + PaymentOrderStatus::Refunded => module_runtime::PaymentOrderStatus::Refunded, + } +} + +pub(crate) fn map_payment_webhook_enqueue_result( + result: PaymentWebhookProcedureResult, +) -> Result, SpacetimeClientError> { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + Ok(result.delivery.map(map_payment_webhook_snapshot)) +} + +pub(crate) fn map_payment_webhook_claim_result( + result: PaymentWebhookProcedureResult, +) -> Result, SpacetimeClientError> { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + Ok(result + .deliveries + .into_iter() + .map(map_payment_webhook_snapshot) + .collect()) +} + +pub(crate) fn map_payment_webhook_complete_result( + result: PaymentWebhookProcedureResult, +) -> Result { + if !result.ok { + return Err(SpacetimeClientError::procedure_failed(result.error_message)); + } + result + .delivery + .map(map_payment_webhook_snapshot) + .ok_or_else(|| SpacetimeClientError::missing_snapshot("支付回调投递快照")) +} + +fn map_payment_webhook_snapshot( + snapshot: PaymentWebhookDeliverySnapshot, +) -> PaymentWebhookDeliveryRecord { + module_runtime::PaymentWebhookDeliverySnapshot { + delivery_id: snapshot.delivery_id, + order_id: snapshot.order_id, + app_id: snapshot.app_id, + owner_user_id: snapshot.owner_user_id, + callback_url: snapshot.callback_url, + payload_json: snapshot.payload_json, + signature: snapshot.signature, + status: snapshot.status, + attempt_count: snapshot.attempt_count, + available_at_micros: snapshot.available_at_micros, + lease_worker_id: snapshot.lease_worker_id, + lease_expires_at_micros: snapshot.lease_expires_at_micros, + last_error_message: snapshot.last_error_message, + created_at_micros: snapshot.created_at_micros, + updated_at_micros: snapshot.updated_at_micros, + } +} diff --git a/server-rs/crates/spacetime-client/src/active/payment.rs b/server-rs/crates/spacetime-client/src/active/payment.rs new file mode 100644 index 000000000..8d1d767e6 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/active/payment.rs @@ -0,0 +1,324 @@ +use super::*; + +impl SpacetimeClient { + pub async fn create_payment_app( + &self, + input: PaymentAppCreateRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect("create_payment_app", move |connection, sender| { + connection + .procedures() + .create_payment_app_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_app_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn list_payment_apps( + &self, + owner_user_id: String, + ) -> Result, SpacetimeClientError> { + let input = PaymentAppListInput { owner_user_id }; + self.call_after_connect("list_payment_apps", move |connection, sender| { + connection + .procedures() + .list_payment_apps_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_app_list_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn update_payment_app( + &self, + input: PaymentAppUpdateRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect("update_payment_app", move |connection, sender| { + connection + .procedures() + .update_payment_app_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_app_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn list_payment_api_keys( + &self, + owner_user_id: String, + ) -> Result, SpacetimeClientError> { + let input = PaymentApiKeyListInput { owner_user_id }; + self.call_after_connect("list_payment_api_keys", move |connection, sender| { + connection + .procedures() + .list_payment_api_keys_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_api_key_list_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn create_payment_api_key( + &self, + input: PaymentApiKeyCreateRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect("create_payment_api_key", move |connection, sender| { + connection + .procedures() + .create_payment_api_key_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_api_key_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn revoke_payment_api_key( + &self, + input: PaymentApiKeyRevokeRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect("revoke_payment_api_key", move |connection, sender| { + connection + .procedures() + .revoke_payment_api_key_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_api_key_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn authenticate_payment_api_key( + &self, + input: PaymentApiKeyAuthenticateRecordInput, + ) -> Result<(PaymentAppRecord, PaymentApiKeyRecord), SpacetimeClientError> { + let input = input.into(); + self.call_after_connect("authenticate_payment_api_key", move |connection, sender| { + connection + .procedures() + .authenticate_payment_api_key_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_authenticate_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn create_payment_order( + &self, + input: PaymentOrderCreateRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect("create_payment_order", move |connection, sender| { + connection + .procedures() + .create_payment_order_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_order_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn get_payment_order( + &self, + input: PaymentOrderGetRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect("get_payment_order", move |connection, sender| { + connection + .procedures() + .get_payment_order_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_order_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn get_payment_order_by_checkout_token( + &self, + checkout_token: String, + ) -> Result { + let input = PaymentOrderCheckoutGetInput { checkout_token }; + self.call_after_connect( + "get_payment_order_by_checkout_token", + move |connection, sender| { + connection + .procedures() + .get_payment_order_by_checkout_token_and_return_then( + input, + move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_order_result); + send_once(&sender, mapped); + }, + ); + }, + ) + .await + } + + pub async fn list_payment_orders( + &self, + input: PaymentOrderListRecordInput, + ) -> Result, SpacetimeClientError> { + let input = input.into(); + self.call_after_connect("list_payment_orders", move |connection, sender| { + connection + .procedures() + .list_payment_orders_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_order_list_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn mark_payment_order_paid( + &self, + input: PaymentOrderMarkPaidRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect("mark_payment_order_paid", move |connection, sender| { + connection + .procedures() + .mark_payment_order_paid_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_order_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn set_payment_order_provider_code( + &self, + input: PaymentOrderProviderCodeRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect( + "set_payment_order_provider_code", + move |connection, sender| { + connection + .procedures() + .set_payment_order_provider_code_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_order_result); + send_once(&sender, mapped); + }); + }, + ) + .await + } + + pub async fn mark_payment_order_provider_attempted( + &self, + input: PaymentOrderProviderAttemptRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect( + "mark_payment_order_provider_attempted", + move |connection, sender| { + connection + .procedures() + .mark_payment_order_provider_attempted_and_return_then( + input, + move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_order_result); + send_once(&sender, mapped); + }, + ); + }, + ) + .await + } + + pub async fn enqueue_payment_webhook( + &self, + input: PaymentWebhookEnqueueRecordInput, + ) -> Result, SpacetimeClientError> { + let input = input.into(); + self.call_after_connect("enqueue_payment_webhook", move |connection, sender| { + connection + .procedures() + .enqueue_payment_webhook_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_webhook_enqueue_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn claim_payment_webhooks( + &self, + input: PaymentWebhookClaimRecordInput, + ) -> Result, SpacetimeClientError> { + let input = input.into(); + self.call_after_connect("claim_payment_webhooks", move |connection, sender| { + connection + .procedures() + .claim_payment_webhooks_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_webhook_claim_result); + send_once(&sender, mapped); + }); + }) + .await + } + + pub async fn complete_payment_webhook( + &self, + input: PaymentWebhookCompleteRecordInput, + ) -> Result { + let input = input.into(); + self.call_after_connect("complete_payment_webhook", move |connection, sender| { + connection + .procedures() + .complete_payment_webhook_and_return_then(input, move |_, result| { + let mapped = result + .map_err(SpacetimeClientError::from_sdk_error) + .and_then(map_payment_webhook_complete_result); + send_once(&sender, mapped); + }); + }) + .await + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings.rs b/server-rs/crates/spacetime-client/src/module_bindings.rs index 0946050b7..805d286be 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings.rs @@ -134,6 +134,7 @@ pub mod auth_store_projection_user_type; pub mod auth_store_projection_view_type; pub mod auth_store_projection_wechat_state_type; pub mod authenticate_external_api_key_and_return_procedure; +pub mod authenticate_payment_api_key_and_return_procedure; pub mod authorize_database_migration_operator_procedure; pub mod backfill_editor_canvas_layout_and_return_procedure; pub mod backfill_external_generation_job_summaries_and_return_procedure; @@ -142,6 +143,7 @@ pub mod bind_asset_object_to_entity_reducer; pub mod cancel_ai_task_and_return_procedure; pub mod cancel_game_distribution_version_and_return_procedure; pub mod claim_external_generation_jobs_and_return_procedure; +pub mod claim_payment_webhooks_and_return_procedure; pub mod claim_profile_recharge_order_expiration_schedule_and_return_procedure; pub mod claim_profile_task_reward_and_return_procedure; pub mod clean_editor_image_asset_kind_and_return_procedure; @@ -152,6 +154,7 @@ pub mod complete_ai_stage_and_return_procedure; pub mod complete_ai_task_and_return_procedure; pub mod complete_editor_asset_group_cohort_and_return_procedure; pub mod complete_external_generation_job_and_return_procedure; +pub mod complete_payment_webhook_and_return_procedure; pub mod complete_profile_recharge_order_expiration_schedule_and_return_procedure; pub mod confirm_asset_object_and_return_procedure; pub mod confirm_asset_object_reducer; @@ -169,6 +172,9 @@ pub mod create_error_report_and_return_procedure; pub mod create_external_api_key_and_return_procedure; pub mod create_game_distribution_game_and_return_procedure; pub mod create_game_distribution_version_and_return_procedure; +pub mod create_payment_api_key_and_return_procedure; +pub mod create_payment_app_and_return_procedure; +pub mod create_payment_order_and_return_procedure; pub mod create_profile_recharge_order_and_return_procedure; pub mod creation_entry_config_table; pub mod creation_entry_config_type; @@ -337,6 +343,7 @@ pub mod editor_spritesheet_slice_batch_persist_result_type; pub mod editor_spritesheet_slice_persist_item_input_type; pub mod editor_spritesheet_slice_persisted_item_type; pub mod enqueue_external_generation_job_and_return_procedure; +pub mod enqueue_payment_webhook_and_return_procedure; pub mod enqueue_profile_wallet_refund_outbox_and_return_procedure; pub mod ensure_analytics_date_dimension_for_date_reducer; pub mod error_report_create_input_type; @@ -477,6 +484,8 @@ pub mod get_game_distribution_my_review_and_return_procedure; pub mod get_game_distribution_version_and_return_procedure; pub mod get_llm_router_account_and_return_procedure; pub mod get_owner_game_distribution_version_and_return_procedure; +pub mod get_payment_order_and_return_procedure; +pub mod get_payment_order_by_checkout_token_and_return_procedure; pub mod get_profile_dashboard_procedure; pub mod get_profile_recharge_center_procedure; pub mod get_profile_recharge_order_and_return_procedure; @@ -509,6 +518,9 @@ pub mod list_game_distribution_review_games_and_return_procedure; pub mod list_game_distribution_reviews_and_return_procedure; pub mod list_game_distribution_user_reviews_and_return_procedure; pub mod list_owner_game_distribution_games_and_return_procedure; +pub mod list_payment_api_keys_and_return_procedure; +pub mod list_payment_apps_and_return_procedure; +pub mod list_payment_orders_and_return_procedure; pub mod list_profile_recharge_refund_holds_for_reconciliation_procedure; pub mod list_profile_recharge_refunds_for_reconciliation_procedure; pub mod list_profile_wallet_ledger_procedure; @@ -528,10 +540,46 @@ pub mod llm_router_billing_checkpoint_type; pub mod llm_router_quota_settlement_input_type; pub mod llm_router_quota_settlement_result_type; pub mod mark_editor_showcase_asset_refunded_and_return_procedure; +pub mod mark_payment_order_paid_and_return_procedure; +pub mod mark_payment_order_provider_attempted_and_return_procedure; pub mod mark_profile_recharge_order_expiration_checked_procedure; pub mod mark_profile_recharge_order_paid_and_return_procedure; pub mod moderate_game_distribution_user_review_and_return_procedure; pub mod normalize_editor_character_animation_metadata_and_return_procedure; +pub mod payment_api_key_authenticate_input_type; +pub mod payment_api_key_create_input_type; +pub mod payment_api_key_list_input_type; +pub mod payment_api_key_revoke_input_type; +pub mod payment_api_key_snapshot_type; +pub mod payment_api_key_table; +pub mod payment_api_key_type; +pub mod payment_app_create_input_type; +pub mod payment_app_list_input_type; +pub mod payment_app_procedure_result_type; +pub mod payment_app_snapshot_type; +pub mod payment_app_table; +pub mod payment_app_type; +pub mod payment_app_update_input_type; +pub mod payment_order_checkout_get_input_type; +pub mod payment_order_create_input_type; +pub mod payment_order_get_input_type; +pub mod payment_order_list_input_type; +pub mod payment_order_mark_paid_input_type; +pub mod payment_order_procedure_result_type; +pub mod payment_order_provider_attempt_input_type; +pub mod payment_order_provider_code_input_type; +pub mod payment_order_snapshot_type; +pub mod payment_order_status_type; +pub mod payment_order_table; +pub mod payment_order_type; +pub mod payment_provider_type; +pub mod payment_webhook_claim_input_type; +pub mod payment_webhook_complete_input_type; +pub mod payment_webhook_delivery_snapshot_type; +pub mod payment_webhook_delivery_table; +pub mod payment_webhook_delivery_type; +pub mod payment_webhook_enqueue_input_type; +pub mod payment_webhook_procedure_result_type; pub mod persist_editor_generation_result_and_return_procedure; pub mod persist_editor_pixel_art_result_and_return_procedure; pub mod persist_editor_spritesheet_slice_batch_and_return_procedure; @@ -625,6 +673,7 @@ pub mod resolve_profile_recharge_refund_manual_review_and_return_procedure; pub mod restore_game_distribution_game_and_return_procedure; pub mod revoke_database_migration_operator_procedure; pub mod revoke_external_api_key_and_return_procedure; +pub mod revoke_payment_api_key_and_return_procedure; pub mod rollback_editor_canvas_layout_and_return_procedure; pub mod rotate_editor_generation_runtime_service_identity_and_return_procedure; pub mod runtime_browse_history_theme_mode_type; @@ -776,6 +825,7 @@ pub mod save_editor_project_layout_v_2_and_return_procedure; pub mod save_game_distribution_my_review_and_return_procedure; pub mod seed_analytics_date_dimensions_reducer; pub mod set_editor_showcase_asset_like_for_viewer_and_return_procedure; +pub mod set_payment_order_provider_code_and_return_procedure; pub mod settle_llm_router_quota_and_return_procedure; pub mod start_ai_task_reducer; pub mod start_ai_task_stage_reducer; @@ -797,6 +847,7 @@ pub mod update_editor_project_resource_showcase_and_return_procedure; pub mod update_editor_showcase_asset_display_and_return_procedure; pub mod update_error_report_and_return_procedure; pub mod update_external_generation_job_phase_and_return_procedure; +pub mod update_payment_app_and_return_procedure; pub mod upload_agc_analytics_batch_procedure; pub mod upsert_editor_generation_pricing_config_and_return_procedure; pub mod upsert_editor_showcase_campaign_config_and_return_procedure; @@ -937,6 +988,7 @@ pub use auth_store_projection_user_type::AuthStoreProjectionUser; pub use auth_store_projection_view_type::AuthStoreProjectionView; pub use auth_store_projection_wechat_state_type::AuthStoreProjectionWechatState; pub use authenticate_external_api_key_and_return_procedure::authenticate_external_api_key_and_return; +pub use authenticate_payment_api_key_and_return_procedure::authenticate_payment_api_key_and_return; pub use authorize_database_migration_operator_procedure::authorize_database_migration_operator; pub use backfill_editor_canvas_layout_and_return_procedure::backfill_editor_canvas_layout_and_return; pub use backfill_external_generation_job_summaries_and_return_procedure::backfill_external_generation_job_summaries_and_return; @@ -945,6 +997,7 @@ pub use bind_asset_object_to_entity_reducer::bind_asset_object_to_entity; pub use cancel_ai_task_and_return_procedure::cancel_ai_task_and_return; pub use cancel_game_distribution_version_and_return_procedure::cancel_game_distribution_version_and_return; pub use claim_external_generation_jobs_and_return_procedure::claim_external_generation_jobs_and_return; +pub use claim_payment_webhooks_and_return_procedure::claim_payment_webhooks_and_return; pub use claim_profile_recharge_order_expiration_schedule_and_return_procedure::claim_profile_recharge_order_expiration_schedule_and_return; pub use claim_profile_task_reward_and_return_procedure::claim_profile_task_reward_and_return; pub use clean_editor_image_asset_kind_and_return_procedure::clean_editor_image_asset_kind_and_return; @@ -955,6 +1008,7 @@ pub use complete_ai_stage_and_return_procedure::complete_ai_stage_and_return; pub use complete_ai_task_and_return_procedure::complete_ai_task_and_return; pub use complete_editor_asset_group_cohort_and_return_procedure::complete_editor_asset_group_cohort_and_return; pub use complete_external_generation_job_and_return_procedure::complete_external_generation_job_and_return; +pub use complete_payment_webhook_and_return_procedure::complete_payment_webhook_and_return; pub use complete_profile_recharge_order_expiration_schedule_and_return_procedure::complete_profile_recharge_order_expiration_schedule_and_return; pub use confirm_asset_object_and_return_procedure::confirm_asset_object_and_return; pub use confirm_asset_object_reducer::confirm_asset_object; @@ -972,6 +1026,9 @@ pub use create_error_report_and_return_procedure::create_error_report_and_return pub use create_external_api_key_and_return_procedure::create_external_api_key_and_return; pub use create_game_distribution_game_and_return_procedure::create_game_distribution_game_and_return; pub use create_game_distribution_version_and_return_procedure::create_game_distribution_version_and_return; +pub use create_payment_api_key_and_return_procedure::create_payment_api_key_and_return; +pub use create_payment_app_and_return_procedure::create_payment_app_and_return; +pub use create_payment_order_and_return_procedure::create_payment_order_and_return; pub use create_profile_recharge_order_and_return_procedure::create_profile_recharge_order_and_return; pub use creation_entry_config_table::*; pub use creation_entry_config_type::CreationEntryConfig; @@ -1140,6 +1197,7 @@ pub use editor_spritesheet_slice_batch_persist_result_type::EditorSpritesheetSli pub use editor_spritesheet_slice_persist_item_input_type::EditorSpritesheetSlicePersistItemInput; pub use editor_spritesheet_slice_persisted_item_type::EditorSpritesheetSlicePersistedItem; pub use enqueue_external_generation_job_and_return_procedure::enqueue_external_generation_job_and_return; +pub use enqueue_payment_webhook_and_return_procedure::enqueue_payment_webhook_and_return; pub use enqueue_profile_wallet_refund_outbox_and_return_procedure::enqueue_profile_wallet_refund_outbox_and_return; pub use ensure_analytics_date_dimension_for_date_reducer::ensure_analytics_date_dimension_for_date; pub use error_report_create_input_type::ErrorReportCreateInput; @@ -1280,6 +1338,8 @@ pub use get_game_distribution_my_review_and_return_procedure::get_game_distribut pub use get_game_distribution_version_and_return_procedure::get_game_distribution_version_and_return; pub use get_llm_router_account_and_return_procedure::get_llm_router_account_and_return; pub use get_owner_game_distribution_version_and_return_procedure::get_owner_game_distribution_version_and_return; +pub use get_payment_order_and_return_procedure::get_payment_order_and_return; +pub use get_payment_order_by_checkout_token_and_return_procedure::get_payment_order_by_checkout_token_and_return; pub use get_profile_dashboard_procedure::get_profile_dashboard; pub use get_profile_recharge_center_procedure::get_profile_recharge_center; pub use get_profile_recharge_order_and_return_procedure::get_profile_recharge_order_and_return; @@ -1312,6 +1372,9 @@ pub use list_game_distribution_review_games_and_return_procedure::list_game_dist pub use list_game_distribution_reviews_and_return_procedure::list_game_distribution_reviews_and_return; pub use list_game_distribution_user_reviews_and_return_procedure::list_game_distribution_user_reviews_and_return; pub use list_owner_game_distribution_games_and_return_procedure::list_owner_game_distribution_games_and_return; +pub use list_payment_api_keys_and_return_procedure::list_payment_api_keys_and_return; +pub use list_payment_apps_and_return_procedure::list_payment_apps_and_return; +pub use list_payment_orders_and_return_procedure::list_payment_orders_and_return; pub use list_profile_recharge_refund_holds_for_reconciliation_procedure::list_profile_recharge_refund_holds_for_reconciliation; pub use list_profile_recharge_refunds_for_reconciliation_procedure::list_profile_recharge_refunds_for_reconciliation; pub use list_profile_wallet_ledger_procedure::list_profile_wallet_ledger; @@ -1331,10 +1394,46 @@ pub use llm_router_billing_checkpoint_type::LlmRouterBillingCheckpoint; pub use llm_router_quota_settlement_input_type::LlmRouterQuotaSettlementInput; pub use llm_router_quota_settlement_result_type::LlmRouterQuotaSettlementResult; pub use mark_editor_showcase_asset_refunded_and_return_procedure::mark_editor_showcase_asset_refunded_and_return; +pub use mark_payment_order_paid_and_return_procedure::mark_payment_order_paid_and_return; +pub use mark_payment_order_provider_attempted_and_return_procedure::mark_payment_order_provider_attempted_and_return; pub use mark_profile_recharge_order_expiration_checked_procedure::mark_profile_recharge_order_expiration_checked; pub use mark_profile_recharge_order_paid_and_return_procedure::mark_profile_recharge_order_paid_and_return; pub use moderate_game_distribution_user_review_and_return_procedure::moderate_game_distribution_user_review_and_return; pub use normalize_editor_character_animation_metadata_and_return_procedure::normalize_editor_character_animation_metadata_and_return; +pub use payment_api_key_authenticate_input_type::PaymentApiKeyAuthenticateInput; +pub use payment_api_key_create_input_type::PaymentApiKeyCreateInput; +pub use payment_api_key_list_input_type::PaymentApiKeyListInput; +pub use payment_api_key_revoke_input_type::PaymentApiKeyRevokeInput; +pub use payment_api_key_snapshot_type::PaymentApiKeySnapshot; +pub use payment_api_key_table::*; +pub use payment_api_key_type::PaymentApiKey; +pub use payment_app_create_input_type::PaymentAppCreateInput; +pub use payment_app_list_input_type::PaymentAppListInput; +pub use payment_app_procedure_result_type::PaymentAppProcedureResult; +pub use payment_app_snapshot_type::PaymentAppSnapshot; +pub use payment_app_table::*; +pub use payment_app_type::PaymentApp; +pub use payment_app_update_input_type::PaymentAppUpdateInput; +pub use payment_order_checkout_get_input_type::PaymentOrderCheckoutGetInput; +pub use payment_order_create_input_type::PaymentOrderCreateInput; +pub use payment_order_get_input_type::PaymentOrderGetInput; +pub use payment_order_list_input_type::PaymentOrderListInput; +pub use payment_order_mark_paid_input_type::PaymentOrderMarkPaidInput; +pub use payment_order_procedure_result_type::PaymentOrderProcedureResult; +pub use payment_order_provider_attempt_input_type::PaymentOrderProviderAttemptInput; +pub use payment_order_provider_code_input_type::PaymentOrderProviderCodeInput; +pub use payment_order_snapshot_type::PaymentOrderSnapshot; +pub use payment_order_status_type::PaymentOrderStatus; +pub use payment_order_table::*; +pub use payment_order_type::PaymentOrder; +pub use payment_provider_type::PaymentProvider; +pub use payment_webhook_claim_input_type::PaymentWebhookClaimInput; +pub use payment_webhook_complete_input_type::PaymentWebhookCompleteInput; +pub use payment_webhook_delivery_snapshot_type::PaymentWebhookDeliverySnapshot; +pub use payment_webhook_delivery_table::*; +pub use payment_webhook_delivery_type::PaymentWebhookDelivery; +pub use payment_webhook_enqueue_input_type::PaymentWebhookEnqueueInput; +pub use payment_webhook_procedure_result_type::PaymentWebhookProcedureResult; pub use persist_editor_generation_result_and_return_procedure::persist_editor_generation_result_and_return; pub use persist_editor_pixel_art_result_and_return_procedure::persist_editor_pixel_art_result_and_return; pub use persist_editor_spritesheet_slice_batch_and_return_procedure::persist_editor_spritesheet_slice_batch_and_return; @@ -1428,6 +1527,7 @@ pub use resolve_profile_recharge_refund_manual_review_and_return_procedure::reso pub use restore_game_distribution_game_and_return_procedure::restore_game_distribution_game_and_return; pub use revoke_database_migration_operator_procedure::revoke_database_migration_operator; pub use revoke_external_api_key_and_return_procedure::revoke_external_api_key_and_return; +pub use revoke_payment_api_key_and_return_procedure::revoke_payment_api_key_and_return; pub use rollback_editor_canvas_layout_and_return_procedure::rollback_editor_canvas_layout_and_return; pub use rotate_editor_generation_runtime_service_identity_and_return_procedure::rotate_editor_generation_runtime_service_identity_and_return; pub use runtime_browse_history_theme_mode_type::RuntimeBrowseHistoryThemeMode; @@ -1579,6 +1679,7 @@ pub use save_editor_project_layout_v_2_and_return_procedure::save_editor_project pub use save_game_distribution_my_review_and_return_procedure::save_game_distribution_my_review_and_return; pub use seed_analytics_date_dimensions_reducer::seed_analytics_date_dimensions; pub use set_editor_showcase_asset_like_for_viewer_and_return_procedure::set_editor_showcase_asset_like_for_viewer_and_return; +pub use set_payment_order_provider_code_and_return_procedure::set_payment_order_provider_code_and_return; pub use settle_llm_router_quota_and_return_procedure::settle_llm_router_quota_and_return; pub use start_ai_task_reducer::start_ai_task; pub use start_ai_task_stage_reducer::start_ai_task_stage; @@ -1600,6 +1701,7 @@ pub use update_editor_project_resource_showcase_and_return_procedure::update_edi pub use update_editor_showcase_asset_display_and_return_procedure::update_editor_showcase_asset_display_and_return; pub use update_error_report_and_return_procedure::update_error_report_and_return; pub use update_external_generation_job_phase_and_return_procedure::update_external_generation_job_phase_and_return; +pub use update_payment_app_and_return_procedure::update_payment_app_and_return; pub use upload_agc_analytics_batch_procedure::upload_agc_analytics_batch; pub use upsert_editor_generation_pricing_config_and_return_procedure::upsert_editor_generation_pricing_config_and_return; pub use upsert_editor_showcase_campaign_config_and_return_procedure::upsert_editor_showcase_campaign_config_and_return; @@ -1772,6 +1874,10 @@ pub struct DbUpdate { game_distribution_version: __sdk::TableUpdate, llm_router_account: __sdk::TableUpdate, llm_router_billing_checkpoint: __sdk::TableUpdate, + payment_api_key: __sdk::TableUpdate, + payment_app: __sdk::TableUpdate, + payment_order: __sdk::TableUpdate, + payment_webhook_delivery: __sdk::TableUpdate, profile_code_operation: __sdk::TableUpdate, profile_daily_free_points: __sdk::TableUpdate, profile_dashboard_state: __sdk::TableUpdate, @@ -2003,6 +2109,18 @@ impl TryFrom<__ws::v2::TransactionUpdate> for DbUpdate { "llm_router_billing_checkpoint" => db_update.llm_router_billing_checkpoint.append( llm_router_billing_checkpoint_table::parse_table_update(table_update)?, ), + "payment_api_key" => db_update + .payment_api_key + .append(payment_api_key_table::parse_table_update(table_update)?), + "payment_app" => db_update + .payment_app + .append(payment_app_table::parse_table_update(table_update)?), + "payment_order" => db_update + .payment_order + .append(payment_order_table::parse_table_update(table_update)?), + "payment_webhook_delivery" => db_update.payment_webhook_delivery.append( + payment_webhook_delivery_table::parse_table_update(table_update)?, + ), "profile_code_operation" => db_update.profile_code_operation.append( profile_code_operation_table::parse_table_update(table_update)?, ), @@ -2414,6 +2532,21 @@ impl __sdk::DbUpdate for DbUpdate { &self.llm_router_billing_checkpoint, ) .with_updates_by_pk(|row| &row.account_key); + diff.payment_api_key = cache + .apply_diff_to_table::("payment_api_key", &self.payment_api_key) + .with_updates_by_pk(|row| &row.key_id); + diff.payment_app = cache + .apply_diff_to_table::("payment_app", &self.payment_app) + .with_updates_by_pk(|row| &row.app_id); + diff.payment_order = cache + .apply_diff_to_table::("payment_order", &self.payment_order) + .with_updates_by_pk(|row| &row.order_id); + diff.payment_webhook_delivery = cache + .apply_diff_to_table::( + "payment_webhook_delivery", + &self.payment_webhook_delivery, + ) + .with_updates_by_pk(|row| &row.delivery_id); diff.profile_code_operation = cache .apply_diff_to_table::( "profile_code_operation", @@ -2775,6 +2908,18 @@ impl __sdk::DbUpdate for DbUpdate { "llm_router_billing_checkpoint" => db_update .llm_router_billing_checkpoint .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), + "payment_api_key" => db_update + .payment_api_key + .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), + "payment_app" => db_update + .payment_app + .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), + "payment_order" => db_update + .payment_order + .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), + "payment_webhook_delivery" => db_update + .payment_webhook_delivery + .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), "profile_code_operation" => db_update .profile_code_operation .append(__sdk::parse_row_list_as_inserts(table_rows.rows)?), @@ -3049,6 +3194,18 @@ impl __sdk::DbUpdate for DbUpdate { "llm_router_billing_checkpoint" => db_update .llm_router_billing_checkpoint .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), + "payment_api_key" => db_update + .payment_api_key + .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), + "payment_app" => db_update + .payment_app + .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), + "payment_order" => db_update + .payment_order + .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), + "payment_webhook_delivery" => db_update + .payment_webhook_delivery + .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), "profile_code_operation" => db_update .profile_code_operation .append(__sdk::parse_row_list_as_deletes(table_rows.rows)?), @@ -3229,6 +3386,10 @@ pub struct AppliedDiff<'r> { game_distribution_version: __sdk::TableAppliedDiff<'r, GameDistributionVersion>, llm_router_account: __sdk::TableAppliedDiff<'r, LlmRouterAccount>, llm_router_billing_checkpoint: __sdk::TableAppliedDiff<'r, LlmRouterBillingCheckpoint>, + payment_api_key: __sdk::TableAppliedDiff<'r, PaymentApiKey>, + payment_app: __sdk::TableAppliedDiff<'r, PaymentApp>, + payment_order: __sdk::TableAppliedDiff<'r, PaymentOrder>, + payment_webhook_delivery: __sdk::TableAppliedDiff<'r, PaymentWebhookDelivery>, profile_code_operation: __sdk::TableAppliedDiff<'r, ProfileCodeOperation>, profile_daily_free_points: __sdk::TableAppliedDiff<'r, ProfileDailyFreePoints>, profile_dashboard_state: __sdk::TableAppliedDiff<'r, ProfileDashboardState>, @@ -3526,6 +3687,22 @@ impl<'r> __sdk::AppliedDiff<'r> for AppliedDiff<'r> { &self.llm_router_billing_checkpoint, event, ); + callbacks.invoke_table_row_callbacks::( + "payment_api_key", + &self.payment_api_key, + event, + ); + callbacks.invoke_table_row_callbacks::("payment_app", &self.payment_app, event); + callbacks.invoke_table_row_callbacks::( + "payment_order", + &self.payment_order, + event, + ); + callbacks.invoke_table_row_callbacks::( + "payment_webhook_delivery", + &self.payment_webhook_delivery, + event, + ); callbacks.invoke_table_row_callbacks::( "profile_code_operation", &self.profile_code_operation, @@ -4421,6 +4598,10 @@ impl __sdk::SpacetimeModule for RemoteModule { game_distribution_version_table::register_table(client_cache); llm_router_account_table::register_table(client_cache); llm_router_billing_checkpoint_table::register_table(client_cache); + payment_api_key_table::register_table(client_cache); + payment_app_table::register_table(client_cache); + payment_order_table::register_table(client_cache); + payment_webhook_delivery_table::register_table(client_cache); profile_code_operation_table::register_table(client_cache); profile_daily_free_points_table::register_table(client_cache); profile_dashboard_state_table::register_table(client_cache); @@ -4510,6 +4691,10 @@ impl __sdk::SpacetimeModule for RemoteModule { "game_distribution_version", "llm_router_account", "llm_router_billing_checkpoint", + "payment_api_key", + "payment_app", + "payment_order", + "payment_webhook_delivery", "profile_code_operation", "profile_daily_free_points", "profile_dashboard_state", diff --git a/server-rs/crates/spacetime-client/src/module_bindings/authenticate_payment_api_key_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/authenticate_payment_api_key_and_return_procedure.rs new file mode 100644 index 000000000..33c26c311 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/authenticate_payment_api_key_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_api_key_authenticate_input_type::PaymentApiKeyAuthenticateInput; +use super::payment_app_procedure_result_type::PaymentAppProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct AuthenticatePaymentApiKeyAndReturnArgs { + pub input: PaymentApiKeyAuthenticateInput, +} + +impl __sdk::InModule for AuthenticatePaymentApiKeyAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `authenticate_payment_api_key_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait authenticate_payment_api_key_and_return { + fn authenticate_payment_api_key_and_return(&self, input: PaymentApiKeyAuthenticateInput) { + self.authenticate_payment_api_key_and_return_then(input, |_, _| {}); + } + + fn authenticate_payment_api_key_and_return_then( + &self, + input: PaymentApiKeyAuthenticateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl authenticate_payment_api_key_and_return for super::RemoteProcedures { + fn authenticate_payment_api_key_and_return_then( + &self, + input: PaymentApiKeyAuthenticateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentAppProcedureResult>( + "authenticate_payment_api_key_and_return", + AuthenticatePaymentApiKeyAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/claim_payment_webhooks_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/claim_payment_webhooks_and_return_procedure.rs new file mode 100644 index 000000000..f28ea001f --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/claim_payment_webhooks_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_webhook_claim_input_type::PaymentWebhookClaimInput; +use super::payment_webhook_procedure_result_type::PaymentWebhookProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct ClaimPaymentWebhooksAndReturnArgs { + pub input: PaymentWebhookClaimInput, +} + +impl __sdk::InModule for ClaimPaymentWebhooksAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `claim_payment_webhooks_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait claim_payment_webhooks_and_return { + fn claim_payment_webhooks_and_return(&self, input: PaymentWebhookClaimInput) { + self.claim_payment_webhooks_and_return_then(input, |_, _| {}); + } + + fn claim_payment_webhooks_and_return_then( + &self, + input: PaymentWebhookClaimInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl claim_payment_webhooks_and_return for super::RemoteProcedures { + fn claim_payment_webhooks_and_return_then( + &self, + input: PaymentWebhookClaimInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentWebhookProcedureResult>( + "claim_payment_webhooks_and_return", + ClaimPaymentWebhooksAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/complete_payment_webhook_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/complete_payment_webhook_and_return_procedure.rs new file mode 100644 index 000000000..8eb38c881 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/complete_payment_webhook_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_webhook_complete_input_type::PaymentWebhookCompleteInput; +use super::payment_webhook_procedure_result_type::PaymentWebhookProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct CompletePaymentWebhookAndReturnArgs { + pub input: PaymentWebhookCompleteInput, +} + +impl __sdk::InModule for CompletePaymentWebhookAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `complete_payment_webhook_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait complete_payment_webhook_and_return { + fn complete_payment_webhook_and_return(&self, input: PaymentWebhookCompleteInput) { + self.complete_payment_webhook_and_return_then(input, |_, _| {}); + } + + fn complete_payment_webhook_and_return_then( + &self, + input: PaymentWebhookCompleteInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl complete_payment_webhook_and_return for super::RemoteProcedures { + fn complete_payment_webhook_and_return_then( + &self, + input: PaymentWebhookCompleteInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentWebhookProcedureResult>( + "complete_payment_webhook_and_return", + CompletePaymentWebhookAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_payment_api_key_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_payment_api_key_and_return_procedure.rs new file mode 100644 index 000000000..6cd1a0ca5 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_payment_api_key_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_api_key_create_input_type::PaymentApiKeyCreateInput; +use super::payment_app_procedure_result_type::PaymentAppProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct CreatePaymentApiKeyAndReturnArgs { + pub input: PaymentApiKeyCreateInput, +} + +impl __sdk::InModule for CreatePaymentApiKeyAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `create_payment_api_key_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait create_payment_api_key_and_return { + fn create_payment_api_key_and_return(&self, input: PaymentApiKeyCreateInput) { + self.create_payment_api_key_and_return_then(input, |_, _| {}); + } + + fn create_payment_api_key_and_return_then( + &self, + input: PaymentApiKeyCreateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl create_payment_api_key_and_return for super::RemoteProcedures { + fn create_payment_api_key_and_return_then( + &self, + input: PaymentApiKeyCreateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentAppProcedureResult>( + "create_payment_api_key_and_return", + CreatePaymentApiKeyAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_payment_app_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_payment_app_and_return_procedure.rs new file mode 100644 index 000000000..493fba127 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_payment_app_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_app_create_input_type::PaymentAppCreateInput; +use super::payment_app_procedure_result_type::PaymentAppProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct CreatePaymentAppAndReturnArgs { + pub input: PaymentAppCreateInput, +} + +impl __sdk::InModule for CreatePaymentAppAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `create_payment_app_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait create_payment_app_and_return { + fn create_payment_app_and_return(&self, input: PaymentAppCreateInput) { + self.create_payment_app_and_return_then(input, |_, _| {}); + } + + fn create_payment_app_and_return_then( + &self, + input: PaymentAppCreateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl create_payment_app_and_return for super::RemoteProcedures { + fn create_payment_app_and_return_then( + &self, + input: PaymentAppCreateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentAppProcedureResult>( + "create_payment_app_and_return", + CreatePaymentAppAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/create_payment_order_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/create_payment_order_and_return_procedure.rs new file mode 100644 index 000000000..e576d93b7 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/create_payment_order_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_create_input_type::PaymentOrderCreateInput; +use super::payment_order_procedure_result_type::PaymentOrderProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct CreatePaymentOrderAndReturnArgs { + pub input: PaymentOrderCreateInput, +} + +impl __sdk::InModule for CreatePaymentOrderAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `create_payment_order_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait create_payment_order_and_return { + fn create_payment_order_and_return(&self, input: PaymentOrderCreateInput) { + self.create_payment_order_and_return_then(input, |_, _| {}); + } + + fn create_payment_order_and_return_then( + &self, + input: PaymentOrderCreateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl create_payment_order_and_return for super::RemoteProcedures { + fn create_payment_order_and_return_then( + &self, + input: PaymentOrderCreateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentOrderProcedureResult>( + "create_payment_order_and_return", + CreatePaymentOrderAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/enqueue_payment_webhook_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/enqueue_payment_webhook_and_return_procedure.rs new file mode 100644 index 000000000..91c952715 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/enqueue_payment_webhook_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_webhook_enqueue_input_type::PaymentWebhookEnqueueInput; +use super::payment_webhook_procedure_result_type::PaymentWebhookProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct EnqueuePaymentWebhookAndReturnArgs { + pub input: PaymentWebhookEnqueueInput, +} + +impl __sdk::InModule for EnqueuePaymentWebhookAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `enqueue_payment_webhook_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait enqueue_payment_webhook_and_return { + fn enqueue_payment_webhook_and_return(&self, input: PaymentWebhookEnqueueInput) { + self.enqueue_payment_webhook_and_return_then(input, |_, _| {}); + } + + fn enqueue_payment_webhook_and_return_then( + &self, + input: PaymentWebhookEnqueueInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl enqueue_payment_webhook_and_return for super::RemoteProcedures { + fn enqueue_payment_webhook_and_return_then( + &self, + input: PaymentWebhookEnqueueInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentWebhookProcedureResult>( + "enqueue_payment_webhook_and_return", + EnqueuePaymentWebhookAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_payment_order_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_payment_order_and_return_procedure.rs new file mode 100644 index 000000000..981124029 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_payment_order_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_get_input_type::PaymentOrderGetInput; +use super::payment_order_procedure_result_type::PaymentOrderProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct GetPaymentOrderAndReturnArgs { + pub input: PaymentOrderGetInput, +} + +impl __sdk::InModule for GetPaymentOrderAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `get_payment_order_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait get_payment_order_and_return { + fn get_payment_order_and_return(&self, input: PaymentOrderGetInput) { + self.get_payment_order_and_return_then(input, |_, _| {}); + } + + fn get_payment_order_and_return_then( + &self, + input: PaymentOrderGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl get_payment_order_and_return for super::RemoteProcedures { + fn get_payment_order_and_return_then( + &self, + input: PaymentOrderGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentOrderProcedureResult>( + "get_payment_order_and_return", + GetPaymentOrderAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/get_payment_order_by_checkout_token_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/get_payment_order_by_checkout_token_and_return_procedure.rs new file mode 100644 index 000000000..eb14d8e86 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/get_payment_order_by_checkout_token_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_checkout_get_input_type::PaymentOrderCheckoutGetInput; +use super::payment_order_procedure_result_type::PaymentOrderProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct GetPaymentOrderByCheckoutTokenAndReturnArgs { + pub input: PaymentOrderCheckoutGetInput, +} + +impl __sdk::InModule for GetPaymentOrderByCheckoutTokenAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `get_payment_order_by_checkout_token_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait get_payment_order_by_checkout_token_and_return { + fn get_payment_order_by_checkout_token_and_return(&self, input: PaymentOrderCheckoutGetInput) { + self.get_payment_order_by_checkout_token_and_return_then(input, |_, _| {}); + } + + fn get_payment_order_by_checkout_token_and_return_then( + &self, + input: PaymentOrderCheckoutGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl get_payment_order_by_checkout_token_and_return for super::RemoteProcedures { + fn get_payment_order_by_checkout_token_and_return_then( + &self, + input: PaymentOrderCheckoutGetInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentOrderProcedureResult>( + "get_payment_order_by_checkout_token_and_return", + GetPaymentOrderByCheckoutTokenAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_payment_api_keys_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_payment_api_keys_and_return_procedure.rs new file mode 100644 index 000000000..76c904866 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_payment_api_keys_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_api_key_list_input_type::PaymentApiKeyListInput; +use super::payment_app_procedure_result_type::PaymentAppProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct ListPaymentApiKeysAndReturnArgs { + pub input: PaymentApiKeyListInput, +} + +impl __sdk::InModule for ListPaymentApiKeysAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `list_payment_api_keys_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait list_payment_api_keys_and_return { + fn list_payment_api_keys_and_return(&self, input: PaymentApiKeyListInput) { + self.list_payment_api_keys_and_return_then(input, |_, _| {}); + } + + fn list_payment_api_keys_and_return_then( + &self, + input: PaymentApiKeyListInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl list_payment_api_keys_and_return for super::RemoteProcedures { + fn list_payment_api_keys_and_return_then( + &self, + input: PaymentApiKeyListInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentAppProcedureResult>( + "list_payment_api_keys_and_return", + ListPaymentApiKeysAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_payment_apps_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_payment_apps_and_return_procedure.rs new file mode 100644 index 000000000..200701e1e --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_payment_apps_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_app_list_input_type::PaymentAppListInput; +use super::payment_app_procedure_result_type::PaymentAppProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct ListPaymentAppsAndReturnArgs { + pub input: PaymentAppListInput, +} + +impl __sdk::InModule for ListPaymentAppsAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `list_payment_apps_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait list_payment_apps_and_return { + fn list_payment_apps_and_return(&self, input: PaymentAppListInput) { + self.list_payment_apps_and_return_then(input, |_, _| {}); + } + + fn list_payment_apps_and_return_then( + &self, + input: PaymentAppListInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl list_payment_apps_and_return for super::RemoteProcedures { + fn list_payment_apps_and_return_then( + &self, + input: PaymentAppListInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentAppProcedureResult>( + "list_payment_apps_and_return", + ListPaymentAppsAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/list_payment_orders_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/list_payment_orders_and_return_procedure.rs new file mode 100644 index 000000000..f00f5674d --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/list_payment_orders_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_list_input_type::PaymentOrderListInput; +use super::payment_order_procedure_result_type::PaymentOrderProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct ListPaymentOrdersAndReturnArgs { + pub input: PaymentOrderListInput, +} + +impl __sdk::InModule for ListPaymentOrdersAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `list_payment_orders_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait list_payment_orders_and_return { + fn list_payment_orders_and_return(&self, input: PaymentOrderListInput) { + self.list_payment_orders_and_return_then(input, |_, _| {}); + } + + fn list_payment_orders_and_return_then( + &self, + input: PaymentOrderListInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl list_payment_orders_and_return for super::RemoteProcedures { + fn list_payment_orders_and_return_then( + &self, + input: PaymentOrderListInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentOrderProcedureResult>( + "list_payment_orders_and_return", + ListPaymentOrdersAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/mark_payment_order_paid_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/mark_payment_order_paid_and_return_procedure.rs new file mode 100644 index 000000000..15600aaff --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/mark_payment_order_paid_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_mark_paid_input_type::PaymentOrderMarkPaidInput; +use super::payment_order_procedure_result_type::PaymentOrderProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct MarkPaymentOrderPaidAndReturnArgs { + pub input: PaymentOrderMarkPaidInput, +} + +impl __sdk::InModule for MarkPaymentOrderPaidAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `mark_payment_order_paid_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait mark_payment_order_paid_and_return { + fn mark_payment_order_paid_and_return(&self, input: PaymentOrderMarkPaidInput) { + self.mark_payment_order_paid_and_return_then(input, |_, _| {}); + } + + fn mark_payment_order_paid_and_return_then( + &self, + input: PaymentOrderMarkPaidInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl mark_payment_order_paid_and_return for super::RemoteProcedures { + fn mark_payment_order_paid_and_return_then( + &self, + input: PaymentOrderMarkPaidInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentOrderProcedureResult>( + "mark_payment_order_paid_and_return", + MarkPaymentOrderPaidAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/mark_payment_order_provider_attempted_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/mark_payment_order_provider_attempted_and_return_procedure.rs new file mode 100644 index 000000000..b533220a7 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/mark_payment_order_provider_attempted_and_return_procedure.rs @@ -0,0 +1,62 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_procedure_result_type::PaymentOrderProcedureResult; +use super::payment_order_provider_attempt_input_type::PaymentOrderProviderAttemptInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct MarkPaymentOrderProviderAttemptedAndReturnArgs { + pub input: PaymentOrderProviderAttemptInput, +} + +impl __sdk::InModule for MarkPaymentOrderProviderAttemptedAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `mark_payment_order_provider_attempted_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait mark_payment_order_provider_attempted_and_return { + fn mark_payment_order_provider_attempted_and_return( + &self, + input: PaymentOrderProviderAttemptInput, + ) { + self.mark_payment_order_provider_attempted_and_return_then(input, |_, _| {}); + } + + fn mark_payment_order_provider_attempted_and_return_then( + &self, + input: PaymentOrderProviderAttemptInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl mark_payment_order_provider_attempted_and_return for super::RemoteProcedures { + fn mark_payment_order_provider_attempted_and_return_then( + &self, + input: PaymentOrderProviderAttemptInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentOrderProcedureResult>( + "mark_payment_order_provider_attempted_and_return", + MarkPaymentOrderProviderAttemptedAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_authenticate_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_authenticate_input_type.rs new file mode 100644 index 000000000..e875b26e1 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_authenticate_input_type.rs @@ -0,0 +1,16 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentApiKeyAuthenticateInput { + pub key_hash: String, + pub used_at_micros: i64, +} + +impl __sdk::InModule for PaymentApiKeyAuthenticateInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_create_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_create_input_type.rs new file mode 100644 index 000000000..f197e8a9b --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_create_input_type.rs @@ -0,0 +1,22 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentApiKeyCreateInput { + pub key_id: String, + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub key_prefix: String, + pub key_hash: String, + pub scopes_json: String, + pub now_micros: i64, +} + +impl __sdk::InModule for PaymentApiKeyCreateInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_list_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_list_input_type.rs new file mode 100644 index 000000000..71c0c77aa --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_list_input_type.rs @@ -0,0 +1,15 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentApiKeyListInput { + pub owner_user_id: String, +} + +impl __sdk::InModule for PaymentApiKeyListInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_revoke_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_revoke_input_type.rs new file mode 100644 index 000000000..0078ab788 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_revoke_input_type.rs @@ -0,0 +1,17 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentApiKeyRevokeInput { + pub key_id: String, + pub owner_user_id: String, + pub revoked_at_micros: i64, +} + +impl __sdk::InModule for PaymentApiKeyRevokeInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_snapshot_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_snapshot_type.rs new file mode 100644 index 000000000..fc27bf52d --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_snapshot_type.rs @@ -0,0 +1,24 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentApiKeySnapshot { + pub key_id: String, + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub key_prefix: String, + pub scopes_json: String, + pub created_at_micros: i64, + pub last_used_at_micros: Option, + pub revoked_at_micros: Option, + pub updated_at_micros: i64, +} + +impl __sdk::InModule for PaymentApiKeySnapshot { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_table.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_table.rs new file mode 100644 index 000000000..409f34921 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_table.rs @@ -0,0 +1,259 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use super::payment_api_key_type::PaymentApiKey; +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +/// Table handle for the table `payment_api_key`. +/// +/// Obtain a handle from the [`PaymentApiKeyTableAccess::payment_api_key`] method on [`super::RemoteTables`], +/// like `ctx.db.payment_api_key()`. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_api_key().on_insert(...)`. +pub struct PaymentApiKeyTableHandle<'ctx> { + imp: __sdk::TableHandle, + ctx: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +/// Lifetime-aware accessor marker for the table `payment_api_key`. +pub struct PaymentApiKeyTableAccessor; + +impl __sdk::TableAccessor for PaymentApiKeyTableAccessor { + type Row = PaymentApiKey; + type Handle<'db> = PaymentApiKeyTableHandle<'db>; + + fn get<'db>(db: &'db super::RemoteTables) -> Self::Handle<'db> { + db.payment_api_key() + } +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the table `payment_api_key`. +/// +/// Implemented for [`super::RemoteTables`]. +pub trait PaymentApiKeyTableAccess { + #[allow(non_snake_case)] + /// Obtain a [`PaymentApiKeyTableHandle`], which mediates access to the table `payment_api_key`. + fn payment_api_key(&self) -> PaymentApiKeyTableHandle<'_>; +} + +impl PaymentApiKeyTableAccess for super::RemoteTables { + fn payment_api_key(&self) -> PaymentApiKeyTableHandle<'_> { + PaymentApiKeyTableHandle { + imp: self.imp.get_table::("payment_api_key"), + ctx: std::marker::PhantomData, + } + } +} + +pub struct PaymentApiKeyInsertCallbackId(__sdk::CallbackId); +pub struct PaymentApiKeyDeleteCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableLike for PaymentApiKeyTableHandle<'ctx> { + type Row = PaymentApiKey; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } +} + +impl<'ctx> __sdk::Table for PaymentApiKeyTableHandle<'ctx> { + type Row = PaymentApiKey; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } + + type InsertCallbackId = PaymentApiKeyInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentApiKeyInsertCallbackId { + PaymentApiKeyInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: PaymentApiKeyInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } + + type DeleteCallbackId = PaymentApiKeyDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentApiKeyDeleteCallbackId { + PaymentApiKeyDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: PaymentApiKeyDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +impl<'ctx> __sdk::WithInsert for PaymentApiKeyTableHandle<'ctx> { + type InsertCallbackId = PaymentApiKeyInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentApiKeyInsertCallbackId { + PaymentApiKeyInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: PaymentApiKeyInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } +} + +impl<'ctx> __sdk::WithDelete for PaymentApiKeyTableHandle<'ctx> { + type DeleteCallbackId = PaymentApiKeyDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentApiKeyDeleteCallbackId { + PaymentApiKeyDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: PaymentApiKeyDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +pub struct PaymentApiKeyUpdateCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableWithPrimaryKey for PaymentApiKeyTableHandle<'ctx> { + type UpdateCallbackId = PaymentApiKeyUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> PaymentApiKeyUpdateCallbackId { + PaymentApiKeyUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: PaymentApiKeyUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +impl<'ctx> __sdk::WithUpdate for PaymentApiKeyTableHandle<'ctx> { + type UpdateCallbackId = PaymentApiKeyUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> PaymentApiKeyUpdateCallbackId { + PaymentApiKeyUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: PaymentApiKeyUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +/// Access to the `key_id` unique index on the table `payment_api_key`, +/// which allows point queries on the field of the same name +/// via the [`PaymentApiKeyKeyIdUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_api_key().key_id().find(...)`. +pub struct PaymentApiKeyKeyIdUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> PaymentApiKeyTableHandle<'ctx> { + /// Get a handle on the `key_id` unique index on the table `payment_api_key`. + pub fn key_id(&self) -> PaymentApiKeyKeyIdUnique<'ctx> { + PaymentApiKeyKeyIdUnique { + imp: self.imp.get_unique_constraint::("key_id"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> PaymentApiKeyKeyIdUnique<'ctx> { + /// Find the subscribed row whose `key_id` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +/// Access to the `key_hash` unique index on the table `payment_api_key`, +/// which allows point queries on the field of the same name +/// via the [`PaymentApiKeyKeyHashUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_api_key().key_hash().find(...)`. +pub struct PaymentApiKeyKeyHashUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> PaymentApiKeyTableHandle<'ctx> { + /// Get a handle on the `key_hash` unique index on the table `payment_api_key`. + pub fn key_hash(&self) -> PaymentApiKeyKeyHashUnique<'ctx> { + PaymentApiKeyKeyHashUnique { + imp: self.imp.get_unique_constraint::("key_hash"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> PaymentApiKeyKeyHashUnique<'ctx> { + /// Find the subscribed row whose `key_hash` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +#[doc(hidden)] +pub(super) fn register_table(client_cache: &mut __sdk::ClientCache) { + let _table = client_cache.get_or_make_table::("payment_api_key"); + _table.add_unique_constraint::("key_id", |row| &row.key_id); + _table.add_unique_constraint::("key_hash", |row| &row.key_hash); +} + +#[doc(hidden)] +pub(super) fn parse_table_update( + raw_updates: __ws::v2::TableUpdate, +) -> __sdk::Result<__sdk::TableUpdate> { + __sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| { + __sdk::InternalError::failed_parse("TableUpdate", "TableUpdate") + .with_cause(e) + .into() + }) +} + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `PaymentApiKey`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait payment_api_keyQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `PaymentApiKey`. + fn payment_api_key(&self) -> __sdk::__query_builder::Table; +} + +impl payment_api_keyQueryTableAccess for __sdk::QueryTableAccessor { + fn payment_api_key(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("payment_api_key") + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_type.rs new file mode 100644 index 000000000..4a9bc51e7 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_api_key_type.rs @@ -0,0 +1,85 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentApiKey { + pub key_id: String, + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub key_prefix: String, + pub key_hash: String, + pub scopes_json: String, + pub created_at: __sdk::Timestamp, + pub last_used_at: Option<__sdk::Timestamp>, + pub revoked_at: Option<__sdk::Timestamp>, + pub updated_at: __sdk::Timestamp, +} + +impl __sdk::InModule for PaymentApiKey { + type Module = super::RemoteModule; +} + +/// Column accessor struct for the table `PaymentApiKey`. +/// +/// Provides typed access to columns for query building. +pub struct PaymentApiKeyCols { + pub key_id: __sdk::__query_builder::Col, + pub app_id: __sdk::__query_builder::Col, + pub owner_user_id: __sdk::__query_builder::Col, + pub name: __sdk::__query_builder::Col, + pub key_prefix: __sdk::__query_builder::Col, + pub key_hash: __sdk::__query_builder::Col, + pub scopes_json: __sdk::__query_builder::Col, + pub created_at: __sdk::__query_builder::Col, + pub last_used_at: __sdk::__query_builder::Col>, + pub revoked_at: __sdk::__query_builder::Col>, + pub updated_at: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for PaymentApiKey { + type Cols = PaymentApiKeyCols; + fn cols(table_name: &'static str) -> Self::Cols { + PaymentApiKeyCols { + key_id: __sdk::__query_builder::Col::new(table_name, "key_id"), + app_id: __sdk::__query_builder::Col::new(table_name, "app_id"), + owner_user_id: __sdk::__query_builder::Col::new(table_name, "owner_user_id"), + name: __sdk::__query_builder::Col::new(table_name, "name"), + key_prefix: __sdk::__query_builder::Col::new(table_name, "key_prefix"), + key_hash: __sdk::__query_builder::Col::new(table_name, "key_hash"), + scopes_json: __sdk::__query_builder::Col::new(table_name, "scopes_json"), + created_at: __sdk::__query_builder::Col::new(table_name, "created_at"), + last_used_at: __sdk::__query_builder::Col::new(table_name, "last_used_at"), + revoked_at: __sdk::__query_builder::Col::new(table_name, "revoked_at"), + updated_at: __sdk::__query_builder::Col::new(table_name, "updated_at"), + } + } +} + +/// Indexed column accessor struct for the table `PaymentApiKey`. +/// +/// Provides typed access to indexed columns for query building. +pub struct PaymentApiKeyIxCols { + pub app_id: __sdk::__query_builder::IxCol, + pub key_hash: __sdk::__query_builder::IxCol, + pub key_id: __sdk::__query_builder::IxCol, + pub owner_user_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for PaymentApiKey { + type IxCols = PaymentApiKeyIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + PaymentApiKeyIxCols { + app_id: __sdk::__query_builder::IxCol::new(table_name, "app_id"), + key_hash: __sdk::__query_builder::IxCol::new(table_name, "key_hash"), + key_id: __sdk::__query_builder::IxCol::new(table_name, "key_id"), + owner_user_id: __sdk::__query_builder::IxCol::new(table_name, "owner_user_id"), + } + } +} + +impl __sdk::__query_builder::CanBeLookupTable for PaymentApiKey {} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_app_create_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_create_input_type.rs new file mode 100644 index 000000000..ffbc34df5 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_create_input_type.rs @@ -0,0 +1,19 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentAppCreateInput { + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub callback_url: Option, + pub now_micros: i64, +} + +impl __sdk::InModule for PaymentAppCreateInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_app_list_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_list_input_type.rs new file mode 100644 index 000000000..641a4020d --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_list_input_type.rs @@ -0,0 +1,15 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentAppListInput { + pub owner_user_id: String, +} + +impl __sdk::InModule for PaymentAppListInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_app_procedure_result_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_procedure_result_type.rs new file mode 100644 index 000000000..2bbb8ef04 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_procedure_result_type.rs @@ -0,0 +1,23 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_api_key_snapshot_type::PaymentApiKeySnapshot; +use super::payment_app_snapshot_type::PaymentAppSnapshot; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentAppProcedureResult { + pub ok: bool, + pub app: Option, + pub key: Option, + pub apps: Vec, + pub keys: Vec, + pub error_message: Option, +} + +impl __sdk::InModule for PaymentAppProcedureResult { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_app_snapshot_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_snapshot_type.rs new file mode 100644 index 000000000..a96a682da --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_snapshot_type.rs @@ -0,0 +1,21 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentAppSnapshot { + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub callback_url: Option, + pub enabled: bool, + pub created_at_micros: i64, + pub updated_at_micros: i64, +} + +impl __sdk::InModule for PaymentAppSnapshot { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_app_table.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_table.rs new file mode 100644 index 000000000..74fea42c5 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_table.rs @@ -0,0 +1,228 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use super::payment_app_type::PaymentApp; +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +/// Table handle for the table `payment_app`. +/// +/// Obtain a handle from the [`PaymentAppTableAccess::payment_app`] method on [`super::RemoteTables`], +/// like `ctx.db.payment_app()`. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_app().on_insert(...)`. +pub struct PaymentAppTableHandle<'ctx> { + imp: __sdk::TableHandle, + ctx: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +/// Lifetime-aware accessor marker for the table `payment_app`. +pub struct PaymentAppTableAccessor; + +impl __sdk::TableAccessor for PaymentAppTableAccessor { + type Row = PaymentApp; + type Handle<'db> = PaymentAppTableHandle<'db>; + + fn get<'db>(db: &'db super::RemoteTables) -> Self::Handle<'db> { + db.payment_app() + } +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the table `payment_app`. +/// +/// Implemented for [`super::RemoteTables`]. +pub trait PaymentAppTableAccess { + #[allow(non_snake_case)] + /// Obtain a [`PaymentAppTableHandle`], which mediates access to the table `payment_app`. + fn payment_app(&self) -> PaymentAppTableHandle<'_>; +} + +impl PaymentAppTableAccess for super::RemoteTables { + fn payment_app(&self) -> PaymentAppTableHandle<'_> { + PaymentAppTableHandle { + imp: self.imp.get_table::("payment_app"), + ctx: std::marker::PhantomData, + } + } +} + +pub struct PaymentAppInsertCallbackId(__sdk::CallbackId); +pub struct PaymentAppDeleteCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableLike for PaymentAppTableHandle<'ctx> { + type Row = PaymentApp; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } +} + +impl<'ctx> __sdk::Table for PaymentAppTableHandle<'ctx> { + type Row = PaymentApp; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } + + type InsertCallbackId = PaymentAppInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentAppInsertCallbackId { + PaymentAppInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: PaymentAppInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } + + type DeleteCallbackId = PaymentAppDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentAppDeleteCallbackId { + PaymentAppDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: PaymentAppDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +impl<'ctx> __sdk::WithInsert for PaymentAppTableHandle<'ctx> { + type InsertCallbackId = PaymentAppInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentAppInsertCallbackId { + PaymentAppInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: PaymentAppInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } +} + +impl<'ctx> __sdk::WithDelete for PaymentAppTableHandle<'ctx> { + type DeleteCallbackId = PaymentAppDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentAppDeleteCallbackId { + PaymentAppDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: PaymentAppDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +pub struct PaymentAppUpdateCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableWithPrimaryKey for PaymentAppTableHandle<'ctx> { + type UpdateCallbackId = PaymentAppUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> PaymentAppUpdateCallbackId { + PaymentAppUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: PaymentAppUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +impl<'ctx> __sdk::WithUpdate for PaymentAppTableHandle<'ctx> { + type UpdateCallbackId = PaymentAppUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> PaymentAppUpdateCallbackId { + PaymentAppUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: PaymentAppUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +/// Access to the `app_id` unique index on the table `payment_app`, +/// which allows point queries on the field of the same name +/// via the [`PaymentAppAppIdUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_app().app_id().find(...)`. +pub struct PaymentAppAppIdUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> PaymentAppTableHandle<'ctx> { + /// Get a handle on the `app_id` unique index on the table `payment_app`. + pub fn app_id(&self) -> PaymentAppAppIdUnique<'ctx> { + PaymentAppAppIdUnique { + imp: self.imp.get_unique_constraint::("app_id"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> PaymentAppAppIdUnique<'ctx> { + /// Find the subscribed row whose `app_id` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +#[doc(hidden)] +pub(super) fn register_table(client_cache: &mut __sdk::ClientCache) { + let _table = client_cache.get_or_make_table::("payment_app"); + _table.add_unique_constraint::("app_id", |row| &row.app_id); +} + +#[doc(hidden)] +pub(super) fn parse_table_update( + raw_updates: __ws::v2::TableUpdate, +) -> __sdk::Result<__sdk::TableUpdate> { + __sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| { + __sdk::InternalError::failed_parse("TableUpdate", "TableUpdate") + .with_cause(e) + .into() + }) +} + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `PaymentApp`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait payment_appQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `PaymentApp`. + fn payment_app(&self) -> __sdk::__query_builder::Table; +} + +impl payment_appQueryTableAccess for __sdk::QueryTableAccessor { + fn payment_app(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("payment_app") + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_app_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_type.rs new file mode 100644 index 000000000..f34b81a07 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_type.rs @@ -0,0 +1,69 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentApp { + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub callback_url: Option, + pub enabled: bool, + pub created_at: __sdk::Timestamp, + pub updated_at: __sdk::Timestamp, +} + +impl __sdk::InModule for PaymentApp { + type Module = super::RemoteModule; +} + +/// Column accessor struct for the table `PaymentApp`. +/// +/// Provides typed access to columns for query building. +pub struct PaymentAppCols { + pub app_id: __sdk::__query_builder::Col, + pub owner_user_id: __sdk::__query_builder::Col, + pub name: __sdk::__query_builder::Col, + pub callback_url: __sdk::__query_builder::Col>, + pub enabled: __sdk::__query_builder::Col, + pub created_at: __sdk::__query_builder::Col, + pub updated_at: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for PaymentApp { + type Cols = PaymentAppCols; + fn cols(table_name: &'static str) -> Self::Cols { + PaymentAppCols { + app_id: __sdk::__query_builder::Col::new(table_name, "app_id"), + owner_user_id: __sdk::__query_builder::Col::new(table_name, "owner_user_id"), + name: __sdk::__query_builder::Col::new(table_name, "name"), + callback_url: __sdk::__query_builder::Col::new(table_name, "callback_url"), + enabled: __sdk::__query_builder::Col::new(table_name, "enabled"), + created_at: __sdk::__query_builder::Col::new(table_name, "created_at"), + updated_at: __sdk::__query_builder::Col::new(table_name, "updated_at"), + } + } +} + +/// Indexed column accessor struct for the table `PaymentApp`. +/// +/// Provides typed access to indexed columns for query building. +pub struct PaymentAppIxCols { + pub app_id: __sdk::__query_builder::IxCol, + pub owner_user_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for PaymentApp { + type IxCols = PaymentAppIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + PaymentAppIxCols { + app_id: __sdk::__query_builder::IxCol::new(table_name, "app_id"), + owner_user_id: __sdk::__query_builder::IxCol::new(table_name, "owner_user_id"), + } + } +} + +impl __sdk::__query_builder::CanBeLookupTable for PaymentApp {} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_app_update_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_update_input_type.rs new file mode 100644 index 000000000..f83e5f760 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_app_update_input_type.rs @@ -0,0 +1,18 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentAppUpdateInput { + pub app_id: String, + pub owner_user_id: String, + pub enabled: bool, + pub updated_at_micros: i64, +} + +impl __sdk::InModule for PaymentAppUpdateInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_checkout_get_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_checkout_get_input_type.rs new file mode 100644 index 000000000..66b87f70e --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_checkout_get_input_type.rs @@ -0,0 +1,15 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrderCheckoutGetInput { + pub checkout_token: String, +} + +impl __sdk::InModule for PaymentOrderCheckoutGetInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_create_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_create_input_type.rs new file mode 100644 index 000000000..a9952746d --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_create_input_type.rs @@ -0,0 +1,31 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_provider_type::PaymentProvider; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrderCreateInput { + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub merchant_order_id: String, + pub idempotency_lookup: String, + pub title: String, + pub items_json: String, + pub amount_cents: u64, + pub currency: String, + pub provider: PaymentProvider, + pub checkout_token: String, + pub now_micros: i64, + pub expires_at_micros: i64, + pub callback_url: Option, + pub callback_signing_key_hash: Option, +} + +impl __sdk::InModule for PaymentOrderCreateInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_get_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_get_input_type.rs new file mode 100644 index 000000000..203c66ccb --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_get_input_type.rs @@ -0,0 +1,16 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrderGetInput { + pub order_id: String, + pub owner_user_id: Option, +} + +impl __sdk::InModule for PaymentOrderGetInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_list_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_list_input_type.rs new file mode 100644 index 000000000..2be50fede --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_list_input_type.rs @@ -0,0 +1,17 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrderListInput { + pub app_id: Option, + pub owner_user_id: String, + pub limit: u32, +} + +impl __sdk::InModule for PaymentOrderListInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_mark_paid_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_mark_paid_input_type.rs new file mode 100644 index 000000000..837ac27f6 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_mark_paid_input_type.rs @@ -0,0 +1,18 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrderMarkPaidInput { + pub order_id: String, + pub provider_trade_no: String, + pub amount_cents: u64, + pub paid_at_micros: i64, +} + +impl __sdk::InModule for PaymentOrderMarkPaidInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_procedure_result_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_procedure_result_type.rs new file mode 100644 index 000000000..22c3f85af --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_procedure_result_type.rs @@ -0,0 +1,20 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_snapshot_type::PaymentOrderSnapshot; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrderProcedureResult { + pub ok: bool, + pub order: Option, + pub orders: Vec, + pub error_message: Option, +} + +impl __sdk::InModule for PaymentOrderProcedureResult { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_provider_attempt_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_provider_attempt_input_type.rs new file mode 100644 index 000000000..e2b0002bb --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_provider_attempt_input_type.rs @@ -0,0 +1,16 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrderProviderAttemptInput { + pub order_id: String, + pub attempted_at_micros: i64, +} + +impl __sdk::InModule for PaymentOrderProviderAttemptInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_provider_code_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_provider_code_input_type.rs new file mode 100644 index 000000000..b02d63297 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_provider_code_input_type.rs @@ -0,0 +1,17 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrderProviderCodeInput { + pub order_id: String, + pub provider_code_url: String, + pub updated_at_micros: i64, +} + +impl __sdk::InModule for PaymentOrderProviderCodeInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_snapshot_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_snapshot_type.rs new file mode 100644 index 000000000..f2e351627 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_snapshot_type.rs @@ -0,0 +1,38 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_status_type::PaymentOrderStatus; +use super::payment_provider_type::PaymentProvider; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrderSnapshot { + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub merchant_order_id: String, + pub idempotency_lookup: String, + pub title: String, + pub items_json: String, + pub amount_cents: u64, + pub currency: String, + pub provider: PaymentProvider, + pub provider_trade_no: Option, + pub provider_code_url: Option, + pub callback_url: Option, + pub callback_signing_key_hash: Option, + pub provider_attempted_at_micros: Option, + pub checkout_token: String, + pub status: PaymentOrderStatus, + pub created_at_micros: i64, + pub expires_at_micros: i64, + pub paid_at_micros: Option, + pub updated_at_micros: i64, +} + +impl __sdk::InModule for PaymentOrderSnapshot { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_status_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_status_type.rs new file mode 100644 index 000000000..046f3370c --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_status_type.rs @@ -0,0 +1,26 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +#[derive(Copy, Eq, Hash)] +pub enum PaymentOrderStatus { + Pending, + + Paying, + + Paid, + + Expired, + + Closed, + + Refunded, +} + +impl __sdk::InModule for PaymentOrderStatus { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_table.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_table.rs new file mode 100644 index 000000000..58f65872a --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_table.rs @@ -0,0 +1,328 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use super::payment_order_status_type::PaymentOrderStatus; +use super::payment_order_type::PaymentOrder; +use super::payment_provider_type::PaymentProvider; +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +/// Table handle for the table `payment_order`. +/// +/// Obtain a handle from the [`PaymentOrderTableAccess::payment_order`] method on [`super::RemoteTables`], +/// like `ctx.db.payment_order()`. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_order().on_insert(...)`. +pub struct PaymentOrderTableHandle<'ctx> { + imp: __sdk::TableHandle, + ctx: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +/// Lifetime-aware accessor marker for the table `payment_order`. +pub struct PaymentOrderTableAccessor; + +impl __sdk::TableAccessor for PaymentOrderTableAccessor { + type Row = PaymentOrder; + type Handle<'db> = PaymentOrderTableHandle<'db>; + + fn get<'db>(db: &'db super::RemoteTables) -> Self::Handle<'db> { + db.payment_order() + } +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the table `payment_order`. +/// +/// Implemented for [`super::RemoteTables`]. +pub trait PaymentOrderTableAccess { + #[allow(non_snake_case)] + /// Obtain a [`PaymentOrderTableHandle`], which mediates access to the table `payment_order`. + fn payment_order(&self) -> PaymentOrderTableHandle<'_>; +} + +impl PaymentOrderTableAccess for super::RemoteTables { + fn payment_order(&self) -> PaymentOrderTableHandle<'_> { + PaymentOrderTableHandle { + imp: self.imp.get_table::("payment_order"), + ctx: std::marker::PhantomData, + } + } +} + +pub struct PaymentOrderInsertCallbackId(__sdk::CallbackId); +pub struct PaymentOrderDeleteCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableLike for PaymentOrderTableHandle<'ctx> { + type Row = PaymentOrder; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } +} + +impl<'ctx> __sdk::Table for PaymentOrderTableHandle<'ctx> { + type Row = PaymentOrder; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } + + type InsertCallbackId = PaymentOrderInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentOrderInsertCallbackId { + PaymentOrderInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: PaymentOrderInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } + + type DeleteCallbackId = PaymentOrderDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentOrderDeleteCallbackId { + PaymentOrderDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: PaymentOrderDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +impl<'ctx> __sdk::WithInsert for PaymentOrderTableHandle<'ctx> { + type InsertCallbackId = PaymentOrderInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentOrderInsertCallbackId { + PaymentOrderInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: PaymentOrderInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } +} + +impl<'ctx> __sdk::WithDelete for PaymentOrderTableHandle<'ctx> { + type DeleteCallbackId = PaymentOrderDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentOrderDeleteCallbackId { + PaymentOrderDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: PaymentOrderDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +pub struct PaymentOrderUpdateCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableWithPrimaryKey for PaymentOrderTableHandle<'ctx> { + type UpdateCallbackId = PaymentOrderUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> PaymentOrderUpdateCallbackId { + PaymentOrderUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: PaymentOrderUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +impl<'ctx> __sdk::WithUpdate for PaymentOrderTableHandle<'ctx> { + type UpdateCallbackId = PaymentOrderUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> PaymentOrderUpdateCallbackId { + PaymentOrderUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: PaymentOrderUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +/// Access to the `order_id` unique index on the table `payment_order`, +/// which allows point queries on the field of the same name +/// via the [`PaymentOrderOrderIdUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_order().order_id().find(...)`. +pub struct PaymentOrderOrderIdUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> PaymentOrderTableHandle<'ctx> { + /// Get a handle on the `order_id` unique index on the table `payment_order`. + pub fn order_id(&self) -> PaymentOrderOrderIdUnique<'ctx> { + PaymentOrderOrderIdUnique { + imp: self.imp.get_unique_constraint::("order_id"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> PaymentOrderOrderIdUnique<'ctx> { + /// Find the subscribed row whose `order_id` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +/// Access to the `idempotency_lookup` unique index on the table `payment_order`, +/// which allows point queries on the field of the same name +/// via the [`PaymentOrderIdempotencyLookupUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_order().idempotency_lookup().find(...)`. +pub struct PaymentOrderIdempotencyLookupUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> PaymentOrderTableHandle<'ctx> { + /// Get a handle on the `idempotency_lookup` unique index on the table `payment_order`. + pub fn idempotency_lookup(&self) -> PaymentOrderIdempotencyLookupUnique<'ctx> { + PaymentOrderIdempotencyLookupUnique { + imp: self + .imp + .get_unique_constraint::("idempotency_lookup"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> PaymentOrderIdempotencyLookupUnique<'ctx> { + /// Find the subscribed row whose `idempotency_lookup` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +/// Access to the `merchant_order_lookup` unique index on the table `payment_order`, +/// which allows point queries on the field of the same name +/// via the [`PaymentOrderMerchantOrderLookupUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_order().merchant_order_lookup().find(...)`. +pub struct PaymentOrderMerchantOrderLookupUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> PaymentOrderTableHandle<'ctx> { + /// Get a handle on the `merchant_order_lookup` unique index on the table `payment_order`. + pub fn merchant_order_lookup(&self) -> PaymentOrderMerchantOrderLookupUnique<'ctx> { + PaymentOrderMerchantOrderLookupUnique { + imp: self + .imp + .get_unique_constraint::("merchant_order_lookup"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> PaymentOrderMerchantOrderLookupUnique<'ctx> { + /// Find the subscribed row whose `merchant_order_lookup` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +/// Access to the `checkout_token` unique index on the table `payment_order`, +/// which allows point queries on the field of the same name +/// via the [`PaymentOrderCheckoutTokenUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_order().checkout_token().find(...)`. +pub struct PaymentOrderCheckoutTokenUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> PaymentOrderTableHandle<'ctx> { + /// Get a handle on the `checkout_token` unique index on the table `payment_order`. + pub fn checkout_token(&self) -> PaymentOrderCheckoutTokenUnique<'ctx> { + PaymentOrderCheckoutTokenUnique { + imp: self.imp.get_unique_constraint::("checkout_token"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> PaymentOrderCheckoutTokenUnique<'ctx> { + /// Find the subscribed row whose `checkout_token` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +#[doc(hidden)] +pub(super) fn register_table(client_cache: &mut __sdk::ClientCache) { + let _table = client_cache.get_or_make_table::("payment_order"); + _table.add_unique_constraint::("order_id", |row| &row.order_id); + _table.add_unique_constraint::("idempotency_lookup", |row| &row.idempotency_lookup); + _table + .add_unique_constraint::("merchant_order_lookup", |row| &row.merchant_order_lookup); + _table.add_unique_constraint::("checkout_token", |row| &row.checkout_token); +} + +#[doc(hidden)] +pub(super) fn parse_table_update( + raw_updates: __ws::v2::TableUpdate, +) -> __sdk::Result<__sdk::TableUpdate> { + __sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| { + __sdk::InternalError::failed_parse("TableUpdate", "TableUpdate") + .with_cause(e) + .into() + }) +} + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `PaymentOrder`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait payment_orderQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `PaymentOrder`. + fn payment_order(&self) -> __sdk::__query_builder::Table; +} + +impl payment_orderQueryTableAccess for __sdk::QueryTableAccessor { + fn payment_order(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("payment_order") + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_order_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_type.rs new file mode 100644 index 000000000..abb46c6d5 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_order_type.rs @@ -0,0 +1,142 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_status_type::PaymentOrderStatus; +use super::payment_provider_type::PaymentProvider; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentOrder { + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub merchant_order_id: String, + pub idempotency_lookup: String, + pub merchant_order_lookup: String, + pub title: String, + pub items_json: String, + pub amount_cents: u64, + pub currency: String, + pub provider: PaymentProvider, + pub provider_trade_no: Option, + pub checkout_token: String, + pub status: PaymentOrderStatus, + pub created_at: __sdk::Timestamp, + pub expires_at: __sdk::Timestamp, + pub paid_at: Option<__sdk::Timestamp>, + pub updated_at: __sdk::Timestamp, + pub provider_code_url: Option, + pub callback_url: Option, + pub callback_signing_key_hash: Option, + pub provider_attempted_at: Option<__sdk::Timestamp>, +} + +impl __sdk::InModule for PaymentOrder { + type Module = super::RemoteModule; +} + +/// Column accessor struct for the table `PaymentOrder`. +/// +/// Provides typed access to columns for query building. +pub struct PaymentOrderCols { + pub order_id: __sdk::__query_builder::Col, + pub app_id: __sdk::__query_builder::Col, + pub owner_user_id: __sdk::__query_builder::Col, + pub merchant_order_id: __sdk::__query_builder::Col, + pub idempotency_lookup: __sdk::__query_builder::Col, + pub merchant_order_lookup: __sdk::__query_builder::Col, + pub title: __sdk::__query_builder::Col, + pub items_json: __sdk::__query_builder::Col, + pub amount_cents: __sdk::__query_builder::Col, + pub currency: __sdk::__query_builder::Col, + pub provider: __sdk::__query_builder::Col, + pub provider_trade_no: __sdk::__query_builder::Col>, + pub checkout_token: __sdk::__query_builder::Col, + pub status: __sdk::__query_builder::Col, + pub created_at: __sdk::__query_builder::Col, + pub expires_at: __sdk::__query_builder::Col, + pub paid_at: __sdk::__query_builder::Col>, + pub updated_at: __sdk::__query_builder::Col, + pub provider_code_url: __sdk::__query_builder::Col>, + pub callback_url: __sdk::__query_builder::Col>, + pub callback_signing_key_hash: __sdk::__query_builder::Col>, + pub provider_attempted_at: __sdk::__query_builder::Col>, +} + +impl __sdk::__query_builder::HasCols for PaymentOrder { + type Cols = PaymentOrderCols; + fn cols(table_name: &'static str) -> Self::Cols { + PaymentOrderCols { + order_id: __sdk::__query_builder::Col::new(table_name, "order_id"), + app_id: __sdk::__query_builder::Col::new(table_name, "app_id"), + owner_user_id: __sdk::__query_builder::Col::new(table_name, "owner_user_id"), + merchant_order_id: __sdk::__query_builder::Col::new(table_name, "merchant_order_id"), + idempotency_lookup: __sdk::__query_builder::Col::new(table_name, "idempotency_lookup"), + merchant_order_lookup: __sdk::__query_builder::Col::new( + table_name, + "merchant_order_lookup", + ), + title: __sdk::__query_builder::Col::new(table_name, "title"), + items_json: __sdk::__query_builder::Col::new(table_name, "items_json"), + amount_cents: __sdk::__query_builder::Col::new(table_name, "amount_cents"), + currency: __sdk::__query_builder::Col::new(table_name, "currency"), + provider: __sdk::__query_builder::Col::new(table_name, "provider"), + provider_trade_no: __sdk::__query_builder::Col::new(table_name, "provider_trade_no"), + checkout_token: __sdk::__query_builder::Col::new(table_name, "checkout_token"), + status: __sdk::__query_builder::Col::new(table_name, "status"), + created_at: __sdk::__query_builder::Col::new(table_name, "created_at"), + expires_at: __sdk::__query_builder::Col::new(table_name, "expires_at"), + paid_at: __sdk::__query_builder::Col::new(table_name, "paid_at"), + updated_at: __sdk::__query_builder::Col::new(table_name, "updated_at"), + provider_code_url: __sdk::__query_builder::Col::new(table_name, "provider_code_url"), + callback_url: __sdk::__query_builder::Col::new(table_name, "callback_url"), + callback_signing_key_hash: __sdk::__query_builder::Col::new( + table_name, + "callback_signing_key_hash", + ), + provider_attempted_at: __sdk::__query_builder::Col::new( + table_name, + "provider_attempted_at", + ), + } + } +} + +/// Indexed column accessor struct for the table `PaymentOrder`. +/// +/// Provides typed access to indexed columns for query building. +pub struct PaymentOrderIxCols { + pub app_id: __sdk::__query_builder::IxCol, + pub checkout_token: __sdk::__query_builder::IxCol, + pub idempotency_lookup: __sdk::__query_builder::IxCol, + pub merchant_order_lookup: __sdk::__query_builder::IxCol, + pub order_id: __sdk::__query_builder::IxCol, + pub owner_user_id: __sdk::__query_builder::IxCol, + pub status: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for PaymentOrder { + type IxCols = PaymentOrderIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + PaymentOrderIxCols { + app_id: __sdk::__query_builder::IxCol::new(table_name, "app_id"), + checkout_token: __sdk::__query_builder::IxCol::new(table_name, "checkout_token"), + idempotency_lookup: __sdk::__query_builder::IxCol::new( + table_name, + "idempotency_lookup", + ), + merchant_order_lookup: __sdk::__query_builder::IxCol::new( + table_name, + "merchant_order_lookup", + ), + order_id: __sdk::__query_builder::IxCol::new(table_name, "order_id"), + owner_user_id: __sdk::__query_builder::IxCol::new(table_name, "owner_user_id"), + status: __sdk::__query_builder::IxCol::new(table_name, "status"), + } + } +} + +impl __sdk::__query_builder::CanBeLookupTable for PaymentOrder {} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_provider_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_provider_type.rs new file mode 100644 index 000000000..c006a51ca --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_provider_type.rs @@ -0,0 +1,16 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +#[derive(Copy, Eq, Hash)] +pub enum PaymentProvider { + WechatNative, +} + +impl __sdk::InModule for PaymentProvider { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_claim_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_claim_input_type.rs new file mode 100644 index 000000000..3fdb121b4 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_claim_input_type.rs @@ -0,0 +1,18 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentWebhookClaimInput { + pub worker_id: String, + pub limit: u32, + pub now_micros: i64, + pub lease_expires_at_micros: i64, +} + +impl __sdk::InModule for PaymentWebhookClaimInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_complete_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_complete_input_type.rs new file mode 100644 index 000000000..ecbdd90dd --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_complete_input_type.rs @@ -0,0 +1,21 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentWebhookCompleteInput { + pub delivery_id: String, + pub worker_id: String, + pub success: bool, + pub error_message: Option, + pub now_micros: i64, + pub next_available_at_micros: i64, + pub attempt_count: u32, +} + +impl __sdk::InModule for PaymentWebhookCompleteInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_snapshot_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_snapshot_type.rs new file mode 100644 index 000000000..22eca80db --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_snapshot_type.rs @@ -0,0 +1,29 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentWebhookDeliverySnapshot { + pub delivery_id: String, + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub callback_url: String, + pub payload_json: String, + pub signature: String, + pub status: String, + pub attempt_count: u32, + pub available_at_micros: i64, + pub lease_worker_id: Option, + pub lease_expires_at_micros: Option, + pub last_error_message: Option, + pub created_at_micros: i64, + pub updated_at_micros: i64, +} + +impl __sdk::InModule for PaymentWebhookDeliverySnapshot { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_table.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_table.rs new file mode 100644 index 000000000..8cc76e053 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_table.rs @@ -0,0 +1,231 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use super::payment_webhook_delivery_type::PaymentWebhookDelivery; +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +/// Table handle for the table `payment_webhook_delivery`. +/// +/// Obtain a handle from the [`PaymentWebhookDeliveryTableAccess::payment_webhook_delivery`] method on [`super::RemoteTables`], +/// like `ctx.db.payment_webhook_delivery()`. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_webhook_delivery().on_insert(...)`. +pub struct PaymentWebhookDeliveryTableHandle<'ctx> { + imp: __sdk::TableHandle, + ctx: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +/// Lifetime-aware accessor marker for the table `payment_webhook_delivery`. +pub struct PaymentWebhookDeliveryTableAccessor; + +impl __sdk::TableAccessor for PaymentWebhookDeliveryTableAccessor { + type Row = PaymentWebhookDelivery; + type Handle<'db> = PaymentWebhookDeliveryTableHandle<'db>; + + fn get<'db>(db: &'db super::RemoteTables) -> Self::Handle<'db> { + db.payment_webhook_delivery() + } +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the table `payment_webhook_delivery`. +/// +/// Implemented for [`super::RemoteTables`]. +pub trait PaymentWebhookDeliveryTableAccess { + #[allow(non_snake_case)] + /// Obtain a [`PaymentWebhookDeliveryTableHandle`], which mediates access to the table `payment_webhook_delivery`. + fn payment_webhook_delivery(&self) -> PaymentWebhookDeliveryTableHandle<'_>; +} + +impl PaymentWebhookDeliveryTableAccess for super::RemoteTables { + fn payment_webhook_delivery(&self) -> PaymentWebhookDeliveryTableHandle<'_> { + PaymentWebhookDeliveryTableHandle { + imp: self + .imp + .get_table::("payment_webhook_delivery"), + ctx: std::marker::PhantomData, + } + } +} + +pub struct PaymentWebhookDeliveryInsertCallbackId(__sdk::CallbackId); +pub struct PaymentWebhookDeliveryDeleteCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableLike for PaymentWebhookDeliveryTableHandle<'ctx> { + type Row = PaymentWebhookDelivery; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } +} + +impl<'ctx> __sdk::Table for PaymentWebhookDeliveryTableHandle<'ctx> { + type Row = PaymentWebhookDelivery; + type EventContext = super::EventContext; + + fn count(&self) -> u64 { + self.imp.count() + } + fn iter(&self) -> impl Iterator + '_ { + self.imp.iter() + } + + type InsertCallbackId = PaymentWebhookDeliveryInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentWebhookDeliveryInsertCallbackId { + PaymentWebhookDeliveryInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: PaymentWebhookDeliveryInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } + + type DeleteCallbackId = PaymentWebhookDeliveryDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentWebhookDeliveryDeleteCallbackId { + PaymentWebhookDeliveryDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: PaymentWebhookDeliveryDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +impl<'ctx> __sdk::WithInsert for PaymentWebhookDeliveryTableHandle<'ctx> { + type InsertCallbackId = PaymentWebhookDeliveryInsertCallbackId; + + fn on_insert( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentWebhookDeliveryInsertCallbackId { + PaymentWebhookDeliveryInsertCallbackId(self.imp.on_insert(Box::new(callback))) + } + + fn remove_on_insert(&self, callback: PaymentWebhookDeliveryInsertCallbackId) { + self.imp.remove_on_insert(callback.0) + } +} + +impl<'ctx> __sdk::WithDelete for PaymentWebhookDeliveryTableHandle<'ctx> { + type DeleteCallbackId = PaymentWebhookDeliveryDeleteCallbackId; + + fn on_delete( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row) + Send + 'static, + ) -> PaymentWebhookDeliveryDeleteCallbackId { + PaymentWebhookDeliveryDeleteCallbackId(self.imp.on_delete(Box::new(callback))) + } + + fn remove_on_delete(&self, callback: PaymentWebhookDeliveryDeleteCallbackId) { + self.imp.remove_on_delete(callback.0) + } +} + +pub struct PaymentWebhookDeliveryUpdateCallbackId(__sdk::CallbackId); + +impl<'ctx> __sdk::TableWithPrimaryKey for PaymentWebhookDeliveryTableHandle<'ctx> { + type UpdateCallbackId = PaymentWebhookDeliveryUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> PaymentWebhookDeliveryUpdateCallbackId { + PaymentWebhookDeliveryUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: PaymentWebhookDeliveryUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +impl<'ctx> __sdk::WithUpdate for PaymentWebhookDeliveryTableHandle<'ctx> { + type UpdateCallbackId = PaymentWebhookDeliveryUpdateCallbackId; + + fn on_update( + &self, + callback: impl FnMut(&Self::EventContext, &Self::Row, &Self::Row) + Send + 'static, + ) -> PaymentWebhookDeliveryUpdateCallbackId { + PaymentWebhookDeliveryUpdateCallbackId(self.imp.on_update(Box::new(callback))) + } + + fn remove_on_update(&self, callback: PaymentWebhookDeliveryUpdateCallbackId) { + self.imp.remove_on_update(callback.0) + } +} + +/// Access to the `delivery_id` unique index on the table `payment_webhook_delivery`, +/// which allows point queries on the field of the same name +/// via the [`PaymentWebhookDeliveryDeliveryIdUnique::find`] method. +/// +/// Users are encouraged not to explicitly reference this type, +/// but to directly chain method calls, +/// like `ctx.db.payment_webhook_delivery().delivery_id().find(...)`. +pub struct PaymentWebhookDeliveryDeliveryIdUnique<'ctx> { + imp: __sdk::UniqueConstraintHandle, + phantom: std::marker::PhantomData<&'ctx super::RemoteTables>, +} + +impl<'ctx> PaymentWebhookDeliveryTableHandle<'ctx> { + /// Get a handle on the `delivery_id` unique index on the table `payment_webhook_delivery`. + pub fn delivery_id(&self) -> PaymentWebhookDeliveryDeliveryIdUnique<'ctx> { + PaymentWebhookDeliveryDeliveryIdUnique { + imp: self.imp.get_unique_constraint::("delivery_id"), + phantom: std::marker::PhantomData, + } + } +} + +impl<'ctx> PaymentWebhookDeliveryDeliveryIdUnique<'ctx> { + /// Find the subscribed row whose `delivery_id` column value is equal to `col_val`, + /// if such a row is present in the client cache. + pub fn find(&self, col_val: &String) -> Option { + self.imp.find(col_val) + } +} + +#[doc(hidden)] +pub(super) fn register_table(client_cache: &mut __sdk::ClientCache) { + let _table = + client_cache.get_or_make_table::("payment_webhook_delivery"); + _table.add_unique_constraint::("delivery_id", |row| &row.delivery_id); +} + +#[doc(hidden)] +pub(super) fn parse_table_update( + raw_updates: __ws::v2::TableUpdate, +) -> __sdk::Result<__sdk::TableUpdate> { + __sdk::TableUpdate::parse_table_update(raw_updates).map_err(|e| { + __sdk::InternalError::failed_parse("TableUpdate", "TableUpdate") + .with_cause(e) + .into() + }) +} + +#[allow(non_camel_case_types)] +/// Extension trait for query builder access to the table `PaymentWebhookDelivery`. +/// +/// Implemented for [`__sdk::QueryTableAccessor`]. +pub trait payment_webhook_deliveryQueryTableAccess { + #[allow(non_snake_case)] + /// Get a query builder for the table `PaymentWebhookDelivery`. + fn payment_webhook_delivery(&self) -> __sdk::__query_builder::Table; +} + +impl payment_webhook_deliveryQueryTableAccess for __sdk::QueryTableAccessor { + fn payment_webhook_delivery(&self) -> __sdk::__query_builder::Table { + __sdk::__query_builder::Table::new("payment_webhook_delivery") + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_type.rs new file mode 100644 index 000000000..be33d532c --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_delivery_type.rs @@ -0,0 +1,96 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentWebhookDelivery { + pub delivery_id: String, + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub callback_url: String, + pub payload_json: String, + pub signature: String, + pub status: String, + pub attempt_count: u32, + pub available_at: __sdk::Timestamp, + pub lease_worker_id: Option, + pub lease_expires_at: Option<__sdk::Timestamp>, + pub last_error_message: Option, + pub created_at: __sdk::Timestamp, + pub updated_at: __sdk::Timestamp, +} + +impl __sdk::InModule for PaymentWebhookDelivery { + type Module = super::RemoteModule; +} + +/// Column accessor struct for the table `PaymentWebhookDelivery`. +/// +/// Provides typed access to columns for query building. +pub struct PaymentWebhookDeliveryCols { + pub delivery_id: __sdk::__query_builder::Col, + pub order_id: __sdk::__query_builder::Col, + pub app_id: __sdk::__query_builder::Col, + pub owner_user_id: __sdk::__query_builder::Col, + pub callback_url: __sdk::__query_builder::Col, + pub payload_json: __sdk::__query_builder::Col, + pub signature: __sdk::__query_builder::Col, + pub status: __sdk::__query_builder::Col, + pub attempt_count: __sdk::__query_builder::Col, + pub available_at: __sdk::__query_builder::Col, + pub lease_worker_id: __sdk::__query_builder::Col>, + pub lease_expires_at: + __sdk::__query_builder::Col>, + pub last_error_message: __sdk::__query_builder::Col>, + pub created_at: __sdk::__query_builder::Col, + pub updated_at: __sdk::__query_builder::Col, +} + +impl __sdk::__query_builder::HasCols for PaymentWebhookDelivery { + type Cols = PaymentWebhookDeliveryCols; + fn cols(table_name: &'static str) -> Self::Cols { + PaymentWebhookDeliveryCols { + delivery_id: __sdk::__query_builder::Col::new(table_name, "delivery_id"), + order_id: __sdk::__query_builder::Col::new(table_name, "order_id"), + app_id: __sdk::__query_builder::Col::new(table_name, "app_id"), + owner_user_id: __sdk::__query_builder::Col::new(table_name, "owner_user_id"), + callback_url: __sdk::__query_builder::Col::new(table_name, "callback_url"), + payload_json: __sdk::__query_builder::Col::new(table_name, "payload_json"), + signature: __sdk::__query_builder::Col::new(table_name, "signature"), + status: __sdk::__query_builder::Col::new(table_name, "status"), + attempt_count: __sdk::__query_builder::Col::new(table_name, "attempt_count"), + available_at: __sdk::__query_builder::Col::new(table_name, "available_at"), + lease_worker_id: __sdk::__query_builder::Col::new(table_name, "lease_worker_id"), + lease_expires_at: __sdk::__query_builder::Col::new(table_name, "lease_expires_at"), + last_error_message: __sdk::__query_builder::Col::new(table_name, "last_error_message"), + created_at: __sdk::__query_builder::Col::new(table_name, "created_at"), + updated_at: __sdk::__query_builder::Col::new(table_name, "updated_at"), + } + } +} + +/// Indexed column accessor struct for the table `PaymentWebhookDelivery`. +/// +/// Provides typed access to indexed columns for query building. +pub struct PaymentWebhookDeliveryIxCols { + pub delivery_id: __sdk::__query_builder::IxCol, + pub order_id: __sdk::__query_builder::IxCol, + pub owner_user_id: __sdk::__query_builder::IxCol, +} + +impl __sdk::__query_builder::HasIxCols for PaymentWebhookDelivery { + type IxCols = PaymentWebhookDeliveryIxCols; + fn ix_cols(table_name: &'static str) -> Self::IxCols { + PaymentWebhookDeliveryIxCols { + delivery_id: __sdk::__query_builder::IxCol::new(table_name, "delivery_id"), + order_id: __sdk::__query_builder::IxCol::new(table_name, "order_id"), + owner_user_id: __sdk::__query_builder::IxCol::new(table_name, "owner_user_id"), + } + } +} + +impl __sdk::__query_builder::CanBeLookupTable for PaymentWebhookDelivery {} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_enqueue_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_enqueue_input_type.rs new file mode 100644 index 000000000..d44d70835 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_enqueue_input_type.rs @@ -0,0 +1,18 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentWebhookEnqueueInput { + pub order_id: String, + pub payload_json: String, + pub signature: String, + pub now_micros: i64, +} + +impl __sdk::InModule for PaymentWebhookEnqueueInput { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_procedure_result_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_procedure_result_type.rs new file mode 100644 index 000000000..0ffbd510e --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/payment_webhook_procedure_result_type.rs @@ -0,0 +1,20 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_webhook_delivery_snapshot_type::PaymentWebhookDeliverySnapshot; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +pub struct PaymentWebhookProcedureResult { + pub ok: bool, + pub delivery: Option, + pub deliveries: Vec, + pub error_message: Option, +} + +impl __sdk::InModule for PaymentWebhookProcedureResult { + type Module = super::RemoteModule; +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/revoke_payment_api_key_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/revoke_payment_api_key_and_return_procedure.rs new file mode 100644 index 000000000..659adfe4c --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/revoke_payment_api_key_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_api_key_revoke_input_type::PaymentApiKeyRevokeInput; +use super::payment_app_procedure_result_type::PaymentAppProcedureResult; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct RevokePaymentApiKeyAndReturnArgs { + pub input: PaymentApiKeyRevokeInput, +} + +impl __sdk::InModule for RevokePaymentApiKeyAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `revoke_payment_api_key_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait revoke_payment_api_key_and_return { + fn revoke_payment_api_key_and_return(&self, input: PaymentApiKeyRevokeInput) { + self.revoke_payment_api_key_and_return_then(input, |_, _| {}); + } + + fn revoke_payment_api_key_and_return_then( + &self, + input: PaymentApiKeyRevokeInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl revoke_payment_api_key_and_return for super::RemoteProcedures { + fn revoke_payment_api_key_and_return_then( + &self, + input: PaymentApiKeyRevokeInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentAppProcedureResult>( + "revoke_payment_api_key_and_return", + RevokePaymentApiKeyAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/set_payment_order_provider_code_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/set_payment_order_provider_code_and_return_procedure.rs new file mode 100644 index 000000000..c2ee27aa6 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/set_payment_order_provider_code_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_order_procedure_result_type::PaymentOrderProcedureResult; +use super::payment_order_provider_code_input_type::PaymentOrderProviderCodeInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct SetPaymentOrderProviderCodeAndReturnArgs { + pub input: PaymentOrderProviderCodeInput, +} + +impl __sdk::InModule for SetPaymentOrderProviderCodeAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `set_payment_order_provider_code_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait set_payment_order_provider_code_and_return { + fn set_payment_order_provider_code_and_return(&self, input: PaymentOrderProviderCodeInput) { + self.set_payment_order_provider_code_and_return_then(input, |_, _| {}); + } + + fn set_payment_order_provider_code_and_return_then( + &self, + input: PaymentOrderProviderCodeInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl set_payment_order_provider_code_and_return for super::RemoteProcedures { + fn set_payment_order_provider_code_and_return_then( + &self, + input: PaymentOrderProviderCodeInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentOrderProcedureResult>( + "set_payment_order_provider_code_and_return", + SetPaymentOrderProviderCodeAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-client/src/module_bindings/update_payment_app_and_return_procedure.rs b/server-rs/crates/spacetime-client/src/module_bindings/update_payment_app_and_return_procedure.rs new file mode 100644 index 000000000..c87253b43 --- /dev/null +++ b/server-rs/crates/spacetime-client/src/module_bindings/update_payment_app_and_return_procedure.rs @@ -0,0 +1,59 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#![allow(unused, clippy::all)] +use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws}; + +use super::payment_app_procedure_result_type::PaymentAppProcedureResult; +use super::payment_app_update_input_type::PaymentAppUpdateInput; + +#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)] +#[sats(crate = __lib)] +struct UpdatePaymentAppAndReturnArgs { + pub input: PaymentAppUpdateInput, +} + +impl __sdk::InModule for UpdatePaymentAppAndReturnArgs { + type Module = super::RemoteModule; +} + +#[allow(non_camel_case_types)] +/// Extension trait for access to the procedure `update_payment_app_and_return`. +/// +/// Implemented for [`super::RemoteProcedures`]. +pub trait update_payment_app_and_return { + fn update_payment_app_and_return(&self, input: PaymentAppUpdateInput) { + self.update_payment_app_and_return_then(input, |_, _| {}); + } + + fn update_payment_app_and_return_then( + &self, + input: PaymentAppUpdateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ); +} + +impl update_payment_app_and_return for super::RemoteProcedures { + fn update_payment_app_and_return_then( + &self, + input: PaymentAppUpdateInput, + + __callback: impl FnOnce( + &super::ProcedureEventContext, + Result, + ) + Send + + 'static, + ) { + self.imp + .invoke_procedure_with_callback::<_, PaymentAppProcedureResult>( + "update_payment_app_and_return", + UpdatePaymentAppAndReturnArgs { input }, + __callback, + ); + } +} diff --git a/server-rs/crates/spacetime-module/src/active.rs b/server-rs/crates/spacetime-module/src/active.rs index de0a60919..12d2789e2 100644 --- a/server-rs/crates/spacetime-module/src/active.rs +++ b/server-rs/crates/spacetime-module/src/active.rs @@ -29,6 +29,7 @@ mod external_generation; mod game_distribution; #[path = "llm_router_account.rs"] mod llm_router_account_storage; +mod payment_storage; pub use agc_models::*; mod migration; mod runtime; @@ -46,6 +47,7 @@ pub use external_generation::*; pub use game_distribution::*; pub use llm_router_account_storage::*; pub use migration::*; +pub use payment_storage::*; pub use runtime::*; // Host-side unit tests need to link the module crate as a normal test binary. diff --git a/server-rs/crates/spacetime-module/src/migration.rs b/server-rs/crates/spacetime-module/src/migration.rs index ba1738869..f942967bb 100644 --- a/server-rs/crates/spacetime-module/src/migration.rs +++ b/server-rs/crates/spacetime-module/src/migration.rs @@ -204,6 +204,10 @@ macro_rules! migration_tables { asset_entity_binding, asset_event, external_api_key, + payment_app, + payment_api_key, + payment_order, + payment_webhook_delivery, // 游戏分发:游戏身份、不可变发行版本和幂等收据都属于业务事实, // 随迁移导出/导入;私有 ZIP 与展开内容保存在对象存储,不进入这两张表。 // 资料随版本冻结:版本表末尾追加 metadata_json,游戏表末尾追加 diff --git a/server-rs/crates/spacetime-module/src/payment_storage.rs b/server-rs/crates/spacetime-module/src/payment_storage.rs new file mode 100644 index 000000000..375c1c641 --- /dev/null +++ b/server-rs/crates/spacetime-module/src/payment_storage.rs @@ -0,0 +1,1199 @@ +use crate::*; + +#[spacetimedb::table( + accessor = payment_app, + index(accessor = by_payment_app_owner_user_id, btree(columns = [owner_user_id])) +)] +#[derive(Clone)] +pub struct PaymentApp { + #[primary_key] + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub callback_url: Option, + pub enabled: bool, + pub created_at: Timestamp, + pub updated_at: Timestamp, +} + +#[spacetimedb::table( + accessor = payment_api_key, + index(accessor = by_payment_api_key_app_id, btree(columns = [app_id])), + index(accessor = by_payment_api_key_owner_user_id, btree(columns = [owner_user_id])) +)] +pub struct PaymentApiKey { + #[primary_key] + pub key_id: String, + pub app_id: String, + pub owner_user_id: String, + pub name: String, + pub key_prefix: String, + #[unique] + pub key_hash: String, + pub scopes_json: String, + pub created_at: Timestamp, + pub last_used_at: Option, + pub revoked_at: Option, + pub updated_at: Timestamp, +} + +#[spacetimedb::table( + accessor = payment_order, + index(accessor = by_payment_order_app_id, btree(columns = [app_id])), + index(accessor = by_payment_order_owner_user_id, btree(columns = [owner_user_id])), + index(accessor = by_payment_order_status, btree(columns = [status])) +)] +#[derive(Clone)] +pub struct PaymentOrder { + #[primary_key] + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub merchant_order_id: String, + #[unique] + pub idempotency_lookup: String, + #[unique] + pub merchant_order_lookup: String, + pub title: String, + pub items_json: String, + pub amount_cents: u64, + pub currency: String, + pub provider: PaymentProvider, + pub provider_trade_no: Option, + #[unique] + pub checkout_token: String, + pub status: PaymentOrderStatus, + pub created_at: Timestamp, + pub expires_at: Timestamp, + pub paid_at: Option, + pub updated_at: Timestamp, + pub provider_code_url: Option, + pub callback_url: Option, + pub callback_signing_key_hash: Option, + #[default(None::)] + pub provider_attempted_at: Option, +} + +#[spacetimedb::table( + accessor = payment_webhook_delivery, + index(accessor = by_payment_webhook_delivery_status_available, btree(columns = [status, available_at])), + index(accessor = by_payment_webhook_delivery_owner_user_id, btree(columns = [owner_user_id])), + index(accessor = by_payment_webhook_delivery_order_id, btree(columns = [order_id])) +)] +#[derive(Clone)] +pub struct PaymentWebhookDelivery { + #[primary_key] + pub delivery_id: String, + pub order_id: String, + pub app_id: String, + pub owner_user_id: String, + pub callback_url: String, + pub payload_json: String, + pub signature: String, + pub status: String, + pub attempt_count: u32, + pub available_at: Timestamp, + pub lease_worker_id: Option, + pub lease_expires_at: Option, + pub last_error_message: Option, + pub created_at: Timestamp, + pub updated_at: Timestamp, +} + +const PAYMENT_WEBHOOK_STATUS_PENDING: &str = "pending"; +const PAYMENT_WEBHOOK_STATUS_PROCESSING: &str = "processing"; +const PAYMENT_WEBHOOK_STATUS_DELIVERED: &str = "delivered"; +const PAYMENT_WEBHOOK_STATUS_FAILED: &str = "failed"; + +#[spacetimedb::procedure] +pub fn create_payment_app_and_return( + ctx: &mut ProcedureContext, + input: PaymentAppCreateInput, +) -> PaymentAppProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + create_payment_app(tx, input.clone()) + }) { + Ok(app) => PaymentAppProcedureResult { + ok: true, + app: Some(app), + key: None, + apps: Vec::new(), + keys: Vec::new(), + error_message: None, + }, + Err(error_message) => payment_app_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn list_payment_apps_and_return( + ctx: &mut ProcedureContext, + input: PaymentAppListInput, +) -> PaymentAppProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + list_payment_apps(tx, input.clone()) + }) { + Ok(apps) => PaymentAppProcedureResult { + ok: true, + app: None, + key: None, + apps, + keys: Vec::new(), + error_message: None, + }, + Err(error_message) => payment_app_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn update_payment_app_and_return( + ctx: &mut ProcedureContext, + input: PaymentAppUpdateInput, +) -> PaymentAppProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + update_payment_app(tx, input.clone()) + }) { + Ok(app) => PaymentAppProcedureResult { + ok: true, + app: Some(app), + key: None, + apps: Vec::new(), + keys: Vec::new(), + error_message: None, + }, + Err(error_message) => payment_app_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn list_payment_api_keys_and_return( + ctx: &mut ProcedureContext, + input: PaymentApiKeyListInput, +) -> PaymentAppProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + list_payment_api_keys(tx, input.clone()) + }) { + Ok(keys) => PaymentAppProcedureResult { + ok: true, + app: None, + key: None, + apps: Vec::new(), + keys, + error_message: None, + }, + Err(error_message) => payment_app_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn create_payment_api_key_and_return( + ctx: &mut ProcedureContext, + input: PaymentApiKeyCreateInput, +) -> PaymentAppProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + create_payment_api_key(tx, input.clone()) + }) { + Ok(key) => PaymentAppProcedureResult { + ok: true, + app: None, + key: Some(key), + apps: Vec::new(), + keys: Vec::new(), + error_message: None, + }, + Err(error_message) => payment_app_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn revoke_payment_api_key_and_return( + ctx: &mut ProcedureContext, + input: PaymentApiKeyRevokeInput, +) -> PaymentAppProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + revoke_payment_api_key(tx, input.clone()) + }) { + Ok(key) => PaymentAppProcedureResult { + ok: true, + app: None, + key: Some(key), + apps: Vec::new(), + keys: Vec::new(), + error_message: None, + }, + Err(error_message) => payment_app_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn authenticate_payment_api_key_and_return( + ctx: &mut ProcedureContext, + input: PaymentApiKeyAuthenticateInput, +) -> PaymentAppProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + authenticate_payment_api_key(tx, input.clone()) + }) { + Ok((app, key)) => PaymentAppProcedureResult { + ok: true, + app: Some(app), + key: Some(key), + apps: Vec::new(), + keys: Vec::new(), + error_message: None, + }, + Err(error_message) => payment_app_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn create_payment_order_and_return( + ctx: &mut ProcedureContext, + input: PaymentOrderCreateInput, +) -> PaymentOrderProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + create_payment_order(tx, input.clone()) + }) { + Ok(order) => payment_order_single_ok(order), + Err(error_message) => payment_order_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn get_payment_order_and_return( + ctx: &mut ProcedureContext, + input: PaymentOrderGetInput, +) -> PaymentOrderProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + get_payment_order(tx, input.clone()) + }) { + Ok(order) => payment_order_single_ok(order), + Err(error_message) => payment_order_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn get_payment_order_by_checkout_token_and_return( + ctx: &mut ProcedureContext, + input: PaymentOrderCheckoutGetInput, +) -> PaymentOrderProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + get_payment_order_by_checkout_token(tx, input.clone()) + }) { + Ok(order) => payment_order_single_ok(order), + Err(error_message) => payment_order_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn list_payment_orders_and_return( + ctx: &mut ProcedureContext, + input: PaymentOrderListInput, +) -> PaymentOrderProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + list_payment_orders(tx, input.clone()) + }) { + Ok(orders) => PaymentOrderProcedureResult { + ok: true, + order: None, + orders, + error_message: None, + }, + Err(error_message) => payment_order_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn mark_payment_order_paid_and_return( + ctx: &mut ProcedureContext, + input: PaymentOrderMarkPaidInput, +) -> PaymentOrderProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + mark_payment_order_paid(tx, input.clone()) + }) { + Ok(order) => payment_order_single_ok(order), + Err(error_message) => payment_order_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn set_payment_order_provider_code_and_return( + ctx: &mut ProcedureContext, + input: PaymentOrderProviderCodeInput, +) -> PaymentOrderProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + set_payment_order_provider_code(tx, input.clone()) + }) { + Ok(order) => payment_order_single_ok(order), + Err(error_message) => payment_order_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn mark_payment_order_provider_attempted_and_return( + ctx: &mut ProcedureContext, + input: PaymentOrderProviderAttemptInput, +) -> PaymentOrderProcedureResult { + match ctx.try_with_tx(|tx| mark_payment_order_provider_attempted(tx, input.clone())) { + Ok(order) => payment_order_single_ok(order), + Err(error_message) => payment_order_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn enqueue_payment_webhook_and_return( + ctx: &mut ProcedureContext, + input: PaymentWebhookEnqueueInput, +) -> PaymentWebhookProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + enqueue_payment_webhook(tx, input.clone()) + }) { + Ok(delivery) => PaymentWebhookProcedureResult { + ok: true, + delivery, + deliveries: Vec::new(), + error_message: None, + }, + Err(error_message) => payment_webhook_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn claim_payment_webhooks_and_return( + ctx: &mut ProcedureContext, + input: PaymentWebhookClaimInput, +) -> PaymentWebhookProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + claim_payment_webhooks(tx, input.clone()) + }) { + Ok(deliveries) => PaymentWebhookProcedureResult { + ok: true, + delivery: None, + deliveries, + error_message: None, + }, + Err(error_message) => payment_webhook_error(error_message), + } +} + +#[spacetimedb::procedure] +pub fn complete_payment_webhook_and_return( + ctx: &mut ProcedureContext, + input: PaymentWebhookCompleteInput, +) -> PaymentWebhookProcedureResult { + let caller = ctx.sender(); + match ctx.try_with_tx(|tx| { + crate::require_editor_generation_runtime_service_identity(tx, caller)?; + complete_payment_webhook(tx, input.clone()) + }) { + Ok(delivery) => PaymentWebhookProcedureResult { + ok: true, + delivery: Some(delivery), + deliveries: Vec::new(), + error_message: None, + }, + Err(error_message) => payment_webhook_error(error_message), + } +} + +fn create_payment_app( + ctx: &ReducerContext, + input: PaymentAppCreateInput, +) -> Result { + let input = build_payment_app_create_input( + input.app_id, + input.owner_user_id, + input.name, + input.callback_url, + input.now_micros, + )?; + if ctx.db.payment_app().app_id().find(&input.app_id).is_some() { + return Err("支付应用 ID 已存在".to_string()); + } + let now = Timestamp::from_micros_since_unix_epoch(input.now_micros); + ctx.db.payment_app().insert(PaymentApp { + app_id: input.app_id.clone(), + owner_user_id: input.owner_user_id, + name: input.name, + callback_url: input.callback_url, + enabled: true, + created_at: now, + updated_at: now, + }); + ctx.db + .payment_app() + .app_id() + .find(&input.app_id) + .map(|row| payment_app_snapshot(&row)) + .ok_or_else(|| "支付应用创建后读取失败".to_string()) +} + +fn list_payment_apps( + ctx: &ReducerContext, + input: PaymentAppListInput, +) -> Result, String> { + let owner_user_id = required(input.owner_user_id, "payment_app.owner_user_id")?; + let mut apps = ctx + .db + .payment_app() + .by_payment_app_owner_user_id() + .filter(&owner_user_id) + .map(|row| payment_app_snapshot(&row)) + .collect::>(); + apps.sort_by(|left, right| right.created_at_micros.cmp(&left.created_at_micros)); + Ok(apps) +} + +fn update_payment_app( + ctx: &ReducerContext, + input: PaymentAppUpdateInput, +) -> Result { + let app_id = required(input.app_id, "payment_app.app_id")?; + let owner_user_id = required(input.owner_user_id, "payment_app.owner_user_id")?; + let row = ctx + .db + .payment_app() + .app_id() + .find(&app_id) + .ok_or_else(|| "支付应用不存在".to_string())?; + if row.owner_user_id != owner_user_id { + return Err("无权访问支付应用".to_string()); + } + let now = Timestamp::from_micros_since_unix_epoch(input.updated_at_micros); + ctx.db.payment_app().app_id().delete(&app_id); + ctx.db.payment_app().insert(PaymentApp { + enabled: input.enabled, + updated_at: now, + ..row + }); + ctx.db + .payment_app() + .app_id() + .find(&app_id) + .map(|row| payment_app_snapshot(&row)) + .ok_or_else(|| "支付应用更新后读取失败".to_string()) +} + +fn list_payment_api_keys( + ctx: &ReducerContext, + input: PaymentApiKeyListInput, +) -> Result, String> { + let owner_user_id = required(input.owner_user_id, "payment_api_key.owner_user_id")?; + let mut keys = ctx + .db + .payment_api_key() + .by_payment_api_key_owner_user_id() + .filter(&owner_user_id) + .map(|row| payment_api_key_snapshot(&row)) + .collect::>(); + keys.sort_by(|left, right| right.created_at_micros.cmp(&left.created_at_micros)); + Ok(keys) +} + +fn create_payment_api_key( + ctx: &ReducerContext, + input: PaymentApiKeyCreateInput, +) -> Result { + let input = build_payment_api_key_create_input( + input.key_id, + input.app_id, + input.owner_user_id, + input.name, + input.key_prefix, + input.key_hash, + input.scopes_json, + input.now_micros, + )?; + let app = ctx + .db + .payment_app() + .app_id() + .find(&input.app_id) + .ok_or_else(|| "支付应用不存在".to_string())?; + if app.owner_user_id != input.owner_user_id || !app.enabled { + return Err("支付应用不可用".to_string()); + } + if ctx + .db + .payment_api_key() + .key_hash() + .find(&input.key_hash) + .is_some() + { + return Err("支付 API Key 摘要已存在".to_string()); + } + let now = Timestamp::from_micros_since_unix_epoch(input.now_micros); + ctx.db.payment_api_key().insert(PaymentApiKey { + key_id: input.key_id.clone(), + app_id: input.app_id, + owner_user_id: input.owner_user_id, + name: input.name, + key_prefix: input.key_prefix, + key_hash: input.key_hash, + scopes_json: input.scopes_json, + created_at: now, + last_used_at: None, + revoked_at: None, + updated_at: now, + }); + ctx.db + .payment_api_key() + .key_id() + .find(&input.key_id) + .map(|row| payment_api_key_snapshot(&row)) + .ok_or_else(|| "支付 API Key 创建后读取失败".to_string()) +} + +fn revoke_payment_api_key( + ctx: &ReducerContext, + input: PaymentApiKeyRevokeInput, +) -> Result { + let key_id = required(input.key_id, "payment_api_key.key_id")?; + let owner_user_id = required(input.owner_user_id, "payment_api_key.owner_user_id")?; + let row = ctx + .db + .payment_api_key() + .key_id() + .find(&key_id) + .ok_or_else(|| "支付 API Key 不存在".to_string())?; + if row.owner_user_id != owner_user_id { + return Err("无权访问支付 API Key".to_string()); + } + let now = Timestamp::from_micros_since_unix_epoch(input.revoked_at_micros); + ctx.db.payment_api_key().key_id().delete(&key_id); + ctx.db.payment_api_key().insert(PaymentApiKey { + revoked_at: row.revoked_at.or(Some(now)), + updated_at: now, + ..row + }); + ctx.db + .payment_api_key() + .key_id() + .find(&key_id) + .map(|row| payment_api_key_snapshot(&row)) + .ok_or_else(|| "支付 API Key 撤销后读取失败".to_string()) +} + +fn authenticate_payment_api_key( + ctx: &ReducerContext, + input: PaymentApiKeyAuthenticateInput, +) -> Result<(PaymentAppSnapshot, PaymentApiKeySnapshot), String> { + let key_hash = required(input.key_hash, "payment_api_key.key_hash")?; + let key = ctx + .db + .payment_api_key() + .key_hash() + .find(&key_hash) + .ok_or_else(|| "支付 API Key 不存在或已失效".to_string())?; + if key.revoked_at.is_some() { + return Err("支付 API Key 不存在或已失效".to_string()); + } + let app = ctx + .db + .payment_app() + .app_id() + .find(&key.app_id) + .ok_or_else(|| "支付应用不存在".to_string())?; + if !app.enabled || app.owner_user_id != key.owner_user_id { + return Err("支付应用不可用".to_string()); + } + let now = Timestamp::from_micros_since_unix_epoch(input.used_at_micros); + let key_id = key.key_id.clone(); + ctx.db.payment_api_key().key_id().delete(&key_id); + ctx.db.payment_api_key().insert(PaymentApiKey { + last_used_at: Some(now), + updated_at: now, + ..key + }); + let key = ctx + .db + .payment_api_key() + .key_id() + .find(&key_id) + .ok_or_else(|| "支付 API Key 更新失败".to_string())?; + Ok((payment_app_snapshot(&app), payment_api_key_snapshot(&key))) +} + +fn create_payment_order( + ctx: &ReducerContext, + input: PaymentOrderCreateInput, +) -> Result { + let input = build_payment_order_create_input( + input.order_id, + input.app_id, + input.owner_user_id, + input.merchant_order_id, + input.idempotency_lookup, + input.title, + input.items_json, + input.amount_cents, + input.currency, + input.provider, + input.checkout_token, + input.now_micros, + input.expires_at_micros, + input.callback_url.clone(), + input.callback_signing_key_hash.clone(), + )?; + let app = ctx + .db + .payment_app() + .app_id() + .find(&input.app_id) + .ok_or_else(|| "支付应用不存在".to_string())?; + if !app.enabled || app.owner_user_id != input.owner_user_id { + return Err("支付应用不可用".to_string()); + } + if let Some(existing) = ctx + .db + .payment_order() + .idempotency_lookup() + .find(&input.idempotency_lookup) + { + if existing.app_id != input.app_id + || existing.amount_cents != input.amount_cents + || existing.title != input.title + || existing.items_json != input.items_json + { + return Err("相同幂等键对应的订单字段不一致".to_string()); + } + return Ok(payment_order_snapshot(&existing)); + } + let merchant_order_lookup = format!("{}:{}", input.app_id, input.merchant_order_id); + if ctx + .db + .payment_order() + .merchant_order_lookup() + .find(&merchant_order_lookup) + .is_some() + { + return Err("接入方订单号已存在".to_string()); + } + if ctx + .db + .payment_order() + .checkout_token() + .find(&input.checkout_token) + .is_some() + { + return Err("收银台 token 已存在".to_string()); + } + let now = Timestamp::from_micros_since_unix_epoch(input.now_micros); + let expires_at = Timestamp::from_micros_since_unix_epoch(input.expires_at_micros); + ctx.db.payment_order().insert(PaymentOrder { + order_id: input.order_id.clone(), + app_id: input.app_id, + owner_user_id: input.owner_user_id, + merchant_order_id: input.merchant_order_id, + idempotency_lookup: input.idempotency_lookup, + merchant_order_lookup, + title: input.title, + items_json: input.items_json, + amount_cents: input.amount_cents, + currency: input.currency, + provider: input.provider, + provider_trade_no: None, + checkout_token: input.checkout_token, + status: PaymentOrderStatus::Pending, + created_at: now, + expires_at, + paid_at: None, + updated_at: now, + provider_code_url: None, + callback_url: input.callback_url, + callback_signing_key_hash: input.callback_signing_key_hash, + provider_attempted_at: None, + }); + ctx.db + .payment_order() + .order_id() + .find(&input.order_id) + .map(|row| payment_order_snapshot(&row)) + .ok_or_else(|| "支付订单创建后读取失败".to_string()) +} + +fn get_payment_order( + ctx: &ReducerContext, + input: PaymentOrderGetInput, +) -> Result { + let order_id = required(input.order_id, "payment_order.order_id")?; + let order = ctx + .db + .payment_order() + .order_id() + .find(&order_id) + .ok_or_else(|| "支付订单不存在".to_string())?; + if let Some(owner_user_id) = input.owner_user_id { + if order.owner_user_id != required(owner_user_id, "payment_order.owner_user_id")? { + return Err("无权访问支付订单".to_string()); + } + } + Ok(payment_order_snapshot(&order)) +} + +fn get_payment_order_by_checkout_token( + ctx: &ReducerContext, + input: PaymentOrderCheckoutGetInput, +) -> Result { + let token = required(input.checkout_token, "payment_order.checkout_token")?; + ctx.db + .payment_order() + .checkout_token() + .find(&token) + .map(|order| payment_order_snapshot(&order)) + .ok_or_else(|| "支付订单不存在".to_string()) +} + +fn list_payment_orders( + ctx: &ReducerContext, + input: PaymentOrderListInput, +) -> Result, String> { + let owner_user_id = required(input.owner_user_id, "payment_order.owner_user_id")?; + let limit = input.limit.clamp(1, 100) as usize; + let mut orders = match input.app_id { + Some(app_id) => ctx + .db + .payment_order() + .by_payment_order_app_id() + .filter(&required(app_id, "payment_order.app_id")?) + .filter(|order| order.owner_user_id == owner_user_id) + .map(|row| payment_order_snapshot(&row)) + .collect::>(), + None => ctx + .db + .payment_order() + .by_payment_order_owner_user_id() + .filter(&owner_user_id) + .map(|row| payment_order_snapshot(&row)) + .collect::>(), + }; + orders.sort_by(|left, right| right.created_at_micros.cmp(&left.created_at_micros)); + orders.truncate(limit); + Ok(orders) +} + +fn mark_payment_order_paid( + ctx: &ReducerContext, + input: PaymentOrderMarkPaidInput, +) -> Result { + let input = build_payment_order_mark_paid_input( + input.order_id, + input.provider_trade_no, + input.amount_cents, + input.paid_at_micros, + )?; + let order = ctx + .db + .payment_order() + .order_id() + .find(&input.order_id) + .ok_or_else(|| "支付订单不存在".to_string())?; + if order.amount_cents != input.amount_cents { + return Err("支付金额与本地订单不一致".to_string()); + } + if order.status == PaymentOrderStatus::Paid { + if order.provider_trade_no.as_deref() != Some(input.provider_trade_no.as_str()) { + return Err("已支付订单的平台交易号不一致".to_string()); + } + return Ok(payment_order_snapshot(&order)); + } + if matches!( + order.status, + PaymentOrderStatus::Closed | PaymentOrderStatus::Refunded + ) { + return Err("当前支付订单状态不能确认支付".to_string()); + } + let now = Timestamp::from_micros_since_unix_epoch(input.paid_at_micros); + ctx.db.payment_order().order_id().delete(&order.order_id); + ctx.db.payment_order().insert(PaymentOrder { + status: PaymentOrderStatus::Paid, + provider_trade_no: Some(input.provider_trade_no), + paid_at: Some(now), + updated_at: now, + ..order + }); + ctx.db + .payment_order() + .order_id() + .find(&input.order_id) + .map(|row| payment_order_snapshot(&row)) + .ok_or_else(|| "支付订单确认后读取失败".to_string()) +} + +fn set_payment_order_provider_code( + ctx: &ReducerContext, + input: PaymentOrderProviderCodeInput, +) -> Result { + let order_id = required(input.order_id, "payment_order.order_id")?; + let provider_code_url = required(input.provider_code_url, "payment_order.provider_code_url")?; + let order = ctx + .db + .payment_order() + .order_id() + .find(&order_id) + .ok_or_else(|| "支付订单不存在".to_string())?; + if matches!( + order.status, + PaymentOrderStatus::Paid | PaymentOrderStatus::Closed + ) { + return Ok(payment_order_snapshot(&order)); + } + let updated_at = Timestamp::from_micros_since_unix_epoch(input.updated_at_micros); + ctx.db.payment_order().order_id().delete(&order_id); + ctx.db.payment_order().insert(PaymentOrder { + provider_code_url: Some(provider_code_url), + updated_at, + ..order + }); + ctx.db + .payment_order() + .order_id() + .find(&order_id) + .map(|row| payment_order_snapshot(&row)) + .ok_or_else(|| "支付订单 provider 结果写入后读取失败".to_string()) +} + +fn mark_payment_order_provider_attempted( + ctx: &ReducerContext, + input: PaymentOrderProviderAttemptInput, +) -> Result { + let order_id = required(input.order_id, "payment_order.order_id")?; + let order = ctx + .db + .payment_order() + .order_id() + .find(&order_id) + .ok_or_else(|| "支付订单不存在".to_string())?; + if order.provider_code_url.is_some() || order.status == PaymentOrderStatus::Paid { + return Ok(payment_order_snapshot(&order)); + } + if order.provider_attempted_at.is_some() { + return Err("PAYMENT_PROVIDER_PENDING".to_string()); + } + let attempted_at = Timestamp::from_micros_since_unix_epoch(input.attempted_at_micros); + ctx.db.payment_order().order_id().delete(&order_id); + ctx.db.payment_order().insert(PaymentOrder { + status: PaymentOrderStatus::Paying, + provider_attempted_at: Some(attempted_at), + updated_at: attempted_at, + ..order + }); + ctx.db + .payment_order() + .order_id() + .find(&order_id) + .map(|row| payment_order_snapshot(&row)) + .ok_or_else(|| "支付订单 provider claim 后读取失败".to_string()) +} + +fn enqueue_payment_webhook( + ctx: &ReducerContext, + input: PaymentWebhookEnqueueInput, +) -> Result, String> { + let order_id = required(input.order_id, "payment_webhook.order_id")?; + let payload_json = required(input.payload_json, "payment_webhook.payload_json")?; + let signature = required(input.signature, "payment_webhook.signature")?; + if payload_json.len() > 64 * 1024 { + return Err("payment_webhook.payload_json 超出大小限制".to_string()); + } + let order = ctx + .db + .payment_order() + .order_id() + .find(&order_id) + .ok_or_else(|| "支付订单不存在".to_string())?; + if order.status != PaymentOrderStatus::Paid { + return Err("只有已支付订单可以创建外部回调".to_string()); + } + let Some(callback_url) = order.callback_url.clone() else { + return Ok(None); + }; + let delivery_id = format!("payment-webhook:{order_id}"); + if let Some(existing) = ctx + .db + .payment_webhook_delivery() + .delivery_id() + .find(&delivery_id) + { + if existing.payload_json != payload_json || existing.signature != signature { + return Err("相同支付订单的回调内容不一致".to_string()); + } + return Ok(Some(payment_webhook_snapshot(&existing))); + } + let now = Timestamp::from_micros_since_unix_epoch(input.now_micros); + ctx.db + .payment_webhook_delivery() + .insert(PaymentWebhookDelivery { + delivery_id: delivery_id.clone(), + order_id: order.order_id, + app_id: order.app_id, + owner_user_id: order.owner_user_id, + callback_url, + payload_json, + signature, + status: PAYMENT_WEBHOOK_STATUS_PENDING.to_string(), + attempt_count: 0, + available_at: now, + lease_worker_id: None, + lease_expires_at: None, + last_error_message: None, + created_at: now, + updated_at: now, + }); + ctx.db + .payment_webhook_delivery() + .delivery_id() + .find(&delivery_id) + .map(|row| payment_webhook_snapshot(&row)) + .map(Some) + .ok_or_else(|| "支付回调写入后读取失败".to_string()) +} + +fn claim_payment_webhooks( + ctx: &ReducerContext, + input: PaymentWebhookClaimInput, +) -> Result, String> { + let worker_id = required(input.worker_id, "payment_webhook.worker_id")?; + let now = Timestamp::from_micros_since_unix_epoch(input.now_micros); + let lease_expires_at = Timestamp::from_micros_since_unix_epoch(input.lease_expires_at_micros); + let limit = input.limit.clamp(1, 50) as usize; + let mut rows = ctx + .db + .payment_webhook_delivery() + .iter() + .filter(|row| { + (row.status == PAYMENT_WEBHOOK_STATUS_PENDING && row.available_at <= now) + || (row.status == PAYMENT_WEBHOOK_STATUS_PROCESSING + && row.lease_expires_at.is_some_and(|value| value <= now)) + }) + .collect::>(); + rows.sort_by(|left, right| left.available_at.cmp(&right.available_at)); + rows.truncate(limit); + let mut claimed = Vec::with_capacity(rows.len()); + for row in rows { + let delivery_id = row.delivery_id.clone(); + ctx.db + .payment_webhook_delivery() + .delivery_id() + .delete(&delivery_id); + ctx.db + .payment_webhook_delivery() + .insert(PaymentWebhookDelivery { + status: PAYMENT_WEBHOOK_STATUS_PROCESSING.to_string(), + lease_worker_id: Some(worker_id.clone()), + lease_expires_at: Some(lease_expires_at), + updated_at: now, + ..row + }); + if let Some(updated) = ctx + .db + .payment_webhook_delivery() + .delivery_id() + .find(&delivery_id) + { + claimed.push(payment_webhook_snapshot(&updated)); + } + } + Ok(claimed) +} + +fn complete_payment_webhook( + ctx: &ReducerContext, + input: PaymentWebhookCompleteInput, +) -> Result { + let delivery_id = required(input.delivery_id, "payment_webhook.delivery_id")?; + let worker_id = required(input.worker_id, "payment_webhook.worker_id")?; + let mut row = ctx + .db + .payment_webhook_delivery() + .delivery_id() + .find(&delivery_id) + .ok_or_else(|| "支付回调投递不存在".to_string())?; + if row.status != PAYMENT_WEBHOOK_STATUS_PROCESSING + || row.lease_worker_id.as_deref() != Some(worker_id.as_str()) + { + return Err("支付回调投递租约不属于当前 worker".to_string()); + } + let now = Timestamp::from_micros_since_unix_epoch(input.now_micros); + row.lease_worker_id = None; + row.lease_expires_at = None; + row.updated_at = now; + if input.success { + row.status = PAYMENT_WEBHOOK_STATUS_DELIVERED.to_string(); + row.last_error_message = None; + } else { + row.attempt_count = row.attempt_count.saturating_add(1); + row.last_error_message = input + .error_message + .and_then(|value| normalize_optional_text(Some(value))); + if row.attempt_count >= PAYMENT_WEBHOOK_MAX_ATTEMPTS { + row.status = PAYMENT_WEBHOOK_STATUS_FAILED.to_string(); + } else { + row.status = PAYMENT_WEBHOOK_STATUS_PENDING.to_string(); + row.available_at = + Timestamp::from_micros_since_unix_epoch(input.next_available_at_micros); + } + } + ctx.db + .payment_webhook_delivery() + .delivery_id() + .delete(&delivery_id); + ctx.db.payment_webhook_delivery().insert(row.clone()); + Ok(payment_webhook_snapshot(&row)) +} + +fn payment_app_snapshot(row: &PaymentApp) -> PaymentAppSnapshot { + PaymentAppSnapshot { + app_id: row.app_id.clone(), + owner_user_id: row.owner_user_id.clone(), + name: row.name.clone(), + callback_url: row.callback_url.clone(), + enabled: row.enabled, + created_at_micros: row.created_at.to_micros_since_unix_epoch(), + updated_at_micros: row.updated_at.to_micros_since_unix_epoch(), + } +} + +fn payment_api_key_snapshot(row: &PaymentApiKey) -> PaymentApiKeySnapshot { + PaymentApiKeySnapshot { + key_id: row.key_id.clone(), + app_id: row.app_id.clone(), + owner_user_id: row.owner_user_id.clone(), + name: row.name.clone(), + key_prefix: row.key_prefix.clone(), + scopes_json: row.scopes_json.clone(), + created_at_micros: row.created_at.to_micros_since_unix_epoch(), + last_used_at_micros: row + .last_used_at + .map(|value| value.to_micros_since_unix_epoch()), + revoked_at_micros: row + .revoked_at + .map(|value| value.to_micros_since_unix_epoch()), + updated_at_micros: row.updated_at.to_micros_since_unix_epoch(), + } +} + +fn payment_order_snapshot(row: &PaymentOrder) -> PaymentOrderSnapshot { + PaymentOrderSnapshot { + order_id: row.order_id.clone(), + app_id: row.app_id.clone(), + owner_user_id: row.owner_user_id.clone(), + merchant_order_id: row.merchant_order_id.clone(), + idempotency_lookup: row.idempotency_lookup.clone(), + title: row.title.clone(), + items_json: row.items_json.clone(), + amount_cents: row.amount_cents, + currency: row.currency.clone(), + provider: row.provider, + provider_trade_no: row.provider_trade_no.clone(), + provider_code_url: row.provider_code_url.clone(), + callback_url: row.callback_url.clone(), + callback_signing_key_hash: row.callback_signing_key_hash.clone(), + provider_attempted_at_micros: row + .provider_attempted_at + .map(|value| value.to_micros_since_unix_epoch()), + checkout_token: row.checkout_token.clone(), + status: row.status, + created_at_micros: row.created_at.to_micros_since_unix_epoch(), + expires_at_micros: row.expires_at.to_micros_since_unix_epoch(), + paid_at_micros: row.paid_at.map(|value| value.to_micros_since_unix_epoch()), + updated_at_micros: row.updated_at.to_micros_since_unix_epoch(), + } +} + +fn payment_webhook_snapshot(row: &PaymentWebhookDelivery) -> PaymentWebhookDeliverySnapshot { + PaymentWebhookDeliverySnapshot { + delivery_id: row.delivery_id.clone(), + order_id: row.order_id.clone(), + app_id: row.app_id.clone(), + owner_user_id: row.owner_user_id.clone(), + callback_url: row.callback_url.clone(), + payload_json: row.payload_json.clone(), + signature: row.signature.clone(), + status: row.status.clone(), + attempt_count: row.attempt_count, + available_at_micros: row.available_at.to_micros_since_unix_epoch(), + lease_worker_id: row.lease_worker_id.clone(), + lease_expires_at_micros: row + .lease_expires_at + .map(|value| value.to_micros_since_unix_epoch()), + last_error_message: row.last_error_message.clone(), + created_at_micros: row.created_at.to_micros_since_unix_epoch(), + updated_at_micros: row.updated_at.to_micros_since_unix_epoch(), + } +} + +fn payment_app_error(error_message: String) -> PaymentAppProcedureResult { + PaymentAppProcedureResult { + ok: false, + app: None, + key: None, + apps: Vec::new(), + keys: Vec::new(), + error_message: Some(error_message), + } +} + +fn payment_order_single_ok(order: PaymentOrderSnapshot) -> PaymentOrderProcedureResult { + PaymentOrderProcedureResult { + ok: true, + order: Some(order), + orders: Vec::new(), + error_message: None, + } +} + +fn payment_order_error(error_message: String) -> PaymentOrderProcedureResult { + PaymentOrderProcedureResult { + ok: false, + order: None, + orders: Vec::new(), + error_message: Some(error_message), + } +} + +fn payment_webhook_error(error_message: String) -> PaymentWebhookProcedureResult { + PaymentWebhookProcedureResult { + ok: false, + delivery: None, + deliveries: Vec::new(), + error_message: Some(error_message), + } +} + +fn required(value: String, field: &str) -> Result { + let value = value.trim().to_string(); + if value.is_empty() { + return Err(format!("{field} 不能为空")); + } + Ok(value) +} diff --git a/src/components/platform-entry/PaymentCheckoutView.tsx b/src/components/platform-entry/PaymentCheckoutView.tsx new file mode 100644 index 000000000..f1bf8a149 --- /dev/null +++ b/src/components/platform-entry/PaymentCheckoutView.tsx @@ -0,0 +1,199 @@ +import { + CheckCircle2, + Clock3, + Copy, + LoaderCircle, + ShieldCheck, +} from 'lucide-react'; +import QRCode from 'qrcode'; +import { useEffect, useState } from 'react'; + +import type { PaymentOrder } from '../../../packages/shared/src/contracts/payment'; +import { getPublicPaymentCheckout } from '../../services/payment/paymentCheckoutClient'; + +type PaymentCheckoutViewProps = { + checkoutToken: string; +}; + +export function PaymentCheckoutView({ + checkoutToken, +}: PaymentCheckoutViewProps) { + const [order, setOrder] = useState(null); + const [qrDataUrl, setQrDataUrl] = useState(''); + const [error, setError] = useState(''); + + useEffect(() => { + let cancelled = false; + const load = async () => { + try { + const response = await getPublicPaymentCheckout(checkoutToken); + if (!cancelled) { + setOrder(response.order); + setError(''); + } + } catch (nextError: unknown) { + if (!cancelled) { + setError( + nextError instanceof Error ? nextError.message : '读取支付订单失败', + ); + } + } + }; + void load(); + const timer = window.setInterval(() => { + if ( + order?.status === 'paid' || + order?.status === 'closed' || + order?.status === 'expired' + ) { + return; + } + void load(); + }, 5000); + return () => { + cancelled = true; + window.clearInterval(timer); + }; + }, [checkoutToken, order?.status]); + + useEffect(() => { + let cancelled = false; + if (!order?.providerQrCode) { + setQrDataUrl(''); + return; + } + QRCode.toDataURL(order.providerQrCode, { + width: 320, + margin: 2, + color: { dark: '#2c2723', light: '#ffffff' }, + }).then((dataUrl) => { + if (!cancelled) { + setQrDataUrl(dataUrl); + } + }); + return () => { + cancelled = true; + }; + }, [order?.providerQrCode]); + + const copyAmount = () => { + if (order) { + void navigator.clipboard?.writeText((order.amountCents / 100).toFixed(2)); + } + }; + + if (error) { + return ( +
+
{error}
+
+ ); + } + + if (!order) { + return ( +
+
+ + 正在读取支付订单... +
+
+ ); + } + + const amount = (order.amountCents / 100).toFixed(2); + const isPaid = order.status === 'paid'; + const isClosed = order.status === 'closed' || order.status === 'expired'; + + return ( +
+
+
+
+ ¥ +
+ 扫码付款 + 支付成功后自动更新订单状态 +
+
+
+ 订单号 {order.merchantOrderId} +
+

{order.title}

+

+ 请核对商品与订单信息,使用右侧二维码完成支付。 +

+
+ 付款金额说明 + + 请完全按照页面显示的金额付款,少付或多付都可能导致支付无法自动确认。 + +
+
+ {isPaid ? ( + + ) : ( + + )} +
+ + {isPaid ? '支付成功' : isClosed ? '订单已关闭' : '等待支付'} + + + {isPaid + ? '平台已确认到账' + : isClosed + ? '请重新创建订单' + : '完成付款后页面会自动更新状态'} + +
+
+ +
+
+
+ 扫码付款 + {isPaid ? '已完成' : isClosed ? '已关闭' : '支付中'} +
+
+ 应付金额 + ¥{amount} +
+ {isPaid ? ( +
+ + 支付成功 +
+ ) : isClosed ? ( +
+ + 订单已关闭 +
+ ) : qrDataUrl ? ( + 支付二维码 + ) : ( +
+ +
+ )} +
+ + 微信支付 +
+

请使用微信扫一扫完成支付

+
+
+
+ ); +} diff --git a/src/components/platform-entry/PlatformActiveProfileView.tsx b/src/components/platform-entry/PlatformActiveProfileView.tsx index 8b431a2aa..c271c9365 100644 --- a/src/components/platform-entry/PlatformActiveProfileView.tsx +++ b/src/components/platform-entry/PlatformActiveProfileView.tsx @@ -1,6 +1,7 @@ import { Camera, Coins, + CreditCard, History, KeyRound, MessageCircle, @@ -69,6 +70,7 @@ type PlatformActiveProfileViewProps = { mudPointBalance: ProfileMudPointBalance | null; onLogin: () => void; onOpenApiKeys: () => void; + onOpenPaymentService?: () => void; onOpenCommunity: () => void; onOpenFeedback: () => void; onOpenInvite: () => void; @@ -279,6 +281,7 @@ export function PlatformActiveProfileView({ mudPointBalance, onLogin, onOpenApiKeys, + onOpenPaymentService, onOpenCommunity, onOpenFeedback, onOpenInvite, @@ -663,6 +666,11 @@ export function PlatformActiveProfileView({ icon={KeyRound} onClick={onOpenApiKeys} /> + onOpenPaymentService?.()} + /> diff --git a/src/components/platform-entry/PlatformEntryActiveFlowShell.tsx b/src/components/platform-entry/PlatformEntryActiveFlowShell.tsx index 26007e677..a6a621256 100644 --- a/src/components/platform-entry/PlatformEntryActiveFlowShell.tsx +++ b/src/components/platform-entry/PlatformEntryActiveFlowShell.tsx @@ -35,6 +35,7 @@ import { FLOATING_FEEDBACK_FORM_URL } from '../common/floatingFeedbackEntryModel import { PlatformActionButton } from '../common/PlatformActionButton'; import { PlatformSubpanel } from '../common/PlatformSubpanel'; import { ClientDownloadEntry } from '../creation-home/ClientDownloadEntry'; +import { PaymentCheckoutView } from './PaymentCheckoutView'; import { PlatformActiveMobileWelcomeDialog, shouldOpenActiveMobileWelcomeDialog, @@ -46,6 +47,7 @@ import { import { PlatformActiveProfileView } from './PlatformActiveProfileView'; import type { PlatformEntryFlowShellProps } from './platformEntryActiveTypes'; import { usePlatformDesktopLayout } from './platformEntryResponsive'; +import { PlatformPaymentServiceView } from './PlatformPaymentServiceView'; import { PlatformProfileApiKeysModal } from './PlatformProfileApiKeysModal'; import { canPasteFromNativeHostClipboard, @@ -365,6 +367,7 @@ export function PlatformEntryFlowShellImpl({ const isProfileStage = selectionStage === 'profile' || + selectionStage === 'profile-payment' || (!isDesktopLayout && selectionStage === 'platform'); const profileCenter = usePlatformProfileCenterController({ @@ -403,6 +406,10 @@ export function PlatformEntryFlowShellImpl({ setSelectionStage('profile', { path: '/profile' }); }, [setSelectionStage]); + const openPaymentService = useCallback(() => { + setSelectionStage('profile-payment', { path: '/profile/payment' }); + }, [setSelectionStage]); + const openGames = useCallback(() => { setSelectionStage('games', { path: '/games' }); }, [setSelectionStage]); @@ -575,6 +582,14 @@ export function PlatformEntryFlowShellImpl({ ); } + if (selectionStage === 'payment-checkout') { + const checkoutToken = + typeof window === 'undefined' + ? '' + : (window.location.pathname.split('/').filter(Boolean).at(-1) ?? ''); + return ; + } + const isAuthenticated = Boolean(authUi?.user); const balance = mudPointBalance?.totalPoints ?? legacyWalletBalance; const isCreationStage = @@ -770,7 +785,13 @@ export function PlatformEntryFlowShellImpl({ id={isCreationStage ? 'platform-tab-panel-create' : undefined} className={`platform-tab-panel min-h-0 min-w-0 flex-1 ${isGamePlayStage ? 'platform-tab-panel--game-play' : 'overflow-auto'} ${isCreationStage || isProfileStage || isGamePlayStage ? '' : 'px-3 py-4 sm:px-6 sm:py-6'}`} > - {isProfileStage ? ( + {selectionStage === 'profile-payment' ? ( + authUi?.openLoginModal()} + /> + ) : isProfileStage ? ( authUi?.openLoginModal()} onOpenApiKeys={() => setIsApiKeysOpen(true)} + onOpenPaymentService={openPaymentService} onOpenCommunity={() => profileCenter.openProfilePopupPanel('community') } diff --git a/src/components/platform-entry/PlatformPaymentServiceView.tsx b/src/components/platform-entry/PlatformPaymentServiceView.tsx new file mode 100644 index 000000000..9e91b88ac --- /dev/null +++ b/src/components/platform-entry/PlatformPaymentServiceView.tsx @@ -0,0 +1,347 @@ +import { + ArrowLeft, + Check, + Copy, + CreditCard, + ExternalLink, + KeyRound, +} from 'lucide-react'; +import { useEffect, useState } from 'react'; + +import type { AuthUser } from '@/packages/shared/src'; + +import type { + PaymentApiKey, + PaymentApp, + PaymentAppCreateResponse, +} from '../../../packages/shared/src/contracts/payment'; +import { + createPlatformProfilePaymentApp, + listPlatformProfilePaymentApps, + revokePlatformProfilePaymentApiKey, + updatePlatformProfilePaymentApp, +} from '../../services/platform-entry/platformProfileClient'; +import { PlatformActionButton } from '../common/PlatformActionButton'; +import { PlatformStatusMessage } from '../common/PlatformStatusMessage'; +import { PlatformSubpanel } from '../common/PlatformSubpanel'; + +type PlatformPaymentServiceViewProps = { + user: AuthUser | null | undefined; + onBack: () => void; + onLogin: () => void; +}; + +export function PlatformPaymentServiceView({ + user, + onBack, + onLogin, +}: PlatformPaymentServiceViewProps) { + const [apps, setApps] = useState([]); + const [keys, setKeys] = useState([]); + const [name, setName] = useState('我的游戏支付'); + const [callbackUrl, setCallbackUrl] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [isCreating, setIsCreating] = useState(false); + const [error, setError] = useState(''); + const [created, setCreated] = useState(null); + + useEffect(() => { + if (!user) { + return; + } + let cancelled = false; + setIsLoading(true); + listPlatformProfilePaymentApps() + .then((response) => { + if (!cancelled) { + setApps(response.apps ?? []); + setKeys(response.keys ?? []); + } + }) + .catch((nextError: unknown) => { + if (!cancelled) { + setError( + nextError instanceof Error ? nextError.message : '读取支付服务失败', + ); + } + }) + .finally(() => { + if (!cancelled) { + setIsLoading(false); + } + }); + return () => { + cancelled = true; + }; + }, [user]); + + const submit = async () => { + const normalizedName = name.trim(); + if (!normalizedName) { + setError('请填写应用名称'); + return; + } + setIsCreating(true); + setError(''); + try { + const response = await createPlatformProfilePaymentApp( + normalizedName, + callbackUrl.trim() || null, + ); + setCreated(response); + setApps((current) => [response.app, ...current]); + } catch (nextError: unknown) { + setError( + nextError instanceof Error ? nextError.message : '创建支付应用失败', + ); + } finally { + setIsCreating(false); + } + }; + + const toggleApp = async (app: PaymentApp) => { + try { + const updated = await updatePlatformProfilePaymentApp( + app.appId, + !app.enabled, + ); + setApps((current) => + current.map((item) => (item.appId === updated.appId ? updated : item)), + ); + } catch (nextError: unknown) { + setError( + nextError instanceof Error ? nextError.message : '更新支付应用失败', + ); + } + }; + + const revokeKey = async (key: PaymentApiKey) => { + try { + const updated = await revokePlatformProfilePaymentApiKey(key.keyId); + setKeys((current) => + current.map((item) => (item.keyId === updated.keyId ? updated : item)), + ); + } catch (nextError: unknown) { + setError( + nextError instanceof Error + ? nextError.message + : '撤销支付 API Key 失败', + ); + } + }; + + const copyKey = async () => { + if (!created?.apiKey) { + return; + } + await navigator.clipboard?.writeText(created.apiKey); + }; + + if (!user) { + return ( +
+ + +

支付服务

+

+ 登录后可以创建游戏或外部产品的支付应用。 +

+ + 登录 + +
+
+ ); + } + + return ( +
+
+ +
+

+ 支付服务 +

+

+ 统一收款、动态二维码和支付结果通知。 +

+
+
+ + {error ? ( + + {error} + + ) : null} + + +
+ + +
+

创建接入应用

+

+ 为一款游戏或外部产品创建独立的应用身份。 +

+
+
+
+ + +
+ void submit()} + disabled={isCreating} + > + +
+ + {created ? ( + +
+ + 应用已创建 +
+

+ 完整 API Key 只显示这一次,请立即复制并保存到你的服务端。 +

+
+ + {created.apiKey} + + +
+
+ + {created.key.scopes.join('、')} +
+
+ ) : null} + + +
+

我的支付应用

+ + {isLoading ? '读取中...' : `${apps.length} 个应用`} + +
+
+ {apps.length === 0 && !isLoading ? ( +

+ 还没有支付应用。 +

+ ) : null} + {apps.map((app) => ( +
+
+ {app.name} + + {app.appId} + +
+
+ + {app.enabled ? '可用' : '已停用'} + +
+
+ ))} +
+
+ + +
+

支付 API Key

+ + {keys.length} 个 + +
+
+ {keys.length === 0 ? ( +

+ 创建应用后会生成默认 Key。 +

+ ) : null} + {keys.map((key) => ( +
+
+ {key.name} + + {key.keyPrefix} + +
+ +
+ ))} +
+
+ +

+ + 支付金额由服务端订单快照决定,到账以微信支付通知或查单为准。 +

+
+ ); +} diff --git a/src/components/platform-entry/platformEntryActiveTypes.ts b/src/components/platform-entry/platformEntryActiveTypes.ts index 862fbe957..46af48ad2 100644 --- a/src/components/platform-entry/platformEntryActiveTypes.ts +++ b/src/components/platform-entry/platformEntryActiveTypes.ts @@ -3,6 +3,8 @@ export type SelectionStage = | 'creation-home' | 'project' | 'profile' + | 'profile-payment' + | 'payment-checkout' | 'image-editor' | 'games' | 'game-detail' diff --git a/src/index.css b/src/index.css index 561c0d1bb..71eaa9a09 100644 --- a/src/index.css +++ b/src/index.css @@ -15,6 +15,71 @@ font-display: swap; } +.payment-checkout-page { + min-height: 100%; + display: flex; + align-items: center; + justify-content: center; + padding: 2rem; + background: radial-gradient(circle at 18% 12%, rgba(199, 101, 50, 0.11), transparent 32%), #f5f1ea; + color: #2c2723; +} + +.payment-checkout-shell { + width: min(68rem, 100%); + display: grid; + grid-template-columns: minmax(0, 0.95fr) minmax(20rem, 1.15fr); + gap: 1.25rem; +} + +.payment-checkout-summary, +.payment-checkout-qr-panel { + border: 1px solid rgba(119, 92, 68, 0.13); + border-radius: 1.8rem; + background: rgba(255, 253, 249, 0.92); + box-shadow: 0 1.5rem 3.5rem rgba(92, 70, 49, 0.1); +} + +.payment-checkout-summary { padding: 2rem; } +.payment-checkout-qr-panel { padding: 2rem; text-align: center; } +.payment-checkout-brand { display: flex; align-items: center; gap: 0.75rem; } +.payment-checkout-brand > span { display: grid; place-items: center; width: 2.5rem; height: 2.5rem; border-radius: 0.9rem; background: #f0e4d8; font-weight: 900; } +.payment-checkout-brand strong, .payment-checkout-brand small { display: block; } +.payment-checkout-brand small { margin-top: 0.2rem; color: #88796d; font-size: 0.76rem; } +.payment-checkout-code { margin-top: 2rem; color: #8c7d70; font-size: 0.78rem; } +.payment-checkout-code strong { display: block; margin-top: 0.35rem; color: #2c2723; font-size: 0.9rem; } +.payment-checkout-summary h1 { margin-top: 1.8rem; font-size: clamp(1.8rem, 4vw, 2.6rem); font-weight: 900; } +.payment-checkout-description { margin-top: 0.65rem; color: #75675c; font-size: 0.9rem; line-height: 1.7; } +.payment-checkout-alert { display: grid; gap: 0.45rem; margin-top: 1.7rem; padding: 1rem; border: 1px solid #f1d9d1; border-radius: 1rem; background: #fff7f4; color: #8f3e32; font-size: 0.82rem; line-height: 1.6; } +.payment-checkout-state { display: flex; align-items: center; gap: 0.75rem; margin-top: 1.1rem; padding: 1rem; border: 1px solid rgba(119, 92, 68, 0.1); border-radius: 1rem; } +.payment-checkout-state strong, .payment-checkout-state span { display: block; } +.payment-checkout-state span { margin-top: 0.2rem; color: #88796d; font-size: 0.78rem; } +.payment-checkout-copy { display: inline-flex; align-items: center; gap: 0.4rem; margin-top: 1rem; color: #7a5b42; font-size: 0.8rem; font-weight: 700; } +.payment-checkout-qr-title { display: flex; justify-content: space-between; font-size: 0.95rem; } +.payment-checkout-qr-title span { padding: 0.35rem 0.7rem; border: 1px solid rgba(119, 92, 68, 0.12); border-radius: 999px; color: #88796d; font-size: 0.75rem; } +.payment-checkout-amount { display: flex; align-items: center; justify-content: space-between; margin-top: 1.2rem; padding: 1.15rem; border: 1px solid rgba(119, 92, 68, 0.11); border-radius: 1rem; background: #f8f1e9; text-align: left; } +.payment-checkout-amount small { color: #88796d; } +.payment-checkout-amount strong { font-size: 2.1rem; } +.payment-checkout-qr, .payment-checkout-qr-placeholder { width: min(19rem, 100%); aspect-ratio: 1; margin: 1.8rem auto 1rem; border-radius: 1.2rem; background: #fff; } +.payment-checkout-qr { display: block; padding: 0.65rem; border: 1px solid rgba(119, 92, 68, 0.12); } +.payment-checkout-qr-placeholder { display: grid; place-items: center; color: #a17c5b; } +.payment-checkout-success { display: grid; place-items: center; gap: 0.7rem; min-height: 19rem; margin-top: 1.8rem; color: #27845d; } +.payment-checkout-success--muted { color: #998b7f; } +.payment-checkout-provider { display: inline-flex; align-items: center; gap: 0.35rem; font-weight: 800; } +.payment-checkout-hint { margin-top: 0.45rem; color: #88796d; font-size: 0.8rem; } +.payment-checkout-loading, .payment-checkout-error { display: flex; align-items: center; gap: 0.6rem; padding: 1rem 1.25rem; border-radius: 1rem; background: rgba(255, 253, 249, 0.95); box-shadow: 0 1rem 2rem rgba(92, 70, 49, 0.1); } +.payment-checkout-error { color: #8f3e32; } + +@media (max-width: 760px) { + .payment-checkout-page { align-items: flex-start; padding: 1rem; } + .payment-checkout-shell { grid-template-columns: 1fr; gap: 0.8rem; } + .payment-checkout-summary, .payment-checkout-qr-panel { border-radius: 1.25rem; padding: 1.25rem; } + .payment-checkout-summary h1 { margin-top: 1.25rem; font-size: 1.7rem; } + .payment-checkout-code { margin-top: 1.25rem; } + .payment-checkout-qr, .payment-checkout-qr-placeholder { margin-top: 1.25rem; } + .payment-checkout-success { min-height: 14rem; } +} + @theme { --font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif; --font-serif: 'Noto Serif SC', 'Georgia', serif; diff --git a/src/routing/activeAppPageRoutes.test.ts b/src/routing/activeAppPageRoutes.test.ts index 11e141e2a..94b300a3e 100644 --- a/src/routing/activeAppPageRoutes.test.ts +++ b/src/routing/activeAppPageRoutes.test.ts @@ -30,6 +30,9 @@ describe('appPageRoutes', () => { expect(resolveSelectionStageFromPath('/games/publish')).toBe( 'game-publish', ); + expect(resolveSelectionStageFromPath('/pay/checkout-token')).toBe( + 'payment-checkout', + ); expect(resolveSelectionStageFromPath('/creation/rpg')).toBe('platform'); expect(resolveSelectionStageFromPath('/runtime/puzzle')).toBe('platform'); expect(isKnownMainAppPagePath('/creation')).toBe(true); @@ -42,6 +45,10 @@ describe('appPageRoutes', () => { expect(resolvePathForSelectionStage('games')).toBe('/games'); expect(resolvePathForSelectionStage('game-mine')).toBe('/games/mine'); expect(resolvePathForSelectionStage('game-publish')).toBe('/games/publish'); + expect(resolvePathForSelectionStage('profile-payment')).toBe( + '/profile/payment', + ); + expect(resolvePathForSelectionStage('payment-checkout')).toBe('/pay'); }); it('requires a project id for direct editor navigation', () => { diff --git a/src/routing/activeAppPageRoutes.ts b/src/routing/activeAppPageRoutes.ts index 5da7357e4..8c91e2e6e 100644 --- a/src/routing/activeAppPageRoutes.ts +++ b/src/routing/activeAppPageRoutes.ts @@ -8,6 +8,8 @@ const STAGE_ROUTE_ENTRIES = [ ['creation-home', '/creation'], ['project', '/project'], ['profile', '/profile'], + ['profile-payment', '/profile/payment'], + ['payment-checkout', '/pay'], ['image-editor', '/editor/canvas'], ['games', '/games'], ['game-detail', '/games/detail'], @@ -39,6 +41,9 @@ export function normalizeAppPath(pathname: string) { export function resolveSelectionStageFromPath( pathname: string, ): SelectionStage { + if (normalizeAppPath(pathname).startsWith('/pay/')) { + return 'payment-checkout'; + } return ROUTE_STAGE_BY_PATH.get(normalizeAppPath(pathname)) ?? 'platform'; } @@ -69,7 +74,8 @@ export function shouldRedirectEditorCanvasWithoutProject( } export function isKnownMainAppPagePath(pathname: string) { - return ROUTE_STAGE_BY_PATH.has(normalizeAppPath(pathname)); + const normalized = normalizeAppPath(pathname); + return ROUTE_STAGE_BY_PATH.has(normalized) || normalized.startsWith('/pay/'); } export function pushAppHistoryPath(path: string) { diff --git a/src/services/activeAppTitle.ts b/src/services/activeAppTitle.ts index 618713eab..d3a82f17d 100644 --- a/src/services/activeAppTitle.ts +++ b/src/services/activeAppTitle.ts @@ -9,6 +9,8 @@ const APP_TITLE_BY_SELECTION_STAGE: Record = { 'creation-home': APP_HOME_TITLE, project: '项目 - 陶泥儿', profile: '我的 - 陶泥儿', + 'profile-payment': '支付服务 - 陶泥儿', + 'payment-checkout': '扫码支付 - 陶泥儿', 'image-editor': '美术编辑器 - 陶泥儿', games: '游戏 - 陶泥儿', 'game-detail': '游戏详情 - 陶泥儿', diff --git a/src/services/payment/paymentCheckoutClient.ts b/src/services/payment/paymentCheckoutClient.ts new file mode 100644 index 000000000..0438338e0 --- /dev/null +++ b/src/services/payment/paymentCheckoutClient.ts @@ -0,0 +1,11 @@ +import type { PaymentOrderCreateResponse } from '../../../packages/shared/src/contracts/payment'; +import { requestJson } from '../apiClient'; + +export function getPublicPaymentCheckout(checkoutToken: string) { + return requestJson( + `/api/payment/checkout/${encodeURIComponent(checkoutToken)}`, + { method: 'GET' }, + '读取支付订单失败', + { skipAuth: true, skipRefresh: true }, + ); +} diff --git a/src/services/platform-entry/platformProfileClient.ts b/src/services/platform-entry/platformProfileClient.ts index 7164a8118..561674520 100644 --- a/src/services/platform-entry/platformProfileClient.ts +++ b/src/services/platform-entry/platformProfileClient.ts @@ -1,3 +1,9 @@ +import type { + PaymentApiKey, + PaymentApp, + PaymentAppCreateResponse, + PaymentAppListResponse, +} from '../../../packages/shared/src/contracts/payment'; import type { ConfirmWechatProfileRechargeOrderResponse, CreateProfileRechargeOrderResponse, @@ -140,6 +146,63 @@ export function revokePlatformProfileExternalApiKey( ); } +export function listPlatformProfilePaymentApps( + options: PlatformProfileRequestOptions = {}, +) { + return requestPlatformProfileJson( + '/payment/apps', + { method: 'GET' }, + '读取支付服务失败', + options, + ); +} + +export function createPlatformProfilePaymentApp( + name: string, + callbackUrl: string | null, + options: PlatformProfileRequestOptions = {}, +) { + return requestPlatformProfileJson( + '/payment/apps', + { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name, callbackUrl }), + }, + '创建支付应用失败', + options, + ); +} + +export function updatePlatformProfilePaymentApp( + appId: string, + enabled: boolean, + options: PlatformProfileRequestOptions = {}, +) { + return requestPlatformProfileJson( + `/payment/apps/${encodeURIComponent(appId)}`, + { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ enabled }), + }, + '更新支付应用失败', + options, + ); +} + +export function revokePlatformProfilePaymentApiKey( + keyId: string, + options: PlatformProfileRequestOptions = {}, +) { + return requestPlatformProfileJson( + `/payment/keys/${encodeURIComponent(keyId)}`, + { method: 'DELETE' }, + '撤销支付 API Key 失败', + options, + ); +} + export function getPlatformProfileRechargeCenter( options: PlatformProfileRequestOptions = {}, ) { From 86e74867ae414f57912d6a859668cca1597cec36 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Sat, 3 Oct 2026 17:42:09 +0800 Subject: [PATCH 6/7] =?UTF-8?q?review=20=E5=8F=8D=E9=A6=88=EF=BC=9A?= =?UTF-8?q?=E8=A1=A5=E9=BD=90=20targetCategory=20=E7=9A=84=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E4=B8=8E=E6=B3=A8=E9=87=8A=E5=8F=A3=E5=BE=84=EF=BC=88?= =?UTF-8?q?#359=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实施计划合同补上「GUI 上传与图片类生成同一 targetCategory 口径,不传时仍按内容证据派生 kind」 - 栏目画布底部工具栏入口矩阵 §1 一句话补上「带当前栏目 targetCategory」 - 工具栏模型里上传入口的类型注释写明入口栏目与「待归类」的因果 - 修正占位落点 effect 里陈旧的示例:普通图片只在 Agent / Direct 不传 targetCategory 时才落「待归类」 --- .../resource-canvas/resourceCanvasBottomToolbarModel.ts | 8 +++++++- .../src/view/project-development/index.tsx | 5 +++-- .../【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md | 2 +- .../【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasBottomToolbarModel.ts b/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasBottomToolbarModel.ts index 429d83a34..9b848ccbc 100644 --- a/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasBottomToolbarModel.ts +++ b/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasBottomToolbarModel.ts @@ -99,7 +99,13 @@ export type ResourceCanvasAudioToolAction = audioKind: ResourceCanvasGenerationKind; }; -/** 上传入口:复用既有 `upload_local_asset`。 */ +/** + * 上传入口:复用既有 `upload_local_asset`。 + * + * 调用方按当前栏目带 `targetCategory`(见 `uploadResourceCanvasToolbarFiles`)——上传的 + * manifest `kind` 只由内容证据推导,图片 / 视频 / 代码都会派生成 `unclassified`, + * 不带入口栏目素材就落「待归类」、在上传它的那一栏里看不见。 + */ export type ResourceCanvasUploadToolAction = ResourceCanvasBottomToolActionBase & { route: 'upload'; diff --git a/apps/ai-game-creator-shell/src/view/project-development/index.tsx b/apps/ai-game-creator-shell/src/view/project-development/index.tsx index cfabbccf2..50e0c00dc 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/index.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/index.tsx @@ -3348,8 +3348,9 @@ export default function ProjectDevelopmentView({ * 两条判据缺一不可: * 1. 这张卡已经进了布局(`resourcePositionById`),否则 reconcile 还没补位、写坐标是空操作; * 2. 这张卡已经有正式归类(投影里的 `category`)——`commitPosition` 的 `section` 必须与该资源 - * 在 sidecar 里的 section 一致,否则会被静默跳过。生成结果的实际归类与入口栏目本来就可能不同 - * (普通图片落「待归类」、规范落「文档」),所以这里按**正式归类**写,而不是入口栏目。 + * 在 sidecar 里的 section 一致,否则会被静默跳过。生成结果的实际归类与入口栏目**不一定相同** + * (Agent / Direct 路径不传 `targetCategory`,普通图片仍落「待归类」),所以这里按**正式归类**写, + * 而不是入口栏目。 * * 写完撤掉占位:结果已经接管了它的位置。占位被用户先删掉时同样清掉这条意图(没有位置可接管)。 */ diff --git a/docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md b/docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md index b7da13037..ab8643343 100644 --- a/docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md +++ b/docs/technical/【AGC】栏目画布底部工具栏入口矩阵-2026-09-13.md @@ -6,7 +6,7 @@ ## 1. 一句话 -功能画布 = 资源栏目页;栏目页左下角渲染一条由栏目 `category` 决定的工具栏,图片类与音频入口都走本地 `start_local_project_asset_generation`(提交即返回、后台生成,见 2026-09-20 音频并入后台任务账本),上传复用 `upload_local_asset`;生成 / 上传成功后一律走既有 manifest 刷新与资源定位。 +功能画布 = 资源栏目页;栏目页左下角渲染一条由栏目 `category` 决定的工具栏,图片类与音频入口都走本地 `start_local_project_asset_generation`(提交即返回、后台生成,见 2026-09-20 音频并入后台任务账本),上传复用 `upload_local_asset`(带当前栏目 `targetCategory`,素材登记进上传它的那一栏);生成 / 上传成功后一律走既有 manifest 刷新与资源定位。 ## 2. 入口矩阵(事实源) diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index 4faeabece..28eb88164 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -329,7 +329,7 @@ Rust 侧在 `server-rs/crates/shared-contracts` 维护唯一权威 `GameCreation - 参考选择范围为同一项目已登记图片,可跨栏目、多选,无规范前置时最多 5 张,有规范前置时最多 4 张用户参考(总计最多 5 张);复用资源引用选择组件,不允许文档、音视频、占位或跨项目素材。本地生成命令补最小引用 ID 参数并转换为当前账号绑定下的远端资源 ID,沿用图片生成 API 已有 `referenceImageSrcs`。需要规范图的普通图片请求合并并去重规范引用,总数不超过现有 API 限制;只接受单规范引用的图集操作不显示用户参考选择器,原生提交拒绝额外参考而非静默丢弃。不得降级成纯提示词。 - 占位由宿主按项目与独立草稿 ID 管理,提交后关联任务 ID;失败重试使用同一占位。切项目清理未提交草稿与界面位置,已提交任务继续沿用账本恢复,重开后不承诺恢复未持久化的占位位置。迟到结果先核对项目和任务归属;只有本会话仍存在的占位才应用最新位置。删除占位只隐藏展示,不取消后台任务或丢弃正式结果。 - 参考必须是原生可解码的栅格图片,SVG 不进入参考候选;原生在上传任何引用前预校验整组素材的归属、受控路径、文件及解码,失败不静默丢图。需要重新上传当前账号绑定的参考遵循 `asset.upload` 权限。manifest 读侧的引用形状检查不证明远端账号归属,实际生成始终通过当前账号 binding 解析,不凭历史来源 ID 发起请求。 -- 图片类 GUI 生成通过可选 `targetCategory` 在原生登记时写入入口栏目,使用既有 manifest `category` 字段及合法分类词表;不传时保留按 kind 派生的行为,Agent 不传。该值不改变远端生成内容及计费幂等槽,仅决定本地生成结果分类;重试保持原占位栏目。同路径重新生成时,主产物按本次入口栏目更新分类(包含覆盖此前手动分类),图集附属切片保持既有独立分类规则。 +- 图片类 GUI 生成通过可选 `targetCategory` 在原生登记时写入入口栏目,使用既有 manifest `category` 字段及合法分类词表;不传时保留按 kind 派生的行为,Agent 不传。该值不改变远端生成内容及计费幂等槽,仅决定本地生成结果分类;重试保持原占位栏目。同路径重新生成时,主产物按本次入口栏目更新分类(包含覆盖此前手动分类),图集附属切片保持既有独立分类规则。GUI 上传(栏目画布底部工具栏的 `upload_local_asset`)与图片类生成**同一口径**:带可选 `targetCategory` 在当前栏目登记,不传(资源面板、UI 编辑器导入、聊天附件)时保持按内容证据派生 kind 的行为。 - 生成面板打开后,占位和面板需处于当前画布标题栏与底部工具栏之间;面板复用公共外观,空间不足时面板内部滚动,提交按钮可达。音频/BGM 占位绑定原有 operation/idempotency 身份,进行中不允许换身份重复提交;失败可用原身份重试,成功结果与图片一样接管占位。关闭未提交浮层保留可继续编辑的草稿,删除占位才丢弃该草稿。 - 整理范围为当前栏目页全部资源;“所有资源”页为当前项目所有可展示资源,总览不新增整理行为。重排结果成为自动坐标,可撤销恢复原坐标与手动标记;历史仅保留当前会话,切项目清空。多选仅作用于当前画布可见选中资源,不携带筛选隐藏或跨栏目残留选择;取消手势恢复拖动前坐标,切项目清空选择。 - 当前素材名以现有正式命名链路为准:生成时 assetName 参与落盘名称,重命名更新文件名;卡片消费正式资源 label,不从临时输入或历史任务名覆盖后续重命名,不新增平行显示名持久化。若原有命名链路丢失 assetName,则修复原链路,而非只在卡片本地伪造。文档卡不显示任何正文摘要,但详情原文与 JSON 识别读取不变。 From 8aee5db84ed2d05669e184438a5e914a9bb415b4 Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Sat, 3 Oct 2026 17:57:41 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E7=BB=9F=E4=B8=80=20Claude=20Code=20?= =?UTF-8?q?=E4=B8=8E=20Codex=20=E9=94=99=E8=AF=AF=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 保留 Claude Code 的上游 HTTP 状态、超时、空响应和无效 JSON 语义 补充状态摘要、重试建议、定向回归测试与排障记录 --- .../src-tauri/src/agent.rs | 6 +- .../src-tauri/src/agent/claude_code_cli.rs | 65 ++++++++++++++++- .../src/agent/codex_app_server/mod.rs | 4 +- .../src/agent/codex_app_server/turn_error.rs | 69 +++++++++++++++++-- docs/project-memory/shared-memory/pitfalls.md | 3 +- 5 files changed, 136 insertions(+), 11 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent.rs b/apps/ai-game-creator-shell/src-tauri/src/agent.rs index 110b0b918..fc4843f6d 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent.rs @@ -43,9 +43,9 @@ pub mod tool; pub(crate) use art_manifest::*; use claude_code_cli::*; pub(crate) use claude_code_cli::{ - cancel_direct_claude_code_turn_at, direct_game_creator_claude_code_chat_at, - direct_game_creator_claude_code_home_chat, game_creator_claude_code_cli_route_error, - game_creator_claude_code_cli_version_identity, + cancel_direct_claude_code_turn_at, claude_code_failure_to_llm_error, + direct_game_creator_claude_code_chat_at, direct_game_creator_claude_code_home_chat, + game_creator_claude_code_cli_route_error, game_creator_claude_code_cli_version_identity, }; pub(crate) use codex_app_server::direct_game_creator_codex_chat_at; pub(crate) use codex_app_server::turn_error::*; diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/claude_code_cli.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/claude_code_cli.rs index 65b71e4d6..0ea85c3b7 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/claude_code_cli.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/claude_code_cli.rs @@ -747,6 +747,46 @@ fn parse_usage(value: &serde_json::Value) -> Option }) } +/// 把 Claude Code/sidecar 的字符串失败投影到与 Codex app-server 相同的 LlmError 分类。 +/// +/// DirectProject 不能把上游 HTTP 错误统统包装成 Transport:那会把 429、401、5xx 等可识别 +/// 的上游事实显示成“执行通道已断开”。这里只认结构化的状态位置(`Request rejected (N)` / +/// `HTTP N`),其它文本继续保留为 Transport,避免凭关键词猜测。 +pub(crate) fn claude_code_failure_to_llm_error(detail: String) -> platform_llm::LlmError { + if let Some(status_code) = claude_code_failure_status_code(&detail) { + return platform_llm::LlmError::Upstream { + status_code, + message: detail, + }; + } + if detail.contains("Claude Agent SDK sidecar 回合超时") { + return platform_llm::LlmError::Timeout { attempts: 1 }; + } + if detail.contains("Claude Code 缺少最终回复") { + return platform_llm::LlmError::EmptyResponse; + } + if detail.contains("sidecar 输出不是有效 JSON") || detail.contains("stream-json 包含无效 JSON") + { + return platform_llm::LlmError::Deserialize(detail); + } + platform_llm::LlmError::Transport(detail) +} + +fn claude_code_failure_status_code(detail: &str) -> Option { + ["Request rejected (", "HTTP "].iter().find_map(|marker| { + let tail = detail.split_once(marker)?.1; + let digits = tail + .chars() + .take_while(|character| character.is_ascii_digit()) + .collect::(); + if digits.len() != 3 { + return None; + } + let status_code = digits.parse::().ok()?; + (100..=599).contains(&status_code).then_some(status_code) + }) +} + fn parse_claude_code_result( stdout: &[u8], request: &LlmRunRequest, @@ -758,7 +798,7 @@ fn parse_claude_code_result( let detail = claude_result_error_detail(&value) .map(|detail| format!(":{detail}")) .unwrap_or_default(); - return Err(platform_llm::LlmError::Transport(format!( + return Err(claude_code_failure_to_llm_error(format!( "Claude Code 返回失败终态{detail}" ))); } @@ -1156,6 +1196,29 @@ mod tests { assert!(error.to_string().contains("Authentication failed")); } + #[test] + fn claude_failure_reuses_codex_error_categories() { + assert!(matches!( + claude_code_failure_to_llm_error( + "Claude Code 返回失败终态:API Error: Request rejected (429)".into() + ), + platform_llm::LlmError::Upstream { + status_code: 429, + .. + } + )); + assert!(matches!( + claude_code_failure_to_llm_error( + "Claude Agent SDK sidecar 回合超时:连续 180000 ms 没有任何事件".into() + ), + platform_llm::LlmError::Timeout { attempts: 1 } + )); + assert!(matches!( + claude_code_failure_to_llm_error("Claude Code 缺少最终回复".into()), + platform_llm::LlmError::EmptyResponse + )); + } + #[test] fn parses_direct_stream_result_and_final_text() { let mut observed = Vec::new(); diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/mod.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/mod.rs index 54a6a023c..a1141d90e 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/mod.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/mod.rs @@ -5300,7 +5300,9 @@ pub(crate) async fn direct_game_creator_codex_chat_at_with_optional_observer( observer, ) .await - .map_err(|detail| TurnError::from_model_call(&platform_llm::LlmError::Transport(detail))); + .map_err(|detail| { + TurnError::from_model_call(&crate::agent::claude_code_failure_to_llm_error(detail)) + }); } game_creator_codex_app_server_validate_llm_config(&config.llm).map_err(|error| { TurnError::EnvironmentNotReady(EnvironmentNotReady { diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/turn_error.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/turn_error.rs index 707674fbf..745a9c1c2 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/turn_error.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/turn_error.rs @@ -304,7 +304,7 @@ impl ModelCallKind { native, } => match native { Some(native) => native.is_retryable(), - None => *status_code >= 500, + None => matches!(*status_code, 401 | 408 | 429 | 500..=599), }, Self::PaidCreditsInsufficient => false, Self::EmptyResponse => false, @@ -322,9 +322,16 @@ impl ModelCallKind { } Self::EmptyResponse => Some("模型未返回内容"), Self::PayloadInvalid { .. } => Some("模型回执无法解析"), - Self::RequestRejected { native } | Self::UpstreamFailed { native, .. } => { + Self::RequestRejected { native } => { native.as_ref().and_then(NativeKind::public_summary) } + Self::UpstreamFailed { + status_code, + native, + } => native + .as_ref() + .and_then(NativeKind::public_summary) + .or_else(|| upstream_status_summary(*status_code)), } } @@ -341,13 +348,40 @@ impl ModelCallKind { Self::EmptyResponse | Self::PayloadInvalid { .. } => { Some("模型未给出可用的回执,请重试;如持续失败请检查项目诊断") } - Self::RequestRejected { native } | Self::UpstreamFailed { native, .. } => { - native.as_ref().and_then(NativeKind::recovery_hint) - } + Self::RequestRejected { native } => native.as_ref().and_then(NativeKind::recovery_hint), + Self::UpstreamFailed { + status_code, + native, + } => native + .as_ref() + .and_then(NativeKind::recovery_hint) + .or_else(|| upstream_status_recovery_hint(*status_code)), } } } +fn upstream_status_summary(status_code: u16) -> Option<&'static str> { + Some(match status_code { + 401 => "上游服务拒绝认证(HTTP 401)", + 403 => "上游服务拒绝访问(HTTP 403)", + 408 => "上游请求超时(HTTP 408)", + 429 => "上游服务返回 HTTP 429", + 500..=599 => "上游服务暂时不可用", + _ => return None, + }) +} + +fn upstream_status_recovery_hint(status_code: u16) -> Option<&'static str> { + Some(match status_code { + 401 => "请重新登录陶泥儿后重试;如持续失败请检查项目诊断", + 403 => "请检查当前账号的上游访问权限后重试;如持续失败请检查项目诊断", + 408 => "上游请求超时,请稍后重试;如持续失败请检查项目诊断", + 429 => "上游服务暂时繁忙(HTTP 429),请稍后重试;如持续失败请检查项目诊断", + 500..=599 => "上游服务暂时不可用,请稍后重试;如持续失败请检查项目诊断", + _ => return None, + }) +} + // ══════════════════════════════════════════════════════════════════════════════════════════ // 入队失败:`#[tauri::command]` 的 `Err`,这一轮没有开始也没有进队列 // ══════════════════════════════════════════════════════════════════════════════════════════ @@ -1327,6 +1361,31 @@ mod tests { assert!(!projected.is_model_repairable()); } + #[test] + fn upstream_http_status_keeps_codex_style_summary_and_retry_guidance() { + let rate_limited = TurnError::from_model_call(&LlmError::Upstream { + status_code: 429, + message: "Claude Code 返回失败终态:API Error: Request rejected (429)".into(), + }); + assert_eq!(rate_limited.public_summary(), Some("上游服务返回 HTTP 429")); + assert_eq!( + rate_limited.recovery_hint(), + Some("上游服务暂时繁忙(HTTP 429),请稍后重试;如持续失败请检查项目诊断") + ); + assert!(rate_limited.is_retryable()); + assert!(!rate_limited.is_model_repairable()); + + let unauthorized = TurnError::from_model_call(&LlmError::Upstream { + status_code: 401, + message: "Claude Code 返回失败终态:HTTP 401".into(), + }); + assert_eq!( + unauthorized.public_summary(), + Some("上游服务拒绝认证(HTTP 401)") + ); + assert!(unauthorized.is_retryable()); + } + /// 反馈判据:原生分类里"再跑一次也不会变"的那些不再反馈给模型。 #[test] fn terminal_native_kinds_are_not_fed_back_to_the_model() { diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 02594596b..75a6d0d4f 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -6288,7 +6288,8 @@ Cocos Creator 根目录由 `package.json.creator.version` 与普通 `assets/` - **根因 3(工具被拒)**:sidecar 用 `permissionMode: 'dontAsk'` 且没有 `allowedTools`,宿主 MCP 工具(`mcp__agc__*`)一律被直接拒绝,模型只能回"没有权限"。 - **根因 4(界面看不到回复)**:聊天区是按 `item.completed` 事件流投影的(codex 路径在 `rawResponseItem/completed` 时下发 `ThreadItem::Message`),只把回复落进 `project.jsonl` 不会让本轮出现在界面上——用户看到"用户气泡 + 本轮结束于 … · 耗时",回复只在重进项目时从历史读出来。 - **根因 5(验收反馈复用 assistant ID)**:同一 client turn 进入 `ReviewRequired` 后会再次调用 cc。首次回复已经占用 `direct-codex::assistant`,第二次不同正文沿用该 ID 会被历史层正确拒绝为冲突,随后却被错误投影成 `runtime-unclassified`。真实诊断中可见「写入本项目对话历史失败:…assistant」且历史已经有该条回复。 -- **现行口径**:cc 成功出口由放行侧补写 `DirectTurnTerminal::completed()`(`finish_if_unfinished` 幂等,codex 已写过终态时是空操作);cc 每次解析成功后都把实际落盘的回复 item id 同步下发 `ThreadEvent::item_completed(ThreadItem::Message{role:"assistant"})`。首个回复沿用 `direct-codex::assistant`,同一回合的反馈回复遇到内容冲突时追加 `:assistant:`,相同内容仍按原 ID 幂等;落盘失败按回合失败收口。sidecar 按 `mcp__` 前缀整体放行请求里声明的 MCP 服务器(权限策略在宿主侧执行)。 +- **根因 6(cc 字符串错误覆盖了上游分类)**:DirectProject 的 Claude Code 路由原本把 sidecar 返回的所有字符串都包装成 `LlmError::Transport`,因此 HTTP 429、401、408、5xx、sidecar 超时、空回执和无效 JSON 都显示成「执行通道未能建立或已断开」。 +- **现行口径**:cc 成功出口由放行侧补写 `DirectTurnTerminal::completed()`(`finish_if_unfinished` 幂等,codex 已写过终态时是空操作);cc 每次解析成功后都把实际落盘的回复 item id 同步下发 `ThreadEvent::item_completed(ThreadItem::Message{role:"assistant"})`。首个回复沿用 `direct-codex::assistant`,同一回合的反馈回复遇到内容冲突时追加 `:assistant:`,相同内容仍按原 ID 幂等;落盘失败按回合失败收口。Claude Code 的失败文本先投影到与 Codex 相同的 `LlmError` 分类:HTTP 状态、sidecar 超时、空回执和无效 JSON 分别复用上游、超时、空响应和反序列化语义;上游状态摘要与重试建议按状态码给出。sidecar 按 `mcp__` 前缀整体放行请求里声明的 MCP 服务器(权限策略在宿主侧执行)。 - **诊断口径**:`agent.direct_turn.host_dropped` / `agent.direct_turn.panic` 里的令牌字段必须写 `tt=`,写 `turnToken=` 会命中脱敏标记,整行变成 ``,离线只剩"说不出原因"的 HostDropped。 - **验证**:dev 栈里用 CDP 注入真实回合(`node %TEMP%\agc-cdp.mjs `):①读文件轮 `claude-parse-done chars=108`,`.agent/conversations/project.jsonl` 出现 `direct-codex:cdp-…:assistant` 条目,回复内容与 `game/index.html` 前两行(`` / ``)逐字一致(证明宿主工具真的执行了);②聊天视图打开时注入 `只回三个字:收到了`,DOM 断言(`document.body.innerText`)同时出现用户气泡 `11:40:05`、助手回复 `收到了` 与 `本轮结束于 11:40:16 · 耗时 10.7秒`(证明 `item.completed` 实时投影生效,不必重进项目);同一日志不再出现新的 `host_dropped`。另有 `agent::claude_code_cli::tests::direct_claude_feedback_reply_does_not_fail_on_a_reused_client_turn_id` 回归覆盖同一回合两次不同回复。`cargo test … -- claude_code_cli::tests direct_turn_failure::tests` 19 passed。 - **关联**:`apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/dispatch.rs`、`apps/ai-game-creator-shell/src-tauri/src/agent/direct_turn_failure.rs`、`apps/ai-game-creator-shell/src-tauri/src/agent/claude_code_cli.rs`、`apps/ai-game-creator-shell/agent-sidecar/src/index.mjs`。

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Š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�A+GLaHRO&@l^M^^4(sfw~mN|QHN&X(n6I| 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