package test import ( "context" "encoding/base64" "encoding/json" "errors" "fmt" "net/http" "testing" "time" "voucher/internal/biz/bo" "voucher/internal/biz/businesserr" "voucher/internal/pkg/helper" "voucher/internal/pkg/supplier/qixing" "voucher/internal/pkg/wechat/utils" ) func Test_MarketingSend(t *testing.T) { tests := []struct { name string }{ { name: "给指定用户报名多笔立减活动", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { MarketingSend() }) } } func Test_MarketingQuery(t *testing.T) { appId := "wx619991cc795028f5" openId := "oSNb4fixFZ4uRvcP6F25_FySgUE0" couponId := "147079366189" tests := []struct { name string appId, openId, couponId string }{ { name: "查询绑定多笔立减活动的代金券详情", // 查询的商户非创建方商户 查询商户要为创建方商户 appId: appId, openId: openId, couponId: couponId, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { resp, err := MarketingQuery(tt.appId, tt.openId, tt.couponId) if err != nil { var e *utils.ApiException if errors.As(err, &e) { // 格式:{"code":"INVALID_REQUEST","message":"对应单号已超出重试期;请查单确认后决定是否换单请求"} var beer *businesserr.BusinessErr if err = json.Unmarshal(e.Body(), &beer); err != nil { t.Errorf("微信错误返回body解析报错,body:%s,err:%s", string(e.Body()), err.Error()) } t.Logf("MarketingQuery error,body:%s,err:%s", string(e.Body()), e.ErrCode) } else { t.Errorf("MarketingQuery() error = %v", err) } return } t.Logf("MarketingQuery() = %v", resp) }) } // 合单订单就是没有核销回调通知的 // {"code":"APPID_MCHID_NOT_MATCH","message":"商户号与AppID不匹配"} // APPID_MCHID_NOT_MATCH 商户号与AppID不匹配 调用接口的商户号需与接口传入的AppID有绑定关系 //openid不是自己的appid下的喔,这也能查询到吗” //不行的,需要是在自己appid下的才能查到 } func Test_QixingNotifyDataDecodeString(t *testing.T) { content := `eyJzdW1tYXJ5Ijoi5Luj6YeR5Yi45qC46ZSA6YCa55+lIiwiYXNzb2NpYXRlZF9kYXRhIjoiY291cG9uIiwiZXZlbnRfdHlwZSI6IkNPVVBPTi5VU0UiLCJjcmVhdGVfdGltZSI6IjIwMjUtMTItMjRUMTk6NDg6NDYrMDg6MDAiLCJwbGFpbl90ZXh0Ijp7InN0b2NrX2NyZWF0b3JfbWNoaWQiOiIxNzE1MzQ5NTc4Iiwic3RvY2tfaWQiOiIyMTQzODg1MSIsImNvdXBvbl9pZCI6IjE0NDQ2MTIyOTg5MCIsInNpbmdsZWl0ZW1fZGlzY291bnRfb2ZmIjpudWxsLCJkaXNjb3VudF90byI6bnVsbCwiY291cG9uX25hbWUiOiLpk7booYzljaHlpJrnrJTnq4vlh48iLCJzdGF0dXMiOiJVU0VEIiwiZGVzY3JpcHRpb24iOiIiLCJjcmVhdGVfdGltZSI6IjIwMjUtMTItMThUMTU6NDQ6NTIrMDg6MDAiLCJjb3Vwb25fdHlwZSI6Ik5PUk1BTCIsIm5vX2Nhc2giOmZhbHNlLCJhdmFpbGFibGVfYmVnaW5fdGltZSI6IjIwMjUtMTItMThUMDA6MDA6MDArMDg6MDAiLCJhdmFpbGFibGVfZW5kX3RpbWUiOiIyMDI2LTAxLTE2VDIzOjU5OjU5KzA4OjAwIiwic2luZ2xlaXRlbSI6ZmFsc2UsIm5vcm1hbF9jb3Vwb25faW5mb3JtYXRpb24iOnsiY291cG9uX2Ftb3VudCI6MzAwLCJ0cmFuc2FjdGlvbl9taW5pbXVtIjoxODAwfSwiY29uc3VtZV9pbmZvcm1hdGlvbiI6eyJjb25zdW1lX3RpbWUiOiIyMDI1LTEyLTI0VDE5OjQ4OjQ2KzA4OjAwIiwiY29uc3VtZV9tY2hpZCI6IjEyNzQ5Mzg2MDEiLCJ0cmFuc2FjdGlvbl9pZCI6IjQyMDAwMDI5MTcyMDI1MTIyNDgzODQ2MTg0MzgiLCJjb25zdW1lX2Ftb3VudCI6MzAwLCJnb29kc19kZXRhaWwiOm51bGx9fSwicmVzb3VyY2VfdHlwZSI6ImVuY3J5cHQtcmVzb3VyY2UiLCJvcmlnaW5hbF90eXBlIjoiY291cG9uIiwiaWQiOiI4NzkxZTMyZS0zYjFiLTViNDktYTNiNi1mYzY0YTc5NTVlZjEifQ==` b, err := base64.StdEncoding.DecodeString(content) if err != nil { t.Errorf("base64.StdEncoding.DecodeString() error = %v", err) return } t.Log(string(b)) } func Test_QixingNotifyData(t *testing.T) { //wxBody := `{"id":"4ab2699d-e91d-5460-9810-25fd6d4c69a5","create_time":"2025-12-08T17:54:24+08:00","resource_type":"encrypt-resource","event_type":"COUPON.USE","summary":"代金券核销通知","original_type":"coupon","associated_data":"coupon","plain_text":{"stock_creator_mchid":"1652465541","stock_id":"21386484","coupon_id":"142388354994","coupon_name":"银行卡多笔立减","description":"","status":"SENDED","create_time":"2025-12-08T17:50:48+08:00","coupon_type":"NORMAL","no_cash":false,"singleitem":false,"business_type":"","consume_information":{"consume_time":"2025-12-08T17:54:24+08:00","consume_mchid":"1274938601","transaction_id":"4200002996202512083063051834","consume_amount":16}}}` wxBody := `{"id":"4ab2699d-e91d-5460-9810-25fd6d4c69a6","create_time":"2025-12-08T17:54:24+08:00","resource_type":"encrypt-resource","event_type":"COUPON.USE","summary":"代金券核销通知","original_type":"coupon","associated_data":"coupon","plain_text":{"stock_creator_mchid":"1652465541","stock_id":"21386484","coupon_id":"118758145502","coupon_name":"银行卡多笔立减","description":"","status":"USED","create_time":"2025-12-08T17:50:48+08:00","coupon_type":"NORMAL","no_cash":false,"singleitem":false,"business_type":"","consume_information":{"consume_time":"2025-12-08T17:54:24+08:00","consume_mchid":"1274938601","transaction_id":"4200002996202512083063051834","consume_amount":16}}}` t.Log(len(wxBody)) content := base64.StdEncoding.EncodeToString([]byte(wxBody)) ciphertext := helper.Md5(content + "DrY1zLkOH01q0sN66vrmkdpbWsyb41ho") req := qixing.QiXingRequestBo{ Content: content, Timestamp: time.Now().UnixMilli(), Ciphertext: ciphertext, } b, _ := json.Marshal(req) t.Log(string(b)) // {"content":"base64(微信通知json对象数据)","timestamp":1765447477945,"ciphertext":"md5(base64(微信通知json对象数据)+key)"} //t.Logf(`{"content":"%s","timestamp":122345677890,"ciphertext":"%s"}`, content, ciphertext) } func Test_MarketingNotify(t *testing.T) { header := `{"Accept":["*/*"],"Cache-Control":["no-cache"],"Connection":["close"],"Content-Length":["1109"],"Content-Type":["application/json"],"Pragma":["no-cache"],"User-Agent":["Mozilla/4.0"],"Wechatpay-Nonce":["9OdaHVZ5OW75Wq0m1oQydpGCb4ONM2Wl"],"Wechatpay-Serial":["PUB_KEY_ID_0111000406952026032500382251001000"],"Wechatpay-Signature":["RtBgwpQebjUFhasnP3816IA0KoekMIYxqOnK79/EElILbDOpIDD1yE2ckpQ8Vb+/JJm15n5iHSQPL2MQ0xI4fDb4doaRiytIZxvr8EhxLGVmtjKmHrerTEIGf0wSoYofeE+RT4n25l06EAPNGVBmr4bd6VIhV7kz0Upmmlld4DhuDomAAjOxETd+Uy8ck2T9Y8kn31LF320DMRXrub7UG/n1PtKMI9XTHo+TRMBwVUvaWMchSVwUoqVzRejg0ogjCNE8YcxkEqx7hbvxiLPFEthGnSlZdg/0iHkCduxsiQSLo30xBTm1NYZbb1ww4nauajqNTowk5+2TeUONcQAW/g=="],"Wechatpay-Signature-Type":["WECHATPAY2-SHA256-RSA2048"],"Wechatpay-Timestamp":["1774579207"],"X-Forwarded-For":["121.51.58.169"],"X-Real-Ip":["121.51.58.169"]}` bodyBytes := []byte(`{"id":"8285f110-2fd9-5d05-9c0b-86a54be0a6ba","create_time":"2026-03-27T10:40:07+08:00","resource_type":"encrypt-resource","event_type":"COUPON.USE","summary":"代金券核销通知","resource":{"original_type":"coupon","algorithm":"AEAD_AES_256_GCM","ciphertext":"+64vCJPvAAikNVJ8IPRNWawVz/8rZtzNzrtFSSTxZs0x3YY91wypH7RnTcYdXQo7TMe89eha5+c1Cf/u2It4P/tfVx5F3CkW1epDY9v0dII3nKNHW291Nv+dGrYUsLdnfBK/EydUNrsSpSrleKvHkA5bd0qF3asuZ9uHEWeeCPtKa5+YNJY56sIRsyzJbkgJcnBTlGoeuWeGJzcQ3YCJIkPXYk25QJkGbvJpOrCZNhUVUtJlkuR5IGxiPP/pR55fGG2+J6akuUp9oKXxeXDlHnPTTVLfj14I2WeEp7E/+l6vqHQiFwtN5M9AY7362IdqxS27v227NoW41si5RINCc8Fu8iIj2UfccGzcFLIBUDiHREa9ZJayUMpe6FzKrLCZxfjvw9Z36WBFR6zWrgsW9gR5gwrltFgdkekZqDqDBbjBJKPQZdbpALszmg7+VkFMkgSBdkxPnHGwzDrbbW5d+CddWR6Dl1N8kl0588b8lh4Vgf3UtXIcSEJ8PEIk5Bm7lm/PaiRBJrGWz/1DZvEtbArQwbKudgcV9aEPcMk3Nk6lsCszI2BO39E34HyW8KsrVbogv7D2FO8jNw9BWxUKfKukNf33HsNW1k+P7+Fi/ZOtr9JnaBW8cCruK8OwUPYyZGAJWEyGvez4HU3GB+TpyHZ1jgbthDZtTA9UmZ0BcqUFnBZeiO44RzFSdG8y5hbAa3rn4PJa7SBhAO+/iK6r48FzYwk/wsNkxi0Pq3AVECwbE5Iqpe1MY+qXUsDWrw6X+sag2XkjUwNFLsd1gwldMjA=","associated_data":"coupon","nonce":"8LSgP6Pee83S"}`) httpHeaders := make(http.Header) if err := json.Unmarshal([]byte(header), &httpHeaders); err != nil { fmt.Printf("headers Unmarshal err: %+v\n", err) return } body, bizContent, err := marketingFJLF().Notify(context.Background(), &httpHeaders, bodyBytes) if err != nil { t.Errorf("notify err: %+v\n", err) return } var plainText bo.PlainText if err = json.Unmarshal([]byte(bizContent), &plainText); err != nil { t.Errorf("Unmarshal err: %+v\n", err) return } notifyBo := bo.WechatVoucherNotifyBo{ ID: body.Id, CreateTime: body.CreateTime, ResourceType: body.ResourceType, EventType: body.EventType, Summary: body.Summary, OriginalType: body.Resource.OriginalType, AssociatedData: body.Resource.AssociatedData, PlainText: plainText, } fmt.Printf("bizContent: %s\n", bizContent) fmt.Printf("notifyBo: %+v\n", notifyBo) }