From 81250f625a97d308e4eb81717cb656ad0042de57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=85=89=E6=98=A5?= Date: Mon, 20 Jun 2022 10:50:32 +0800 Subject: [PATCH] - update wechatpayapiv2 --- service/wechatpayapiv2/app.go | 76 ------------------- service/wechatpayapiv2/client.go | 47 ++++++++++++ service/wechatpayapiv2/const.go | 9 +++ service/wechatpayapiv2/get.go | 28 +++++++ .../mmpaymkttransfers.gettransferinfo.go | 16 ++-- .../mmpaymkttransfers.promotion.transfers.go | 16 ++-- service/wechatpayapiv2/mongodb.go | 4 +- service/wechatpayapiv2/params.go | 2 +- service/wechatpayapiv2/pgsql.go | 6 +- service/wechatpayapiv2/request.go | 37 +++++++++ service/wechatpayapiv2/sign.go | 12 +-- 11 files changed, 149 insertions(+), 104 deletions(-) delete mode 100644 service/wechatpayapiv2/app.go create mode 100644 service/wechatpayapiv2/client.go create mode 100644 service/wechatpayapiv2/const.go create mode 100644 service/wechatpayapiv2/get.go create mode 100644 service/wechatpayapiv2/request.go diff --git a/service/wechatpayapiv2/app.go b/service/wechatpayapiv2/app.go deleted file mode 100644 index 6f046743..00000000 --- a/service/wechatpayapiv2/app.go +++ /dev/null @@ -1,76 +0,0 @@ -package wechatpayapiv2 - -import ( - "crypto/tls" - "go.dtapp.net/library/utils/golog" - "go.dtapp.net/library/utils/gomongo" - "go.dtapp.net/library/utils/gorequest" - "gorm.io/gorm" -) - -// App 微信支付服务 -type App struct { - appId string // 小程序或者公众号唯一凭证 - appSecret string // 小程序或者公众号唯一凭证密钥 - mchId string // 微信支付的商户id - mchKey string // 私钥 - certString string - keyString string - mongo *gomongo.Client // 日志数据库 - pgsql *gorm.DB // pgsql数据库 - client *gorequest.App // 请求客户端 - log *golog.Api // 日志服务 - logTableName string // 日志表名 - logStatus bool // 日志状态 -} - -func NewApp(appId string, appSecret string, mchId string, mchKey string, certString string, keyString string, pgsql *gorm.DB) *App { - app := &App{appId: appId, appSecret: appSecret, mchId: mchId, mchKey: mchKey, certString: certString, keyString: keyString} - app.client = gorequest.NewHttp() - if pgsql != nil { - app.pgsql = pgsql - app.logStatus = true - app.logTableName = "wechatpayapiv2" - app.log = golog.NewApi(&golog.ApiConfig{ - Db: pgsql, - TableName: app.logTableName, - }) - } - return app -} - -func (app *App) request(url string, params map[string]interface{}, cert *tls.Certificate) (resp gorequest.Response, err error) { - - // 创建请求 - client := app.client - - // 设置请求地址 - client.SetUri(url) - - // 设置格式 - client.SetContentTypeXml() - - // 设置参数 - client.SetParams(params) - - // 设置证书 - client.SetP12Cert(cert) - - // 发起请求 - request, err := client.Post() - if err != nil { - return gorequest.Response{}, err - } - - // 日志 - if app.logStatus == true { - go app.postgresqlLog(request) - } - - return request, err -} - -func (app *App) P12ToPem() (*tls.Certificate, error) { - pemCert, err := tls.X509KeyPair([]byte(app.certString), []byte(app.keyString)) - return &pemCert, err -} diff --git a/service/wechatpayapiv2/client.go b/service/wechatpayapiv2/client.go new file mode 100644 index 00000000..1dd1c44d --- /dev/null +++ b/service/wechatpayapiv2/client.go @@ -0,0 +1,47 @@ +package wechatpayapiv2 + +import ( + "go.dtapp.net/library/utils/golog" + "go.dtapp.net/library/utils/gomongo" + "go.dtapp.net/library/utils/gorequest" + "gorm.io/gorm" +) + +type ConfigClient struct { + AppId string // 小程序或者公众号唯一凭证 + AppSecret string // 小程序或者公众号唯一凭证密钥 + MchId string // 微信支付的商户id + MchKey string // 私钥 + CertString string + KeyString string + MongoDb *gomongo.Client // 日志数据库 + PgsqlDb *gorm.DB // pgsql数据库 +} + +// Client 微信支付服务 +type Client struct { + client *gorequest.App // 请求客户端 + log *golog.ApiClient // 日志服务 + logStatus bool // 日志状态 + config *ConfigClient // 配置 +} + +func NewClient(config *ConfigClient) (*Client, error) { + + var err error + c := &Client{config: config} + + c.client = gorequest.NewHttp() + if c.config.PgsqlDb != nil { + c.logStatus = true + c.log, err = golog.NewApiClient(&golog.ConfigApiClient{ + Db: c.config.PgsqlDb, + TableName: logTable, + }) + if err != nil { + return nil, err + } + } + + return c, nil +} diff --git a/service/wechatpayapiv2/const.go b/service/wechatpayapiv2/const.go new file mode 100644 index 00000000..a45d8d6e --- /dev/null +++ b/service/wechatpayapiv2/const.go @@ -0,0 +1,9 @@ +package wechatpayapiv2 + +const ( + apiUrl = "https://api.mch.weixin.qq.com" +) + +const ( + logTable = "wechatpayapiv2" +) diff --git a/service/wechatpayapiv2/get.go b/service/wechatpayapiv2/get.go new file mode 100644 index 00000000..01b2595c --- /dev/null +++ b/service/wechatpayapiv2/get.go @@ -0,0 +1,28 @@ +package wechatpayapiv2 + +import "crypto/tls" + +func (c *Client) GetAppId() string { + return c.config.AppId +} + +func (c *Client) GetMchId() string { + return c.config.MchId +} + +func (c *Client) GetMchKey() string { + return c.config.MchKey +} + +func (c *Client) GetCertString() string { + return c.config.CertString +} + +func (c *Client) GetKeyString() string { + return c.config.KeyString +} + +func (c *Client) P12ToPem() (*tls.Certificate, error) { + pemCert, err := tls.X509KeyPair([]byte(c.GetCertString()), []byte(c.GetKeyString())) + return &pemCert, err +} diff --git a/service/wechatpayapiv2/mmpaymkttransfers.gettransferinfo.go b/service/wechatpayapiv2/mmpaymkttransfers.gettransferinfo.go index d3dea9d3..f4b49e29 100644 --- a/service/wechatpayapiv2/mmpaymkttransfers.gettransferinfo.go +++ b/service/wechatpayapiv2/mmpaymkttransfers.gettransferinfo.go @@ -33,27 +33,27 @@ type TransfersQueryResult struct { Err error // 错误 } -func NewTransfersQueryResult(result TransfersQueryResponse, body []byte, http gorequest.Response, err error) *TransfersQueryResult { +func newTransfersQueryResult(result TransfersQueryResponse, body []byte, http gorequest.Response, err error) *TransfersQueryResult { return &TransfersQueryResult{Result: result, Body: body, Http: http, Err: err} } // TransfersQuery // 付款到零钱 - 查询付款 // https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3 -func (app *App) TransfersQuery(partnerTradeNo string) *TransfersQueryResult { - cert, err := app.P12ToPem() +func (c *Client) TransfersQuery(partnerTradeNo string) *TransfersQueryResult { + cert, err := c.P12ToPem() // 参数 params := NewParams() - params.Set("appid", app.appId) - params.Set("mch_id", app.mchId) + params.Set("appid", c.GetAppId()) + params.Set("mch_id", c.GetMchId()) params.Set("nonce_str", gorandom.Alphanumeric(32)) params.Set("partner_trade_no", partnerTradeNo) // 签名 - params.Set("sign", app.getMd5Sign(params)) + params.Set("sign", c.getMd5Sign(params)) // 请求 - request, err := app.request("https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo", params, cert) + request, err := c.request(apiUrl+"/mmpaymkttransfers/gettransferinfo", params, cert) // 定义 var response TransfersQueryResponse err = xml.Unmarshal(request.ResponseBody, &response) - return NewTransfersQueryResult(response, request.ResponseBody, request, err) + return newTransfersQueryResult(response, request.ResponseBody, request, err) } diff --git a/service/wechatpayapiv2/mmpaymkttransfers.promotion.transfers.go b/service/wechatpayapiv2/mmpaymkttransfers.promotion.transfers.go index f3e0b3dc..4439395c 100644 --- a/service/wechatpayapiv2/mmpaymkttransfers.promotion.transfers.go +++ b/service/wechatpayapiv2/mmpaymkttransfers.promotion.transfers.go @@ -28,19 +28,19 @@ type TransfersResult struct { Err error // 错误 } -func NewTransfersResult(result TransfersResponse, body []byte, http gorequest.Response, err error) *TransfersResult { +func newTransfersResult(result TransfersResponse, body []byte, http gorequest.Response, err error) *TransfersResult { return &TransfersResult{Result: result, Body: body, Http: http, Err: err} } // Transfers // 付款到零钱 - 付款 // https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 -func (app *App) Transfers(partnerTradeNo, openid string, amount int64, desc string) *TransfersResult { - cert, err := app.P12ToPem() +func (c *Client) Transfers(partnerTradeNo, openid string, amount int64, desc string) *TransfersResult { + cert, err := c.P12ToPem() // 参数 params := NewParams() - params.Set("mch_appid", app.appId) - params.Set("mchid", app.mchId) + params.Set("mch_appid", c.GetAppId()) + params.Set("mchid", c.GetMchId()) params.Set("nonce_str", gorandom.Alphanumeric(32)) params.Set("partner_trade_no", partnerTradeNo) params.Set("openid", openid) @@ -48,11 +48,11 @@ func (app *App) Transfers(partnerTradeNo, openid string, amount int64, desc stri params.Set("amount", amount) params.Set("desc", desc) // 签名 - params.Set("sign", app.getMd5Sign(params)) + params.Set("sign", c.getMd5Sign(params)) // 请求 - request, err := app.request("https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers", params, cert) + request, err := c.request(apiUrl+"/mmpaymkttransfers/promotion/transfers", params, cert) // 定义 var response TransfersResponse err = xml.Unmarshal(request.ResponseBody, &response) - return NewTransfersResult(response, request.ResponseBody, request, err) + return newTransfersResult(response, request.ResponseBody, request, err) } diff --git a/service/wechatpayapiv2/mongodb.go b/service/wechatpayapiv2/mongodb.go index 95aab8be..883e6897 100644 --- a/service/wechatpayapiv2/mongodb.go +++ b/service/wechatpayapiv2/mongodb.go @@ -31,8 +31,8 @@ func (m *mongoZap) TableName() string { return "wechatpayapiv2" } -func (app *App) mongoLog(request gorequest.Response) { - _, _ = app.mongo.Model(&mongoZap{}).InsertOne(mongoZap{ +func (c *Client) mongoLog(request gorequest.Response) { + _, _ = c.config.MongoDb.Model(&mongoZap{}).InsertOne(mongoZap{ RequestTime: gomongo.BsonTime(request.RequestTime), //【请求】时间 RequestUri: request.RequestUri, //【请求】链接 RequestUrl: gorequest.UriParse(request.RequestUri).Url, //【请求】链接 diff --git a/service/wechatpayapiv2/params.go b/service/wechatpayapiv2/params.go index 58194903..60a62237 100644 --- a/service/wechatpayapiv2/params.go +++ b/service/wechatpayapiv2/params.go @@ -15,7 +15,7 @@ func NewParams() Params { return p } -func (app *App) NewParamsWith(params ...Params) Params { +func (c *Client) NewParamsWith(params ...Params) Params { p := make(Params) for _, v := range params { p.SetParams(v) diff --git a/service/wechatpayapiv2/pgsql.go b/service/wechatpayapiv2/pgsql.go index a7657a34..1c303a94 100644 --- a/service/wechatpayapiv2/pgsql.go +++ b/service/wechatpayapiv2/pgsql.go @@ -9,15 +9,15 @@ import ( ) // 记录日志 -func (app *App) postgresqlLog(request gorequest.Response) { - app.log.Record(golog.ApiPostgresqlLog{ +func (c *Client) postgresqlLog(request gorequest.Response) { + c.log.Record(golog.ApiPostgresqlLog{ RequestTime: golog.TimeString{Time: request.RequestTime}, //【请求】时间 RequestUri: request.RequestUri, //【请求】链接 RequestUrl: gorequest.UriParse(request.RequestUri).Url, //【请求】链接 RequestApi: gorequest.UriParse(request.RequestUri).Path, //【请求】接口 RequestMethod: request.RequestMethod, //【请求】方式 RequestParams: datatypes.JSON(gojson.JsonEncodeNoError(request.RequestParams)), //【请求】参数 - RequestHeader: datatypes.JSON(gojson.JsonEncodeNoError(request.RequestHeader)), //【返回】头部 + RequestHeader: datatypes.JSON(gojson.JsonEncodeNoError(request.RequestHeader)), //【请求】头部 ResponseHeader: datatypes.JSON(gojson.JsonEncodeNoError(request.ResponseHeader)), //【返回】头部 ResponseStatusCode: request.ResponseStatusCode, //【返回】状态码 ResponseBody: datatypes.JSON(gojson.JsonEncodeNoError(gomongo.XmlDecodeNoError(request.ResponseBody))), //【返回】内容 diff --git a/service/wechatpayapiv2/request.go b/service/wechatpayapiv2/request.go new file mode 100644 index 00000000..e7db56e8 --- /dev/null +++ b/service/wechatpayapiv2/request.go @@ -0,0 +1,37 @@ +package wechatpayapiv2 + +import ( + "crypto/tls" + "go.dtapp.net/library/utils/gorequest" +) + +func (c *Client) request(url string, params map[string]interface{}, cert *tls.Certificate) (gorequest.Response, error) { + + // 创建请求 + client := c.client + + // 设置请求地址 + client.SetUri(url) + + // 设置格式 + client.SetContentTypeXml() + + // 设置参数 + client.SetParams(params) + + // 设置证书 + client.SetP12Cert(cert) + + // 发起请求 + request, err := client.Post() + if err != nil { + return gorequest.Response{}, err + } + + // 日志 + if c.logStatus == true { + go c.postgresqlLog(request) + } + + return request, err +} diff --git a/service/wechatpayapiv2/sign.go b/service/wechatpayapiv2/sign.go index 0fa69369..bc3945b9 100644 --- a/service/wechatpayapiv2/sign.go +++ b/service/wechatpayapiv2/sign.go @@ -9,7 +9,7 @@ import ( ) // 支付字符串拼接 -func (app *App) getSortString(m map[string]interface{}) string { +func (c *Client) getSortString(m map[string]interface{}) string { var buf bytes.Buffer keys := make([]string, 0, len(m)) for k := range m { @@ -32,14 +32,14 @@ func (app *App) getSortString(m map[string]interface{}) string { } // 获取签名 -func (app *App) getMd5Sign(paramMap map[string]interface{}) string { - sortString := app.getSortString(paramMap) - sign := gomd5.Md5(sortString + "&key=" + app.mchKey) +func (c *Client) getMd5Sign(paramMap map[string]interface{}) string { + sortString := c.getSortString(paramMap) + sign := gomd5.Md5(sortString + "&key=" + c.GetMchKey()) return strings.ToUpper(sign) } // 验证签名 -func (app *App) checkMd5Sign(rspMap map[string]interface{}, sign string) bool { - calculateSign := app.getMd5Sign(rspMap) +func (c *Client) checkMd5Sign(rspMap map[string]interface{}, sign string) bool { + calculateSign := c.getMd5Sign(rspMap) return calculateSign == sign }