jimmyyem 5 ヶ月 前
コミット
f03d136e8d

+ 10 - 0
desc/wechat/wx_card.api

@@ -98,6 +98,12 @@ type (
         // WxCard information | WxCard数据
         Data WxCardInfo `json:"data"`
     }
+
+	QrcodeReq {
+		Path string `form:"path"`
+		Width int64 `form:"width"`
+		EnvVersion string `form:"envVersion"`
+	}
 )
 
 @server(
@@ -110,6 +116,10 @@ service Wechat {
 	// Get wx card by ID | 通过ID获取WxCard
 	@handler getApiWxCardDetail
 	post /api/card/detail (IDReq) returns (WxCardInfoResp)
+
+	// Get wx card share qrcode | 通过小程序分享二维码
+	@handler getApiWxCardQrcode
+	get /api/card/qrcode (QrcodeReq)
 }
 
 @server(

+ 27 - 0
hook/wechat/client.go

@@ -0,0 +1,27 @@
+package wechat
+
+import (
+	"fmt"
+	mini "github.com/ArtisanCloud/PowerWeChat/v2/src/miniProgram"
+)
+
+// NewClient 获取操作小程序的实例
+func NewClient(AppId, Secret string) (*mini.MiniProgram, error) {
+	client, err := mini.NewMiniProgram(&mini.UserConfig{
+		AppID:     AppId,
+		Secret:    Secret,
+		HttpDebug: true,
+		Debug:     false,
+		// 可选,不传默认走程序内存
+		//Cache: kernel.NewRedisClient(&kernel.RedisOptions{
+		//	Addr:     RedisAddr,
+		//	Password: "",
+		//	DB:       0,
+		//}),
+	})
+	if err != nil {
+		fmt.Printf("init wechat miniprogram failed")
+	}
+
+	return client, err
+}

+ 5 - 0
internal/handler/routes.go

@@ -1142,6 +1142,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 					Path:    "/api/card/detail",
 					Handler: wxcard.GetApiWxCardDetailHandler(serverCtx),
 				},
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/card/qrcode",
+					Handler: wxcard.GetApiWxCardQrcodeHandler(serverCtx),
+				},
 			}...,
 		),
 		rest.WithJwt(serverCtx.Config.Auth.AccessSecret),

+ 42 - 0
internal/handler/wxcard/get_api_wx_card_qrcode_handler.go

@@ -0,0 +1,42 @@
+package wxcard
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/wxcard"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+// swagger:route post /api/card/qrcode wxcard GetApiWxCardQrcode
+//
+// Get wx card share qrcode | 通过小程序分享二维码
+//
+// Get wx card share qrcode | 通过小程序分享二维码
+//
+// Parameters:
+//  + name: body
+//    require: true
+//    in: body
+//    type: QrcodeReq
+//
+
+func GetApiWxCardQrcodeHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.QrcodeReq
+		if err := httpx.Parse(r, &req, true); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := wxcard.NewGetApiWxCardQrcodeLogic(r.Context(), svcCtx)
+		l.GetApiWxCardQrcode(&req, w)
+		//if err != nil {
+		//	httpx.ErrorCtx(r.Context(), w, err)
+		//} else {
+		//	httpx.Ok(w)
+		//}
+	}
+}

+ 3 - 16
internal/logic/User/do_api_user_login_logic.go

@@ -7,12 +7,12 @@ import (
 	"time"
 	"wechat-api/ent"
 	"wechat-api/ent/wxcarduser"
+	"wechat-api/hook/wechat"
 	"wechat-api/internal/svc"
 	"wechat-api/internal/types"
 	"wechat-api/internal/utils/dberrorhandler"
 	"wechat-api/internal/utils/jwt"
 
-	mini "github.com/ArtisanCloud/PowerWeChat/v2/src/miniProgram"
 	"github.com/zeromicro/go-zero/core/logx"
 )
 
@@ -32,24 +32,11 @@ func NewDoApiUserLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Do
 func (l *DoApiUserLoginLogic) DoApiUserLogin(req *types.UserLoginReq) (*types.UserLoginResp, error) {
 	var err error
 
-	Appid := l.svcCtx.Config.Miniprogram.Appid
+	AppId := l.svcCtx.Config.Miniprogram.Appid
 	Secret := l.svcCtx.Config.Miniprogram.Secret
-	//RedisAddr := l.svcCtx.Config.Miniprogram.Redisaddr
 
 	// 1. 初始化小程序应用实例
-	app, err := mini.NewMiniProgram(&mini.UserConfig{
-		AppID:     Appid,  // 小程序、公众号或者企业微信的appid
-		Secret:    Secret, // 商户号 appID
-		HttpDebug: true,
-		Debug:     false,
-		// 可选,不传默认走程序内存
-		//Cache: kernel.NewRedisClient(&kernel.RedisOptions{
-		//	Addr:     RedisAddr,
-		//	Password: "",
-		//	DB:       0,
-		//}),
-	})
-
+	app, err := wechat.NewClient(AppId, Secret)
 	if err != nil {
 		return nil, errorx.NewApiInternalError("init wechat miniprogram failed")
 	}

+ 57 - 0
internal/logic/wxcard/get_api_wx_card_qrcode_logic.go

@@ -0,0 +1,57 @@
+package wxcard
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"net/http"
+	"strconv"
+	"wechat-api/hook/wechat"
+
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+
+	"github.com/ArtisanCloud/PowerWeChat/v2/src/kernel/power"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetApiWxCardQrcodeLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetApiWxCardQrcodeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetApiWxCardQrcodeLogic {
+	return &GetApiWxCardQrcodeLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *GetApiWxCardQrcodeLogic) GetApiWxCardQrcode(req *types.QrcodeReq, w http.ResponseWriter) {
+	AppId := l.svcCtx.Config.Miniprogram.Appid
+	Secret := l.svcCtx.Config.Miniprogram.Secret
+
+	// 1. 初始化小程序应用实例
+	app, err := wechat.NewClient(AppId, Secret)
+	if err != nil {
+		fmt.Printf("init wechat miniprogram failed:%v\n", err)
+		return
+	}
+
+	pphash := power.HashMap{}
+	resp, err := app.WXACode.Get(req.Path, req.Width, false, &pphash, false)
+	if err != nil {
+		fmt.Printf("get miniprogram qrcode failed:%v\n", err)
+		return
+	}
+	defer resp.Body.Close()
+
+	imageContent, _ := io.ReadAll(resp.Body)
+	w.Header().Set("Content-Type", "image/png")
+	w.Header().Set("Content-Length", strconv.Itoa(len(imageContent)))
+
+	_, _ = fmt.Fprintln(w, imageContent)
+
+	//fmt.Printf("imageContent=%v, contentLength=%d\n", imageContent, resp.ContentLength)
+}

+ 7 - 0
internal/types/types.go

@@ -2303,6 +2303,13 @@ type WxCardInfoResp struct {
 	Data WxCardInfo `json:"data"`
 }
 
+// swagger:model QrcodeReq
+type QrcodeReq struct {
+	Path       string `form:"path"`
+	Width      int64  `form:"width"`
+	EnvVersion string `form:"envVersion"`
+}
+
 // The data of wx card user information | WxCardUser信息
 // swagger:model WxCardUserInfo
 type WxCardUserInfo struct {