瀏覽代碼

Merge remote-tracking branch 'origin/master' into master

# Conflicts:
#	i2bill.api
icole 4 年之前
父節點
當前提交
7c59a1e140

+ 26 - 5
i2bill.api

@@ -102,23 +102,32 @@ type punchClockRequest {
 	Type    int64  `json:"type"`
 }
 
+type enrollRequest {
+	Name        string `json:"name"`
+	Sex         int64  `json:"sex"`
+	IponeNumber string `json:"ipone_number"`
+	Target      int64  `json:"target"`
+}
+
 type Response {
 	Code int         `json:"code"`
 	Msg  string      `json:"msg"`
 	Data interface{} `json:"data"`
 }
 
+// 认证模块
 @server(
 	group: auth
 )
 service i2bill-api {
 	@handler Hello
 	get /api/hello
-	
+
 	@handler LoginByWeixin
 	post /api/auth/loginByWeixin(loginByWeixinRequest) returns(loginByWeixinResponse)
 }
 
+// 用户模块
 @server(
 	jwt: JwtAuth
 	group: user
@@ -135,20 +144,32 @@ service i2bill-api {
 	
 	@handler PunchClock
 	post /api/user/punchClock(punchClockRequest) returns(Response)
-	
+
 }
 
+// 兼职模块
 @server(
 	jwt: JwtAuth
 	group: part_time_user
 )
-service  i2bill-api{
+service i2bill-api {
 	@handler  PartTimeUserAdd
 	post /api/v1/part_time_user/add (partTimeUserAddRequest) returns(Response)
-	
+
 	@handler  PartTimeUserUpdate
 	post /api/v1/part_time_user/update (partTimeUserAddRequest) returns(Response)
-	
+
 	@handler  PartTimeUserGet
 	get /api/v1/part_time_user/get  returns(Response)
+}
+
+
+// 收单模块
+@server(
+	jwt: JwtAuth
+	group: acquirer
+)
+service i2bill-api {
+	@handler Enroll
+	post /api/acquirer/enroll(enrollRequest) returns(Response)
 }

+ 29 - 0
internal/handler/acquirer/enrollhandler.go

@@ -0,0 +1,29 @@
+package acquirer
+
+import (
+	"net/http"
+
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/acquirer"
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+	"git.i2edu.net/i2/i2-bill-api/internal/types"
+
+	"git.i2edu.net/i2/go-zero/rest/httpx"
+)
+
+func EnrollHandler(ctx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.EnrollRequest
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := acquirer.NewEnrollLogic(r.Context(), ctx)
+		resp, err := l.Enroll(req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 12 - 0
internal/handler/routes.go

@@ -4,6 +4,7 @@ package handler
 import (
 	"net/http"
 
+	acquirer "git.i2edu.net/i2/i2-bill-api/internal/handler/acquirer"
 	auth "git.i2edu.net/i2/i2-bill-api/internal/handler/auth"
 	part_time_user "git.i2edu.net/i2/i2-bill-api/internal/handler/part_time_user"
 	user "git.i2edu.net/i2/i2-bill-api/internal/handler/user"
@@ -74,4 +75,15 @@ func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
 		},
 		rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret),
 	)
+
+	engine.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/acquirer/enroll",
+				Handler: acquirer.EnrollHandler(serverCtx),
+			},
+		},
+		rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret),
+	)
 }

+ 30 - 0
internal/logic/acquirer/enrolllogic.go

@@ -0,0 +1,30 @@
+package acquirer
+
+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 EnrollLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewEnrollLogic(ctx context.Context, svcCtx *svc.ServiceContext) EnrollLogic {
+	return EnrollLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *EnrollLogic) Enroll(req types.EnrollRequest) (*types.Response, error) {
+	// todo: add your logic here and delete this line
+
+	return &types.Response{}, nil
+}

+ 12 - 0
internal/svc/cache.go

@@ -0,0 +1,12 @@
+package svc
+
+import "time"
+
+const cacheWechatTokenPrefix = "cache:wechat:token:"
+
+// Cache defined
+type Cache interface {
+	SetCache(key string, v interface{}) error
+	GetCache(key string, v interface{}) error
+	SetWithExpire(key string, v interface{}, expire time.Duration) error
+}

+ 2 - 145
internal/svc/servicecontext.go

@@ -2,13 +2,9 @@ package svc
 
 import (
 	"context"
-	"crypto/aes"
-	"crypto/cipher"
-	"encoding/base64"
 	"encoding/json"
 	"fmt"
 	"net/http"
-	"path"
 	"strconv"
 	"time"
 
@@ -16,157 +12,18 @@ import (
 	"git.i2edu.net/i2/go-zero/rest/token"
 	"git.i2edu.net/i2/go-zero/zrpc"
 	"git.i2edu.net/i2/i2-bill-api/internal/config"
-	"git.i2edu.net/i2/i2-bill-api/internal/utils"
 	"git.i2edu.net/i2/i2-bill-api/model"
 	"git.i2edu.net/i2/i2-bill-erp/transformclient"
 	"github.com/dgrijalva/jwt-go"
 )
 
-const cacheWechatTokenPrefix = "cache:wechat:token:"
-
-// RdCli defined
-type RdCli interface {
-	SetCache(key string, v interface{}) error
-	GetCache(key string, v interface{}) error
-	SetWithExpire(key string, v interface{}, expire time.Duration) error
-}
-
-// Wechat defined
-type Wechat struct {
-	RdCli RdCli
-	c     config.Config
-}
-
-// WechatPhonedecrypt defined TODO
-type WechatPhonedecrypt struct {
-	PhoneNumber     string `json:"phoneNumber"`
-	PurePhoneNumber string `json:"purePhoneNumber"`
-	CountryCode     string `json:"countryCode"`
-	Watermark       struct {
-		Appid     string `json:"appid"`
-		Timestamp int32  `json:"timestamp"`
-	} `json:"watermark"`
-}
-
-// GetAccessToken defined TODO
-func (wc *Wechat) GetAccessToken() (string, error) {
-	token := ""
-	err := wc.RdCli.GetCache(cacheWechatTokenPrefix, &token)
-	if err == model.ErrRdsNotFound {
-		req := utils.Get("https://api.weixin.qq.com/cgi-bin/token")
-		req.Param("grant_type", "client_credential")
-		req.Param("secret", wc.c.Weixin.Secret)
-		req.Param("appid", wc.c.Weixin.Appid)
-		var res = struct {
-			AccessToken string `json:"access_token"`
-			ExpiresIn   int    `json:"expires_in"`
-		}{}
-		err = req.ToJSON(&res)
-		if err != nil {
-			return "", err
-		}
-		token = res.AccessToken
-		err := wc.RdCli.SetWithExpire(cacheWechatTokenPrefix, res.AccessToken, time.Duration((res.ExpiresIn-60*2))*time.Second)
-		if err != nil {
-			return "", err
-		}
-	}
-	return token, nil
-}
-
-// GenQrId defined TODO
-func (wc *Wechat) GenQrId(prefix string, params interface{}) (string, error) {
-	timestamp := utils.GetTimestamp()
-	ube, err := json.Marshal(params)
-	if err != nil {
-		return "", err
-	}
-	err = wc.RdCli.SetWithExpire(fmt.Sprintf(prefix, timestamp), string(ube), time.Duration(1)*time.Hour)
-	return fmt.Sprintf("%v", timestamp), err
-}
-
-// GenUserQrId defined TODO
-func (wc *Wechat) GenUserQrId(prefix string, userId int64, params interface{}) (string, error) {
-	timestamp := utils.GetTimestamp()
-	ube, err := json.Marshal(params)
-	if err != nil {
-		return "", err
-	}
-	qrId := fmt.Sprintf("u%v-%v", userId, timestamp)
-	err = wc.RdCli.SetWithExpire(fmt.Sprintf(prefix, qrId), string(ube), time.Duration(1)*time.Hour)
-	return qrId, err
-}
-
-// GetQrParams defined TODO
-func (wc *Wechat) GetQrParams(prefix string, id string, params interface{}) error {
-	ube := ""
-	err := wc.RdCli.GetCache(fmt.Sprintf(prefix, id), &ube)
-	if err != nil {
-		return err
-	}
-	err = json.Unmarshal([]byte(ube), params)
-	if err != nil {
-		return err
-	}
-	return err
-}
-
-// GetQrParams defined TODO
-func (wc *Wechat) DecryptMobile(sessionKey, encryptedData, iv string) (string, error) {
-	key, err := base64.StdEncoding.DecodeString(sessionKey)
-	if err != nil {
-		return "", err
-	}
-	bIv, err := base64.StdEncoding.DecodeString(iv)
-	if err != nil {
-		return "", err
-	}
-	bEncryptedData, err := base64.StdEncoding.DecodeString(encryptedData)
-	if err != nil {
-		return "", err
-	}
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		return "", err
-	}
-	var decrypt = bEncryptedData
-	blockMode := cipher.NewCBCDecrypter(block, bIv)
-	blockMode.CryptBlocks(decrypt, bEncryptedData)
-	length := len(decrypt)
-	unpadding := int(decrypt[length-1])
-	decData := decrypt[:(length - unpadding)]
-
-	decryptData := WechatPhonedecrypt{}
-	err = json.Unmarshal(decData, &decryptData)
-	if err != nil {
-		return "", err
-	}
-	return decryptData.PhoneNumber, err
-}
-
-// GenQrCode defined TODO
-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?access_token=" + token)
-	req.JSONBody(map[string]interface{}{"scene": scene, "page": page})
-	ph := path.Join("asserts", "qrcode", scene+".png")
-	err = req.ToFile(ph)
-	if err != nil {
-		return "", err
-	}
-	return ph, err
-}
-
 type ServiceContext struct {
 	Config      config.Config
 	SqlConn     sqlx.SqlConn
-	UserModel   model.UserModel
-	RdCli       RdCli
+	RdCli       Cache
 	Wechat      *Wechat
 	Transformer transformclient.Transform
+	UserModel   model.UserModel
 }
 
 // GetUserId defined TODO

