Skip to content

Commit 3f25b44

Browse files
committed
v1.5.65
1 parent 42e2b0e commit 3f25b44

File tree

13 files changed

+224
-43
lines changed

13 files changed

+224
-43
lines changed

alipay/client.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func (a *Client) RequestParam(bm gopay.BodyMap, method string) (string, error) {
114114
if bm.GetString("sign") == "" {
115115
sign, err = GetRsaSign(bm, bm.GetString("sign_type"), a.privateKey)
116116
if err != nil {
117-
return "", fmt.Errorf("GetRsaSign Error: %v", err)
117+
return "", fmt.Errorf("GetRsaSign Error: %w", err)
118118
}
119119
bm.Set("sign", sign)
120120
}
@@ -162,7 +162,7 @@ func (a *Client) doAliPaySelf(ctx context.Context, bm gopay.BodyMap, method stri
162162
if bm.GetString("sign") == "" {
163163
sign, err = GetRsaSign(bm, bm.GetString("sign_type"), a.privateKey)
164164
if err != nil {
165-
return nil, fmt.Errorf("GetRsaSign Error: %v", err)
165+
return nil, fmt.Errorf("GetRsaSign Error: %w", err)
166166
}
167167
bm.Set("sign", sign)
168168
}
@@ -243,7 +243,7 @@ func (a *Client) doAliPay(ctx context.Context, bm gopay.BodyMap, method string,
243243
}
244244
sign, err := GetRsaSign(pubBody, pubBody.GetString("sign_type"), a.privateKey)
245245
if err != nil {
246-
return nil, fmt.Errorf("GetRsaSign Error: %v", err)
246+
return nil, fmt.Errorf("GetRsaSign Error: %w", err)
247247
}
248248
pubBody.Set("sign", sign)
249249
if a.DebugSwitch == gopay.DebugOn {

body_map_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,16 @@ func TestBodyMapMarshalSlice(t *testing.T) {
131131
bss, _ := xml.Marshal(bm)
132132
xlog.Debug("body:", string(bss))
133133
}
134+
135+
func TestSliceTest(t *testing.T) {
136+
var rs []string
137+
rs = append(rs, "SOFTWARE")
138+
rs = append(rs, "SECURITY")
139+
rs = append(rs, "LOVE_MARRIAGE")
140+
141+
bm := make(BodyMap)
142+
bm.Set("sub_mchid", "2021060717").
143+
Set("advertising_industry_filters", rs)
144+
145+
xlog.Debugf("%s", bm.JsonBody())
146+
}

doc/wechat_v3.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,11 @@ wechat.V3DecryptScoreNotifyCipherText()
349349
* 修改结算账号:`client.V3Apply4SubModifySettlement()`
350350
* 查询结算账户:`client.V3Apply4SubQuerySettlement()`
351351
* <font color='#07C160' size='4'>点金计划(服务商)</font>
352-
* 待实现-[文档](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_1.shtml)
352+
* 点金计划管理:`client.V3GoldPlanManage()`
353+
* 商家小票管理:`client.V3GoldPlanBillManage()`
354+
* 同业过滤标签管理:`client.V3GoldPlanFilterManage()`
355+
* 开通广告展示:`client.V3GoldPlanOpenAdShow()`
356+
* 关闭广告展示:`client.V3GoldPlanCloseAdShow()`
353357
* <font color='#07C160' size='4'>电商收付通(商户进件)</font>
354358
* 二级商户进件:`client.V3EcommerceApply()`
355359
* 查询申请状态:`client.V3EcommerceApplyStatus()`

release_note.txt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@
22
修改记录:
33
(1) 微信V3:新增 client.V3EcommerceApply(),二级商户进件
44
(2) 微信V3:新增 client.V3EcommerceApplyStatus(),查询申请状态
5-
(3) 微信V3:公有化 wechat.GetReleaseSign()、wechat.GetSandBoxSign() 方法
5+
(3) 微信V3:新增 client.V3GoldPlanManage(),点金计划管理
6+
(4) 微信V3:新增 client.V3GoldPlanBillManage(),商家小票管理
7+
(5) 微信V3:新增 client.V3GoldPlanFilterManage(),同业过滤标签管理
8+
(6) 微信V3:新增 client.V3GoldPlanOpenAdShow(),开通广告展示
9+
(7) 微信V3:新增 client.V3GoldPlanCloseAdShow(),关闭广告展示
10+
(8) 微信V3:公有化 wechat.GetReleaseSign()、wechat.GetSandBoxSign() 方法
11+
(9) 微信V3:修改 client.V3PartnerCloseOrder() 入参参数
12+
(10) GoPay:一些小修改优化
613

714
版本号:Release 1.5.64
815
修改记录:

wechat/v3/cert.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func GetPlatformCerts(ctx context.Context, mchid, apiV3Key, serialNo, privateKey
109109
}
110110

111111
// Deprecated
112-
// 推荐直接使用 GetAndSelectNewestCert() 方法
112+
// 推荐直接使用 client.GetAndSelectNewestCert() 方法
113113
// 获取微信平台证书公钥(获取后自行保存使用,如需定期刷新功能,自行实现)
114114
// 注意事项
115115
// 如果自行实现验证平台签名逻辑的话,需要注意以下事项:
@@ -171,6 +171,7 @@ func (c *ClientV3) GetPlatformCerts() (certs *PlatformCertRsp, err error) {
171171
}
172172

173173
// Deprecated
174+
// client 已内部集成证书获取并维护,无需再Set正式
174175
// 设置 微信支付平台证书 和 证书序列号
175176
// 注意:请预先通过 client.GetPlatformCerts() 获取 微信平台公钥证书 和 证书序列号
176177
// 部分接口请求参数中敏感信息加密,使用此 微信支付平台公钥 和 证书序列号
@@ -192,7 +193,7 @@ func (c *ClientV3) DecryptCerts(ciphertext, nonce, additional string) (wxCerts s
192193
cipherBytes, _ := base64.StdEncoding.DecodeString(ciphertext)
193194
decrypt, err := aes.GCMDecrypt(cipherBytes, []byte(nonce), []byte(additional), c.ApiV3Key)
194195
if err != nil {
195-
return "", fmt.Errorf("aes.GCMDecrypt, err:%+v", err)
196+
return "", fmt.Errorf("aes.GCMDecrypt, err:%w", err)
196197
}
197198
return string(decrypt), nil
198199
}

wechat/v3/client_test.go

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package wechat
22

33
import (
44
"context"
5+
"crypto/rsa"
56
"crypto/sha256"
67
"encoding/hex"
78
"io/ioutil"
@@ -103,20 +104,23 @@ func TestGetAndSelectNewestCert(t *testing.T) {
103104
xlog.Infof("WxContent: \n%s", cert)
104105
}
105106

106-
func TestV3VerifySign(t *testing.T) {
107+
func TestV3VerifySignByPK(t *testing.T) {
107108
// type SignInfo struct {
108109
// HeaderTimestamp string `json:"Wechatpay-Timestamp"`
109110
// HeaderNonce string `json:"Wechatpay-Nonce"`
110111
// HeaderSignature string `json:"Wechatpay-Signature"`
111112
// HeaderSerial string `json:"Wechatpay-Serial"`
112113
// SignBody string `json:"sign_body"`
113114
//}
115+
116+
wxPublicKey := &rsa.PublicKey{}
117+
114118
timestamp := "1609149813"
115119
nonce := "c4682f0902e4c7fd5cfb7568a2a45e1b"
116120
signBody := `{"code_url":"weixin://wxpay/bizpayurl?pr=5zPMHa4zz"}`
117121
signature := "D/nRx+h1To/ybCJkJYTXptoSp6+UVPsKNlJ2AsHMf76rXq2qAYDSnoOTB4HRc8ZlPNck5JfeZ19lDXAJ/N9gyvWEwE3n01HNhaKqxOjW0C1KROCtxAj1Wd2qtMyiCzh/Azuk15eIHjht03teGQFDmowoOBSlMg9qOBaK8MNfwFcXvV3J12AMbFFR7s4cXbqzuk2qBeMAz6VrKDAwDHxZOWFqME59mg4bPWwBTNyYeCQVR2sqPflLvY1zttEGMN3s/CDvgLQ/SXZrAsHlS2lkDVHEc/sP9q0x9oU8lFL6DhD6eDU2mVP3pt7CPD/5QAnGnINaHIcZVj6Vb4l3PKzeog=="
118122

119-
err = V3VerifySign(timestamp, nonce, signBody, signature, "WxPublicKeyContent")
123+
err = V3VerifySignByPK(timestamp, nonce, signBody, signature, wxPublicKey)
120124
if err != nil {
121125
xlog.Error(err)
122126
return
@@ -301,7 +305,6 @@ func TestV3BillDownLoadBill(t *testing.T) {
301305
}
302306

303307
func TestV3ProfitSharingOrder(t *testing.T) {
304-
client.autoSign = true
305308
var rs []*ProfitSharingReceiver
306309
item := &ProfitSharingReceiver{
307310
Type: "PERSONAL_OPENID",
@@ -448,3 +451,21 @@ func TestClientV3_V3ComplaintUploadImage(t *testing.T) {
448451
}
449452
xlog.Errorf("wxRsp: %s", wxRsp.Error)
450453
}
454+
455+
func TestV3GoldPlanFilterManage(t *testing.T) {
456+
var rs []string
457+
rs = append(rs, "SOFTWARE")
458+
rs = append(rs, "SECURITY")
459+
rs = append(rs, "LOVE_MARRIAGE")
460+
461+
bm := make(gopay.BodyMap)
462+
bm.Set("sub_mchid", "2021060717").
463+
Set("advertising_industry_filters", rs)
464+
465+
wxRsp, err := client.V3GoldPlanFilterManage(ctx, bm)
466+
if err != nil {
467+
xlog.Error(err)
468+
return
469+
}
470+
xlog.Debugf("wxRsp: %#v", wxRsp)
471+
}

wechat/v3/constant.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ const (
147147
v3GoldPlanBillManage = "/v3/goldplan/merchants/changecustompagestatus" // 商家小票管理 POST
148148
v3GoldPlanFilterManage = "/v3/goldplan/merchants/set-advertising-industry-filter" // 同业过滤标签管理 POST
149149
v3GoldPlanOpenAdShow = "/v3/goldplan/merchants/open-advertising-show" // 开通广告展示 PATCH
150-
v3GoldPlanCloseAdShow = "/v3/goldplan/merchants/close-advertising-show" // 关闭广告展示 PATCH
150+
v3GoldPlanCloseAdShow = "/v3/goldplan/merchants/close-advertising-show" // 关闭广告展示 POST
151151

152152
// 消费者投诉2.0
153153
v3ComplaintList = "/v3/merchant-service/complaints-v2" // 查询投诉单列表 GET

wechat/v3/encrypt_decrypt.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ func V3DecryptNotifyCipherText(ciphertext, nonce, additional, apiV3Key string) (
7171
cipherBytes, _ := base64.StdEncoding.DecodeString(ciphertext)
7272
decrypt, err := aes.GCMDecrypt(cipherBytes, []byte(nonce), []byte(additional), []byte(apiV3Key))
7373
if err != nil {
74-
return nil, fmt.Errorf("aes.GCMDecrypt, err:%+v", err)
74+
return nil, fmt.Errorf("aes.GCMDecrypt, err:%w", err)
7575
}
7676
result = &V3DecryptResult{}
7777
if err = json.Unmarshal(decrypt, result); err != nil {
78-
return nil, fmt.Errorf("json.Unmarshal(%s), err:%+v", string(decrypt), err)
78+
return nil, fmt.Errorf("json.Unmarshal(%s), err:%w", string(decrypt), err)
7979
}
8080
return result, nil
8181
}
@@ -85,11 +85,11 @@ func V3DecryptPartnerNotifyCipherText(ciphertext, nonce, additional, apiV3Key st
8585
cipherBytes, _ := base64.StdEncoding.DecodeString(ciphertext)
8686
decrypt, err := aes.GCMDecrypt(cipherBytes, []byte(nonce), []byte(additional), []byte(apiV3Key))
8787
if err != nil {
88-
return nil, fmt.Errorf("aes.GCMDecrypt, err:%+v", err)
88+
return nil, fmt.Errorf("aes.GCMDecrypt, err:%w", err)
8989
}
9090
result = &V3DecryptPartnerResult{}
9191
if err = json.Unmarshal(decrypt, result); err != nil {
92-
return nil, fmt.Errorf("json.Unmarshal(%s), err:%+v", string(decrypt), err)
92+
return nil, fmt.Errorf("json.Unmarshal(%s), err:%w", string(decrypt), err)
9393
}
9494
return result, nil
9595
}
@@ -99,11 +99,11 @@ func V3DecryptRefundNotifyCipherText(ciphertext, nonce, additional, apiV3Key str
9999
cipherBytes, _ := base64.StdEncoding.DecodeString(ciphertext)
100100
decrypt, err := aes.GCMDecrypt(cipherBytes, []byte(nonce), []byte(additional), []byte(apiV3Key))
101101
if err != nil {
102-
return nil, fmt.Errorf("aes.GCMDecrypt, err:%+v", err)
102+
return nil, fmt.Errorf("aes.GCMDecrypt, err:%w", err)
103103
}
104104
result = &V3DecryptRefundResult{}
105105
if err = json.Unmarshal(decrypt, result); err != nil {
106-
return nil, fmt.Errorf("json.Unmarshal(%s), err:%+v", string(decrypt), err)
106+
return nil, fmt.Errorf("json.Unmarshal(%s), err:%w", string(decrypt), err)
107107
}
108108
return result, nil
109109
}
@@ -113,11 +113,11 @@ func V3DecryptPartnerRefundNotifyCipherText(ciphertext, nonce, additional, apiV3
113113
cipherBytes, _ := base64.StdEncoding.DecodeString(ciphertext)
114114
decrypt, err := aes.GCMDecrypt(cipherBytes, []byte(nonce), []byte(additional), []byte(apiV3Key))
115115
if err != nil {
116-
return nil, fmt.Errorf("aes.GCMDecrypt, err:%+v", err)
116+
return nil, fmt.Errorf("aes.GCMDecrypt, err:%w", err)
117117
}
118118
result = &V3DecryptPartnerRefundResult{}
119119
if err = json.Unmarshal(decrypt, result); err != nil {
120-
return nil, fmt.Errorf("json.Unmarshal(%s), err:%+v", string(decrypt), err)
120+
return nil, fmt.Errorf("json.Unmarshal(%s), err:%w", string(decrypt), err)
121121
}
122122
return result, nil
123123
}
@@ -127,11 +127,11 @@ func V3DecryptCombineNotifyCipherText(ciphertext, nonce, additional, apiV3Key st
127127
cipherBytes, _ := base64.StdEncoding.DecodeString(ciphertext)
128128
decrypt, err := aes.GCMDecrypt(cipherBytes, []byte(nonce), []byte(additional), []byte(apiV3Key))
129129
if err != nil {
130-
return nil, fmt.Errorf("aes.GCMDecrypt, err:%+v", err)
130+
return nil, fmt.Errorf("aes.GCMDecrypt, err:%w", err)
131131
}
132132
result = &V3DecryptCombineResult{}
133133
if err = json.Unmarshal(decrypt, result); err != nil {
134-
return nil, fmt.Errorf("json.Unmarshal(%s), err:%+v", string(decrypt), err)
134+
return nil, fmt.Errorf("json.Unmarshal(%s), err:%w", string(decrypt), err)
135135
}
136136
return result, nil
137137
}
@@ -141,11 +141,11 @@ func V3DecryptProfitShareNotifyCipherText(ciphertext, nonce, additional, apiV3Ke
141141
cipherBytes, _ := base64.StdEncoding.DecodeString(ciphertext)
142142
decrypt, err := aes.GCMDecrypt(cipherBytes, []byte(nonce), []byte(additional), []byte(apiV3Key))
143143
if err != nil {
144-
return nil, fmt.Errorf("aes.GCMDecrypt, err:%+v", err)
144+
return nil, fmt.Errorf("aes.GCMDecrypt, err:%w", err)
145145
}
146146
result = &V3DecryptProfitShareResult{}
147147
if err = json.Unmarshal(decrypt, result); err != nil {
148-
return nil, fmt.Errorf("json.Unmarshal(%s), err:%+v", string(decrypt), err)
148+
return nil, fmt.Errorf("json.Unmarshal(%s), err:%w", string(decrypt), err)
149149
}
150150
return result, nil
151151
}
@@ -155,11 +155,11 @@ func V3DecryptScoreNotifyCipherText(ciphertext, nonce, additional, apiV3Key stri
155155
cipherBytes, _ := base64.StdEncoding.DecodeString(ciphertext)
156156
decrypt, err := aes.GCMDecrypt(cipherBytes, []byte(nonce), []byte(additional), []byte(apiV3Key))
157157
if err != nil {
158-
return nil, fmt.Errorf("aes.GCMDecrypt, err:%+v", err)
158+
return nil, fmt.Errorf("aes.GCMDecrypt, err:%w", err)
159159
}
160160
result = &V3DecryptScoreResult{}
161161
if err = json.Unmarshal(decrypt, result); err != nil {
162-
return nil, fmt.Errorf("json.Unmarshal(%s), err:%+v", string(decrypt), err)
162+
return nil, fmt.Errorf("json.Unmarshal(%s), err:%w", string(decrypt), err)
163163
}
164164
return result, nil
165165
}

wechat/v3/gold_plan.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package wechat
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"net/http"
8+
9+
"github.com/go-pay/gopay"
10+
)
11+
12+
// 点金计划管理API
13+
// Code = 0 is success
14+
// 服务商文档:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_1.shtml
15+
func (c *ClientV3) V3GoldPlanManage(ctx context.Context, bm gopay.BodyMap) (wxRsp *GoldPlanManageRsp, err error) {
16+
authorization, err := c.authorization(MethodPost, v3GoldPlanManage, bm)
17+
if err != nil {
18+
return nil, err
19+
}
20+
res, si, bs, err := c.doProdPost(ctx, bm, v3GoldPlanManage, authorization)
21+
if err != nil {
22+
return nil, err
23+
}
24+
wxRsp = &GoldPlanManageRsp{Code: Success, SignInfo: si}
25+
wxRsp.Response = new(GoldPlanManage)
26+
if err = json.Unmarshal(bs, wxRsp.Response); err != nil {
27+
return nil, fmt.Errorf("json.Unmarshal(%s):%w", string(bs), err)
28+
}
29+
if res.StatusCode != http.StatusOK {
30+
wxRsp.Code = res.StatusCode
31+
wxRsp.Error = string(bs)
32+
return wxRsp, nil
33+
}
34+
return wxRsp, c.verifySyncSign(si)
35+
}
36+
37+
// 商家小票管理API
38+
// Code = 0 is success
39+
// 服务商文档:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_2.shtml
40+
func (c *ClientV3) V3GoldPlanBillManage(ctx context.Context, bm gopay.BodyMap) (wxRsp *GoldPlanManageRsp, err error) {
41+
authorization, err := c.authorization(MethodPost, v3GoldPlanBillManage, bm)
42+
if err != nil {
43+
return nil, err
44+
}
45+
res, si, bs, err := c.doProdPost(ctx, bm, v3GoldPlanBillManage, authorization)
46+
if err != nil {
47+
return nil, err
48+
}
49+
wxRsp = &GoldPlanManageRsp{Code: Success, SignInfo: si}
50+
wxRsp.Response = new(GoldPlanManage)
51+
if err = json.Unmarshal(bs, wxRsp.Response); err != nil {
52+
return nil, fmt.Errorf("json.Unmarshal(%s):%w", string(bs), err)
53+
}
54+
if res.StatusCode != http.StatusOK {
55+
wxRsp.Code = res.StatusCode
56+
wxRsp.Error = string(bs)
57+
return wxRsp, nil
58+
}
59+
return wxRsp, c.verifySyncSign(si)
60+
}
61+
62+
// 同业过滤标签管理API
63+
// Code = 0 is success
64+
// 服务商文档:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_3.shtml
65+
func (c *ClientV3) V3GoldPlanFilterManage(ctx context.Context, bm gopay.BodyMap) (wxRsp *EmptyRsp, err error) {
66+
authorization, err := c.authorization(MethodPost, v3GoldPlanFilterManage, bm)
67+
if err != nil {
68+
return nil, err
69+
}
70+
res, si, bs, err := c.doProdPost(ctx, bm, v3GoldPlanFilterManage, authorization)
71+
if err != nil {
72+
return nil, err
73+
}
74+
wxRsp = &EmptyRsp{Code: Success, SignInfo: si}
75+
if res.StatusCode != http.StatusNoContent {
76+
wxRsp.Code = res.StatusCode
77+
wxRsp.Error = string(bs)
78+
return wxRsp, nil
79+
}
80+
return wxRsp, c.verifySyncSign(si)
81+
}
82+
83+
// 开通广告展示API
84+
// Code = 0 is success
85+
// 服务商文档:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_4.shtml
86+
func (c *ClientV3) V3GoldPlanOpenAdShow(ctx context.Context, bm gopay.BodyMap) (wxRsp *EmptyRsp, err error) {
87+
authorization, err := c.authorization(MethodPATCH, v3GoldPlanOpenAdShow, bm)
88+
if err != nil {
89+
return nil, err
90+
}
91+
res, si, bs, err := c.doProdPatch(ctx, bm, v3GoldPlanOpenAdShow, authorization)
92+
if err != nil {
93+
return nil, err
94+
}
95+
wxRsp = &EmptyRsp{Code: Success, SignInfo: si}
96+
if res.StatusCode != http.StatusNoContent {
97+
wxRsp.Code = res.StatusCode
98+
wxRsp.Error = string(bs)
99+
return wxRsp, nil
100+
}
101+
return wxRsp, c.verifySyncSign(si)
102+
}
103+
104+
// 关闭广告展示API
105+
// Code = 0 is success
106+
// 服务商文档:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_5.shtml
107+
func (c *ClientV3) V3GoldPlanCloseAdShow(ctx context.Context, bm gopay.BodyMap) (wxRsp *EmptyRsp, err error) {
108+
authorization, err := c.authorization(MethodPATCH, v3GoldPlanCloseAdShow, bm)
109+
if err != nil {
110+
return nil, err
111+
}
112+
res, si, bs, err := c.doProdPost(ctx, bm, v3GoldPlanCloseAdShow, authorization)
113+
if err != nil {
114+
return nil, err
115+
}
116+
wxRsp = &EmptyRsp{Code: Success, SignInfo: si}
117+
if res.StatusCode != http.StatusNoContent {
118+
wxRsp.Code = res.StatusCode
119+
wxRsp.Error = string(bs)
120+
return wxRsp, nil
121+
}
122+
return wxRsp, c.verifySyncSign(si)
123+
}

0 commit comments

Comments
 (0)