- update wechatpayapiv2

master
李光春 2 years ago
parent 405aa99fd0
commit 81250f625a

@ -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
}

@ -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
}

@ -0,0 +1,9 @@
package wechatpayapiv2
const (
apiUrl = "https://api.mch.weixin.qq.com"
)
const (
logTable = "wechatpayapiv2"
)

@ -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
}

@ -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)
}

@ -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)
}

@ -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, //【请求】链接

@ -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)

@ -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))), //【返回】内容

@ -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
}

@ -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
}

Loading…
Cancel
Save