优化结构

This commit is contained in:
Yvan
2026-08-27 22:33:43 +08:00
parent 5052835fcb
commit e407d3ac10
86 changed files with 3151 additions and 726 deletions
-20
View File
@@ -11,26 +11,6 @@ import (
"strings"
)
func WechatV2Sign(values map[string]string, key, signType string) string {
keys := make([]string, 0, len(values))
for k, v := range values {
if k != "sign" && v != "" {
keys = append(keys, k)
}
}
sort.Strings(keys)
parts := make([]string, 0, len(keys))
for _, k := range keys {
parts = append(parts, k+"="+values[k])
}
raw := strings.Join(parts, "&") + "&key=" + key
if strings.EqualFold(signType, "HMAC-SHA256") {
return HMACSHA256Hex([]byte(raw), key, true)
}
sum := md5.Sum([]byte(raw))
return strings.ToUpper(hex.EncodeToString(sum[:]))
}
func MD5Canonical(values map[string]any, secret string) string {
keys := make([]string, 0, len(values))
for key, value := range values {
-12
View File
@@ -1,12 +0,0 @@
package paymentutil
import "testing"
func TestWechatV2SignIsStableAndExcludesSign(t *testing.T) {
values := map[string]string{"b": "2", "a": "1", "sign": "old"}
first := WechatV2Sign(values, "secret", "MD5")
values["sign"] = "different"
if second := WechatV2Sign(values, "secret", "MD5"); first != second {
t.Fatalf("signature changed when sign field changed: %q != %q", first, second)
}
}
+17 -3
View File
@@ -7,11 +7,11 @@ import (
func NormalizeStatus(value, fallback string) string {
switch strings.ToUpper(strings.TrimSpace(value)) {
case "SUCCESS", "PAID", "TRADE_SUCCESS", "TRADE_FINISHED", "COMPLETED", "PAY_SUCCESS":
case "SUCCESS", "OK", "PAID", "TRADE_SUCCESS", "TRADE_FINISHED", "COMPLETED", "PAY_SUCCESS", "REFUND_SUCCESS", "REFUNDED":
return "success"
case "WAIT_BUYER_PAY", "USERPAYING", "NOTPAY", "PROCESSING", "PENDING", "CREATED", "ACCEPT", "PAYING":
case "WAIT_BUYER_PAY", "USERPAYING", "NOTPAY", "PROCESSING", "PENDING", "CREATED", "ACCEPT", "ACCEPTED", "PAYING":
return "pending"
case "CLOSED", "TRADE_CLOSED", "CANCELLED", "CANCELED", "REVOKED", "REFUND", "REFUNDED", "FAILED", "FAIL", "PAYERROR":
case "CLOSED", "TRADE_CLOSED", "CANCELLED", "CANCELED", "REVOKED", "REFUND", "FAILED", "FAIL", "REJECTED", "DENIED", "DECLINED", "ERROR", "PAYERROR":
return "failed"
default:
return fallback
@@ -51,6 +51,20 @@ func ContainsFold(values []string, value string) bool {
return false
}
func Text(values map[string]any, key string) string {
value, _ := values[key].(string)
return value
}
func FirstText(values map[string]any, keys ...string) string {
for _, key := range keys {
if value := Text(values, key); value != "" {
return value
}
}
return ""
}
func toString(value any) string {
if value == nil {
return ""
+10 -20
View File
@@ -176,36 +176,26 @@ func (s *Server) OnDisconnect(handler func(*melody.Session)) {
s.mu.Unlock()
}
func snapshotHandlers[T any](mu *sync.RWMutex, handlers []T) []T {
mu.RLock()
defer mu.RUnlock()
return append([]T(nil), handlers...)
}
func (s *Server) messageHandlerSnapshot() []func(*melody.Session, []byte) {
s.mu.RLock()
defer s.mu.RUnlock()
handlers := make([]func(*melody.Session, []byte), len(s.messageHandlers))
copy(handlers, s.messageHandlers)
return handlers
return snapshotHandlers(&s.mu, s.messageHandlers)
}
func (s *Server) binaryHandlerSnapshot() []func(*melody.Session, []byte) {
s.mu.RLock()
defer s.mu.RUnlock()
handlers := make([]func(*melody.Session, []byte), len(s.binaryHandlers))
copy(handlers, s.binaryHandlers)
return handlers
return snapshotHandlers(&s.mu, s.binaryHandlers)
}
func (s *Server) connectHandlerSnapshot() []func(*melody.Session) {
s.mu.RLock()
defer s.mu.RUnlock()
handlers := make([]func(*melody.Session), len(s.connectHandlers))
copy(handlers, s.connectHandlers)
return handlers
return snapshotHandlers(&s.mu, s.connectHandlers)
}
func (s *Server) disconnectHandlerSnapshot() []func(*melody.Session) {
s.mu.RLock()
defer s.mu.RUnlock()
handlers := make([]func(*melody.Session), len(s.disconnectHandlers))
copy(handlers, s.disconnectHandlers)
return handlers
return snapshotHandlers(&s.mu, s.disconnectHandlers)
}
func (s *Server) Send(session *melody.Session, message []byte) error {
if session == nil {