浏览代码

feat: add qr二维码的生成

2637309949 4 年之前
父节点
当前提交
00be124dcd

二进制
asserts/qrcode/123.png


+ 7 - 0
i2bill.api

@@ -62,6 +62,11 @@ type authResponse {
 	UserInfo AuthUserInfo `json:"userInfo"`
 }
 
+type jzQrcodeResponse {
+	Id     int64  `json:"id"`
+	FileId string `json:"fileId"`
+}
+
 type request {
 	// TODO: add members here and delete this comment
 	Id int64 `form:"id"`
@@ -83,6 +88,8 @@ service i2bill-api {
 	jwt: JwtAuth
 )
 service i2bill-api {
+	@handler JzQrCode // TODO: set handler name and delete this comment
+	get /api/users/share/jz_qrcode returns(jzQrcodeResponse)
 	@handler GetUser // TODO: set handler name and delete this comment
 	get /api/users/id/:userId(request) returns(response)
 }

+ 32 - 0
internal/handler/jzqrcodehandler.go

@@ -0,0 +1,32 @@
+package handler
+
+import (
+	"net/http"
+	"time"
+
+	"git.i2edu.net/i2/go-zero/rest/httpx"
+	"git.i2edu.net/i2/go-zero/rest/token"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic"
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+	"git.i2edu.net/i2/i2-bill-api/internal/utils"
+	"github.com/dgrijalva/jwt-go"
+)
+
+func JzQrCodeHandler(ctx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		l := logic.NewJzQrCodeLogic(r.Context(), ctx)
+		token.NewTokenParser()
+		parser := token.NewTokenParser(token.WithResetDuration(time.Minute))
+		tok, err := parser.ParseToken(r, ctx.Config.JwtAuth.AccessSecret, "")
+		if err != nil {
+			httpx.OkJson(w, utils.ReturnHTTPFail(err))
+		} else {
+			res, err := l.JzQrCode(tok.Claims.(jwt.MapClaims)["userId"].(int64))
+			if err != nil {
+				httpx.OkJson(w, utils.ReturnHTTPFail(err))
+			} else {
+				httpx.OkJson(w, utils.ReturnHTTPSuccess(res))
+			}
+		}
+	}
+}

+ 6 - 0
internal/handler/routes.go

@@ -22,11 +22,17 @@ func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
 				Path:    "/api/auth/loginByWeixin",
 				Handler: LoginByWeixinHandler(serverCtx),
 			},
