插件-微信立减金,回调验签,回调是直连天下那边
This commit is contained in:
parent
512976c0c2
commit
b78c50e72e
|
@ -11,8 +11,8 @@ import (
|
|||
"plugins/weixin_cpn/internal/vo"
|
||||
)
|
||||
|
||||
func transConfig(config []byte) (*weixin.Config, error) {
|
||||
var c weixin.Config
|
||||
func transConfig(config []byte) (*weixin.Server, error) {
|
||||
var c weixin.Server
|
||||
err := json.Unmarshal(config, &c)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -6,7 +6,7 @@ import (
|
|||
"plugins/utils/weixin"
|
||||
)
|
||||
|
||||
func getApiSrv(ctx context.Context, c *weixin.Config) (*cashcoupons.CouponApiService, error) {
|
||||
func getApiSrv(ctx context.Context, c *weixin.Server) (*cashcoupons.CouponApiService, error) {
|
||||
client, err := weixin.New(ctx, c)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -14,3 +14,11 @@ func getApiSrv(ctx context.Context, c *weixin.Config) (*cashcoupons.CouponApiSer
|
|||
svc := cashcoupons.CouponApiService{Client: client}
|
||||
return &svc, nil
|
||||
}
|
||||
|
||||
func verify(ctx context.Context, c *weixin.Server) error {
|
||||
err := c.Verify(ctx, "", "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -59,6 +59,13 @@ func (p *WeiXinCpnService) Query(ctx context.Context, request *proto.QueryReques
|
|||
return queryResp(request, resp), nil
|
||||
}
|
||||
|
||||
func (p *WeiXinCpnService) Notify(_ context.Context, request *proto.NotifyRequest) (*proto.NotifyResponse, error) {
|
||||
func (p *WeiXinCpnService) Notify(ctx context.Context, request *proto.NotifyRequest) (*proto.NotifyResponse, error) {
|
||||
config, err := transConfig(request.Config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = verify(ctx, config); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return notifyResp(), nil
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ import (
|
|||
var server = &WeiXinCpnService{}
|
||||
|
||||
func config() []byte {
|
||||
c := &weixin.Config{
|
||||
c := &weixin.Server{
|
||||
MchID: "1605446142",
|
||||
MchCertificateSerialNumber: "4D081089DEB385316CBDCB55C070287E4920AC76",
|
||||
MchAPIv3Key: "ChengDuLanSeXiongDi1234567890123",
|
||||
|
@ -74,7 +74,33 @@ func TestNotify(t *testing.T) {
|
|||
Config: config(),
|
||||
Queries: []byte(``),
|
||||
Headers: []byte(``),
|
||||
Body: []byte(``),
|
||||
Body: []byte(`{
|
||||
"id": "240fd59e-13a3-5e8b-84a8-6608d535f606",
|
||||
"create_time": "2024-08-19T17:29:15+08:00",
|
||||
"resource_type": "encrypt-resource",
|
||||
"event_type": "COUPON.USE",
|
||||
"summary": "代金券核销通知",
|
||||
"original_type": "coupon",
|
||||
"associated_data": "coupon",
|
||||
"plain_text": {
|
||||
"stock_creator_mchid": "1652465541",
|
||||
"stock_id": "19345605",
|
||||
"coupon_id": "71916331907",
|
||||
"coupon_name": "三湘银行200元立减",
|
||||
"description": "",
|
||||
"status": "USED",
|
||||
"create_time": "2024-08-19T17:28:11+08:00",
|
||||
"coupon_type": "NORMAL",
|
||||
"no_cash": false,
|
||||
"singleitem": false,
|
||||
"consume_information": {
|
||||
"consume_time": "2024-08-19T17:29:15+08:00",
|
||||
"consume_mchid": "1319713401",
|
||||
"transaction_id": "4200002399202408192628783906"
|
||||
}
|
||||
}
|
||||
}
|
||||
`),
|
||||
}
|
||||
t.Run("TestNotify", func(t *testing.T) {
|
||||
got, err := server.Notify(context.Background(), in)
|
||||
|
|
|
@ -4,12 +4,14 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
"github.com/wechatpay-apiv3/wechatpay-go/core"
|
||||
"github.com/wechatpay-apiv3/wechatpay-go/core/auth"
|
||||
"github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers"
|
||||
"github.com/wechatpay-apiv3/wechatpay-go/core/option"
|
||||
"github.com/wechatpay-apiv3/wechatpay-go/utils"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
type Server struct {
|
||||
MchID string `json:"mch_id"`
|
||||
MchCertificateSerialNumber string `json:"mch_certificate_serial_number"`
|
||||
MchAPIv3Key string `json:"mch_ap_iv_3_key"`
|
||||
|
@ -31,7 +33,22 @@ func init() {
|
|||
}
|
||||
}
|
||||
|
||||
func New(ctx context.Context, c *Config) (*core.Client, error) {
|
||||
func client(ctx context.Context, c *Server) (*core.Client, error) {
|
||||
mchPrivateKey, err := utils.LoadPrivateKey(c.PrivateKey)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("MchID[%s] load merchant private key error:%v", c.MchID, err)
|
||||
}
|
||||
opts := []core.ClientOption{
|
||||
option.WithWechatPayAutoAuthCipher(c.MchID, c.MchCertificateSerialNumber, mchPrivateKey, c.MchAPIv3Key),
|
||||
}
|
||||
cl, err := core.NewClient(ctx, opts...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("MchID[%s] new wechat pay client err:%v", c.MchID, err)
|
||||
}
|
||||
return cl, nil
|
||||
}
|
||||
|
||||
func New(ctx context.Context, c *Server) (*core.Client, error) {
|
||||
instance.mutex.Lock()
|
||||
defer instance.mutex.Unlock()
|
||||
if instance.clients[c.MchID] != nil {
|
||||
|
@ -47,17 +64,8 @@ func New(ctx context.Context, c *Config) (*core.Client, error) {
|
|||
return instance.clients[c.MchID], nil
|
||||
}
|
||||
|
||||
func client(ctx context.Context, c *Config) (*core.Client, error) {
|
||||
mchPrivateKey, err := utils.LoadPrivateKey(c.PrivateKey)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("MchID[%s] load merchant private key error:%v", c.MchID, err)
|
||||
}
|
||||
opts := []core.ClientOption{
|
||||
option.WithWechatPayAutoAuthCipher(c.MchID, c.MchCertificateSerialNumber, mchPrivateKey, c.MchAPIv3Key),
|
||||
}
|
||||
cl, err := core.NewClient(ctx, opts...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("MchID[%s] new wechat pay client err:%v", c.MchID, err)
|
||||
}
|
||||
return cl, nil
|
||||
func (s *Server) Verify(ctx context.Context, message, signature string) error {
|
||||
var verifier auth.Verifier
|
||||
verifier = verifiers.NewSHA256WithRSAVerifier(nil)
|
||||
return verifier.Verify(ctx, s.MchCertificateSerialNumber, message, signature)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue