core

package
v1.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 9, 2023 License: Apache-2.0 Imports: 23 Imported by: 0

Documentation

Overview

Package core 微信支付 API v3 Go SDK HTTPClient 基础库,你可以使用它来创建一个 Client,并向微信支付发送 HTTP 请求

初始化 Client 时,你需要指定以下参数:

  • Credential 用于生成 HTTP Header 中的 Authorization 信息,微信支付 API v3依赖该值来保证请求的真实性和数据的完整性
  • Validator 用于对微信支付的应答进行校验,避免被恶意攻击

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Bool

func Bool(b bool) *bool

Bool 复制 bool 对象,并返回复制体的指针

func CheckResponse

func CheckResponse(resp *http.Response) error

CheckResponse 校验请求是否成功

当http回包的状态码的范围不是200-299之间的时候,会返回相应的错误信息,主要包括http状态码、回包错误码、回包错误信息提示

func CreateFormField

func CreateFormField(w *multipart.Writer, fieldName, contentType string, fieldValue []byte) error

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

func CreateFormFile(w *multipart.Writer, filename, contentType string, file []byte) error

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 Float32

func Float32(f float32) *float32

Float32 复制 float32 对象,并返回复制体的指针

func Float64

func Float64(f float64) *float64

Float64 复制 float64 对象,并返回复制体的指针

func Int32

func Int32(i int32) *int32

Int32 复制 int64 对象,并返回复制体的指针

func Int64

func Int64(i int64) *int64

Int64 复制 int64 对象,并返回复制体的指针

func IsAPIError

func IsAPIError(err error, code string) bool

IsAPIError 判断当前 error 是否为特定 Code 的 *APIError

类型为其他 error 或 Code 不匹配时均返回 false

func ParameterToJSON

func ParameterToJSON(obj interface{}) (string, error)

ParameterToJSON 将参数转换为 Json 字符串

func ParameterToString

func ParameterToString(obj interface{}, collectionFormat string) string

ParameterToString 将参数转换为字符串,并使用指定分隔符分隔列表参数

func SelectHeaderContentType

func SelectHeaderContentType(contentTypes []string) string

SelectHeaderContentType select a content type from the available list.

func String

func String(s string) *string

String 复制 string 对象,并返回复制体的指针

func Time

func Time(t time.Time) *time.Time

Time 复制 time.Time 对象,并返回复制体的指针

func UnMarshalResponse

func UnMarshalResponse(httpResp *http.Response, resp interface{}) error

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 标准错误结构

func (*APIError) Error

func (e *APIError) Error() string

Error 输出 APIError

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

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

func NewClientWithValidator(client *Client, validator auth.Validator) *Client

NewClientWithValidator 使用原 Client 复制一个新的 Client,并设置新 Client 的 validator。 原 Client 不受任何影响

func (*Client) DecryptResponse

func (client *Client) DecryptResponse(ctx context.Context, resp interface{}) error

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

func (client *Client) EncryptRequest(ctx context.Context, req interface{}) (string, error)

EncryptRequest 使用 cipher 对请求结构进行原地加密,并返回加密所用的平台证书的序列号。 未设置 cipher 时将跳过加密,并返回空序列号。

本方法会对结构中的敏感字段进行原地加密,因此需要传入结构体的指针。

func (*Client) Get

func (client *Client) Get(ctx context.Context, requestURL string) (*APIResult, error)

Get 向微信支付发送一个 HTTP Get 请求

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,可以使用本方法

func (*Client) Sign

func (client *Client) Sign(ctx context.Context, message string) (result *auth.SignatureResult, err error)

Sign 使用 signer 对字符串进行签名

func (*Client) Upload

func (client *Client) Upload(ctx context.Context, requestURL, meta, reqBody, formContentType string) (
	*APIResult, error,
)

Upload 向微信支付发送上传文件 推荐使用 services/fileuploader 中各上传接口的实现

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 需要的配置信息

func (*DialSettings) Validate

func (ds *DialSettings) Validate() error

Validate 校验请求配置是否有效

type ErrorOption

type ErrorOption struct{ Error error }

ErrorOption 错误初始化参数,用于返回错误

func (ErrorOption) Apply

func (w ErrorOption) Apply(*DialSettings) error

Apply 返回初始化错误

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 的初始化参数。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL