Documentation ¶
Overview ¶
Package core 微信支付 API v3 Go SDK HTTPClient 基础库,你可以使用它来创建一个 Client,并向微信支付发送 HTTP 请求
初始化 Client 时,你需要指定以下参数:
- Credential 用于生成 HTTP Header 中的 Authorization 信息,微信支付 API v3依赖该值来保证请求的真实性和数据的完整性
- Validator 用于对微信支付的应答进行校验,避免被恶意攻击
Index ¶
- func Bool(b bool) *bool
- func CheckResponse(resp *http.Response) error
- func CreateFormField(w *multipart.Writer, fieldName, contentType string, fieldValue []byte) error
- func CreateFormFile(w *multipart.Writer, filename, contentType string, file []byte) error
- func Float32(f float32) *float32
- func Float64(f float64) *float64
- func Int32(i int32) *int32
- func Int64(i int64) *int64
- func IsAPIError(err error, code string) bool
- func ParameterToJSON(obj interface{}) (string, error)
- func ParameterToString(obj interface{}, collectionFormat string) string
- func SelectHeaderContentType(contentTypes []string) string
- func String(s string) *string
- func Time(t time.Time) *time.Time
- func UnMarshalResponse(httpResp *http.Response, resp interface{}) error
- type APIError
- type APIResult
- type CertificateExporter
- type CertificateGetter
- type CertificateMap
- func (m *CertificateMap) Get(_ context.Context, serialNumber string) (*x509.Certificate, bool)
- func (m *CertificateMap) GetAll(_ context.Context) map[string]*x509.Certificate
- func (m *CertificateMap) GetNewestSerial(_ context.Context) string
- func (m *CertificateMap) Reset(newCertificates map[string]*x509.Certificate)
- type CertificateVisitor
- type Client
- func (client *Client) DecryptResponse(ctx context.Context, resp interface{}) error
- func (client *Client) Delete(ctx context.Context, requestURL string, requestBody interface{}) (*APIResult, error)
- func (client *Client) EncryptRequest(ctx context.Context, req interface{}) (string, error)
- func (client *Client) Get(ctx context.Context, requestURL string) (*APIResult, error)
- func (client *Client) Patch(ctx context.Context, requestURL string, requestBody interface{}) (*APIResult, error)
- func (client *Client) Post(ctx context.Context, requestURL string, requestBody interface{}) (*APIResult, error)
- func (client *Client) Put(ctx context.Context, requestURL string, requestBody interface{}) (*APIResult, error)
- func (client *Client) Request(ctx context.Context, method, requestPath string, headerParams http.Header, ...) (result *APIResult, err error)
- func (client *Client) Sign(ctx context.Context, message string) (result *auth.SignatureResult, err error)
- func (client *Client) Upload(ctx context.Context, requestURL, meta, reqBody, formContentType string) (*APIResult, error)
- type ClientOption
- type DialSettings
- type ErrorOption
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func CheckResponse ¶
CheckResponse 校验请求是否成功
当http回包的状态码的范围不是200-299之间的时候,会返回相应的错误信息,主要包括http状态码、回包错误码、回包错误信息提示
func CreateFormField ¶
CreateFormField 设置form-data 中的普通属性
示例内容
Content-Disposition: form-data; name="meta"; Content-Type: application/json { "filename": "file_test.mp4", "sha256": " hjkahkjsjkfsjk78687dhjahdajhk " }
如果要设置上述内容
CreateFormField(w, "meta", "application/json", meta)
Example ¶
package main import ( "encoding/json" "mime/multipart" "github.com/Marek-maxs/wechatpay-go/core" "github.com/Marek-maxs/wechatpay-go/core/consts" ) func main() { var w multipart.Writer meta := map[string]string{ "filename": "sample.jpg", "sha256": "5944758444f0af3bc843e39b611a6b0c8c38cca44af653cd461b5765b71dc3f8", } metaBytes, err := json.Marshal(meta) if err != nil { // TODO: 处理错误 return } err = core.CreateFormField(&w, "meta", consts.ApplicationJSON, metaBytes) if err != nil { // TODO: 处理错误 } }
Output:
func CreateFormFile ¶
CreateFormFile 设置form-data中的文件
示例内容:
Content-Disposition: form-data; name="file"; filename="file_test.mp4"; Content-Type: video/mp4 pic1 //pic1即为媒体视频的二进制内容
如果要设置上述内容,则CreateFormFile(w, "file_test.mp4", "video/mp4", pic1)
Example ¶
package main import ( "mime/multipart" "github.com/Marek-maxs/wechatpay-go/core" "github.com/Marek-maxs/wechatpay-go/core/consts" ) func main() { var w multipart.Writer var fileContent []byte err := core.CreateFormFile(&w, "sample.jpg", consts.ImageJPG, fileContent) if err != nil { // TODO: 处理错误 } }
Output:
func ParameterToJSON ¶
ParameterToJSON 将参数转换为 Json 字符串
func ParameterToString ¶
ParameterToString 将参数转换为字符串,并使用指定分隔符分隔列表参数
func SelectHeaderContentType ¶
SelectHeaderContentType select a content type from the available list.
func UnMarshalResponse ¶
UnMarshalResponse 将回包组织成结构化数据
Types ¶
type APIError ¶
type APIError struct { StatusCode int // 应答报文的 HTTP 状态码 Header http.Header // 应答报文的 Header 信息 Body string // 应答报文的 Body 原文 Code string `json:"code"` // 应答报文的 Body 解析后的错误码信息,仅不符合预期/发生系统错误时存在 Message string `json:"message"` // 应答报文的 Body 解析后的文字说明信息,仅不符合预期/发生系统错误时存在 Detail interface{} `json:"detail,omitempty"` // 应答报文的 Body 解析后的详细信息,仅不符合预期/发生系统错误时存在 }
APIError 微信支付 API v3 标准错误结构
type APIResult ¶
type APIResult struct { // 本次请求所使用的 HTTPRequest Request *http.Request // 本次请求所获得的 HTTPResponse Response *http.Response }
APIResult 微信支付API v3 请求结果
type CertificateExporter ¶
type CertificateExporter interface { // Export 获取证书序列号对应的平台证书内容 Export(ctx context.Context, serialNumber string) (string, bool) // ExportAll 获取平台证书内容Map ExportAll(ctx context.Context) map[string]string }
CertificateExporter 平台证书导出器,可获取平台证书内容,
type CertificateGetter ¶
type CertificateGetter interface { // Get 获取证书序列号对应的平台证书 Get(ctx context.Context, serialNumber string) (*x509.Certificate, bool) // GetAll 获取平台证书Map GetAll(ctx context.Context) map[string]*x509.Certificate // GetNewestSerial 获取最新的平台证书的证书序列号 GetNewestSerial(ctx context.Context) string }
CertificateGetter 平台证书提供器
type CertificateMap ¶
type CertificateMap struct {
// contains filtered or unexported fields
}
CertificateMap 最简单的证书获取器——证书Map
func NewCertificateMap ¶
func NewCertificateMap(certificateMap map[string]*x509.Certificate) *CertificateMap
NewCertificateMap 使用 证书序列号->证书 映射 初始化 CertificateMap
func NewCertificateMapWithList ¶
func NewCertificateMapWithList(l []*x509.Certificate) *CertificateMap
NewCertificateMapWithList 使用 证书列表 初始化 CertificateMap
func (*CertificateMap) Get ¶
func (m *CertificateMap) Get(_ context.Context, serialNumber string) (*x509.Certificate, bool)
Get 获取证书序列号对应的平台证书
func (*CertificateMap) GetAll ¶
func (m *CertificateMap) GetAll(_ context.Context) map[string]*x509.Certificate
GetAll 获取平台证书Map
func (*CertificateMap) GetNewestSerial ¶
func (m *CertificateMap) GetNewestSerial(_ context.Context) string
GetNewestSerial 获取最新的平台证书的证书序列号
func (*CertificateMap) Reset ¶
func (m *CertificateMap) Reset(newCertificates map[string]*x509.Certificate)
Reset 完整重设 CertificateMap 中存储的证书,并重新选择最新的证书
type CertificateVisitor ¶
type CertificateVisitor interface { CertificateGetter CertificateExporter }
CertificateVisitor 证书访问器,集 CertificateGetter 与 CertificateExporter 于一体
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client 微信支付API v3 基础 Client
func NewClient ¶
func NewClient(ctx context.Context, opts ...ClientOption) (*Client, error)
NewClient 初始化一个微信支付API v3 HTTPClient
初始化的时候你可以传递多个配置信息
Example (Auto_update_certificate) ¶
package main import ( "context" "crypto/rsa" "log" "github.com/Marek-maxs/wechatpay-go/core" "github.com/Marek-maxs/wechatpay-go/core/option" ) func main() { // 示例参数,实际使用时请自行初始化 var ( mchID string mchCertificateSerialNumber string mchPrivateKey *rsa.PrivateKey mchAPIv3Key string ) client, err := core.NewClient( context.Background(), // 一次性设置 签名/验签/敏感字段加解密,并注册 平台证书下载器,自动定时获取最新的平台证书 option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key), ) if err != nil { log.Printf("new wechat pay client err:%s", err.Error()) return } // 接下来使用 client 进行请求发送 _ = client }
Output:
Example (Default) ¶
package main import ( "context" "crypto/rsa" "crypto/x509" "log" "net/http" "github.com/Marek-maxs/wechatpay-go/core" "github.com/Marek-maxs/wechatpay-go/core/option" ) func main() { // 示例参数,实际使用时请自行初始化 var ( mchID string mchCertificateSerialNumber string mchPrivateKey *rsa.PrivateKey wechatPayCertificateList []*x509.Certificate customHTTPClient *http.Client ) client, err := core.NewClient( context.Background(), // 一次性设置 签名/验签/敏感字段加解密,并注册 平台证书下载器,自动定时获取最新的平台证书 option.WithWechatPayAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, wechatPayCertificateList), // 设置自定义 HTTPClient 实例,不设置时默认使用 http.Client{},并设置超时时间为 30s option.WithHTTPClient(customHTTPClient), ) if err != nil { log.Printf("new wechat pay client err:%s", err.Error()) return } // 接下来使用 client 进行请求发送 _ = client }
Output:
Example (Fully_customized) ¶
package main import ( "context" "log" "net/http" "github.com/Marek-maxs/wechatpay-go/core" "github.com/Marek-maxs/wechatpay-go/core/auth" "github.com/Marek-maxs/wechatpay-go/core/cipher" "github.com/Marek-maxs/wechatpay-go/core/option" ) func main() { var ( signer auth.Signer // 自定义实现 auth.Signer 接口的实例 verifier auth.Verifier // 自定义实现 auth.Verifier 接口的实例 encryptor cipher.Encryptor // 自定义实现 auth.Encryptor 接口的实例 decryptor cipher.Decryptor // 自定义实现 cipher.Decryptor 接口的实例 customHTTPClient *http.Client // 自定义 HTTPClient ) client, err := core.NewClient( context.Background(), // 使用自定义 Signer 初始化 微信支付签名器 option.WithSigner(signer), // 使用自定义 Verifier 初始化 微信支付应答验证器 option.WithVerifier(verifier), // 使用自定义 Encryptor/Decryptor 初始化 微信支付敏感字段加解密器 option.WithWechatPayCipher(encryptor, decryptor), // 使用自定义 HTTPClient option.WithHTTPClient(customHTTPClient), ) if err != nil { log.Printf("new wechat pay client err:%s", err.Error()) return } // 接下来使用 client 进行请求发送 _ = client }
Output:
func NewClientWithDialSettings ¶
func NewClientWithDialSettings(ctx context.Context, settings *DialSettings) (*Client, error)
NewClientWithDialSettings 使用 DialSettings 初始化一个微信支付API v3 HTTPClient
func NewClientWithValidator ¶
NewClientWithValidator 使用原 Client 复制一个新的 Client,并设置新 Client 的 validator。 原 Client 不受任何影响
func (*Client) DecryptResponse ¶
DecryptResponse 使用 cipher 对应答结构进行原地解密,未设置 cipher 时将跳过解密
本方法会对结构中的敏感字段进行原地解密,因此需要传入结构体的指针。
func (*Client) Delete ¶
func (client *Client) Delete(ctx context.Context, requestURL string, requestBody interface{}) (*APIResult, error)
Delete 向微信支付发送一个 HTTP Delete 请求
func (*Client) EncryptRequest ¶
EncryptRequest 使用 cipher 对请求结构进行原地加密,并返回加密所用的平台证书的序列号。 未设置 cipher 时将跳过加密,并返回空序列号。
本方法会对结构中的敏感字段进行原地加密,因此需要传入结构体的指针。
func (*Client) Patch ¶
func (client *Client) Patch(ctx context.Context, requestURL string, requestBody interface{}) (*APIResult, error)
Patch 向微信支付发送一个 HTTP Patch 请求
func (*Client) Post ¶
func (client *Client) Post(ctx context.Context, requestURL string, requestBody interface{}) (*APIResult, error)
Post 向微信支付发送一个 HTTP Post 请求
func (*Client) Put ¶
func (client *Client) Put(ctx context.Context, requestURL string, requestBody interface{}) (*APIResult, error)
Put 向微信支付发送一个 HTTP Put 请求
func (*Client) Request ¶
func (client *Client) Request( ctx context.Context, method, requestPath string, headerParams http.Header, queryParams url.Values, postBody interface{}, contentType string, ) (result *APIResult, err error)
Request 向微信支付发送请求
相比于 Get / Post / Put / Patch / Delete 方法,本方法可以设置更多内容 特别地,如果需要为当前请求设置 Header,可以使用本方法
type ClientOption ¶
type ClientOption interface { // Apply 将初始化参数应用到 DialSettings 中 Apply(settings *DialSettings) error }
ClientOption 微信支付 API v3 HTTPClient core.Client 初始化参数
type DialSettings ¶
type DialSettings struct { HTTPClient *http.Client // 自定义所使用的 HTTPClient 实例 Signer auth.Signer // 签名器 Validator auth.Validator // 应答包签名校验器 Cipher cipher.Cipher // 敏感字段加解密套件 }
DialSettings 微信支付 API v3 Go SDK core.Client 需要的配置信息
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package auth 微信支付 API v3 Go SDK 安全验证相关接口
|
Package auth 微信支付 API v3 Go SDK 安全验证相关接口 |
credentials
Package credentials 微信支付 API v3 Go SDK 请求报文头 Authorization 信息生成器
|
Package credentials 微信支付 API v3 Go SDK 请求报文头 Authorization 信息生成器 |
signers
Package signers 微信支付 API v3 Go SDK 数字签名生成器
|
Package signers 微信支付 API v3 Go SDK 数字签名生成器 |
validators
Package validators 微信支付 API v3 Go SDK 应答报文签名验证器
|
Package validators 微信支付 API v3 Go SDK 应答报文签名验证器 |
verifiers
Package verifiers 微信支付 API v3 Go SDK 数字签名验证器
|
Package verifiers 微信支付 API v3 Go SDK 数字签名验证器 |
Package consts 微信支付 API v3 Go SDK 常量
|
Package consts 微信支付 API v3 Go SDK 常量 |
Package notify 微信支付 API v3 Go SDK 商户通知处理库
|
Package notify 微信支付 API v3 Go SDK 商户通知处理库 |
Package option 微信支付 API v3 Go SDK Client 初始化参数工具包,你可以使用其中的方法快速构建 core.Client 的初始化参数。
|
Package option 微信支付 API v3 Go SDK Client 初始化参数工具包,你可以使用其中的方法快速构建 core.Client 的初始化参数。 |