@@ -21,10 +21,10 @@ import (
21
21
"encoding/base64"
22
22
"encoding/pem"
23
23
"encoding/xml"
24
- "errors"
25
24
"fmt"
26
25
"github.com/blusewang/wx/mch_api"
27
26
"github.com/blusewang/wx/mch_api_v3"
27
+ "log"
28
28
"net/http"
29
29
"strconv"
30
30
"time"
@@ -164,10 +164,7 @@ func (ma MchAccount) RsaEncrypt(plain string) (out string) {
164
164
165
165
// RsaEncryptV3 机要信息加密V2
166
166
func (ma MchAccount ) RsaEncryptV3 (plain string ) (out string ) {
167
- var pk * x509.Certificate
168
- for s := range wechatPayCerts {
169
- pk = wechatPayCerts [s ]
170
- }
167
+ var pk = wechatPayCerts .GetCert ()
171
168
raw , err := rsa .EncryptOAEP (sha1 .New (), rand2 .Reader , pk .PublicKey .(* rsa.PublicKey ), []byte (plain ), nil )
172
169
if err != nil {
173
170
return
@@ -236,25 +233,29 @@ func (ma MchAccount) NewMchReqV3(api mch_api_v3.MchApiV3) (req *mchReqV3) {
236
233
237
234
// GetCertificate 获取证书
238
235
func (ma MchAccount ) GetCertificate () (cert * x509.Certificate , err error ) {
239
- if len ( wechatPayCerts ) == 0 {
236
+ if wechatPayCerts . IsEmpty () {
240
237
if err = ma .DownloadV3Cert (); err != nil {
241
238
return
242
239
}
243
240
}
244
- for i := range wechatPayCerts {
245
- return wechatPayCerts [i ], nil
246
- }
247
- return
241
+ return wechatPayCerts .GetCert (), nil
248
242
}
249
243
250
244
// DownloadV3Cert 获取微信支付官方证书
251
245
func (ma MchAccount ) DownloadV3Cert () (err error ) {
246
+ if wechatPayCerts .IsEmpty () {
247
+ wechatPayCerts .Add (PayCert {
248
+ SerialNo : "" ,
249
+ EffectiveTime : time .Now (),
250
+ ExpireTime : time .Now (),
251
+ cert : nil ,
252
+ })
253
+ }
252
254
var res mch_api_v3.OtherCertificatesResp
253
255
err = ma .NewMchReqV3 (mch_api_v3 .OtherCertificates ).Bind (& res ).Do (http .MethodGet )
254
256
if err != nil {
255
257
return
256
258
}
257
- wechatPayCerts = make (map [string ]* x509.Certificate )
258
259
for _ , c := range res .Data {
259
260
ct , err := ma .DecryptAES256GCM (c .EncryptCertificate .Nonce , c .EncryptCertificate .AssociatedData , c .EncryptCertificate .Ciphertext )
260
261
if err != nil {
@@ -265,7 +266,12 @@ func (ma MchAccount) DownloadV3Cert() (err error) {
265
266
if err != nil {
266
267
return err
267
268
}
268
- wechatPayCerts [c .SerialNo ] = cert
269
+ wechatPayCerts .Add (PayCert {
270
+ SerialNo : c .SerialNo ,
271
+ EffectiveTime : c .EffectiveTime ,
272
+ ExpireTime : c .ExpireTime ,
273
+ cert : cert ,
274
+ })
269
275
}
270
276
return
271
277
}
@@ -284,14 +290,15 @@ func (ma MchAccount) SignBaseV3(message string) (sign string, err error) {
284
290
285
291
// VerifyV3 验签
286
292
func (ma MchAccount ) VerifyV3 (header http.Header , body []byte ) (err error ) {
287
- if len ( wechatPayCerts ) == 0 {
293
+ if wechatPayCerts . IsEmpty () {
288
294
if err = ma .DownloadV3Cert (); err != nil {
289
295
return
290
296
}
291
297
}
292
- cert := wechatPayCerts [ header .Get ("Wechatpay-Serial" )]
298
+ cert := wechatPayCerts . GetCertBySerialNo ( header .Get ("Wechatpay-Serial" ))
293
299
if cert == nil {
294
- return errors .New ("Wechatpay-Serial Error" )
300
+ log .Println ("未能在缓存中匹配到对方ID的证书" , header .Get ("Wechatpay-Serial" ))
301
+ return nil
295
302
}
296
303
signRaw , err := base64 .StdEncoding .DecodeString (header .Get ("Wechatpay-Signature" ))
297
304
if err != nil {
0 commit comments