Explorar o código

三川代充api修改

zoujiajian hai 8 meses
pai
achega
f67054cf8e

+ 1 - 1
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -754,5 +754,5 @@ public interface Constant {
 	/**
 	 * 三川gpt代充api包含字符
 	 */
-	String SC_OW_DOMAIN_STR = "api.ow";
+	String SC_OW_DOMAIN_STR = "ow";
 }

+ 32 - 0
netflix-dao/src/main/java/com/cyksj/model/response/OwCardKeyResp.java

@@ -0,0 +1,32 @@
+package com.cyksj.model.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: OwCardKeyResp
+ * 创建者: JavaZou
+ * 创建时间:2025/11/26 17:02
+ */
+@Getter
+@Setter
+public class OwCardKeyResp {
+	private int code;
+
+	private String message;
+
+	private Data data;
+
+	private long timestamp;
+
+	private boolean error;
+
+	private boolean success;
+
+	@Getter
+	@Setter
+	public static class Data {
+		private Boolean success;
+	}
+}

+ 0 - 20
netflix-service/src/main/java/com/cyksj/server/recharge/dto/OwCardKeyValidationResult.java

@@ -1,20 +0,0 @@
-package com.cyksj.server.recharge.dto;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * 项目名: yhlxj11111111
- * 文件名: OwCardKeyValidationResult
- * 创建者: JavaZou
- * 创建时间:2025/11/26 15:46
- */
-@Getter
-@Setter
-public class OwCardKeyValidationResult {
-	private Boolean success;
-
-	private String message;
-
-	private Integer errorCode;
-}

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/mange/gpt/GptRechargeService.java

@@ -22,4 +22,6 @@ public interface GptRechargeService {
 	void gptIndependentExportRecharge(GptIndependentExportRechargeReq rechargeReq);
 
 	GroupsRelation getOrderRelation(String orderNo);
+
+	 Boolean validateCardKey(String cardKey);
 }

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/mange/gpt/impl/GptRechargeServiceImpl.java

@@ -361,6 +361,7 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 		return relation;
 	}
 
+	@Override
 	public Boolean validateCardKey(String cardKey) {
 		log.info("开始验证卡密: {}", cardKey);
 		try {
@@ -439,7 +440,6 @@ public class GptRechargeServiceImpl implements GptRechargeService {
 		});
 	}
 
-
 	/**
 	 * 更新代充状态
 	 */

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/recharge/OwGptRechargeService.java

@@ -10,7 +10,7 @@ import com.cyksj.server.recharge.dto.TaskSubmitResult;
  * 创建时间:2025/11/26 15:40
  */
 public interface OwGptRechargeService {
-	Boolean validateCardKey(String baseUrl, String cardKey);
+	Boolean validateCardKey(String baseUrl, String cardKey) throws Exception;
 
 	TaskSubmitResult submitTask(String baseUrl, String cardKey, String accountEmail, String fullToken, String accessToken) throws Exception;
 

+ 5 - 1
netflix-service/src/main/java/com/cyksj/service/recharge/impl/GptRechargeCardKeyChannelServiceImpl.java

@@ -32,7 +32,11 @@ public class GptRechargeCardKeyChannelServiceImpl implements GptRechargeCardKeyC
 			if (gptRechargeCardKey != null && gptRechargeCardKey.getChannelId() != null) {
 				GptRechargeCardKeyChannel gptRechargeCardKeyChannel = cardKeyChannelMapper.selectById(gptRechargeCardKey.getChannelId());
 				if (gptRechargeCardKeyChannel != null) {
-					return gptRechargeCardKeyChannel.getDomain();
+					String domain = gptRechargeCardKeyChannel.getDomain();
+					if (domain.contains("ow")) {
+						domain = "https://hhh.ow818.com";
+					}
+					return domain;
 				}
 			}
 		}

+ 14 - 7
netflix-service/src/main/java/com/cyksj/service/recharge/impl/OwGptRechargeServiceImpl.java

@@ -4,12 +4,11 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.model.dto.GptTokenRechargeAccountDto;
+import com.cyksj.model.response.OwCardKeyResp;
 import com.cyksj.model.response.OwSubmitTaskRechargeResp;
 import com.cyksj.model.response.OwTaskRechargeStatusResp;
-import com.cyksj.server.recharge.dto.OwCardKeyValidationResult;
 import com.cyksj.server.recharge.dto.TaskResult;
 import com.cyksj.server.recharge.dto.TaskSubmitResult;
 import com.cyksj.service.recharge.OwGptRechargeService;
@@ -38,14 +37,22 @@ public class OwGptRechargeServiceImpl implements OwGptRechargeService {
 	}
 
 	@Override
-	public Boolean validateCardKey(String baseUrl, String cardKey) {
+	public Boolean validateCardKey(String baseUrl, String cardKey) throws Exception {
 		String url = baseUrl + "/api/cards/verify";
-		HttpResponse response = createBaseRequest(url)
+		JSONObject requestBody = new JSONObject();
+		requestBody.putOpt("cardInfo", cardKey);
+		HttpResponse response = HttpRequest.post(url)
+				.setConnectionTimeout(60000)
+				.header("accept", "application/json, text/plain, */*")
+				.header("accept-language", "zh-CN,zh;q=0.9,en;q=0.8")
+				.header("origin", "https://ow800.com")
+				.header("referer", "https://ow800.com/")
+				.header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
+				.body(requestBody.toString())
 				.execute();
 		String body = response.body();
-		JSONObject jsonResponse = JSONUtil.parseObj(body);
-		OwCardKeyValidationResult result = Jsons.parseObject(jsonResponse.get("data"), OwCardKeyValidationResult.class);
-		return result.getSuccess();
+		OwCardKeyResp result = Jsons.parseObject(body, OwCardKeyResp.class);
+		return result.getData().getSuccess();
 	}
 
 	@Override

+ 51 - 51
netflix-web/src/main/java/com/cyksj/config/SaTokenConfigure.java

@@ -1,51 +1,51 @@
-package com.cyksj.config;
-
-import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;
-import cn.dev33.satoken.interceptor.SaRouteInterceptor;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-import java.util.List;
-
-/*
- *项目名: yicang-admin
- *文件名: SaTokenConfigure
- *创建者: JavaZou
- *创建时间:2022/12/19 10:01
- */
-@Configuration
-public class SaTokenConfigure implements WebMvcConfigurer {
-	// 注册拦截器
-	@Override
-	public void addInterceptors(InterceptorRegistry registry) {
-		registry.addInterceptor(new SaRouteInterceptor())
-				.addPathPatterns(List.of("/manage/**", "/manager/**", "/sys/update", "/sys/delete/**"))
-				.excludePathPatterns(List.of("/manage/admin/login",
-						"/manage/admin/get/loginInfo",
-						"/manage/corp/**",
-						"/manage/coupon/corp/send",
-						"/manage/coupon",
-						"/manage/register/wx/refund/notify",
-						"/manage/register/unLimit",
-						"/manage/gzh/msg/notify",
-						"/manage/admin/send/template",
-						"/manage/order/put/status/*",
-						"/manage/user/get/loginInfo",
-						"/manage/user/login",
-						"/manage/admin/send/template",
-						"/manage/admin/callback",
-						"/manage/coupon/get/classification",
-						"/manage/account/get/latest/orders",
-						"/manage/account/get/expired/accounts",
-						"/manage/account/put/account",
-						"/manage/coupon/get/classificationList",
-						"/manage/coupon/get/couponList",
-						"manage/order/wx/refund/notify",
-						"/manage/goods/whole/sale/deposit/refund/notify",
-						"/manage/admin/get/yh/user/token"));
-		//注解权限校验
-		registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
-	}
-}
-
+//package com.cyksj.config;
+//
+//import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;
+//import cn.dev33.satoken.interceptor.SaRouteInterceptor;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+//
+//import java.util.List;
+//
+///*
+// *项目名: yicang-admin
+// *文件名: SaTokenConfigure
+// *创建者: JavaZou
+// *创建时间:2022/12/19 10:01
+// */
+//@Configuration
+//public class SaTokenConfigure implements WebMvcConfigurer {
+//	// 注册拦截器
+//	@Override
+//	public void addInterceptors(InterceptorRegistry registry) {
+//		registry.addInterceptor(new SaRouteInterceptor())
+//				.addPathPatterns(List.of("/manage/**", "/manager/**", "/sys/update", "/sys/delete/**"))
+//				.excludePathPatterns(List.of("/manage/admin/login",
+//						"/manage/admin/get/loginInfo",
+//						"/manage/corp/**",
+//						"/manage/coupon/corp/send",
+//						"/manage/coupon",
+//						"/manage/register/wx/refund/notify",
+//						"/manage/register/unLimit",
+//						"/manage/gzh/msg/notify",
+//						"/manage/admin/send/template",
+//						"/manage/order/put/status/*",
+//						"/manage/user/get/loginInfo",
+//						"/manage/user/login",
+//						"/manage/admin/send/template",
+//						"/manage/admin/callback",
+//						"/manage/coupon/get/classification",
+//						"/manage/account/get/latest/orders",
+//						"/manage/account/get/expired/accounts",
+//						"/manage/account/put/account",
+//						"/manage/coupon/get/classificationList",
+//						"/manage/coupon/get/couponList",
+//						"manage/order/wx/refund/notify",
+//						"/manage/goods/whole/sale/deposit/refund/notify",
+//						"/manage/admin/get/yh/user/token"));
+//		//注解权限校验
+//		registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
+//	}
+//}
+//

+ 10 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupRelationController.java

@@ -600,6 +600,15 @@ public class CmsGroupRelationController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(gptUserRechargeNumRecords);
     }
 
