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 }