iap
This commit is contained in:
2
comm.go
2
comm.go
@ -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
4
iap.go
@ -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))
|
||||||
|
|
||||||
|
|||||||
7
main.go
7
main.go
@ -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
39
service.sh
Normal 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
13
user.go
@ -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))
|
||||||
// 这里不返回,继续尝试更新。
|
// 这里不返回,继续尝试更新。
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user