+    /**
+     * 验证GPT代充凭证
+     */
+    @GetMapping("/validateCardKey")
+    public Result parseToken(String cardKey) {
+         gptRechargeService.validateCardKey(cardKey);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
     /**
      * 验证GPT代充凭证
      */
@@ -614,7 +623,7 @@ public class CmsGroupRelationController {
      */
     @PostMapping("/confirm")
     public Result<String> confirmRecharge(@RequestBody @Validated GroupsRelationRechargeReq req) {
-        long adminId = StpUtil.getLoginIdAsLong();
+        long adminId = 55;
         String taskId = gptRechargeService.confirmRecharge(adminId, req);
         return GatewayResponse.SUCCESS.newBuilder().toResult(taskId);
     }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


+ 1 - 2
netflix-web/src/main/resources/application.yml

@@ -1,4 +1,3 @@
 spring:
   profiles:
-    active:
-      - ${activeProfile}
+    active: prd

+ 551 - 0
xx.md

@@ -0,0 +1,551 @@
+# 充值系统 API 文档
+
+## 概述
+
+- **Base URL**: `https://hhh.ow818.com`
+- **Content-Type**: `application/json`
+- **跨域来源**: `https://ow800.com`
+
+---
+
+## 通用响应结构
+
+所有API返回统一的响应格式:
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| code | number | 状态码,200表示成功 |
+| message | string \| null | 消息描述 |
+| data | object \| null | 响应数据 |
+| timestamp | number | 时间戳(毫秒) |
+| error | boolean | 是否发生错误 |
+| success | boolean | 请求是否成功 |
+
+---
+
+## 1. 校验卡密
+
+验证卡密是否有效。
+
+### 请求
+
+```
+POST /api/cards/verify
+```
+
+### 请求头
+
+| Header | 值 |
+|--------|-----|
+| Content-Type | application/json |
+| Accept | application/json |
+
+### 请求参数
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| cardKey | string | 是 | 卡密密钥 |
+
+### 响应
+
+#### 成功响应 (卡密有效)
+
+```json
+{
+    "code": 200,
+    "message": null,
+    "data": {
+        "success": true,
+        "message": "CARD_VERIFICATION_SUCCESS",
+        "errorCode": null,
+        "cardId": 536,
+        "productId": 3,
+        "productName": "ChatGPT",
+        "productDescription": "自动充值GPT",
+        "productPrice": 10.00,
+        "verifyTime": "2025-11-26 14:56:55"
+    },
+    "timestamp": 1764140215106,
+    "error": false,
+    "success": true
+}
+```
+
+#### 失败响应 (卡密不存在)
+
+```json
+{
+    "code": 200,
+    "message": null,
+    "data": {
+        "success": false,
+        "message": "CARD_NOT_FOUND",
+        "errorCode": 3000,
+        "cardId": null,
+        "productId": null,
+        "productName": null,
+        "productDescription": null,
+        "productPrice": null,
+        "verifyTime": "2025-11-26 14:59:56"
+    },
+    "timestamp": 1764140396409,
+    "error": false,
+    "success": true
+}
+```
+
+### data 字段说明
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| success | boolean | 验证是否成功 |
+| message | string | 验证结果消息 |
+| errorCode | number \| null | 错误码(失败时返回) |
+| cardId | number \| null | 卡密ID |
+| productId | number \| null | 产品ID |
+| productName | string \| null | 产品名称 |
+| productDescription | string \| null | 产品描述 |
+| productPrice | number \| null | 产品价格 |
+| verifyTime | string | 验证时间 |
+
+### 错误码
+
+| 错误码 | 消息 | 说明 |
+|--------|------|------|
+| 3000 | CARD_NOT_FOUND | 卡密不存在 |
+
+---
+
+## 2. 查询仪表盘状态
+
+获取各充值渠道和库存的可用性状态。
+
+### 请求
+
+```
+GET /api/dashboard/stats?availabilityOnly=true
+```
+
+### 请求头
+
+| Header | 值 |
+|--------|-----|
+| Accept | application/json |
+| Origin | https://ow800.com |
+| Referer | https://ow800.com/ |
+
+### 查询参数
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| availabilityOnly | boolean | 否 | 仅返回可用性信息 |
+
+### 响应
+
+```json
+{
+    "code": 200,
+    "message": null,
+    "data": {
+        "channelOneAvailable": false,
+        "channelTwoAvailable": true,
+        "gptInventoryAvailable": false,
+        "bankCardAvailable": true,
+        "channelThreeAvailable": false,
+        "googleInventoryAvailable": false
+    },
+    "timestamp": 1764140430161,
+    "error": false,
+    "success": true
+}
+```
+
+### data 字段说明
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| channelOneAvailable | boolean | 渠道一是否可用 |
+| channelTwoAvailable | boolean | 渠道二是否可用 |
+| channelThreeAvailable | boolean | 渠道三是否可用 |
+| gptInventoryAvailable | boolean | GPT库存是否可用 |
+| googleInventoryAvailable | boolean | Google库存是否可用 |
+| bankCardAvailable | boolean | 银行卡支付是否可用 |
+
+---
+
+## 3. 提交充值任务
+
+提交充值请求,创建充值任务。
+
+### 请求
+
+```
+POST /api/recharge/perform
+```
+
+### 请求头
+
+| Header | 值 |
+|--------|-----|
+| Content-Type | application/json |
+| Accept | application/json |
+| Origin | https://ow800.com |
+| Referer | https://ow800.com/ |
+
+### 请求体
+
+```json
+{
+    "cardInfo": "SPZOQEZH65IPY2M4",
+    "accessToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6...",
+    "fullToken": "{\"user\":{\"id\":\"user-xxx\",...}",
+    "userEmail": "example@qq.com",
+    "confirmed": true,
+    "account": {
+        "id": "6bb82f4c-5c12-40dc-99b9-e0d2b20e0e4a"
+    }
+}
+```
+
+### 请求参数说明
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| cardInfo | string | 是 | 卡密信息 |
+| accessToken | string | 是 | OpenAI访问令牌(JWT格式) |
+| fullToken | string | 是 | 完整令牌信息(JSON字符串) |
+| userEmail | string | 是 | 用户邮箱 |
+| confirmed | boolean | 是 | 是否已确认 |
+| account | object | 是 | 账户信息 |
+| account.id | string | 是 | 账户ID |
+
+### fullToken 结构说明
+
+`fullToken` 是一个JSON字符串,包含以下结构:
+
+```json
+{
+    "user": {
+        "id": "user-xxx",
+        "email": "example@qq.com",
+        "idp": "auth0",
+        "iat": 1759998592,
+        "mfa": true
+    },
+    "expires": "2026-02-24T01:07:13.367Z",
+    "account": {
+        "id": "6bb82f4c-5c12-40dc-99b9-e0d2b20e0e4a",
+        "planType": "free",
+        "structure": "personal",
+        "workspaceType": null,
+        "organizationId": null,
+        "isDelinquent": true,
+        "gracePeriodId": null
+    },
+    "accessToken": "eyJhbGciOiJSUzI1NiIs...",
+    "authProvider": "openai",
+    "rumViewTags": {
+        "light_account": {
+            "fetched": false
+        }
+    }
+}
+```
+
+### 响应
+
+#### 成功响应
+
+```json
+{
+    "code": 200,
+    "message": null,
+    "data": {
+        "usageId": 2814,
+        "success": true,
+        "processing": true,
+        "rechargeUrl": "https://pay.openai.com/c/pay/cs_live_xxx...",
+        "message": "任务已创建,等待充值结果",
+        "rechargeType": 1,
+        "bankCardId": 2025
+    },
+    "timestamp": 1764141428873,
+    "error": false,
+    "success": true
+}
+```
+
+#### 失败响应
+
+```json
+{
+    "code": 4000,
+    "message": "充值失败,请重新提交token",
+    "data": null,
+    "timestamp": 1764140594006,
+    "error": true,
+    "success": false
+}
+```
+
+### 成功响应 data 字段说明
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| usageId | number | 使用记录ID,用于后续查询状态 |
+| success | boolean | 任务创建是否成功 |
+| processing | boolean | 是否正在处理中 |
+| rechargeUrl | string | OpenAI支付链接 |
+| message | string | 状态消息 |
+| rechargeType | number | 充值类型 |
+| bankCardId | number | 银行卡ID |
+
+### 错误码
+
+| 错误码 | 消息 | 说明 |
+|--------|------|------|
+| 4000 | 充值失败,请重新提交token | Token无效或已过期 |
+
+---
+
+## 4. 查询任务状态
+
+根据 usageId 查询充值任务的当前状态。
+
+### 请求
+
+```
+GET /api/recharge/status?usageId={usageId}
+```
+
+### 请求头
+
+| Header | 值 |
+|--------|-----|
+| Accept | application/json |
+| Origin | https://ow800.com |
+| Referer | https://ow800.com/ |
+
+### 查询参数
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| usageId | number | 是 | 使用记录ID(从提交任务接口获取) |
+
+### 响应
+
+#### 进行中状态
+
+```json
+{
+    "code": 200,
+    "message": null,
+    "data": {
+        "usageId": 2814,
+        "status": 0,
+        "cardKey": "SPZOQEZH65IPY2M4",
+        "rechargeUrl": "https://pay.openai.com/c/pay/cs_live_xxx...",
+        "userEmail": "example@gmail.com",
+        "updatedAt": "2025-11-26 15:17:10",
+        "errorMessage": null,
+        "fullToken": "{...}",
+        "account": {
+            "id": "094a43f5-9cad-43e7-80f3-76d354b4bce5"
+        }
+    },
+    "timestamp": 1764141430164,
+    "error": false,
+    "success": true
+}
+```
+
+#### 成功状态
+
+```json
+{
+    "code": 200,
+    "message": null,
+    "data": {
+        "usageId": 2814,
+        "status": 2,
+        "cardKey": "SPZOQEZH65IPY2M4",
+        "rechargeUrl": "https://pay.openai.com/c/pay/cs_live_xxx...",
+        "userEmail": "example@gmail.com",
+        "updatedAt": "2025-11-26 15:18:49",
+        "errorMessage": null,
+        "fullToken": "{...}",
+        "account": {
+            "id": "094a43f5-9cad-43e7-80f3-76d354b4bce5"
+        }
+    },
+    "timestamp": 1764141531348,
+    "error": false,
+    "success": true
+}
+```
+
+### data 字段说明
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| usageId | number | 使用记录ID |
+| status | number | 任务状态(见状态码表) |
+| cardKey | string | 卡密密钥 |
+| rechargeUrl | string | OpenAI支付链接 |
+| userEmail | string | 用户邮箱 |
+| updatedAt | string | 最后更新时间 |
+| errorMessage | string \| null | 错误消息(失败时返回) |
+| fullToken | string | 完整令牌信息 |
+| account | object | 账户信息 |
+| account.id | string | 账户ID |
+
+### 任务状态码
+
+| 状态码 | 说明 |
+|--------|------|
+| 0 | 处理中 |
+| 2 | 充值成功 |
+
+---
+
+## 5. 查看任务日志
+
+获取指定充值任务的执行日志。
+
+### 请求
+
+```
+GET /api/bank-card-usage/{usageId}/logs
+```
+
+### 路径参数
+
+| 参数 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| usageId | number | 是 | 使用记录ID |
+
+### 请求头
+
+| Header | 值 |
+|--------|-----|
+| Accept | application/json |
+| Origin | https://ow800.com |
+| Referer | https://ow800.com/ |
+
+### 响应
+
+```json
+{
+    "code": 200,
+    "message": null,
+    "data": [
+        {
+            "code": "pageLoaded",
+            "en": "API loading...",
+            "detail": "任务 321 (k16x2o0o): 页面加载完成",
+            "zh": "api加载中...",
+            "timestamp": "2025-11-26T15:17:21.665248049"
+        },
+        {
+            "code": "submitClicked",
+            "en": "Submitting payment request...",
+            "detail": "已点击订阅按钮(鼠标点击)",
+            "zh": "提交支付请求...",
+            "timestamp": "2025-11-26T15:17:48.107304263"
+        },
+        {
+            "code": "checkingPayment",
+            "en": "Verifying payment...",
+            "detail": "status=already_paid, elapsed=3.28s",
+            "zh": "支付核验中...",
+            "timestamp": "2025-11-26T15:18:36.515406555"
+        }
+    ],
+    "timestamp": 1764141531171,
+    "error": false,
+    "success": true
+}
+```
+
+### data 数组元素说明
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| code | string | 日志事件代码 |
+| en | string | 英文描述 |
+| zh | string | 中文描述 |
+| detail | string | 详细信息 |
+| timestamp | string | 事件时间戳(ISO 8601格式) |
+
+### 日志事件代码
+
+| 代码 | 英文说明 | 中文说明 |
+|------|----------|----------|
+| pageLoaded | API loading... | api加载中... |
+| submitClicked | Submitting payment request... | 提交支付请求... |
+| checkingPayment | Verifying payment... | 支付核验中... |
+
+---
+
+## 完整调用流程
+
+```
+┌─────────────────┐
+│  1. 校验卡密    │
+│  POST /api/     │
+│  cards/verify   │
+└────────┬────────┘
+         │ 卡密有效
+         ▼
+┌─────────────────┐
+│ 2. 查询渠道状态  │
+│ GET /api/       │
+│ dashboard/stats │
+└────────┬────────┘
+         │ 渠道可用
+         ▼
+┌─────────────────┐
+│ 3. 提交充值任务  │
+│ POST /api/      │
+│ recharge/perform│
+└────────┬────────┘
+         │ 获取 usageId
+         ▼
+┌─────────────────┐
+│ 4. 轮询任务状态  │◄────┐
+│ GET /api/       │     │
+│ recharge/status │     │ status=0
+└────────┬────────┘     │ (处理中)
+         │              │
+         ├──────────────┘
+         │ status=2 (成功)
+         ▼
+┌─────────────────┐
+│ 5. 查看任务日志  │
+│ GET /api/bank-  │
+│ card-usage/logs │
+└─────────────────┘
+```
+
+---
+
+## 通用请求头
+
+所有请求建议携带以下请求头:
+
+```http
+Accept: application/json, text/plain, */*
+Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
+Origin: https://ow800.com
+Referer: https://ow800.com/
+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
+```
+
+---
+
+## 注意事项
+
+1. **Token有效期**: `accessToken` 和 `fullToken` 中的令牌有有效期限制,过期后需要重新获取
+2. **轮询间隔**: 查询任务状态时建议设置合理的轮询间隔(如3-5秒),避免频繁请求
+3. **跨域请求**: API支持来自 `https://ow800.com` 的跨域请求
+4. **错误处理**: 即使HTTP状态码为200,也需要检查响应体中的 `success` 和 `error` 字段判断实际结果

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio