package test import ( "context" "encoding/json" "fmt" "github.com/wechatpay-apiv3/wechatpay-go/core" "github.com/wechatpay-apiv3/wechatpay-go/services/cashcoupons" "io" "os" "path/filepath" "time" "voucher/internal/biz/do" "voucher/internal/conf" "voucher/internal/data" ) var bc = &conf.Bootstrap{ Wechat: &conf.Wechat{ MchID: "1710953361", MchCertificateSerialNumber: "6006B8208815DB5EAC5BF2E783CB9D34082C3772", WechatPayPublicKeyID: "PUB_KEY_ID_0117109533612025031800326400002563", Name: "蓝色兄弟-new", }, } // bcFJXW Callback{NotifyUrl:https://nsall.86698.cn/wechatPay/coupon_notify/fjxingwang, Mchid:1652465541} var bcFJXW = &conf.Bootstrap{ Wechat: &conf.Wechat{ MchID: "1652465541", // notifyUrl https://nsall.86698.cn/wechatPay/coupon_notify/fjxingwang MchCertificateSerialNumber: "1E3F2CE013203BA9C3DEFC5782FCD3329C3DAC1C", WechatPayPublicKeyID: "PUB_KEY_ID_0116524655412025070900181741001803", Name: "福建兴旺", }, } // bcFJLF Callback{NotifyUrl:https://gateway.dev.cdlsxd.cn/voucher/v1/notify/1100040695, Mchid:1100040695} // /voucher/v1/notify/1100040695 var bcFJLF = &conf.Bootstrap{ Wechat: &conf.Wechat{ MchID: "1100040695", MchCertificateSerialNumber: "46712853869DB0EDAA9B4DF97DADEECD4CCDC85B", WechatPayPublicKeyID: "PUB_KEY_ID_0111000406952026032500382251001000", Name: "福建峦峰", }, } func SendCoupon() { ctx := context.Background() dir, err := os.Getwd() if err != nil { fmt.Printf("os.Getwd() error = %v", err) return } parentDir := filepath.Dir(dir) server := data.Server{ MchID: bc.Wechat.MchID, MchCertificateSerialNumber: bc.Wechat.MchCertificateSerialNumber, WechatPayPublicKeyID: bc.Wechat.WechatPayPublicKeyID, Dir: parentDir, } client, err := data.GetClient(ctx, server) if err != nil { fmt.Println(err) return } req := cashcoupons.SendCouponRequest{ OutRequestNo: core.String("LQ2011991700944699394"), // {CouponId:129623470711} // 微信为发券方商户分配的公众账号ID,接口传入的所有appid应该为公众号的appid(在mp.weixin.qq.com申请的),不能为APP的appid(在open.weixin.qq.com申请的)。 Appid: core.String("wxd27e255810842ba8"), Openid: core.String("o3dEt5b_1lFtKc-aAT3tiYjJIGwk"), StockId: core.String("21502886"), StockCreatorMchid: core.String("1652465541"), } fmt.Printf("\nreq:%+v", req) svc := cashcoupons.CouponApiService{Client: client} resp, result, err := svc.SendCoupon(ctx, req) if err != nil { fmt.Println(err) return } fmt.Printf("\nresp:%+v\n result:%+v", resp, result) return } func QueryCoupon() { ctx := context.Background() dir, err := os.Getwd() if err != nil { fmt.Printf("os.Getwd() error = %v", err) return } parentDir := filepath.Dir(dir) server := data.Server{ MchID: bc.Wechat.MchID, MchCertificateSerialNumber: bc.Wechat.MchCertificateSerialNumber, WechatPayPublicKeyID: bc.Wechat.WechatPayPublicKeyID, Dir: parentDir, } client, err := data.GetClient(ctx, server) if err != nil { fmt.Println(err) return } appId := "wx619991cc795028f5" openId := "oSNb4fnWoktz7YVNIXE5bvoB3-1w" couponId := "106048490308" req := cashcoupons.QueryCouponRequest{ CouponId: core.String(couponId), Appid: core.String(appId), Openid: core.String(openId), } svc := cashcoupons.CouponApiService{Client: client} resp, result, err := svc.QueryCoupon(ctx, req) if err != nil { fmt.Println(err) return } fmt.Printf("\nresp:%+v\n", resp) bodyBytes, err := io.ReadAll(result.Response.Body) if err != nil { fmt.Println(err) return } fmt.Printf("\nresult:%s\n", bodyBytes) return } func QueryProduct() { ctx := context.Background() dir, err := os.Getwd() if err != nil { fmt.Printf("os.Getwd() error = %v", err) return } parentDir := filepath.Dir(dir) server := data.Server{ MchID: bc.Wechat.MchID, MchCertificateSerialNumber: bc.Wechat.MchCertificateSerialNumber, WechatPayPublicKeyID: bc.Wechat.WechatPayPublicKeyID, Dir: parentDir, } client, err := data.GetClient(ctx, server) if err != nil { fmt.Println(err) return } req := cashcoupons.QueryStockRequest{ StockId: core.String("21923564"), StockCreatorMchid: core.String("1100040695"), } svc := cashcoupons.StockApiService{Client: client} resp, _, err := svc.QueryStock(ctx, req) if err != nil { fmt.Println(err) return } j, _ := json.Marshal(resp) fmt.Printf("\nresp:%s\n", string(j)) availableStock := *resp.StockUseRule.MaxCoupons - *resp.DistributedCoupons couponAmount := *resp.StockUseRule.FixedNormalCoupon.CouponAmount / 100 fmt.Printf("\n批次号:%s", *req.StockId) fmt.Printf("\n面额:%d", couponAmount) fmt.Printf("\n总预算:%d", *resp.StockUseRule.MaxAmount/100) fmt.Printf("\n总库存:%d", *resp.StockUseRule.MaxCoupons) fmt.Printf("\n已发券数:%d", *resp.DistributedCoupons) fmt.Printf("\n已发券金额:%d", *resp.DistributedCoupons*couponAmount) fmt.Printf("\n剩余库存:%d", availableStock) fmt.Printf("\n剩余预算:%d", availableStock*couponAmount) str, _ := json.Marshal(WxResp(resp)) fmt.Printf("\nWxResp:%+v", string(str)) return } func WxResp(wxResp *cashcoupons.Stock) (reps *do.WxResp) { availableStock := *wxResp.StockUseRule.MaxCoupons - *wxResp.DistributedCoupons couponAmount := *wxResp.StockUseRule.FixedNormalCoupon.CouponAmount / 100 remainingBudget := availableStock * couponAmount stockUsageRate := float64(*wxResp.DistributedCoupons) / float64(*wxResp.StockUseRule.MaxCoupons) * 100 req := &do.WxResp{ Amount: couponAmount, AllBudget: *wxResp.StockUseRule.MaxAmount / 100, AllStock: *wxResp.StockUseRule.MaxCoupons, UsedStock: *wxResp.DistributedCoupons, UsedBudget: *wxResp.DistributedCoupons * couponAmount, AvailableStock: availableStock, AvailableBudget: remainingBudget, StockUsageRate: stockUsageRate, } inputFormat := time.RFC3339 if wxResp.AvailableBeginTime != nil { availableBeginTime, _ := time.Parse(inputFormat, *wxResp.AvailableBeginTime) req.StartTime = &availableBeginTime } if wxResp.AvailableEndTime != nil { availableEndTime, _ := time.Parse(inputFormat, *wxResp.AvailableEndTime) req.EndTime = &availableEndTime } return req } func QueryCallback(bc *conf.Bootstrap) { ctx := context.Background() dir, err := os.Getwd() if err != nil { fmt.Printf("os.Getwd() error = %v", err) return } parentDir := filepath.Dir(dir) server := data.Server{ MchID: bc.Wechat.MchID, MchCertificateSerialNumber: bc.Wechat.MchCertificateSerialNumber, WechatPayPublicKeyID: bc.Wechat.WechatPayPublicKeyID, Dir: parentDir, } client, err := data.GetClient(ctx, server) if err != nil { fmt.Println(err) return } svc := cashcoupons.CallBackUrlApiService{Client: client} response, _, err := svc.QueryCallback(ctx, cashcoupons.QueryCallbackRequest{ Mchid: core.String(bc.Wechat.MchID), }) if err != nil { fmt.Println(err) return } fmt.Printf("\nresp:%+v\n", response) return } func SetCallback(bc *conf.Bootstrap) { ctx := context.Background() dir, err := os.Getwd() if err != nil { fmt.Printf("os.Getwd() error = %v", err) return } parentDir := filepath.Dir(dir) server := data.Server{ MchID: bc.Wechat.MchID, MchCertificateSerialNumber: bc.Wechat.MchCertificateSerialNumber, WechatPayPublicKeyID: bc.Wechat.WechatPayPublicKeyID, Dir: parentDir, } client, err := data.GetClient(ctx, server) if err != nil { fmt.Println(err) return } svc := cashcoupons.CallBackUrlApiService{Client: client} response, _, err := svc.SetCallback(ctx, cashcoupons.SetCallbackRequest{ Mchid: core.String(bc.Wechat.MchID), NotifyUrl: core.String("https://gateway.dev.cdlsxd.cn/voucher/v1/notify/" + bc.Wechat.MchID), Switch: core.Bool(true), }) if err != nil { fmt.Println(err) return } fmt.Printf("\nresp:%+v\n", response) return }