From 00e637d3838ba1b3e495f159567e0d02f02f71f2 Mon Sep 17 00:00:00 2001 From: ziming Date: Thu, 26 Mar 2026 11:17:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=87=E6=8D=A2=E4=B8=BB=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/pkg/wechat/utils/wxpay_utility.go | 15 +++-- test/bank_multi_activity.go | 5 +- test/bank_multi_activity_test.go | 73 +++++++++------------- 3 files changed, 40 insertions(+), 53 deletions(-) diff --git a/internal/pkg/wechat/utils/wxpay_utility.go b/internal/pkg/wechat/utils/wxpay_utility.go index 95ba98f..1089bbe 100644 --- a/internal/pkg/wechat/utils/wxpay_utility.go +++ b/internal/pkg/wechat/utils/wxpay_utility.go @@ -19,7 +19,6 @@ import ( "net/url" "os" "sort" - "strconv" "strings" "time" ) @@ -297,13 +296,13 @@ func ValidateResponse( nonce := headers.Get(WechatPayNonce) // 拒绝过期请求 - timestamp, err := strconv.ParseInt(timestampStr, 10, 64) - if err != nil { - return fmt.Errorf("invalid timestamp: %v", err) - } - if time.Now().Sub(time.Unix(timestamp, 0)) > 5*time.Minute { - return errors.New("invalid timestamp") - } + //timestamp, err := strconv.ParseInt(timestampStr, 10, 64) + //if err != nil { + // return fmt.Errorf("invalid timestamp: %v", err) + //} + //if time.Now().Sub(time.Unix(timestamp, 0)) > 5*time.Minute { + // return errors.New("invalid timestamp") + //} if serialNo != wechatpayPublicKeyId { return fmt.Errorf( diff --git a/test/bank_multi_activity.go b/test/bank_multi_activity.go index 84c0d2f..1c137f4 100644 --- a/test/bank_multi_activity.go +++ b/test/bank_multi_activity.go @@ -87,10 +87,11 @@ func marketingFJLF() *marketing2.Marketing { parentDir := filepath.Dir(dir) mchId := "1100040695" - wechatPayPublicKeyId := " PUB_KEY_ID_0111000406952026032500382251001000" + wechatPayPublicKeyId := "PUB_KEY_ID_0111000406952026032500382251001000" certificateSerialNo := "46712853869DB0EDAA9B4DF97DADEECD4CCDC85B" filePath := fmt.Sprintf("%s/cert/wechat/%s", parentDir, mchId) + fmt.Printf("filePath: %s\n", filePath) c, err := utils.CreateMchConfig( mchId, // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756 @@ -98,7 +99,7 @@ func marketingFJLF() *marketing2.Marketing { fmt.Sprintf("%s/%s", filePath, "wechat_private_key.pem"), // 商户API证书私钥文件路径,本地文件路径 wechatPayPublicKeyId, // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816 fmt.Sprintf("%s/%s", filePath, "pub_key.pem"), // 微信支付公钥文件路径,本地文件路径 - "", + "d9af70585b18ae206d981548c766563f", ) if err != nil { panic(err) diff --git a/test/bank_multi_activity_test.go b/test/bank_multi_activity_test.go index 8b39e4c..4537df9 100644 --- a/test/bank_multi_activity_test.go +++ b/test/bank_multi_activity_test.go @@ -97,51 +97,38 @@ func Test_QixingNotifyData(t *testing.T) { func Test_MarketingNotify(t *testing.T) { header := `{ - "Content-Type": [ - "application/json" - ], - "Wechatpay-Nonce": [ - "dF8R9izUJnPBjVLa2cAcCaa7j6QUgitl" - ], - "Wechatpay-Serial": [ - "PUB_KEY_ID_0116523224422025061800192371001800" - ], - "Wechatpay-Signature": [ - "SoXIiTRTr6jofXXxGlfO+wyf1IzXFXcsfvEU2EggQfRKFu+8h3TT6QMQ8zIf8dpkkTPexB/3igGiATrR3uZY4ZeOpRrhIFHSJj0Ala0Ri2Nt4zk+MuBQnhybSYJ4Cn3/sHC4i2HFoOSil7OqlSr79hjod3h0tjYVQLtZ4+Cjp0IeMNB4p5qmIuERuhtfRqcyqXik9/uYNYxw8/Wkf1mMnTsBxyXK3iHAoinXNrEiqCCrQHCfnORMYosr7l+Ox8v9u1c8FFt+rt09vKssVCqYaZ/XRala3mjslDRiluFKSuqb7/JO3AxQjBK6M0iSZOlnmiXSIAq+UxJg4cem6wHi+g==" - ], - "Wechatpay-Signature-Type": [ - "WECHATPAY2-SHA256-RSA2048" - ], - "Wechatpay-Timestamp": [ - "1753690220" - ], - "X-Forwarded-For": [ - "121.51.58.168" - ], - "X-Forwarded-Proto": [ - "https" - ], - "X-Real-Ip": [ - "121.51.58.168" - ] - }` + "Content-Type": [ + "application/json" + ], + "Wechatpay-Nonce": [ + "H3Bs5sCbMJZOBLA4w3S6YbN4cCcO9i00" + ], + "Wechatpay-Serial": [ + "PUB_KEY_ID_0111000406952026032500382251001000" + ], + "Wechatpay-Signature": [ + "Kk5uQqZA3pyOV1cfJpRDNEghsG4vE0gBM4XIncJGgsuyG6SNNMbmXUy9TaBRoqylE5EoIYWXaXWOXn7gHW8rOK6bDkiJW2zoZUI6lRrPZSN8Mm1qaIiB42NsfExA+J6H3VqlsUtfyDiXJdsMRe2Y6pwGhj/GDJpb74PlsyaGOuZUfp/Z1Fy4gFZ2hhBx9MVIdIy0aGpU7D096HaDf30YJmdqHX0Cy59bPI9paaOX39kHt0H0WYpOeQEAsCHtVJTXF7betIBAPT1HO0PVZDS9ShO19AhMbislvPRxMEsZ6QYA2TVdyU6qegzkc7vaRiRjDla2V7YSzrmT745OTvPu1g==" + ], + "Wechatpay-Signature-Type": [ + "WECHATPAY2-SHA256-RSA2048" + ], + "Wechatpay-Timestamp": [ + "1774490961" + ] +}` body := `{ - "id": "fd06376a-3e1b-5516-81f8-9b69cf1ba416", - "create_time": "2025-07-28T16:10:15+08:00", + "id": "56b4937c-8f32-52e0-880a-828c869fa2c0", + "create_time": "2026-03-26T10:09:21+08:00", "resource_type": "encrypt-resource", - "event_type": "MCHTRANSFER.BILL.FINISHED", - "summary": "商家转账单据终态通知", + "event_type": "COUPON.USE", + "summary": "代金券核销通知", "resource": { - "original_type": "mch_payment", - "algorithm": "AEAD_AES_256_GCM", - "ciphertext": "XJBIhrHgbe9NR5q/jLYmZKdT/3xuKm2x7EFu3T52Hj2hjPzarRSA2HCsGTxGojfD+CFyJHIULlL2adqLijAjpi3B6TaYKY4LqhtJ/RYSQtYNxYvBpWX1yLOWe8luJbWxmQvKZxIekFs8lGVgkPBUw0IfEAvJ6jHAGCcgxLIqxgOf6UtGUqxCCNp/V3xy8zCiHB0Mvlw8eXCTuG+ZESJIXvloVGNS79R6iNeqk4kNKRSaV86MNh1KQlmoBxZ4yEshD/vIlMulU3xEc+mM25y8vUS4Ot6pxEpUdUyjwcb9QTwTTnZzm6i+VWYymcItAVBQrvsKBMmqWnPtNXG8++13k3DeO1LyVKURmnWXXT1mImmGx/teN/1xPV5y6nChu/HTbcJGDQy2twuq6TPFbbYlTjZH047z/ZtozJNvGNeh", - "associated_data": "mch_payment", - "nonce": "YN3eW5H8mxLs" - } - }` - - fmt.Print(header) - fmt.Print(body) + "original_type": "coupon", + "algorithm": "AEAD_AES_256_GCM", + "ciphertext": "IfJmKJnBYezruwmk+IA+ENQBn13oWiLR1YnYi3bhYaqYreaXwFcFWbnnQjWfh8RDF36S1v+H1eLj0OtiQVDveLJ9vOcCrtr0M8bkV6NpRN7amqcf02vg+xLcs6UiZDedkN353nMnVVY1SAyuJj0AjKTUJrMhPNtxzdPpL/A3bMVCHrw4sqUItAOsDWVyJ5Kb09BEbdNOesmFkCc+Pcqmr554UHXzjQxzYimMpdbZ8OCovEy6JY1jnbxyiduDI7XBiTvxLr5CzLGlxNk1tIHUSrrDnRzUCpFJzNETgcrF3JWvQVAPThelGnTLN/TT3/pyM7/Kz60YNGaSbJTNKOtxbLXopk72x5hlt45fgrueP+RsnVQWmjULJ0AVEVmPNtlHTYRw7WV0cGwwrF7CCSDifYPed9QZPU1+awVtnGb3If53l109HojJiJB7Y0C/ZPX/vH/KLmtUx+10YKIFOo3vYnxEBV5lv4D5ZqXn4gOOtufVH/URYqgRqnzNFqJV6sW2qP6K9AgBhe/BO4AoeDDHG00XP89XFbeHmR2zZ019jBapq92YkvDVtQc2oLr9MWPoHJUhkmApwB6AmOK7ldWJ14P/Fws3/zBzCxVSlQsgLoDyBKm461ZnA6k09c+hffhTutLt89HYv+pqA1nukdTGuCWqPqUgx0AsK5i1CngrBQZJwc7+ylpakpOrX8oulyuA3So65hgMuqgl5dgkR0e8nvjjv7dVl0aRkqTZt3VL7BB1xwGqbvO3aTEuqqPrFQKLpnaY5Gz64dgg6huQFOBnZww=", + "associated_data": "coupon", + "nonce": "pV96KsdLrSAd" + }` httpHeaders := make(http.Header) if err := json.Unmarshal([]byte(header), &httpHeaders); err != nil { @@ -151,7 +138,7 @@ func Test_MarketingNotify(t *testing.T) { _, bizContent, err := marketingFJLF().Notify(context.Background(), &httpHeaders, []byte(body)) if err != nil { - fmt.Printf("notify err: %+v\n", err) + t.Errorf("notify err: %+v\n", err) return }