feat(core): 新增苹果 App Store 订阅票据校验与向量存储结构升级

- 引入 Apple App Store Server Library,完成票据验证、续订、退款通知全套流程
- 新增 AppleReceiptController / AppleReceiptService 及相关配置类,支持沙箱与生产环境双端点
- 向量存储接口升级:EmbedSaveReq 封装向量与业务实体,QdrantVectorService 改为 JSON 字符串载荷并补全异常处理
- 补充 Apple 根证书与订阅密钥资源文件,pom 与 yml 增加对应依赖与配置
This commit is contained in:
2025-11-14 15:48:12 +08:00
parent 9170f93d67
commit f60ee2df3d
16 changed files with 514 additions and 26 deletions

View File

@@ -0,0 +1,27 @@
package com.yolo.keyborad.controller;
import com.yolo.keyborad.model.dto.AppleReceiptValidationResult;
import com.yolo.keyborad.service.AppleReceiptService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/api/apple")
public class AppleReceiptController {
private final AppleReceiptService appleReceiptService;
public AppleReceiptController(AppleReceiptService appleReceiptService) {
this.appleReceiptService = appleReceiptService;
}
@PostMapping("/validate-receipt")
public AppleReceiptValidationResult validateReceipt(@RequestBody Map<String, String> body) {
String receipt = body.get("receipt");
return appleReceiptService.validateReceipt(receipt);
}
}

View File

@@ -1,8 +1,11 @@
package com.yolo.keyborad.controller;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONUtil;
import com.yolo.keyborad.common.BaseResponse;
import com.yolo.keyborad.common.ResultUtils;
import com.yolo.keyborad.model.dto.EmbedSaveReq;
import com.yolo.keyborad.model.dto.IosPayVerifyReq;
import com.yolo.keyborad.service.impl.QdrantVectorService;
import io.qdrant.client.QdrantClient;
@@ -82,8 +85,10 @@ public class DemoController {
@PostMapping("/testSaveEmbed")
@Operation(summary = "测试存储向量接口", description = "测试存储向量接口")
@Parameter(name = "userInput",required = true,description = "测试存储向量接口")
public BaseResponse<Boolean> testSaveEmbed( @RequestBody List<Float> userInput) throws Exception {
qdrantVectorService.upsertPoint(1L, userInput, null);
public BaseResponse<Boolean> testSaveEmbed(@RequestBody EmbedSaveReq embedSaveReq) {
qdrantVectorService.upsertPoint(embedSaveReq.getRecordItem().getId()
, embedSaveReq.getVector()
, JSONUtil.toJsonStr(embedSaveReq.getRecordItem()));
return ResultUtils.success(true);
}
}