插件-微信立减金,回调验签,回调是直连天下那边
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