+ 144 - 0
internal/svc/wechat.go

@@ -0,0 +1,144 @@
+package svc
+
+import (
+	"crypto/aes"
+	"crypto/cipher"
+	"encoding/base64"
+	"encoding/json"
+	"fmt"
+	"path"
+	"time"
+
+	"git.i2edu.net/i2/i2-bill-api/internal/config"
+	"git.i2edu.net/i2/i2-bill-api/internal/utils"
+	"git.i2edu.net/i2/i2-bill-api/model"
+)
+
+// Wechat defined
+type Wechat struct {
+	RdCli Cache
+	c     config.Config
+}
+
+// WechatPhonedecrypt defined TODO
+type WechatPhonedecrypt struct {
+	PhoneNumber     string `json:"phoneNumber"`
+	PurePhoneNumber string `json:"purePhoneNumber"`
+	CountryCode     string `json:"countryCode"`
+	Watermark       struct {
+		Appid     string `json:"appid"`
+		Timestamp int32  `json:"timestamp"`
+	} `json:"watermark"`
+}
+
+// GetAccessToken defined TODO
+func (wc *Wechat) GetAccessToken() (string, error) {
+	token := ""
+	err := wc.RdCli.GetCache(cacheWechatTokenPrefix, &token)
+	if err == model.ErrRdsNotFound {
+		req := utils.Get("https://api.weixin.qq.com/cgi-bin/token")
+		req.Param("grant_type", "client_credential")
+		req.Param("secret", wc.c.Weixin.Secret)
+		req.Param("appid", wc.c.Weixin.Appid)
+		var res = struct {
+			AccessToken string `json:"access_token"`
+			ExpiresIn   int    `json:"expires_in"`
+		}{}
+		err = req.ToJSON(&res)
+		if err != nil {
+			return "", err
+		}
+		token = res.AccessToken
+		err := wc.RdCli.SetWithExpire(cacheWechatTokenPrefix, res.AccessToken, time.Duration((res.ExpiresIn-60*2))*time.Second)
+		if err != nil {
+			return "", err
+		}
+	}
+	return token, nil
+}
+
+// GenQrId defined TODO
+func (wc *Wechat) GenQrId(prefix string, params interface{}) (string, error) {
+	timestamp := utils.GetTimestamp()
+	ube, err := json.Marshal(params)
+	if err != nil {
+		return "", err
+	}
+	err = wc.RdCli.SetWithExpire(fmt.Sprintf(prefix, timestamp), string(ube), time.Duration(1)*time.Hour)
+	return fmt.Sprintf("%v", timestamp), err
+}
+
+// GenUserQrId defined TODO
+func (wc *Wechat) GenUserQrId(prefix string, userId int64, params interface{}) (string, error) {
+	timestamp := utils.GetTimestamp()
+	ube, err := json.Marshal(params)
+	if err != nil {
+		return "", err
+	}
+	qrId := fmt.Sprintf("u%v-%v", userId, timestamp)
+	err = wc.RdCli.SetWithExpire(fmt.Sprintf(prefix, qrId), string(ube), time.Duration(1)*time.Hour)
+	return qrId, err
+}
+
+// GetQrParams defined TODO
+func (wc *Wechat) GetQrParams(prefix string, id string, params interface{}) error {
+	ube := ""
+	err := wc.RdCli.GetCache(fmt.Sprintf(prefix, id), &ube)
+	if err != nil {
+		return err
+	}
+	err = json.Unmarshal([]byte(ube), params)
+	if err != nil {
+		return err
+	}
+	return err
+}
+
+// GetQrParams defined TODO
+func (wc *Wechat) DecryptMobile(sessionKey, encryptedData, iv string) (string, error) {
+	key, err := base64.StdEncoding.DecodeString(sessionKey)
+	if err != nil {
+		return "", err
+	}
+	bIv, err := base64.StdEncoding.DecodeString(iv)
+	if err != nil {
+		return "", err
+	}
+	bEncryptedData, err := base64.StdEncoding.DecodeString(encryptedData)
+	if err != nil {
+		return "", err
+	}
+	block, err := aes.NewCipher(key)
+	if err != nil {
+		return "", err
+	}
+	var decrypt = bEncryptedData
+	blockMode := cipher.NewCBCDecrypter(block, bIv)
+	blockMode.CryptBlocks(decrypt, bEncryptedData)
+	length := len(decrypt)
+	unpadding := int(decrypt[length-1])
+	decData := decrypt[:(length - unpadding)]
+
+	decryptData := WechatPhonedecrypt{}
+	err = json.Unmarshal(decData, &decryptData)
+	if err != nil {
+		return "", err
+	}
+	return decryptData.PhoneNumber, err
+}
+
+// GenQrCode defined TODO
+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?access_token=" + token)
+	req.JSONBody(map[string]interface{}{"scene": scene, "page": page})
+	ph := path.Join("asserts", "qrcode", scene+".png")
+	err = req.ToFile(ph)
+	if err != nil {
+		return "", err
+	}
+	return ph, err
+}

+ 7 - 0
internal/types/types.go

@@ -95,6 +95,13 @@ type PunchClockRequest struct {
 	Type    int64  `json:"type"`
 }
 
+type EnrollRequest struct {
+	Name        string `json:"name"`
+	Sex         int64  `json:"sex"`
+	IponeNumber string `json:"ipone_number"`
+	Target      int64  `json:"target"`
+}
+
 type Response struct {
 	Code int         `json:"code"`
 	Msg  string      `json:"msg"`