diff --git a/service/wechatpayapiv3/app.go b/service/wechatpayapiv3/app.go deleted file mode 100644 index ce23aeda..00000000 --- a/service/wechatpayapiv3/app.go +++ /dev/null @@ -1,95 +0,0 @@ -package wechatpayapiv3 - -import ( - "go.dtapp.net/library/utils/golog" - "go.dtapp.net/library/utils/gomongo" - "go.dtapp.net/library/utils/gorequest" - "gorm.io/gorm" - "net/http" -) - -// App 微信支付直连商户 -type App struct { - appId string // 小程序或者公众号唯一凭证 - appSecret string // 小程序或者公众号唯一凭证密钥 - mchId string // 微信支付的商户id - aesKey string // 私钥 - apiV3 string // API v3密钥 - mchSslSerialNo string // pem 证书号 - mchSslKey string // pem key 内容 - mongo *gomongo.Client // 日志数据库 - pgsql *gorm.DB // pgsql数据库 - client *gorequest.App // 请求客户端 - log *golog.Api // 日志服务 - logTableName string // 日志表名 - logStatus bool // 日志状态 -} - -// NewApp 实例化 -func NewApp(appId string, appSecret string, mchId string, aesKey string, apiV3 string, mchSslSerialNo string, mchSslKey string, pgsql *gorm.DB) *App { - app := &App{appId: appId, appSecret: appSecret, mchId: mchId, aesKey: aesKey, apiV3: apiV3, mchSslSerialNo: mchSslSerialNo, mchSslKey: mchSslKey} - app.client = gorequest.NewHttp() - if pgsql != nil { - app.pgsql = pgsql - app.logStatus = true - app.logTableName = "wechatpayapiv3" - app.log = golog.NewApi(&golog.ApiConfig{ - Db: pgsql, - TableName: app.logTableName, - }) - } - return app -} - -func (app *App) request(url string, params map[string]interface{}, method string, commonParams bool) (resp gorequest.Response, err error) { - - // 公共参数 - if method == http.MethodPost { - if commonParams == true { - params["appid"] = app.appId - params["mchid"] = app.mchId - } - } - - // 认证 - authorization, err := app.authorization(method, params, url) - if err != nil { - return gorequest.Response{}, err - } - - // 创建请求 - client := app.client - - // 设置请求地址 - client.SetUri(url) - - // 设置方式 - client.SetMethod(method) - - // 设置JSON格式 - client.SetContentTypeJson() - - // 设置参数 - client.SetParams(params) - - // 设置头部 - client.SetHeader("Authorization", "WECHATPAY2-SHA256-RSA2048 "+authorization) - client.SetHeader("Accept", "application/json") - client.SetHeader("Accept-Language", "zh-CN") - if url == "https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2" { - client.SetHeader("Wechatpay-Serial", app.mchSslSerialNo) - } - - // 发起请求 - request, err := client.Request() - if err != nil { - return gorequest.Response{}, err - } - - // 日志 - if app.logStatus == true { - go app.postgresqlLog(request) - } - - return request, err -} diff --git a/service/wechatpayapiv3/client.go b/service/wechatpayapiv3/client.go new file mode 100644 index 00000000..7b2536a7 --- /dev/null +++ b/service/wechatpayapiv3/client.go @@ -0,0 +1,48 @@ +package wechatpayapiv3 + +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 + AesKey string // 私钥 + ApiV3 string // API v3密钥 + MchSslSerialNo string // pem 证书号 + MchSslKey string // pem key 内容 + 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/wechatpayapiv3/const.go b/service/wechatpayapiv3/const.go new file mode 100644 index 00000000..fbdbf6cd --- /dev/null +++ b/service/wechatpayapiv3/const.go @@ -0,0 +1,9 @@ +package wechatpayapiv3 + +const ( + apiUrl = "https://api.mch.weixin.qq.com" +) + +const ( + logTable = "wechatpayapiv3" +) diff --git a/service/wechatpayapiv3/get.go b/service/wechatpayapiv3/get.go index 732cefb9..ab8138cc 100644 --- a/service/wechatpayapiv3/get.go +++ b/service/wechatpayapiv3/get.go @@ -1,5 +1,17 @@ package wechatpayapiv3 -func (app *App) GetAppId() string { - return app.appId +func (c *Client) GetAppId() string { + return c.config.AppId +} + +func (c *Client) GetMchId() string { + return c.config.MchId +} + +func (c *Client) GetMchSslKey() string { + return c.config.MchSslKey +} + +func (c *Client) GetMchSslSerialNo() string { + return c.config.MchSslSerialNo } diff --git a/service/wechatpayapiv3/merchant-service.complaints-v2.go b/service/wechatpayapiv3/merchant-service.complaints-v2.go index cfbb40d1..000bbf00 100644 --- a/service/wechatpayapiv3/merchant-service.complaints-v2.go +++ b/service/wechatpayapiv3/merchant-service.complaints-v2.go @@ -57,22 +57,22 @@ type MerchantServiceComplaintsV2Result struct { Err error // 错误 } -func NewMerchantServiceComplaintsV2Result(result MerchantServiceComplaintsV2Response, body []byte, http gorequest.Response, err error) *MerchantServiceComplaintsV2Result { +func newMerchantServiceComplaintsV2Result(result MerchantServiceComplaintsV2Response, body []byte, http gorequest.Response, err error) *MerchantServiceComplaintsV2Result { return &MerchantServiceComplaintsV2Result{Result: result, Body: body, Http: http, Err: err} } // MerchantServiceComplaintsV2 查询投诉单列表API // https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_11.shtml -func (app *App) MerchantServiceComplaintsV2(notMustParams ...Params) *MerchantServiceComplaintsV2Result { +func (c *Client) MerchantServiceComplaintsV2(notMustParams ...gorequest.Params) *MerchantServiceComplaintsV2Result { // 参数 - params := app.NewParamsWith(notMustParams...) + params := gorequest.NewParamsWith(notMustParams...) // 请求 - request, err := app.request("https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2", params, http.MethodGet, false) + request, err := c.request(apiUrl+"/v3/merchant-service/complaints-v2", params, http.MethodGet, false) if err != nil { - return NewMerchantServiceComplaintsV2Result(MerchantServiceComplaintsV2Response{}, request.ResponseBody, request, err) + return newMerchantServiceComplaintsV2Result(MerchantServiceComplaintsV2Response{}, request.ResponseBody, request, err) } // 定义 var response MerchantServiceComplaintsV2Response err = json.Unmarshal(request.ResponseBody, &response) - return NewMerchantServiceComplaintsV2Result(response, request.ResponseBody, request, err) + return newMerchantServiceComplaintsV2Result(response, request.ResponseBody, request, err) } diff --git a/service/wechatpayapiv3/mongo.go b/service/wechatpayapiv3/mongo.go index bb944894..8660c963 100644 --- a/service/wechatpayapiv3/mongo.go +++ b/service/wechatpayapiv3/mongo.go @@ -30,8 +30,8 @@ func (m *mongoZap) TableName() string { return "wechatpayapiv3" } -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/wechatpayapiv3/params.go b/service/wechatpayapiv3/params.go deleted file mode 100644 index 1a17a802..00000000 --- a/service/wechatpayapiv3/params.go +++ /dev/null @@ -1,27 +0,0 @@ -package wechatpayapiv3 - -// Params 请求参数 -type Params map[string]interface{} - -func NewParams() Params { - p := make(Params) - return p -} - -func (app *App) NewParamsWith(params ...Params) Params { - p := make(Params) - for _, v := range params { - p.SetParams(v) - } - return p -} - -func (p Params) Set(key string, value any) { - p[key] = value -} - -func (p Params) SetParams(params Params) { - for key, value := range params { - p[key] = value - } -} diff --git a/service/wechatpayapiv3/pay.jsapi.go b/service/wechatpayapiv3/pay.jsapi.go index 1d09c1f2..397c64d2 100644 --- a/service/wechatpayapiv3/pay.jsapi.go +++ b/service/wechatpayapiv3/pay.jsapi.go @@ -22,26 +22,26 @@ type GetJsApiResult struct { } // GetJsApi JSAPI调起支付API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml -func (app *App) GetJsApi(param GetJsApi) (result GetJsApiResult, err error) { +func (c *Client) GetJsApi(param GetJsApi) (result GetJsApiResult, err error) { // sign params timeStamp := time.Now().Unix() nonce := gorandom.Alphanumeric(32) - result.AppId = app.appId + result.AppId = c.GetAppId() result.TimeStamp = fmt.Sprintf("%v", timeStamp) result.NonceStr = nonce result.Package = param.Package // 签名 - message := fmt.Sprintf("%s\n%s\n%s\n%s\n", app.appId, fmt.Sprintf("%v", timeStamp), nonce, param.Package) + message := fmt.Sprintf("%s\n%s\n%s\n%s\n", c.GetAppId(), fmt.Sprintf("%v", timeStamp), nonce, param.Package) - signBytes, err := app.signPKCS1v15(message, []byte(app.mchSslKey)) + signBytes, err := c.signPKCS1v15(message, []byte(c.GetMchSslKey())) if err != nil { return result, err } - sign := app.base64EncodeStr(signBytes) + sign := c.base64EncodeStr(signBytes) result.PaySign = sign result.SignType = "RSA" return result, nil diff --git a/service/wechatpayapiv3/pay.transactions.id.go b/service/wechatpayapiv3/pay.transactions.id.go index 944dd3c8..e8cd85eb 100644 --- a/service/wechatpayapiv3/pay.transactions.id.go +++ b/service/wechatpayapiv3/pay.transactions.id.go @@ -58,19 +58,19 @@ type PayTransactionsIdResult struct { Err error // 错误 } -func NewPayTransactionsIdResult(result PayTransactionsIdResponse, body []byte, http gorequest.Response, err error) *PayTransactionsIdResult { +func newPayTransactionsIdResult(result PayTransactionsIdResponse, body []byte, http gorequest.Response, err error) *PayTransactionsIdResult { return &PayTransactionsIdResult{Result: result, Body: body, Http: http, Err: err} } // PayTransactionsId 微信支付订单号查询 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml -func (app *App) PayTransactionsId(transactionId string) *PayTransactionsIdResult { +func (c *Client) PayTransactionsId(transactionId string) *PayTransactionsIdResult { // 请求 - request, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/id/%s?mchid=%s", transactionId, app.mchId), map[string]interface{}{}, http.MethodGet, true) + request, err := c.request(fmt.Sprintf(apiUrl+"/v3/pay/transactions/id/%s?mchid=%s", transactionId, c.GetMchId()), map[string]interface{}{}, http.MethodGet, true) if err != nil { - return NewPayTransactionsIdResult(PayTransactionsIdResponse{}, request.ResponseBody, request, err) + return newPayTransactionsIdResult(PayTransactionsIdResponse{}, request.ResponseBody, request, err) } // 定义 var response PayTransactionsIdResponse err = json.Unmarshal(request.ResponseBody, &response) - return NewPayTransactionsIdResult(response, request.ResponseBody, request, err) + return newPayTransactionsIdResult(response, request.ResponseBody, request, err) } diff --git a/service/wechatpayapiv3/pay.transactions.jsapi.go b/service/wechatpayapiv3/pay.transactions.jsapi.go index abea9bb8..602b75d0 100644 --- a/service/wechatpayapiv3/pay.transactions.jsapi.go +++ b/service/wechatpayapiv3/pay.transactions.jsapi.go @@ -17,22 +17,22 @@ type PayTransactionsJsapiResult struct { Err error // 错误 } -func NewPayTransactionsJsapiResult(result PayTransactionsJsapiResponse, body []byte, http gorequest.Response, err error) *PayTransactionsJsapiResult { +func newPayTransactionsJsapiResult(result PayTransactionsJsapiResponse, body []byte, http gorequest.Response, err error) *PayTransactionsJsapiResult { return &PayTransactionsJsapiResult{Result: result, Body: body, Http: http, Err: err} } // PayTransactionsJsapi 小程序 JSAPI下单 // https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml -func (app *App) PayTransactionsJsapi(notMustParams ...Params) *PayTransactionsJsapiResult { +func (c *Client) PayTransactionsJsapi(notMustParams ...gorequest.Params) *PayTransactionsJsapiResult { // 参数 - params := app.NewParamsWith(notMustParams...) + params := gorequest.NewParamsWith(notMustParams...) // 请求 - request, err := app.request("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi", params, http.MethodPost, true) + request, err := c.request(apiUrl+"/v3/pay/transactions/jsapi", params, http.MethodPost, true) if err != nil { - return NewPayTransactionsJsapiResult(PayTransactionsJsapiResponse{}, request.ResponseBody, request, err) + return newPayTransactionsJsapiResult(PayTransactionsJsapiResponse{}, request.ResponseBody, request, err) } // 定义 var response PayTransactionsJsapiResponse err = json.Unmarshal(request.ResponseBody, &response) - return NewPayTransactionsJsapiResult(response, request.ResponseBody, request, err) + return newPayTransactionsJsapiResult(response, request.ResponseBody, request, err) } diff --git a/service/wechatpayapiv3/pay.transactions.out-trade-no.close.go b/service/wechatpayapiv3/pay.transactions.out-trade-no.close.go index efb0c9c0..ebc7bcc1 100644 --- a/service/wechatpayapiv3/pay.transactions.out-trade-no.close.go +++ b/service/wechatpayapiv3/pay.transactions.out-trade-no.close.go @@ -12,16 +12,16 @@ type PayTransactionsOutTradeNoCloseResult struct { Err error // 错误 } -func NewPayTransactionsOutTradeNoCloseResult(body []byte, http gorequest.Response, err error) *PayTransactionsOutTradeNoCloseResult { +func newPayTransactionsOutTradeNoCloseResult(body []byte, http gorequest.Response, err error) *PayTransactionsOutTradeNoCloseResult { return &PayTransactionsOutTradeNoCloseResult{Body: body, Http: http, Err: err} } // PayTransactionsOutTradeNoClose 关闭订单API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_3.shtml -func (app *App) PayTransactionsOutTradeNoClose(OutTradeNo string) *PayTransactionsOutTradeNoCloseResult { +func (c *Client) PayTransactionsOutTradeNoClose(OutTradeNo string) *PayTransactionsOutTradeNoCloseResult { // 参数 - params := NewParams() - params["mchid"] = app.mchId + params := gorequest.NewParams() + params["mchid"] = c.GetMchId() // 请求 - request, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s/close", OutTradeNo), params, http.MethodPost, false) - return NewPayTransactionsOutTradeNoCloseResult(request.ResponseBody, request, err) + request, err := c.request(fmt.Sprintf(apiUrl+"/v3/pay/transactions/out-trade-no/%s/close", OutTradeNo), params, http.MethodPost, false) + return newPayTransactionsOutTradeNoCloseResult(request.ResponseBody, request, err) } diff --git a/service/wechatpayapiv3/pay.transactions.out-trade-no.go b/service/wechatpayapiv3/pay.transactions.out-trade-no.go index ecf716a2..686267ff 100644 --- a/service/wechatpayapiv3/pay.transactions.out-trade-no.go +++ b/service/wechatpayapiv3/pay.transactions.out-trade-no.go @@ -58,19 +58,19 @@ type PayTransactionsOutTradeNoResult struct { Err error // 错误 } -func NewPayTransactionsOutTradeNoResult(result PayTransactionsOutTradeNoResponse, body []byte, http gorequest.Response, err error) *PayTransactionsOutTradeNoResult { +func newPayTransactionsOutTradeNoResult(result PayTransactionsOutTradeNoResponse, body []byte, http gorequest.Response, err error) *PayTransactionsOutTradeNoResult { return &PayTransactionsOutTradeNoResult{Result: result, Body: body, Http: http, Err: err} } // PayTransactionsOutTradeNo 商户订单号查询 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml -func (app *App) PayTransactionsOutTradeNo(outTradeNo string) *PayTransactionsOutTradeNoResult { +func (c *Client) PayTransactionsOutTradeNo(outTradeNo string) *PayTransactionsOutTradeNoResult { // 请求 - request, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s?mchid=%s", outTradeNo, app.mchId), map[string]interface{}{}, http.MethodGet, true) + request, err := c.request(fmt.Sprintf(apiUrl+"/v3/pay/transactions/out-trade-no/%s?mchid=%s", outTradeNo, c.GetMchId()), map[string]interface{}{}, http.MethodGet, true) if err != nil { - return NewPayTransactionsOutTradeNoResult(PayTransactionsOutTradeNoResponse{}, request.ResponseBody, request, err) + return newPayTransactionsOutTradeNoResult(PayTransactionsOutTradeNoResponse{}, request.ResponseBody, request, err) } // 定义 var response PayTransactionsOutTradeNoResponse err = json.Unmarshal(request.ResponseBody, &response) - return NewPayTransactionsOutTradeNoResult(response, request.ResponseBody, request, err) + return newPayTransactionsOutTradeNoResult(response, request.ResponseBody, request, err) } diff --git a/service/wechatpayapiv3/pgsql.go b/service/wechatpayapiv3/pgsql.go index a35e6f3b..e197c265 100644 --- a/service/wechatpayapiv3/pgsql.go +++ b/service/wechatpayapiv3/pgsql.go @@ -8,8 +8,8 @@ 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, //【请求】链接 diff --git a/service/wechatpayapiv3/refund.domestic.refunds.go b/service/wechatpayapiv3/refund.domestic.refunds.go index 14f6de31..fa349ed8 100644 --- a/service/wechatpayapiv3/refund.domestic.refunds.go +++ b/service/wechatpayapiv3/refund.domestic.refunds.go @@ -55,21 +55,21 @@ type RefundDomesticRefundsResult struct { Err error // 错误 } -func NewRefundDomesticRefundsResult(result RefundDomesticRefundsResponse, body []byte, http gorequest.Response, err error) *RefundDomesticRefundsResult { +func newRefundDomesticRefundsResult(result RefundDomesticRefundsResponse, body []byte, http gorequest.Response, err error) *RefundDomesticRefundsResult { return &RefundDomesticRefundsResult{Result: result, Body: body, Http: http, Err: err} } // RefundDomesticRefunds 申请退款API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_26.shtml -func (app *App) RefundDomesticRefunds(notMustParams ...Params) *RefundDomesticRefundsResult { +func (c *Client) RefundDomesticRefunds(notMustParams ...gorequest.Params) *RefundDomesticRefundsResult { // 参数 - params := app.NewParamsWith(notMustParams...) + params := gorequest.NewParamsWith(notMustParams...) // 请求 - request, err := app.request("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds", params, http.MethodPost, false) + request, err := c.request(apiUrl+"/v3/refund/domestic/refunds", params, http.MethodPost, false) if err != nil { - return NewRefundDomesticRefundsResult(RefundDomesticRefundsResponse{}, request.ResponseBody, request, err) + return newRefundDomesticRefundsResult(RefundDomesticRefundsResponse{}, request.ResponseBody, request, err) } // 定义 var response RefundDomesticRefundsResponse err = json.Unmarshal(request.ResponseBody, &response) - return NewRefundDomesticRefundsResult(response, request.ResponseBody, request, err) + return newRefundDomesticRefundsResult(response, request.ResponseBody, request, err) } diff --git a/service/wechatpayapiv3/refund.domestic.refunds.out_refund_no.go b/service/wechatpayapiv3/refund.domestic.refunds.out_refund_no.go index c1c7c8d2..3d42b0e0 100644 --- a/service/wechatpayapiv3/refund.domestic.refunds.out_refund_no.go +++ b/service/wechatpayapiv3/refund.domestic.refunds.out_refund_no.go @@ -56,19 +56,19 @@ type RefundDomesticRefundsOutRefundNoResult struct { Err error // 错误 } -func NewRefundDomesticRefundsOutRefundNoResult(result RefundDomesticRefundsOutRefundNoResponse, body []byte, http gorequest.Response, err error) *RefundDomesticRefundsOutRefundNoResult { +func newRefundDomesticRefundsOutRefundNoResult(result RefundDomesticRefundsOutRefundNoResponse, body []byte, http gorequest.Response, err error) *RefundDomesticRefundsOutRefundNoResult { return &RefundDomesticRefundsOutRefundNoResult{Result: result, Body: body, Http: http, Err: err} } // RefundDomesticRefundsOutRefundNo 查询单笔退款API https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_10.shtml -func (app *App) RefundDomesticRefundsOutRefundNo(outRefundNo string) *RefundDomesticRefundsOutRefundNoResult { +func (c *Client) RefundDomesticRefundsOutRefundNo(outRefundNo string) *RefundDomesticRefundsOutRefundNoResult { // 请求 - request, err := app.request(fmt.Sprintf("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/%s", outRefundNo), map[string]interface{}{}, http.MethodGet, true) + request, err := c.request(fmt.Sprintf(apiUrl+"/v3/refund/domestic/refunds/%s", outRefundNo), map[string]interface{}{}, http.MethodGet, true) if err != nil { - return NewRefundDomesticRefundsOutRefundNoResult(RefundDomesticRefundsOutRefundNoResponse{}, request.ResponseBody, request, err) + return newRefundDomesticRefundsOutRefundNoResult(RefundDomesticRefundsOutRefundNoResponse{}, request.ResponseBody, request, err) } // 定义 var response RefundDomesticRefundsOutRefundNoResponse err = json.Unmarshal(request.ResponseBody, &response) - return NewRefundDomesticRefundsOutRefundNoResult(response, request.ResponseBody, request, err) + return newRefundDomesticRefundsOutRefundNoResult(response, request.ResponseBody, request, err) } diff --git a/service/wechatpayapiv3/request.go b/service/wechatpayapiv3/request.go new file mode 100644 index 00000000..598bd3a4 --- /dev/null +++ b/service/wechatpayapiv3/request.go @@ -0,0 +1,59 @@ +package wechatpayapiv3 + +import ( + "go.dtapp.net/library/utils/gorequest" + "net/http" +) + +func (c *Client) request(url string, params map[string]interface{}, method string, commonParams bool) (gorequest.Response, error) { + + // 公共参数 + if method == http.MethodPost { + if commonParams == true { + params["appid"] = c.GetAppId() + params["mchid"] = c.GetMchId() + } + } + + // 认证 + authorization, err := c.authorization(method, params, url) + if err != nil { + return gorequest.Response{}, err + } + + // 创建请求 + client := c.client + + // 设置请求地址 + client.SetUri(url) + + // 设置方式 + client.SetMethod(method) + + // 设置JSON格式 + client.SetContentTypeJson() + + // 设置参数 + client.SetParams(params) + + // 设置头部 + client.SetHeader("Authorization", "WECHATPAY2-SHA256-RSA2048 "+authorization) + client.SetHeader("Accept", "application/json") + client.SetHeader("Accept-Language", "zh-CN") + if url == "https://api.mch.weixin.qq.com/v3/merchant-service/complaints-v2" { + client.SetHeader("Wechatpay-Serial", c.GetMchSslSerialNo()) + } + + // 发起请求 + request, err := client.Request() + if err != nil { + return gorequest.Response{}, err + } + + // 日志 + if c.logStatus == true { + go c.postgresqlLog(request) + } + + return request, err +} diff --git a/service/wechatpayapiv3/set.go b/service/wechatpayapiv3/set.go index b650df2f..a1ae8905 100644 --- a/service/wechatpayapiv3/set.go +++ b/service/wechatpayapiv3/set.go @@ -1,9 +1,9 @@ package wechatpayapiv3 -func (app *App) SetAppId(appId string) { - app.appId = appId +func (c *Client) SetAppId(appId string) { + c.config.AppId = appId } -func (app *App) SetAppSecret(appSecret string) { - app.appSecret = appSecret +func (c *Client) SetAppSecret(appSecret string) { + c.config.AppSecret = appSecret } diff --git a/service/wechatpayapiv3/sign.go b/service/wechatpayapiv3/sign.go index 5aa8c090..ef8ea01d 100644 --- a/service/wechatpayapiv3/sign.go +++ b/service/wechatpayapiv3/sign.go @@ -19,7 +19,7 @@ import ( ) // 对消息的散列值进行数字签名 -func (app *App) signPKCS1v15(msg string, privateKey []byte) ([]byte, error) { +func (c *Client) signPKCS1v15(msg string, privateKey []byte) ([]byte, error) { block, _ := pem.Decode(privateKey) if block == nil { @@ -33,7 +33,7 @@ func (app *App) signPKCS1v15(msg string, privateKey []byte) ([]byte, error) { if ok == false { return nil, errors.New("private key format error") } - sign, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, app.haSha256(msg)) + sign, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, c.haSha256(msg)) if err != nil { return nil, errors.New("sign error") } @@ -41,19 +41,19 @@ func (app *App) signPKCS1v15(msg string, privateKey []byte) ([]byte, error) { } // base编码 -func (app *App) base64EncodeStr(src []byte) string { +func (c *Client) base64EncodeStr(src []byte) string { return base64.StdEncoding.EncodeToString(src) } // sha256加密 -func (app *App) haSha256(str string) []byte { +func (c *Client) haSha256(str string) []byte { h := sha256.New() h.Write([]byte(str)) return h.Sum(nil) } // 生成身份认证信息 -func (app *App) authorization(method string, paramMap map[string]interface{}, rawUrl string) (token string, err error) { +func (c *Client) authorization(method string, paramMap map[string]interface{}, rawUrl string) (token string, err error) { var body string if len(paramMap) != 0 { paramJsonBytes, err := json.Marshal(paramMap) @@ -71,21 +71,21 @@ func (app *App) authorization(method string, paramMap map[string]interface{}, ra nonce := gorandom.Alphanumeric(32) message := fmt.Sprintf("%s\n%s\n%d\n%s\n%s\n", method, canonicalUrl, timestamp, nonce, body) - signBytes, err := app.signPKCS1v15(message, []byte(app.mchSslKey)) + signBytes, err := c.signPKCS1v15(message, []byte(c.GetMchSslKey())) if err != nil { return token, err } - sign := app.base64EncodeStr(signBytes) + sign := c.base64EncodeStr(signBytes) token = fmt.Sprintf("mchid=\"%s\",nonce_str=\"%s\",timestamp=\"%d\",serial_no=\"%s\",signature=\"%s\"", - app.mchId, nonce, timestamp, app.mchSslSerialNo, sign) + c.GetMchId(), nonce, timestamp, c.GetMchSslSerialNo(), sign) return token, nil } // 报文解密 -func (app *App) decryptGCM(aesKey, nonceV, ciphertextV, additionalDataV string) ([]byte, error) { +func (c *Client) decryptGCM(aesKey, nonceV, ciphertextV, additionalDataV string) ([]byte, error) { key := []byte(aesKey) nonce := []byte(nonceV) additionalData := []byte(additionalDataV)