feat(purchase): 新增 Apple 内购完整链路

- AppleReceiptController 改造:验签后立刻落库并解锁权益
- 新增 ApplePurchaseService 处理业务:防重、写订单、发道具
- 新增 KeyboardUserPurchaseRecords 实体与 Mapper,记录用户购买
- ErrorCode 补充 RECEIPT_INVALID(50016)
- 删除过期 AGENTS.md,修正 i18n_message 表名与 CORS 白名单
This commit is contained in:
2025-12-12 18:18:55 +08:00
parent 2e16183cb8
commit a24a795887
16 changed files with 491 additions and 42 deletions

View File

@@ -3,7 +3,7 @@
<mapper namespace="com.yolo.keyborad.mapper.I18nMessageMapper">
<resultMap id="BaseResultMap" type="com.yolo.keyborad.model.entity.I18nMessage">
<!--@mbg.generated-->
<!--@Table i18n_message-->
<!--@Table keyboard_i18n_message-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="code" jdbcType="VARCHAR" property="code" />
<result column="locale" jdbcType="VARCHAR" property="locale" />
@@ -15,6 +15,6 @@
</sql>
<select id="selectByCodeAndLocale" resultMap="BaseResultMap">
SELECT * FROM "i18n_message" WHERE code = #{code,jdbcType=VARCHAR} AND locale = #{locale,jdbcType=VARCHAR}
SELECT * FROM "keyboard_i18n_message" WHERE code = #{code,jdbcType=VARCHAR} AND locale = #{locale,jdbcType=VARCHAR}
</select>
</mapper>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yolo.keyborad.mapper.KeyboardUserPurchaseRecordsMapper">
<resultMap id="BaseResultMap" type="com.yolo.keyborad.model.entity.KeyboardUserPurchaseRecords">
<!--@mbg.generated-->
<!--@Table keyboard_user_purchase_records-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="user_id" jdbcType="INTEGER" property="userId" />
<result column="product_id" jdbcType="VARCHAR" property="productId" />
<result column="purchase_quantity" jdbcType="INTEGER" property="purchaseQuantity" />
<result column="price" jdbcType="NUMERIC" property="price" />
<result column="currency" jdbcType="VARCHAR" property="currency" />
<result column="purchase_time" jdbcType="TIMESTAMP" property="purchaseTime" />
<result column="purchase_type" jdbcType="VARCHAR" property="purchaseType" />
<result column="status" jdbcType="VARCHAR" property="status" />
<result column="payment_method" jdbcType="VARCHAR" property="paymentMethod" />
<result column="transaction_id" jdbcType="VARCHAR" property="transactionId" />
<result column="original_transaction_id" jdbcType="VARCHAR" property="originalTransactionId" />
<result column="product_ids" jdbcType="VARCHAR" property="productIds" />
<result column="purchase_date" jdbcType="TIMESTAMP" property="purchaseDate" />
<result column="expires_date" jdbcType="TIMESTAMP" property="expiresDate" />
<result column="environment" jdbcType="VARCHAR" property="environment" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, user_id, product_id, purchase_quantity, price, currency, purchase_time, purchase_type,
"status", payment_method, transaction_id, original_transaction_id, product_ids, purchase_date,
expires_date, environment
</sql>
</mapper>