优化结构
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user