Skip to content

Commit ddb9689

Browse files
authored
V1.1.6 (#7)
* v1.1.6
1 parent b6e6bf2 commit ddb9689

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+300
-2264
lines changed

common.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ const (
1010
DebugOff = 0
1111
DebugOn = 1
1212

13-
Version = "1.1.5"
13+
HeaderRequestID = "Request-ID"
14+
15+
Version = "1.1.6"
1416
)
1517

1618
const (

go.mod

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
11
module github.com/go-pay/wechat-sdk
22

33
go 1.21
4+
5+
require (
6+
github.com/go-pay/bm v0.0.4
7+
github.com/go-pay/crypto v0.0.1
8+
github.com/go-pay/util v0.0.2
9+
github.com/go-pay/xhttp v0.0.2
10+
github.com/go-pay/xlog v0.0.3
11+
github.com/go-pay/xtime v0.0.2
12+
)

go.sum

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
github.com/go-pay/bm v0.0.4 h1:MUECRx1t0MkbQ7Yzk2qseKBOKoUi4N8WZ+alZBrZesg=
2+
github.com/go-pay/bm v0.0.4/go.mod h1:S7ZAxWtyjm7PX54cna4N/RzJ1JAZG8EDukZ2fZaZ+qk=
3+
github.com/go-pay/crypto v0.0.1 h1:B6InT8CLfSLc6nGRVx9VMJRBBazFMjr293+jl0lLXUY=
4+
github.com/go-pay/crypto v0.0.1/go.mod h1:41oEIvHMKbNcYlWUlRWtsnC6+ASgh7u29z0gJXe5bes=
5+
github.com/go-pay/util v0.0.2 h1:goJ4f6kNY5zzdtg1Cj8oWC+Cw7bfg/qq2rJangMAb9U=
6+
github.com/go-pay/util v0.0.2/go.mod h1:qM8VbyF1n7YAPZBSJONSPMPsPedhUTktewUAdf1AjPg=
7+
github.com/go-pay/xhttp v0.0.2 h1:O8rnd/d03WsboFtUthwFMg61ikHRfYHyD1m0JiUx60g=
8+
github.com/go-pay/xhttp v0.0.2/go.mod h1:BnuvXpLKkXTFMOBc5MTb0hxdrstwunbzQPJUZOsNbt4=
9+
github.com/go-pay/xlog v0.0.3 h1:avyMhCL/JgBHreoGx/am/kHxfs1udDOAeVqbmzP/Yes=
10+
github.com/go-pay/xlog v0.0.3/go.mod h1:mH47xbobrdsSHWsmFtSF5agWbMHFP+tK0ZbVCk5OAEw=
11+
github.com/go-pay/xtime v0.0.2 h1:7YR4/iuELsEHpJ6LUO0SVK80hQxDO9MLCfuVYIiTCRM=
12+
github.com/go-pay/xtime v0.0.2/go.mod h1:W1yRbJaSt4CSBcdAtLBQ8xajiN/Pl5hquGczUcUE9xE=

mini/access_token.go

+6-8
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import (
66
"runtime"
77
"strconv"
88
"time"
9-
10-
"github.com/go-pay/wechat-sdk/pkg/xlog"
119
)
1210

1311
// 获取小程序全局唯一后台接口调用凭据(access_token)
@@ -25,7 +23,7 @@ func (s *SDK) getAccessToken() (err error) {
2523

2624
path := "/cgi-bin/token?grant_type=client_credential&appid=" + s.Appid + "&secret=" + s.Secret
2725
at := &AccessToken{}
28-
if err = s.DoRequestGet(s.ctx, path, at); err != nil {
26+
if _, err = s.DoRequestGet(s.ctx, path, at); err != nil {
2927
return
3028
}
3129
if at.Errcode != Success {
@@ -45,15 +43,15 @@ func (s *SDK) goAutoRefreshAccessToken() {
4543
if r := recover(); r != nil {
4644
buf := make([]byte, 64<<10)
4745
buf = buf[:runtime.Stack(buf, false)]
48-
xlog.Errorf("mini_goAutoRefreshAccessToken: panic recovered: %s\n%s", r, buf)
46+
s.logger.Errorf("mini_goAutoRefreshAccessToken: panic recovered: %s\n%s", r, buf)
4947
}
5048
}()
5149
for {
5250
// every one hour, request new access token, default 10s
5351
time.Sleep(s.RefreshInternal / 2)
5452
err := s.getAccessToken()
5553
if err != nil {
56-
xlog.Errorf("get access token error, after 10s retry: %+v", err)
54+
s.logger.Errorf("get access token error, after 10s retry: %+v", err)
5755
continue
5856
}
5957
}
@@ -74,7 +72,7 @@ func (s *SDK) getStableAccessToken() (err error) {
7472

7573
path := "/cgi-bin/stable_token?grant_type=client_credential&appid=" + s.Appid + "&secret=" + s.Secret + "&force_refresh=false"
7674
at := &AccessToken{}
77-
if err = s.DoRequestGet(s.ctx, path, at); err != nil {
75+
if _, err = s.DoRequestGet(s.ctx, path, at); err != nil {
7876
return
7977
}
8078
if at.Errcode != Success {
@@ -94,15 +92,15 @@ func (s *SDK) goAutoRefreshStableAccessToken() {
9492
if r := recover(); r != nil {
9593
buf := make([]byte, 64<<10)
9694
buf = buf[:runtime.Stack(buf, false)]
97-
xlog.Errorf("mini_goAutoRefreshAccessToken: panic recovered: %s\n%s", r, buf)
95+
s.logger.Errorf("mini_goAutoRefreshAccessToken: panic recovered: %s\n%s", r, buf)
9896
}
9997
}()
10098
for {
10199
// every one hour, request new access token, default 10s
102100
time.Sleep(s.RefreshInternal / 2)
103101
err := s.getStableAccessToken()
104102
if err != nil {
105-
xlog.Errorf("get access token error, after 10s retry: %+v", err)
103+
s.logger.Errorf("get access token error, after 10s retry: %+v", err)
106104
continue
107105
}
108106
}

mini/customer_service.go

+9-10
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import (
44
"context"
55
"fmt"
66

7-
"github.com/go-pay/wechat-sdk/pkg/bmap"
8-
"github.com/go-pay/wechat-sdk/pkg/util"
7+
"github.com/go-pay/bm"
98
)
109

1110
// CSMessageGetTempMedia 获取客服消息内的临时素材
@@ -26,9 +25,9 @@ func (s *SDK) CSMessageGetTempMedia(c context.Context, mediaId string) (media []
2625
// msgType:消息类型,枚举值:mini.MsgTypeText、mini.MsgTypeImage、mini.MsgTypeLink、mini.MsgTypeMiniPage
2726
// msgValue:对应 msgType 的value值,BodyMap key-value 格式传入
2827
// 文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/kf-mgnt/kf-message/sendCustomMessage.html
29-
func (s *SDK) CSMessageSend(c context.Context, toUser string, msgType MsgType, msgValue bmap.BodyMap) (err error) {
28+
func (s *SDK) CSMessageSend(c context.Context, toUser string, msgType MsgType, msgValue bm.BodyMap) (err error) {
3029
path := "/cgi-bin/message/custom/send?access_token=" + s.accessToken
31-
body := make(bmap.BodyMap)
30+
body := make(bm.BodyMap)
3231
body.Set("touser", toUser)
3332
switch msgType {
3433
case MsgTypeText:
@@ -45,7 +44,7 @@ func (s *SDK) CSMessageSend(c context.Context, toUser string, msgType MsgType, m
4544
Set("text", msgValue)
4645
}
4746
ec := &ErrorCode{}
48-
if err = s.doRequestPost(c, path, body, ec); err != nil {
47+
if _, err = s.doRequestPost(c, path, body, ec); err != nil {
4948
return err
5049
}
5150
if ec.Errcode != Success {
@@ -61,7 +60,7 @@ func (s *SDK) CSMessageSend(c context.Context, toUser string, msgType MsgType, m
6160
// 文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/kf-mgnt/kf-message/setTyping.html
6261
func (s *SDK) CSMessageSetTyping(c context.Context, toUser string, typingStatus TypingStatus) (err error) {
6362
path := "/cgi-bin/message/custom/typing?access_token=" + s.accessToken
64-
body := make(bmap.BodyMap)
63+
body := make(bm.BodyMap)
6564
body.Set("touser", toUser)
6665
switch typingStatus {
6766
case TypingTyping:
@@ -70,7 +69,7 @@ func (s *SDK) CSMessageSetTyping(c context.Context, toUser string, typingStatus
7069
body.Set("command", "CancelTyping")
7170
}
7271
ec := &ErrorCode{}
73-
if err = s.doRequestPost(c, path, body, ec); err != nil {
72+
if _, err = s.doRequestPost(c, path, body, ec); err != nil {
7473
return err
7574
}
7675
if ec.Errcode != Success {
@@ -83,13 +82,13 @@ func (s *SDK) CSMessageSetTyping(c context.Context, toUser string, typingStatus
8382
// 注意:errcode = 0 为成功
8483
// 注意:目前仅支持图片,用于发送客服消息或被动回复用户消息。
8584
// 文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/kf-mgnt/kf-message/uploadTempMedia.html
86-
func (s *SDK) CSMessageUploadTempMedia(c context.Context, img *util.File) (media *UploadTempMedia, err error) {
85+
func (s *SDK) CSMessageUploadTempMedia(c context.Context, img *bm.File) (media *UploadTempMedia, err error) {
8786
path := "/cgi-bin/media/upload?access_token=" + s.accessToken
88-
body := make(bmap.BodyMap)
87+
body := make(bm.BodyMap)
8988
body.Set("type", "image").
9089
SetFormFile("media", img)
9190
media = &UploadTempMedia{}
92-
if err = s.doRequestPostFile(c, path, body, media); err != nil {
91+
if _, err = s.doRequestPostFile(c, path, body, media); err != nil {
9392
return nil, err
9493
}
9594
if media.Errcode != Success {

mini/login.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
func (s *SDK) Code2Session(c context.Context, wxCode string) (session *Code2Session, err error) {
1313
path := "/sns/jscode2session?appid=" + s.Appid + "&secret=" + s.Secret + "&js_code=" + wxCode + "&grant_type=authorization_code"
1414
session = &Code2Session{}
15-
if err = s.doRequestGet(c, path, session); err != nil {
15+
if _, err = s.doRequestGet(c, path, session); err != nil {
1616
return nil, err
1717
}
1818
if session.Errcode != Success {

mini/mini.go

+39-19
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ package mini
22

33
import (
44
"context"
5-
"encoding/json"
65
"fmt"
6+
"net/http"
77
"time"
88

9+
"github.com/go-pay/util"
10+
"github.com/go-pay/util/js"
911
"github.com/go-pay/wechat-sdk"
10-
"github.com/go-pay/wechat-sdk/pkg/util"
11-
"github.com/go-pay/wechat-sdk/pkg/xhttp"
12-
"github.com/go-pay/wechat-sdk/pkg/xlog"
12+
"github.com/go-pay/xhttp"
13+
"github.com/go-pay/xlog"
1314
)
1415

1516
type SDK struct {
@@ -20,6 +21,8 @@ type SDK struct {
2021
Host string
2122
accessToken string
2223
RefreshInternal time.Duration
24+
hc *xhttp.Client
25+
logger xlog.XLogger
2326

2427
callback func(appid, accessToken string, expireIn int, err error)
2528
}
@@ -29,12 +32,16 @@ type SDK struct {
2932
// Secret:appSecret
3033
// autoManageToken:是否自动获取并自动维护刷新 AccessToken,默认使用稳定版接口且force_refresh=false
3134
func New(appid, secret string, autoManageToken bool) (m *SDK, err error) {
35+
logger := xlog.NewLogger()
36+
logger.SetLevel(xlog.DebugLevel)
3237
m = &SDK{
3338
ctx: context.Background(),
3439
DebugSwitch: wechat.DebugOff,
3540
Appid: appid,
3641
Secret: secret,
3742
Host: HostDefault,
43+
hc: xhttp.NewClient(),
44+
logger: logger,
3845
}
3946
if autoManageToken {
4047
if err = m.getStableAccessToken(); err != nil {
@@ -45,35 +52,48 @@ func New(appid, secret string, autoManageToken bool) (m *SDK, err error) {
4552
return
4653
}
4754

48-
func (s *SDK) DoRequestGet(c context.Context, path string, ptr any) (err error) {
55+
// SetHttpClient 设置自定义的xhttp.Client
56+
func (s *SDK) SetHttpClient(client *xhttp.Client) {
57+
if client != nil {
58+
s.hc = client
59+
}
60+
}
61+
62+
func (s *SDK) SetLogger(logger xlog.XLogger) {
63+
if logger != nil {
64+
s.logger = logger
65+
}
66+
}
67+
68+
func (s *SDK) DoRequestGet(c context.Context, path string, ptr any) (res *http.Response, err error) {
4969
uri := s.Host + path
50-
httpClient := xhttp.NewClient()
5170
if s.DebugSwitch == wechat.DebugOn {
52-
xlog.Debugf("Wechat_SDK_URI: %s", uri)
71+
s.logger.Debugf("Wechat_SDK_URI: %s", uri)
5372
}
54-
httpClient.Header.Add(xhttp.HeaderRequestID, fmt.Sprintf("%s-%d", util.RandomString(21), time.Now().Unix()))
55-
res, bs, err := httpClient.Get(uri).EndBytes(c)
73+
req := s.hc.Req()
74+
req.Header.Add(wechat.HeaderRequestID, fmt.Sprintf("%s-%d", util.RandomString(21), time.Now().Unix()))
75+
res, bs, err := req.Get(uri).EndBytes(c)
5676
if err != nil {
57-
return fmt.Errorf("http.request(GET, %s), status_code:%d, err:%w", uri, res.StatusCode, err)
77+
return nil, fmt.Errorf("http.request(GET, %s), err:%w", uri, err)
5878
}
5979
if s.DebugSwitch == wechat.DebugOn {
60-
xlog.Debugf("Wechat_SDK_Response: [%d] -> %s", res.StatusCode, string(bs))
80+
s.logger.Debugf("Wechat_SDK_Response: [%d] -> %s", res.StatusCode, string(bs))
6181
}
62-
if err = json.Unmarshal(bs, ptr); err != nil {
63-
return fmt.Errorf("json.Unmarshal(%s, %+v):%w", string(bs), ptr, err)
82+
if err = js.UnmarshalBytes(bs, ptr); err != nil {
83+
return res, fmt.Errorf("js.UnmarshalBytes(%s, %+v):%w", string(bs), ptr, err)
6484
}
6585
return
6686
}
6787

6888
func doRequestGet(c context.Context, uri string, ptr any) (err error) {
69-
httpClient := xhttp.NewClient()
70-
httpClient.Header.Add(xhttp.HeaderRequestID, fmt.Sprintf("%s-%d", util.RandomString(21), time.Now().Unix()))
71-
res, bs, err := httpClient.Get(uri).EndBytes(c)
89+
req := xhttp.NewClient().Req()
90+
req.Header.Add(wechat.HeaderRequestID, fmt.Sprintf("%s-%d", util.RandomString(21), time.Now().Unix()))
91+
_, bs, err := req.Get(uri).EndBytes(c)
7292
if err != nil {
73-
return fmt.Errorf("http.request(GET, %s), status_code:%d, err:%w", uri, res.StatusCode, err)
93+
return fmt.Errorf("http.request(GET, %s), err:%w", uri, err)
7494
}
75-
if err = json.Unmarshal(bs, ptr); err != nil {
76-
return fmt.Errorf("json.Unmarshal(%s, %+v):%w", string(bs), ptr, err)
95+
if err = js.UnmarshalBytes(bs, ptr); err != nil {
96+
return fmt.Errorf("js.UnmarshalBytes(%s, %+v):%w", string(bs), ptr, err)
7797
}
7898
return
7999
}

mini/mini_test.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import (
55
"os"
66
"testing"
77

8+
"github.com/go-pay/bm"
89
"github.com/go-pay/wechat-sdk"
9-
"github.com/go-pay/wechat-sdk/pkg/bmap"
10-
"github.com/go-pay/wechat-sdk/pkg/xlog"
10+
"github.com/go-pay/xlog"
1111
)
1212

1313
var (
@@ -20,6 +20,7 @@ var (
2020
)
2121

2222
func TestMain(m *testing.M) {
23+
xlog.SetLevel(xlog.DebugLevel)
2324
// 初始化微信小程序 SDK
2425
// Appid:Appid
2526
// Secret:appSecret
@@ -62,10 +63,10 @@ func TestCode2Session(t *testing.T) {
6263
}
6364

6465
func TestUniformMessageSend(t *testing.T) {
65-
body := make(bmap.BodyMap)
66-
bb := make(bmap.BodyMap)
66+
body := make(bm.BodyMap)
67+
bb := make(bm.BodyMap)
6768
bb.Set("appid", "APPID").
68-
Set("template_id", "TEMPLATE_ID").SetBodyMap("miniprogram", func(b bmap.BodyMap) {
69+
Set("template_id", "TEMPLATE_ID").SetBodyMap("miniprogram", func(b bm.BodyMap) {
6970
b.Set("appid", "xiaochengxuappid12345").Set("pagepath", "index?foo=bar")
7071
})
7172

mini/model.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package mini
22

3-
import "github.com/go-pay/wechat-sdk/pkg/xtime"
3+
import "github.com/go-pay/xtime"
44

55
const (
66
Success = 0

mini/open_data.go

+8-17
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package mini
22

33
import (
4-
"crypto/aes"
5-
"crypto/cipher"
64
"crypto/sha1"
75
"encoding/base64"
86
"encoding/hex"
9-
"encoding/json"
107
"errors"
118
"fmt"
129
"reflect"
1310

14-
xaes "github.com/go-pay/wechat-sdk/pkg/aes"
15-
"github.com/go-pay/wechat-sdk/pkg/util"
11+
"github.com/go-pay/crypto/aes"
12+
"github.com/go-pay/util"
13+
"github.com/go-pay/util/js"
1614
)
1715

1816
// VerifyDecryptOpenData 数据签名校验
@@ -39,8 +37,6 @@ func (s *SDK) DecryptOpenData(encryptedData, iv, sessionKey string, ptr any) (er
3937
}
4038
var (
4139
cipherText, aesKey, ivKey, plainText []byte
42-
block cipher.Block
43-
blockMode cipher.BlockMode
4440
)
4541
beanValue := reflect.ValueOf(ptr)
4642
if beanValue.Kind() != reflect.Ptr {
@@ -55,17 +51,12 @@ func (s *SDK) DecryptOpenData(encryptedData, iv, sessionKey string, ptr any) (er
5551
if len(cipherText)%len(aesKey) != 0 {
5652
return errors.New("encryptedData error")
5753
}
58-
if block, err = aes.NewCipher(aesKey); err != nil {
59-
return fmt.Errorf("aes.NewCipher(),error(%w)", err)
54+
plainText, err = aes.CBCDecrypt(cipherText, aesKey, ivKey)
55+
if err != nil {
56+
return fmt.Errorf("aes.CBCDecrypt(),err(%w)", err)
6057
}
61-
blockMode = cipher.NewCBCDecrypter(block, ivKey)
62-
plainText = make([]byte, len(cipherText))
63-
blockMode.CryptBlocks(plainText, cipherText)
64-
if len(plainText) > 0 {
65-
plainText = xaes.PKCS7UnPadding(plainText)
66-
}
67-
if err = json.Unmarshal(plainText, ptr); err != nil {
68-
return fmt.Errorf("json.Unmarshal(%s, %+v),error(%w)", string(plainText), ptr, err)
58+
if err = js.UnmarshalBytes(plainText, ptr); err != nil {
59+
return fmt.Errorf("js.UnmarshalBytes(%s, %+v),error(%w)", string(plainText), ptr, err)
6960
}
7061
return
7162
}

0 commit comments

Comments
 (0)