From 0f34b3df3341a095460a2b3d50f5f5d39ba2ccf3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E9=93=AD?= <zi__mm@163.com>
Date: Mon, 2 Sep 2024 09:43:40 +0800
Subject: [PATCH] =?UTF-8?q?alipay=E6=8F=92=E4=BB=B6=E5=8A=A0=E8=BD=BD?=
 =?UTF-8?q?=E8=AF=81=E4=B9=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore                                    |  3 +-
 cmd/alipay_redpack.go                         | 57 +++++++++++++++++++
 cmd/{main.go => zltx.go}                      |  8 +--
 .../alipay_redpack/internal/alipay_redpack.go |  2 +-
 .../internal/alipay_redpack_test.go           |  7 +--
 plugins/alipay_redpack/internal/transform.go  | 22 +------
 plugins/alipay_redpack/internal/util.go       |  6 --
 utils/alipay/cert.go                          | 21 +++++--
 utils/alipay/common.go                        |  6 ++
 9 files changed, 88 insertions(+), 44 deletions(-)
 create mode 100644 cmd/alipay_redpack.go
 rename cmd/{main.go => zltx.go} (96%)

diff --git a/.gitignore b/.gitignore
index a2eb5f7..4e7f2ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,4 +7,5 @@ Thumbs.db
 .idea/
 
 # project
-pkg/
\ No newline at end of file
+pkg/
+cert/
\ No newline at end of file
diff --git a/cmd/alipay_redpack.go b/cmd/alipay_redpack.go
new file mode 100644
index 0000000..8ad8bee
--- /dev/null
+++ b/cmd/alipay_redpack.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"gitea.cdlsxd.cn/sdk/plugin/instance"
+	"gitea.cdlsxd.cn/sdk/plugin/manage"
+	"gitea.cdlsxd.cn/sdk/plugin/proto"
+	"log"
+)
+
+var alpayRedConf = &manage.Config{
+	Cmd:         "pkg/mac/alipay_redpack.so",
+	Tag:         "alipay_redpack",
+	Version:     1,
+	CookieKey:   "alipay_redpack",
+	CookieValue: "alipay_redpack",
+}
+
+func getAlpayRedConf() []byte {
+	type Config struct {
+		AppId string `json:"app_id"`
+		Prk   string `json:"prk"` // 私钥
+	}
+	c := &Config{
+		AppId: "2021004100663111",
+		Prk:   "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDbA+YuMp4JUVj6rjzgwGKNXWkEMGX/rinqkfyBZ6B6p8EKz8zgA+ypiJLOixD3GyKnUnAzx4waNRZHfdEu+l57kJFtd/ipfwtJ28aTi7TqtqEpqD+UPY4ourt2CuyCFxWsonS6dczqtTvfAVArTdbGJYY+kNNVR3WiXgGUhkUu8N7vEowU00RUQGNdSVMUs4FX+HlU3RnEoRc/xUhPiaLf0Bm/g9wG96kwyg/TZvkNU7PpMVRdXeLrVORn0qThs3VA4dqondF+O12iC1TK4TKYGzFYczGAUsfuurtDyCc2GMoE+hH2FR8U7amQOVuYZFkutTdqaqukWpFQOr8wLeMzAgMBAAECggEAD715/3v3y6ejA3EeQvDQpGRANeLckcGMlaUkRpCSAf6oawSALuFZUt3T3zAzae7zUJ8mHTKMKR4DmeO68utfevXq3bkvj87nmslGvjfeKrgxYPMMjrTV0KuK6XLjiH3sOtn6FaR9s6iOwvovLs2LT/ZGbZyu84QNOjwTVP9JXZQkBgMItdKf+U3H2Cjp7U/qXBt8/9yzVFklp1g1883DAty0lzmT27dJimGVGaPQ8vNxo81+ZUEJAn6GUTk0K/GwJfhPTU8hh8G90n2LTyskoMjGxQe9lXfCcS9DmWawEQL4WTctPrDYlnS/cjCVMS0KXIFuxRNf6qaMYDeywC8BgQKBgQDyf40dvmw34Rrb46+NLayQ9W5CJI/dYeRajpCjoOomq5QYhbXzUCpVfbtByeGMsg3zN58NNsZGhl5SU0GdEdoOlxCk+2Hey2yQYF4ugQm/dTd68Jgqi3yujigAbNYa1ZhL9t3FqouPY1dGiaxl+DFYdSMIrsVFXh2NbrPyqTk5IQKBgQDnNaH7LCcIUqg9H8Tsls+8GLzP2HwF3hdll8asEsF3K3HX6/Zlp4VnnEcIkAxLRL/L0o5akXrmA18ZwfoSguTPXV9va3G2GgIiJHgcytmGtQVvbpFKuPnCXKz+avxnfO0flJqyYEuHr/40jsGbMkk0Kr52/n3ivXZbBUlT+tkt0wKBgB0qLgSnxEgsMJjFl3V5SsncWrhlwU+02Evz3X1wevjPpe4VFr7+ozjI+F5/MztCpt7bj6t9LPeKbYmlLb0ASqN6k6vj9+9ds97hWDJrnoqCRHvqt8JWKFauDi2O6WksyzZHqIB/dG14WyTGpg9VfEnRPLdsnZksKo26BLZol9NBAoGBAMz7oMNljqlzVtLyMo2q2zuhFuySusoc79NTL4FpE3rK2qCbA5V2YvDL/bIau7uTlRNodmrXZgU84fidIE9/Gsq5tp26vVK8Vj3c5Vxpf1dNcCct+MQtoMjvjzP0uBgsCrKf9lLEytHed1ozYnRsrbgBWWF4GTWH0cG6uxsoX5mfAoGAfYXKZdyRU+Su4y4EnDLMXd320ar7PaeuY8aZU7V6UQEsaOj6H3O8JMEOuBrOVEhAP2EkAC8ayargSXTSOkN97pg88agKDwA6jh4N6TKAK8XMft81YPPliVwZMsAUqihSKQBnKZ7ssHHLGWWWp5vfkyb7Y7dIkZcPzB0X3q/jL58=",
+	}
+	marshal, _ := json.Marshal(c)
+	return marshal
+}
+
+// main 这只是一个演示
+func main() {
+	err := manage.Add(alpayRedConf)
+	if err != nil {
+		log.Fatalln(err)
+	}
+	alipayRedPack()
+}
+
+func alipayRedPack() {
+	queryRequest := &proto.QueryRequest{
+		Config: getAlpayRedConf(),
+		Order: &proto.QueryRequest_Order{
+			OrderNo: "lsxd202306071545141532",
+			TradeNo: "20230607110070000006320086925897",
+			Account: "",
+			Extra:   []byte(``),
+		},
+	}
+	resQuery, err := instance.Query(context.Background(), alpayRedConf.Tag, queryRequest)
+	if err != nil {
+		log.Fatalln(err)
+	}
+	log.Printf("Query res:%+v", resQuery)
+}
diff --git a/cmd/main.go b/cmd/zltx.go
similarity index 96%
rename from cmd/main.go
rename to cmd/zltx.go
index 0d4db5d..e3670ec 100644
--- a/cmd/main.go
+++ b/cmd/zltx.go
@@ -10,7 +10,7 @@ import (
 )
 
 var zltxConf = &manage.Config{
-	Cmd:         "pkg/zltx.so",
+	Cmd:         "pkg/mac/zltx.so",
 	Tag:         "zltx",
 	Version:     1,
 	CookieKey:   "zltx",
@@ -35,15 +35,11 @@ func config() []byte {
 }
 
 // main 这只是一个演示
-func main() {
+func zltx() {
 	err := manage.Add(zltxConf)
 	if err != nil {
 		log.Fatalln(err)
 	}
-	zltx()
-}
-
-func zltx() {
 	orderRequest := &proto.OrderRequest{
 		Config: config(),
 		Order: &proto.OrderRequest_Order{
diff --git a/plugins/alipay_redpack/internal/alipay_redpack.go b/plugins/alipay_redpack/internal/alipay_redpack.go
index a18a674..9abd5ad 100644
--- a/plugins/alipay_redpack/internal/alipay_redpack.go
+++ b/plugins/alipay_redpack/internal/alipay_redpack.go
@@ -85,7 +85,7 @@ func (s *AlipayRedPackService) Notify(_ context.Context, request *proto.NotifyRe
 	}
 	n := notifyReq(request)
 
-	cert, err := alipay.GetCert(c.MchCertPath, c.RootCertPath, c.PukPath, c.AppId)
+	cert, err := alipay.GetCert(c.AppId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/plugins/alipay_redpack/internal/alipay_redpack_test.go b/plugins/alipay_redpack/internal/alipay_redpack_test.go
index 7fe7101..4000405 100644
--- a/plugins/alipay_redpack/internal/alipay_redpack_test.go
+++ b/plugins/alipay_redpack/internal/alipay_redpack_test.go
@@ -13,11 +13,8 @@ var server = &AlipayRedPackService{}
 
 func config() []byte {
 	c := &Config{
-		AppId:        "2021004100663111",
-		Prk:          "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDbA+YuMp4JUVj6rjzgwGKNXWkEMGX/rinqkfyBZ6B6p8EKz8zgA+ypiJLOixD3GyKnUnAzx4waNRZHfdEu+l57kJFtd/ipfwtJ28aTi7TqtqEpqD+UPY4ourt2CuyCFxWsonS6dczqtTvfAVArTdbGJYY+kNNVR3WiXgGUhkUu8N7vEowU00RUQGNdSVMUs4FX+HlU3RnEoRc/xUhPiaLf0Bm/g9wG96kwyg/TZvkNU7PpMVRdXeLrVORn0qThs3VA4dqondF+O12iC1TK4TKYGzFYczGAUsfuurtDyCc2GMoE+hH2FR8U7amQOVuYZFkutTdqaqukWpFQOr8wLeMzAgMBAAECggEAD715/3v3y6ejA3EeQvDQpGRANeLckcGMlaUkRpCSAf6oawSALuFZUt3T3zAzae7zUJ8mHTKMKR4DmeO68utfevXq3bkvj87nmslGvjfeKrgxYPMMjrTV0KuK6XLjiH3sOtn6FaR9s6iOwvovLs2LT/ZGbZyu84QNOjwTVP9JXZQkBgMItdKf+U3H2Cjp7U/qXBt8/9yzVFklp1g1883DAty0lzmT27dJimGVGaPQ8vNxo81+ZUEJAn6GUTk0K/GwJfhPTU8hh8G90n2LTyskoMjGxQe9lXfCcS9DmWawEQL4WTctPrDYlnS/cjCVMS0KXIFuxRNf6qaMYDeywC8BgQKBgQDyf40dvmw34Rrb46+NLayQ9W5CJI/dYeRajpCjoOomq5QYhbXzUCpVfbtByeGMsg3zN58NNsZGhl5SU0GdEdoOlxCk+2Hey2yQYF4ugQm/dTd68Jgqi3yujigAbNYa1ZhL9t3FqouPY1dGiaxl+DFYdSMIrsVFXh2NbrPyqTk5IQKBgQDnNaH7LCcIUqg9H8Tsls+8GLzP2HwF3hdll8asEsF3K3HX6/Zlp4VnnEcIkAxLRL/L0o5akXrmA18ZwfoSguTPXV9va3G2GgIiJHgcytmGtQVvbpFKuPnCXKz+avxnfO0flJqyYEuHr/40jsGbMkk0Kr52/n3ivXZbBUlT+tkt0wKBgB0qLgSnxEgsMJjFl3V5SsncWrhlwU+02Evz3X1wevjPpe4VFr7+ozjI+F5/MztCpt7bj6t9LPeKbYmlLb0ASqN6k6vj9+9ds97hWDJrnoqCRHvqt8JWKFauDi2O6WksyzZHqIB/dG14WyTGpg9VfEnRPLdsnZksKo26BLZol9NBAoGBAMz7oMNljqlzVtLyMo2q2zuhFuySusoc79NTL4FpE3rK2qCbA5V2YvDL/bIau7uTlRNodmrXZgU84fidIE9/Gsq5tp26vVK8Vj3c5Vxpf1dNcCct+MQtoMjvjzP0uBgsCrKf9lLEytHed1ozYnRsrbgBWWF4GTWH0cG6uxsoX5mfAoGAfYXKZdyRU+Su4y4EnDLMXd320ar7PaeuY8aZU7V6UQEsaOj6H3O8JMEOuBrOVEhAP2EkAC8ayargSXTSOkN97pg88agKDwA6jh4N6TKAK8XMft81YPPliVwZMsAUqihSKQBnKZ7ssHHLGWWWp5vfkyb7Y7dIkZcPzB0X3q/jL58=",
-		PukPath:      "/Users/lsxd/code/php/yxxt/market/config/alipaycash/alipayCertPublicKey_RSA2.crt",
-		MchCertPath:  "/Users/lsxd/code/php/yxxt/market/config/alipaycash/appCertPublicKey_2021004100663111.crt",
-		RootCertPath: "/Users/lsxd/code/php/yxxt/market/config/alipaycash/alipayRootCert.crt",
+		AppId: "2021004100663111",
+		Prk:   "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDbA+YuMp4JUVj6rjzgwGKNXWkEMGX/rinqkfyBZ6B6p8EKz8zgA+ypiJLOixD3GyKnUnAzx4waNRZHfdEu+l57kJFtd/ipfwtJ28aTi7TqtqEpqD+UPY4ourt2CuyCFxWsonS6dczqtTvfAVArTdbGJYY+kNNVR3WiXgGUhkUu8N7vEowU00RUQGNdSVMUs4FX+HlU3RnEoRc/xUhPiaLf0Bm/g9wG96kwyg/TZvkNU7PpMVRdXeLrVORn0qThs3VA4dqondF+O12iC1TK4TKYGzFYczGAUsfuurtDyCc2GMoE+hH2FR8U7amQOVuYZFkutTdqaqukWpFQOr8wLeMzAgMBAAECggEAD715/3v3y6ejA3EeQvDQpGRANeLckcGMlaUkRpCSAf6oawSALuFZUt3T3zAzae7zUJ8mHTKMKR4DmeO68utfevXq3bkvj87nmslGvjfeKrgxYPMMjrTV0KuK6XLjiH3sOtn6FaR9s6iOwvovLs2LT/ZGbZyu84QNOjwTVP9JXZQkBgMItdKf+U3H2Cjp7U/qXBt8/9yzVFklp1g1883DAty0lzmT27dJimGVGaPQ8vNxo81+ZUEJAn6GUTk0K/GwJfhPTU8hh8G90n2LTyskoMjGxQe9lXfCcS9DmWawEQL4WTctPrDYlnS/cjCVMS0KXIFuxRNf6qaMYDeywC8BgQKBgQDyf40dvmw34Rrb46+NLayQ9W5CJI/dYeRajpCjoOomq5QYhbXzUCpVfbtByeGMsg3zN58NNsZGhl5SU0GdEdoOlxCk+2Hey2yQYF4ugQm/dTd68Jgqi3yujigAbNYa1ZhL9t3FqouPY1dGiaxl+DFYdSMIrsVFXh2NbrPyqTk5IQKBgQDnNaH7LCcIUqg9H8Tsls+8GLzP2HwF3hdll8asEsF3K3HX6/Zlp4VnnEcIkAxLRL/L0o5akXrmA18ZwfoSguTPXV9va3G2GgIiJHgcytmGtQVvbpFKuPnCXKz+avxnfO0flJqyYEuHr/40jsGbMkk0Kr52/n3ivXZbBUlT+tkt0wKBgB0qLgSnxEgsMJjFl3V5SsncWrhlwU+02Evz3X1wevjPpe4VFr7+ozjI+F5/MztCpt7bj6t9LPeKbYmlLb0ASqN6k6vj9+9ds97hWDJrnoqCRHvqt8JWKFauDi2O6WksyzZHqIB/dG14WyTGpg9VfEnRPLdsnZksKo26BLZol9NBAoGBAMz7oMNljqlzVtLyMo2q2zuhFuySusoc79NTL4FpE3rK2qCbA5V2YvDL/bIau7uTlRNodmrXZgU84fidIE9/Gsq5tp26vVK8Vj3c5Vxpf1dNcCct+MQtoMjvjzP0uBgsCrKf9lLEytHed1ozYnRsrbgBWWF4GTWH0cG6uxsoX5mfAoGAfYXKZdyRU+Su4y4EnDLMXd320ar7PaeuY8aZU7V6UQEsaOj6H3O8JMEOuBrOVEhAP2EkAC8ayargSXTSOkN97pg88agKDwA6jh4N6TKAK8XMft81YPPliVwZMsAUqihSKQBnKZ7ssHHLGWWWp5vfkyb7Y7dIkZcPzB0X3q/jL58=",
 	}
 	marshal, _ := json.Marshal(c)
 	return marshal
diff --git a/plugins/alipay_redpack/internal/transform.go b/plugins/alipay_redpack/internal/transform.go
index ee9014a..8b162fc 100644
--- a/plugins/alipay_redpack/internal/transform.go
+++ b/plugins/alipay_redpack/internal/transform.go
@@ -12,12 +12,8 @@ import (
 )
 
 type Config struct {
-	AppId   string `json:"app_id"`
-	Prk     string `json:"prk"` // 私钥
-	PukPath string `json:"npk"` // 验签公钥
-
-	MchCertPath  string `json:"mch_cert_path"`
-	RootCertPath string `json:"root_cert_path"`
+	AppId string `json:"app_id"`
+	Prk   string `json:"prk"` // 私钥
 }
 
 func transConfig(config []byte) (*Config, error) {
@@ -26,18 +22,6 @@ func transConfig(config []byte) (*Config, error) {
 	if err != nil {
 		return nil, err
 	}
-	//dir, _ := os.Getwd()
-	//filePath := fmt.Sprintf("%s/%s/%s/%s", dir, "cert", "alipay", c.AppId)
-	//if !fileExists(filePath) {
-	//	return nil, fmt.Errorf("授权文件信息不存在,请联系技术人员处理")
-	//}
-	/**
-	AppId:        a.bc.Alipay.AppId,
-	Prk:          a.bc.Alipay.GetPrk(),
-	PukPath:      fmt.Sprintf("%s/%s", filePath, "alipayCertPublicKey_RSA2.crt"),
-	MchCertPath:  fmt.Sprintf("%s/%s", filePath, a.bc.Alipay.MchCertName),
-	RootCertPath: fmt.Sprintf("%s/%s", filePath, "alipayRootCert.crt"),
-	*/
 	return &c, nil
 }
 
@@ -45,7 +29,7 @@ func (c *Config) paramReq(req po.Req, method string) (*po.Param, error) {
 	if err := req.Validate(); err != nil {
 		return nil, err
 	}
-	cert, err := alipay.GetCert(c.MchCertPath, c.RootCertPath, c.PukPath, c.AppId)
+	cert, err := alipay.GetCert(c.AppId)
 	if err != nil {
 		return nil, err
 	}
diff --git a/plugins/alipay_redpack/internal/util.go b/plugins/alipay_redpack/internal/util.go
index 2aea271..a46da92 100644
--- a/plugins/alipay_redpack/internal/util.go
+++ b/plugins/alipay_redpack/internal/util.go
@@ -12,7 +12,6 @@ import (
 	"fmt"
 	"gitea.cdlsxd.cn/sdk/plugin/utils"
 	"net/url"
-	"os"
 	"plugins/alipay_redpack/internal/po"
 	"regexp"
 	"strings"
@@ -28,11 +27,6 @@ func isEmailValid(email string) bool {
 	return emailRegex.MatchString(email)
 }
 
-func fileExists(filePath string) bool {
-	_, err := os.Stat(filePath)
-	return err == nil || os.IsExist(err)
-}
-
 func req(config *Config, req *po.Param) (url.Values, error) {
 	var strToBeSigned strings.Builder
 	uv := url.Values{}
diff --git a/utils/alipay/cert.go b/utils/alipay/cert.go
index 7186def..da33444 100644
--- a/utils/alipay/cert.go
+++ b/utils/alipay/cert.go
@@ -2,6 +2,7 @@ package alipay
 
 import (
 	"fmt"
+	"os"
 	"sync"
 )
 
@@ -37,23 +38,31 @@ func init() {
 	instance.CertConfigs = make(map[string]*CertConfig)
 }
 
-func GetCert(mchCertPath, rootCertPath, PublicKeyPath, appId string) (*CertConfig, error) {
-	if mchCertPath == "" || rootCertPath == "" || appId == "" {
-		return nil, fmt.Errorf("mchCertPath or rootCertPath or appId is empty")
-	}
+func GetCert(appId string) (*CertConfig, error) {
 	c := getCertConfig(appId)
 	if c != nil {
-		return nil, fmt.Errorf("appId %s already exists", appId)
+		return c, nil
 	}
+	dir, err := os.Getwd()
+	if err != nil {
+		return nil, fmt.Errorf("get current dir error: %v", err)
+	}
+	filePath := fmt.Sprintf("%s/%s/%s/%s", dir, "cert", "alipay", appId)
+	if !fileExists(filePath) {
+		return nil, fmt.Errorf("[%s]授权文件信息不存在,请联系技术人员处理", appId)
+	}
+	mchCertPath := fmt.Sprintf("%s/%s_%s.crt", filePath, "appCertPublicKey", appId)
 	mchCertSN, err := getMchCertSN(mchCertPath)
 	if err != nil {
 		return nil, fmt.Errorf("get mchCertSN error: %v", err)
 	}
+	rootCertPath := fmt.Sprintf("%s/%s", filePath, "alipayRootCert.crt")
 	rootCertSN, err := getRootCertSN(rootCertPath)
 	if err != nil {
 		return nil, fmt.Errorf("get rootCertSN error: %v", err)
 	}
-	publicKey, err := getPublicKey(PublicKeyPath)
+	publicKeyPath := fmt.Sprintf("%s/%s", filePath, "alipayCertPublicKey_RSA2.crt")
+	publicKey, err := getPublicKey(publicKeyPath)
 	if err != nil {
 		return nil, fmt.Errorf("get publicKey error: %v", err)
 	}
diff --git a/utils/alipay/common.go b/utils/alipay/common.go
index 03161bf..aa2f3c4 100644
--- a/utils/alipay/common.go
+++ b/utils/alipay/common.go
@@ -7,6 +7,7 @@ import (
 	"encoding/pem"
 	"fmt"
 	"log"
+	"os"
 )
 
 // md5Hash 计算 MD5 哈希值
@@ -36,3 +37,8 @@ func getCert(certData []byte) (*x509.Certificate, error) {
 
 	return cert, nil
 }
+
+func fileExists(filePath string) bool {
+	_, err := os.Stat(filePath)
+	return err == nil || os.IsExist(err)
+}