hi-server/pkg/iap/apple/notification.go
shanshanzhong b391c12c1b
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 6m28s
refactor(apple): 优化base64解码和JWT签名逻辑
移除notification.go中冗余的base64解码代码,使用统一的decodeB64URL函数处理
在serverapi.go中改进ES256签名实现,正确处理P-256曲线的R和S值填充
2025-12-15 23:59:46 -08:00

52 lines
1.2 KiB
Go

package apple
import (
"encoding/json"
"strings"
)
type NotificationEnvelope struct {
NotificationType string
TransactionJWS string
}
func ParseNotificationSignedPayload(jws string) (*NotificationEnvelope, error) {
parts := strings.Split(strings.TrimSpace(jws), ".")
if len(parts) != 3 {
return nil, ErrInvalidJWS
}
data, err := decodeB64URL(parts[1])
if err != nil {
return nil, err
}
var raw map[string]interface{}
if err = json.Unmarshal(data, &raw); err != nil {
return nil, err
}
env := &NotificationEnvelope{}
if v, ok := raw["notificationType"].(string); ok {
env.NotificationType = v
}
if d, ok := raw["data"].(map[string]interface{}); ok {
if sjws, ok := d["signedTransactionInfo"].(string); ok {
env.TransactionJWS = sjws
}
}
return env, nil
}
func VerifyNotificationSignedPayload(jws string) (*TransactionPayload, string, error) {
env, err := ParseNotificationSignedPayload(jws)
if err != nil {
return nil, "", err
}
if env.TransactionJWS == "" {
return nil, env.NotificationType, ErrInvalidJWS
}
tx, err := VerifyTransactionJWS(env.TransactionJWS)
if err != nil {
return nil, env.NotificationType, err
}
return tx, env.NotificationType, nil
}