This commit is contained in:
2024-08-17 04:29:48 +00:00
parent a55ef32347
commit 587c31e8cc
6 changed files with 60 additions and 5 deletions

BIN
aigrammar

Binary file not shown.

View File

@ -9,6 +9,8 @@ const (
KEY_HEADER_TIMEZONE = "timezone" KEY_HEADER_TIMEZONE = "timezone"
KEY_HEADER_SECONDSFROMGMT = "secondsfromgmt" KEY_HEADER_SECONDSFROMGMT = "secondsfromgmt"
KEY_LOCAL_TIMEZONE = "Asia/Shanghai"
// 定义每日免费次数 // 定义每日免费次数
DAILY_FREE_COUNT = 3 DAILY_FREE_COUNT = 3

4
iap.go
View File

@ -75,7 +75,7 @@ func IapVerify(c echo.Context) error {
if err := json.Unmarshal([]byte(request.ReceiptData), &jsonObj); err != nil { if err := json.Unmarshal([]byte(request.ReceiptData), &jsonObj); err != nil {
logger.Debug("receiptdata from request", zap.Any("receiptdata", request.ReceiptData)) // 打印日志 logger.Debug("receiptdata from request", zap.Any("receiptdata", request.ReceiptData)) // 打印日志
} else { } else {
logger.Debug("receiptdata from request", zap.Any("receiptdata", jsonObj)) // 打印日志 logger.Error("receiptdata from request", zap.Any("receiptdata", request.ReceiptData)) // 打印日志
} }
var isSandBox = true var isSandBox = true
@ -105,7 +105,7 @@ func IapVerify(c echo.Context) error {
return echo.NewHTTPError(http.StatusInternalServerError, "ParseSignedTransaction error") return echo.NewHTTPError(http.StatusInternalServerError, "ParseSignedTransaction error")
} }
logger.Debug("transantion", zap.Any("transantion", transantion)) // 打印日志 logger.Debug("transantion", zap.Any("transantion", transantion), zap.Any("request", request)) // 打印日志
//buff, _ := json.Marshal(&transantion) //buff, _ := json.Marshal(&transantion)
//fmt.Println(string(buff)) //fmt.Println(string(buff))

View File

@ -21,7 +21,14 @@ import (
var jwtSigningKey []byte var jwtSigningKey []byte
func main() { func main() {
//检查时区配置,需要包含东八区
_, err := time.LoadLocation(KEY_LOCAL_TIMEZONE)
if err != nil {
fmt.Println("Error loading location:", err)
return
}
// 获取配置
configManager, err := GetConfigManager() configManager, err := GetConfigManager()
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Failed to load config: %v\n", err) fmt.Fprintf(os.Stderr, "Failed to load config: %v\n", err)

39
service.sh Normal file
View File

@ -0,0 +1,39 @@
#!/bin/bash
# 确保脚本使用一个参数
if [ $# -ne 1 ]; then
echo "Usage: $0 {start|stop|restart}"
exit 1
fi
# 定义程序的目录路径
program_dir="/usr/local/aigrammar"
program_name="aigrammar"
log_file="output.log"
case "$1" in
start)
echo "Starting $program_name..."
cd $program_dir
nohup ./$program_name > $log_file 2>&1 &
echo "$program_name started."
;;
stop)
echo "Stopping $program_name..."
killall $program_name
echo "$program_name stopped."
;;
restart)
echo "Restarting $program_name..."
killall $program_name
sleep 2
cd $program_dir
nohup ./$program_name > $log_file 2>&1 &
echo "$program_name restarted."
;;
*)
echo "Unknown command: $1"
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

13
user.go
View File

@ -5,6 +5,7 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"strconv" "strconv"
"strings"
"time" "time"
"github.com/awa/go-iap/appstore/api" "github.com/awa/go-iap/appstore/api"
@ -60,8 +61,8 @@ func queryUserHandler(c echo.Context) error {
} }
} }
// 查询 vip 表 // 查询 vip 表因为可能VIP过期所以要加上时间戳的判断。这里的服务器是东八区时间。
err = db.MySQL.QueryRow("SELECT IsVIP FROM vip WHERE ID = ?", response.ID).Scan(&response.VIP) err = db.MySQL.QueryRow("SELECT IsVIP FROM vip WHERE ID = ? and ExpDate >= ?", response.ID, time.Now()).Scan(&response.VIP)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
response.VIP = 0 // 默认非VIP response.VIP = 0 // 默认非VIP
} else if err != nil { } else if err != nil {
@ -188,6 +189,12 @@ func UpdateOrderByVerify(ID int, AppAcountToken string, OriginTransID string, tr
currentTime := time.Now() currentTime := time.Now()
nextDay := time.Now().AddDate(0, 0, Duration) nextDay := time.Now().AddDate(0, 0, Duration)
// 如果是Sandbox交易那么直接使用Transaction中的过期时间注意匹配时区
if strings.EqualFold(string(transantion.Environment), "Sandbox") {
nextDay = time.Unix(transantion.ExpiresDate/1000, 0).In(time.Local)
logger.Debug("Sandbox ExpireDate", zap.Any("ExpireDate", nextDay), zap.Any("NowDate", currentTime))
}
// TODO: transaction.TransactionReason 有新购和续费,需要区分;同一个购买或者续费事件,可能有通知多次,需要排重 // TODO: transaction.TransactionReason 有新购和续费,需要区分;同一个购买或者续费事件,可能有通知多次,需要排重
var tmpID int var tmpID int
errDup := db.MySQL.QueryRow("SELECT ID from vip where TransactionID = ? and OriginalTransactionID = ? and IsVip = 1 and ExpDate > ?", transantion.TransactionID, transantion.OriginalTransactionId, currentTime).Scan(&tmpID) errDup := db.MySQL.QueryRow("SELECT ID from vip where TransactionID = ? and OriginalTransactionID = ? and IsVip = 1 and ExpDate > ?", transantion.TransactionID, transantion.OriginalTransactionId, currentTime).Scan(&tmpID)
@ -196,7 +203,7 @@ func UpdateOrderByVerify(ID int, AppAcountToken string, OriginTransID string, tr
logger.Info("duplicate request", zap.Int("ID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID), zap.String("TransactionID", transantion.TransactionID)) logger.Info("duplicate request", zap.Int("ID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID), zap.String("TransactionID", transantion.TransactionID))
return nil return nil
} else if errDup != nil { } else if errDup != nil {
logger.Error("query error", zap.Error(errDup), zap.Int("ID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID)) logger.Info("prepare to insert record", zap.Int("ID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID))
// 这里不返回,继续尝试更新。 // 这里不返回,继续尝试更新。
} }