All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 6m41s
新增通过transaction_id附加苹果交易的功能,包括: 1. 添加AttachAppleTransactionByIdRequest类型和对应路由 2. 实现AppleIAPConfig配置模型 3. 添加ServerAPI获取交易信息的实现 4. 优化JWS解析逻辑,增加cleanB64函数处理空格 5. 完善苹果通知处理逻辑的日志和注释
60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package apple
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"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
|
|
}
|
|
payloadB64 := cleanB64(parts[1])
|
|
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
|
|
}
|
|
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
|
|
}
|