All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 6m37s
新增苹果IAP相关接口与逻辑,包括产品列表查询、交易绑定、状态查询和恢复购买功能。移除旧的IAP验证逻辑,重构订阅系统以支持苹果IAP交易记录存储和权益计算。 - 新增/pkg/iap/apple包处理JWS解析和产品映射 - 实现GET /products、POST /attach、POST /restore和GET /status接口 - 新增apple_iap_transactions表存储交易记录 - 更新文档说明配置方式和接口规范 - 移除旧的AppleIAP验证和通知处理逻辑
56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package apple
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func ParseTransactionJWS(jws string) (*TransactionPayload, error) {
|
|
parts := strings.Split(jws, ".")
|
|
if len(parts) != 3 {
|
|
return nil, ErrInvalidJWS
|
|
}
|
|
payloadB64 := parts[1]
|
|
// add padding if required
|
|
switch len(payloadB64) % 4 {
|
|
case 2:
|
|
payloadB64 += "=="
|
|
case 3:
|
|
payloadB64 += "="
|
|
}
|
|
data, err := base64.RawURLEncoding.DecodeString(payloadB64)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var raw map[string]interface{}
|
|
if err = json.Unmarshal(data, &raw); err != nil {
|
|
return nil, err
|
|
}
|
|
var resp TransactionPayload
|
|
if v, ok := raw["bundleId"].(string); ok {
|
|
resp.BundleId = v
|
|
}
|
|
if v, ok := raw["productId"].(string); ok {
|
|
resp.ProductId = v
|
|
}
|
|
if v, ok := raw["transactionId"].(string); ok {
|
|
resp.TransactionId = v
|
|
}
|
|
if v, ok := raw["originalTransactionId"].(string); ok {
|
|
resp.OriginalTransactionId = v
|
|
}
|
|
if v, ok := raw["purchaseDate"].(float64); ok {
|
|
resp.PurchaseDate = time.UnixMilli(int64(v))
|
|
} else if v, ok := raw["purchaseDate"].(int64); ok {
|
|
resp.PurchaseDate = time.UnixMilli(v)
|
|
}
|
|
if v, ok := raw["revocationDate"].(float64); ok {
|
|
t := time.UnixMilli(int64(v))
|
|
resp.RevocationDate = &t
|
|
}
|
|
return &resp, nil
|
|
}
|
|
|