+			{
+				Method:  http.MethodGet,
+				Path:    "/api/users/share/jz_qrcode",
+				Handler: JzQrCodeHandler(serverCtx),
+			},
 		},
 	)
 
 	engine.AddRoutes(
 		[]rest.Route{
+
 			{
 				Method:  http.MethodGet,
 				Path:    "/api/users/id/:userId",

+ 39 - 0
internal/logic/jzqrcodelogic.go

@@ -0,0 +1,39 @@
+package logic
+
+import (
+	"context"
+
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+	"git.i2edu.net/i2/i2-bill-api/internal/types"
+
+	"git.i2edu.net/i2/go-zero/core/logx"
+)
+
+type JzQrCodeLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+var qrcodeJzPrefix = "qrcode:jz:%v"
+
+func NewJzQrCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext) JzQrCodeLogic {
+	return JzQrCodeLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *JzQrCodeLogic) JzQrCode(u int64) (*types.JzQrcodeResponse, error) {
+	uid, err := l.svcCtx.Wechat.GenQrId(qrcodeJzPrefix, map[string]interface{}{
+		"userId": u,
+	})
+	if err != nil {
+		return nil, err
+	}
+	uri, err := l.svcCtx.Wechat.GenQrCode(uid, "index/user")
+	return &types.JzQrcodeResponse{
+		FileId: uri,
+	}, err
+}

+ 1 - 1
internal/logic/loginbyweixinlogic.go

@@ -88,7 +88,7 @@ func (l *LoginByWeixinLogic) LoginByWeixin(req types.AuthLoginBody) (*types.Auth
 	var accessExpire = l.svcCtx.Config.JwtAuth.AccessExpire
 	now := time.Now().Unix()
 	payloads := map[string]interface{}{
-		"user_id": rtnInfo.UserInfo.ID,
+		"userId": rtnInfo.UserInfo.ID,
 	}
 	accessToken, err := l.CreateJWT(now, l.svcCtx.Config.JwtAuth.AccessSecret, payloads, accessExpire)
 	if err != nil {

+ 30 - 5
internal/svc/servicecontext.go

@@ -1,6 +1,7 @@
 package svc
 
 import (
+	"encoding/json"
 	"fmt"
 	"path"
 	"time"
@@ -45,7 +46,6 @@ func (wc *Wechat) GetAccessToken() (string, error) {
 		if err != nil {
 			return "", err
 		}
-		fmt.Println(res)
 		token = res.AccessToken
 		err := wc.RdCli.SetWithExpire(cacheWechatTokenPrefix, res.AccessToken, time.Duration((res.ExpiresIn-60*2))*time.Second)
 		if err != nil {
@@ -55,14 +55,39 @@ func (wc *Wechat) GetAccessToken() (string, error) {
 	return token, nil
 }
 
-// GetAccessToken defined
-func (wc *Wechat) GetQrCode(scene, page string) (string, error) {
+func (wc *Wechat) GenQrId(prefix string, params interface{}) (string, error) {
+	uuid := utils.GetUUID()
+	ube, err := json.Marshal(params)
+	if err != nil {
+		return "", err
+	}
+	err = wc.RdCli.SetWithExpire(fmt.Sprintf(prefix, uuid), string(ube), time.Duration(1)*time.Hour)
+	return uuid, err
+}
+
+func (wc *Wechat) GetQrParams(prefix string, uuid string, params interface{}) error {
+	ube := ""
+	err := wc.RdCli.GetCache(fmt.Sprintf(prefix, uuid), &ube)
+	if err != nil {
+		return err
+	}
+	err = json.Unmarshal([]byte(ube), params)
+	if err != nil {
+		return err
+	}
+	return err
+}
+
+// GenQrCode defined
+// 接口 B:适用于需要的码数量极多的业务场景
+// 生成小程序码,可接受页面参数较短,生成个数不受限。
+func (wc *Wechat) GenQrCode(scene, page string) (string, error) {
 	token, err := wc.GetAccessToken()
 	if err != nil {
 		return "", err
 	}
-	req := utils.Post("https://api.weixin.qq.com/wxa/getwxacodeunlimit")
-	req.Param("access_token", token)
+	req := utils.Post("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + token)
+	req.JSONBody(map[string]interface{}{"scene": scene})
 	ph := path.Join("asserts", "qrcode", scene+".png")
 	err = req.ToFile(ph)
 	if err != nil {

+ 5 - 0
internal/types/types.go

@@ -55,6 +55,11 @@ type AuthResponse struct {
 	UserInfo AuthUserInfo `json:"userInfo"`
 }
 
+type JzQrcodeResponse struct {
+	Id     int64  `json:"id"`
+	FileId string `json:"fileId"`
+}
+
 type Request struct {
 	Id int64 `form:"id"`
 }

+ 3 - 1
internal/utils/http.go

@@ -7,6 +7,7 @@ import (
 	"crypto/tls"
 	"encoding/json"
 	"encoding/xml"
+	"fmt"
 	"io"
 	"io/ioutil"
 	"log"
@@ -59,6 +60,7 @@ func SetDefaultSetting(setting HTTPSettings) {
 func NewRequest(rawurl, method string) *HTTPRequest {
 	var resp http.Response
 	u, err := url.Parse(rawurl)
+	fmt.Println("====", u)
 	if err != nil {
 		log.Println("Httplib:", err)
 	}
@@ -405,6 +407,7 @@ func (b *HTTPRequest) getResponse() (*http.Response, error) {
 	if b.resp.StatusCode != 0 {
 		return b.resp, nil
 	}
+	fmt.Println(b.req.URL)
 	resp, err := b.DoRequest()
 	if err != nil {
 		return nil, err
@@ -438,7 +441,6 @@ func (b *HTTPRequest) doRequest(ctx context.Context) (resp *http.Response, err e
 		paramBody = buf.String()
 		paramBody = paramBody[0 : len(paramBody)-1]
 	}
-
 	b.buildURL(paramBody)
 	urlParsed, err := url.Parse(b.url)
 	if err != nil {