|
@@ -0,0 +1,107 @@
|
|
|
+package avatar
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "crypto/hmac"
|
|
|
+ "crypto/sha1"
|
|
|
+ "encoding/base64"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "github.com/suyuan32/simple-admin-common/msg/errormsg"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "wechat-api/internal/svc"
|
|
|
+ "wechat-api/internal/types"
|
|
|
+
|
|
|
+ "github.com/zeromicro/go-zero/core/logx"
|
|
|
+)
|
|
|
+
|
|
|
+type GetSignatureResponseLogic struct {
|
|
|
+ logx.Logger
|
|
|
+ ctx context.Context
|
|
|
+ svcCtx *svc.ServiceContext
|
|
|
+}
|
|
|
+
|
|
|
+func NewGetSignatureResponseLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetSignatureResponseLogic {
|
|
|
+ return &GetSignatureResponseLogic{
|
|
|
+ Logger: logx.WithContext(ctx),
|
|
|
+ ctx: ctx,
|
|
|
+ svcCtx: svcCtx}
|
|
|
+}
|
|
|
+
|
|
|
+func (l *GetSignatureResponseLogic) GetSignatureResponse() (resp *types.AvatarSignatureResp, err error) {
|
|
|
+ userId := l.ctx.Value("userId").(uint64)
|
|
|
+ helper := NewMpUploadOssHelper(l.svcCtx.Config.Aliyun.ACCESS_KEY_ID, l.svcCtx.Config.Aliyun.ACCESS_KEY_SECRET, 1, 10)
|
|
|
+ params := helper.CreateUploadParams()
|
|
|
+ OSSAccessKeyId := params["OSSAccessKeyId"]
|
|
|
+ policy := params["policy"]
|
|
|
+ signature := params["signature"]
|
|
|
+ key := fmt.Sprintf("mini_program/qingmasiyuai/avatar/%d.jpg", userId)
|
|
|
+ return &types.AvatarSignatureResp{
|
|
|
+ BaseDataInfo: types.BaseDataInfo{
|
|
|
+ Code: 0,
|
|
|
+ Msg: errormsg.Success,
|
|
|
+ },
|
|
|
+ Data: types.SignatureInfo{
|
|
|
+ Key: &key,
|
|
|
+ OSSAccessKeyId: &OSSAccessKeyId,
|
|
|
+ Policy: &policy,
|
|
|
+ Signature: &signature,
|
|
|
+ },
|
|
|
+ }, nil
|
|
|
+}
|
|
|
+
|
|
|
+type MpUploadOssHelper struct {
|
|
|
+ AccessKeyId string
|
|
|
+ AccessKeySecret string
|
|
|
+ Timeout int
|
|
|
+ MaxSize int
|
|
|
+}
|
|
|
+
|
|
|
+type Policy struct {
|
|
|
+ Expiration string `json:"expiration"`
|
|
|
+ Conditions [][]interface{} `json:"conditions"`
|
|
|
+}
|
|
|
+
|
|
|
+func NewMpUploadOssHelper(accessKeyId, accessKeySecret string, timeout, maxSize int) *MpUploadOssHelper {
|
|
|
+ if timeout == 0 {
|
|
|
+ timeout = 1
|
|
|
+ }
|
|
|
+ if maxSize == 0 {
|
|
|
+ maxSize = 10
|
|
|
+ }
|
|
|
+ return &MpUploadOssHelper{
|
|
|
+ AccessKeyId: accessKeyId,
|
|
|
+ AccessKeySecret: accessKeySecret,
|
|
|
+ Timeout: timeout,
|
|
|
+ MaxSize: maxSize,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (helper *MpUploadOssHelper) CreateUploadParams() map[string]string {
|
|
|
+ policy := helper.getPolicyBase64()
|
|
|
+ signature := helper.signature(policy)
|
|
|
+ return map[string]string{
|
|
|
+ "OSSAccessKeyId": helper.AccessKeyId,
|
|
|
+ "policy": policy,
|
|
|
+ "signature": signature,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (helper *MpUploadOssHelper) getPolicyBase64() string {
|
|
|
+ expiration := time.Now().Add(time.Duration(helper.Timeout) * time.Hour).UTC().Format(time.RFC3339)
|
|
|
+ policy := Policy{
|
|
|
+ Expiration: expiration,
|
|
|
+ Conditions: [][]interface{}{
|
|
|
+ {"content-length-range", 0, helper.MaxSize * 1024 * 1024},
|
|
|
+ },
|
|
|
+ }
|
|
|
+ policyBytes, _ := json.Marshal(policy)
|
|
|
+ return base64.StdEncoding.EncodeToString(policyBytes)
|
|
|
+}
|
|
|
+
|
|
|
+func (helper *MpUploadOssHelper) signature(policy string) string {
|
|
|
+ h := hmac.New(sha1.New, []byte(helper.AccessKeySecret))
|
|
|
+ h.Write([]byte(policy))
|
|
|
+ return base64.StdEncoding.EncodeToString(h.Sum(nil))
|
|
|
+}
|