{"id":13570457,"url":"https://github.com/wechatpay-apiv3/wechatpay-go","last_synced_at":"2025-05-14T04:08:01.791Z","repository":{"id":37430344,"uuid":"342486216","full_name":"wechatpay-apiv3/wechatpay-go","owner":"wechatpay-apiv3","description":"微信支付 APIv3 的官方 Go Library","archived":false,"fork":false,"pushed_at":"2024-12-03T07:50:34.000Z","size":676,"stargazers_count":1119,"open_issues_count":19,"forks_count":149,"subscribers_count":16,"default_branch":"main","last_synced_at":"2025-04-15T01:53:35.980Z","etag":null,"topics":["api-client","api-sdk","go","golang","library","sdk","wechatpay","wechatpay-apiv3"],"latest_commit_sha":null,"homepage":"https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/index.shtml","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wechatpay-apiv3.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-26T06:37:41.000Z","updated_at":"2025-04-13T06:47:36.000Z","dependencies_parsed_at":"2024-11-17T23:00:43.435Z","dependency_job_id":"00d37d33-7d03-4fbc-8243-d0eb1c5c362b","html_url":"https://github.com/wechatpay-apiv3/wechatpay-go","commit_stats":null,"previous_names":[],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wechatpay-apiv3%2Fwechatpay-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wechatpay-apiv3%2Fwechatpay-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wechatpay-apiv3%2Fwechatpay-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wechatpay-apiv3%2Fwechatpay-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wechatpay-apiv3","download_url":"https://codeload.github.com/wechatpay-apiv3/wechatpay-go/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254069473,"owners_count":22009557,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-client","api-sdk","go","golang","library","sdk","wechatpay","wechatpay-apiv3"],"created_at":"2024-08-01T14:00:52.554Z","updated_at":"2025-05-14T04:07:56.775Z","avatar_url":"https://github.com/wechatpay-apiv3.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# 微信支付 API v3 Go SDK\n\n[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](https://pkg.go.dev/github.com/wechatpay-apiv3/wechatpay-go)\n[![licence](https://badgen.net/github/license/wechatpay-apiv3/wechatpay-go)](https://github.com/wechatpay-apiv3/wechatpay-go/blob/main/LICENSE)\n\n[微信支付 APIv3](https://wechatpay-api.gitbook.io/wechatpay-api-v3/) 官方Go语言客户端代码库。\n\n## 功能介绍\n\n1. 接口 SDK。详见 [接口介绍](services)。\n2. HTTP 客户端 `core.Client`，支持请求签名和应答验签。如果 SDK 未支持你需要的接口，请用此客户端发起请求。\n3. 回调通知处理库 `core/notify`，支持微信支付回调通知的验签和解密。详见 [回调通知验签与解密](#回调通知的验签与解密)。\n4. 证书下载、[敏感信息加解密](#敏感信息加解密) 等辅助能力。\n\n### 兼容性\n\n当前版本为测试版本，微信支付会尽量保持向后兼容。但可能因为可用性或易用性，同历史版本存在不兼容。如果你使用版本 `\u003c= v0.2.2`，升级前请参考 [升级指南](UPGRADING.md)。\n\n## 快速开始\n\n### 安装\n\n#### 1、使用 Go Modules 管理你的项目\n\n如果你的项目还不是使用 Go Modules 做依赖管理，在项目根目录下执行：\n\n```shell\ngo mod init\n```\n\n#### 2、无需 clone 仓库中的代码，直接在项目目录中执行\n\n```shell\ngo get -u github.com/wechatpay-apiv3/wechatpay-go\n```\n\n来添加依赖，完成 `go.mod` 修改与 SDK 下载。\n\n### 发送请求\n\n先初始化一个 `core.Client` 实例，再向微信支付发送请求。\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\n\t\"github.com/wechatpay-apiv3/wechatpay-go/core\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/core/option\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/services/certificates\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/utils\"\n)\n\nfunc main() {\n\tvar (\n\t\tmchID                      string = \"190000****\"                                // 商户号\n\t\tmchCertificateSerialNumber string = \"3775B6A45ACD588826D15E583A95F5DD********\"  // 商户证书序列号\n\t\tmchAPIv3Key                string = \"2ab9****************************\"          // 商户APIv3密钥\n\t)\n\n\t// 使用 utils 提供的函数从本地文件中加载商户私钥，商户私钥会用来生成请求的签名\n\tmchPrivateKey, err := utils.LoadPrivateKeyWithPath(\"/path/to/merchant/apiclient_key.pem\")\n\tif err != nil {\n\t\tlog.Fatal(\"load merchant private key error\")\n\t}\n\n\tctx := context.Background()\n\t// 使用商户私钥等初始化 client，并使它具有自动定时获取微信支付平台证书的能力\n\topts := []core.ClientOption{\n\t\toption.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),\n\t}\n\tclient, err := core.NewClient(ctx, opts...)\n\tif err != nil {\n\t\tlog.Fatalf(\"new wechat pay client err:%s\", err)\n\t}\n\t\n\t// 发送请求，以下载微信支付平台证书为例\n\t// https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay5_1.shtml\n\tsvc := certificates.CertificatesApiService{Client: client}\n\tresp, result, err := svc.DownloadCertificates(ctx)\n\tlog.Printf(\"status=%d resp=%s\", result.Response.StatusCode, resp)\n}\n```\n\n`resp` 是反序列化（UnmarshalJSON）后的应答。上例中是 `services/certificates` 包中的 `*certificates.Certificate`。\n\n`result` 是 `*core.APIResult` 实例，包含了完整的请求报文 `*http.Request` 和应答报文 `*http.Response`。\n\n#### 名词解释\n\n+ **商户 API 证书**，是用来证实商户身份的。证书中包含商户号、证书序列号、证书有效期等信息，由证书授权机构（Certificate Authority ，简称 CA）签发，以防证书被伪造或篡改。如何获取请见 [商户 API 证书](https://wechatpay-api.gitbook.io/wechatpay-api-v3/ren-zheng/zheng-shu#shang-hu-api-zheng-shu) 。\n\n+ **商户 API 私钥**。商户申请商户 API 证书时，会生成商户私钥，并保存在本地证书文件夹的文件 apiclient_key.pem 中。\n\n\u003e :warning: 不要把私钥文件暴露在公共场合，如上传到 Github，写在客户端代码等。\n\n+ **微信支付平台证书**。微信支付平台证书是指由微信支付负责申请的，包含微信支付平台标识、公钥信息的证书。商户使用微信支付平台证书中的公钥验证应答签名。获取微信支付平台证书需通过 [获取平台证书列表](https://wechatpay-api.gitbook.io/wechatpay-api-v3/ren-zheng/zheng-shu#ping-tai-zheng-shu) 接口下载。\n+ **证书序列号**。每个证书都有一个由 CA 颁发的唯一编号，即证书序列号。扩展阅读 [如何查看证书序列号](https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao) 。\n+ **微信支付 APIv3 密钥**，是在回调通知和微信支付平台证书下载接口中，为加强数据安全，对关键信息 `AES-256-GCM` 加密时使用的对称加密密钥。\n\n## 更多示例\n\n### 以 [JSAPI下单](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml) 为例\n\n```go\nimport (\n\t\"log\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi\"\n)\n\nsvc := jsapi.JsapiApiService{Client: client}\n// 得到prepay_id，以及调起支付所需的参数和签名\nresp, result, err := svc.PrepayWithRequestPayment(ctx,\n\tjsapi.PrepayRequest{\n\t\tAppid:       core.String(\"wxd678efh567hg6787\"),\n\t\tMchid:       core.String(\"1900009191\"),\n\t\tDescription: core.String(\"Image形象店-深圳腾大-QQ公仔\"),\n\t\tOutTradeNo:  core.String(\"1217752501201407033233368018\"),\n\t\tAttach:      core.String(\"自定义数据说明\"),\n\t\tNotifyUrl:   core.String(\"https://www.weixin.qq.com/wxpay/pay.php\"),\n\t\tAmount: \u0026jsapi.Amount{\n\t\t\tTotal: core.Int64(100),\n\t\t},\n\t\tPayer: \u0026jsapi.Payer{\n\t\t\tOpenid: core.String(\"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o\"),\n\t\t},\n\t},\n)\n\nif err == nil {\n\tlog.Println(resp)\n} else {\n\tlog.Println(err)\n}\n```\n\n### 以 [查询订单](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml) 为例\n\n```go\nimport (\n\t\"log\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi\"\n)\n\nsvc := jsapi.JsapiApiService{Client: client}\n\nresp, result, err := svc.QueryOrderById(ctx,\n\tjsapi.QueryOrderByIdRequest{\n\t\tTransactionId: core.String(\"4200000985202103031441826014\"),\n\t\tMchid:         core.String(\"1900009191\"),\n\t},\n)\n\nif err == nil {\n\tlog.Println(resp)\n} else {\n\tlog.Println(err)\n}\n\n```\n\n### 以 [图片上传API](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter2_1_1.shtml) 为例\n\n```go\nimport (\n\t\"os\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/core\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/core/consts\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/services/fileuploader\"\n)\n\nfile, err := os.Open(\"resource/demo.jpg\")\ndefer file.Close()\nif err != nil {\n\treturn err\n}\n\nsvc := fileuploader.ImageUploader{Client: client}\nresp, result, err := svc.Upload(ctx, file, \"demo.jpg\", consts.ImageJPG)\n\n```\n\n### 示例程序\n\n为了方便开发者快速上手，微信支付给每个服务生成了示例代码 `api_xx_example_test.go`。请按需查阅。例如：\n\n+ [api_jsapi_example_test.go](services/payments/jsapi/api_jsapi_example_test.go)\n+ [api_refunds_example_test.go](services/refunddomestic/api_refunds_example_test.go)\n\n## 发送 HTTP 请求\n\n如果 SDK 还未支持你需要的接口，使用 `core.Client` 的 `GET`、`POST` 等方法发送 HTTP 请求，而不用关注签名、验签等逻辑。\n\n以 [下载微信支付平台证书](https://wechatpay-api.gitbook.io/wechatpay-api-v3/jie-kou-wen-dang/ping-tai-zheng-shu) 为例：\n\n```go\nresult, err := client.Get(ctx, \"https://api.mch.weixin.qq.com/v3/certificates\")\n```\n\n使用 `core.Client` 发送 HTTP 请求后会得到 `*core.APIResult` 实例。\n\n## 错误处理\n\n以下情况，SDK 发送请求会返回 `error`：\n\n+ HTTP 网络错误，如应答接收超时或网络连接失败\n+ 客户端失败，如生成签名失败\n+ 服务器端返回了**非** `2xx` HTTP 状态码\n+ 应答签名验证失败\n\n为了方便使用，SDK 将服务器返回的 `4xx` 和 `5xx` 错误，转换成了 `APIError`。\n\n```go\n// 错误处理示例\nresult, err := client.Get(ctx, \"https://api.mch.weixin.qq.com/v3/certificates\")\nif err != nil {\n\tif core.IsAPIError(err, \"INVALID_REQUEST\") { \n\t\t// 处理无效请求 \n\t}\n\t// 处理的其他错误\n}\n```\n\n## 回调通知的验签与解密\n\n1. 使用微信支付平台证书（验签）和商户 APIv3 密钥（解密）初始化 `notify.Handler`\n2. 调用 `handler.ParseNotifyRequest` 验签，并解密报文。\n\n### 初始化\n\n+ 方法一（大多数场景）：先手动注册下载器，再获取微信平台证书访问器。\n\n适用场景： 仅需要对回调通知验证签名并解密的场景。例如，基础支付的回调通知。\n\n```go\nctx := context.Background()\n// 1. 使用 `RegisterDownloaderWithPrivateKey` 注册下载器\nerr := downloader.MgrInstance().RegisterDownloaderWithPrivateKey(ctx, mchPrivateKey, mchCertificateSerialNumber, mchID, mchAPIV3Key)\n// 2. 获取商户号对应的微信支付平台证书访问器\ncertificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchID)\n// 3. 使用证书访问器初始化 `notify.Handler`\nhandler := notify.NewNotifyHandler(mchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor))\n```\n\n+ 方法二：像 [发送请求](#发送请求) 那样使用 `WithWechatPayAutoAuthCipher` 初始化 `core.Client`，然后再用client进行接口调用。\n\n适用场景：需要对回调通知验证签名并解密，并且后续需要使用 Client 的场景。例如，电子发票的回调通知，验签与解密后还需要通过 Client 调用用户填写抬头接口。\n\n```go\nctx := context.Background()\n// 1. 使用商户私钥等初始化 client，并使它具有自动定时获取微信支付平台证书的能力\nopts := []core.ClientOption{\n\toption.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),\n}\nclient, err := core.NewClient(ctx, opts...)\t\n// 2. 获取商户号对应的微信支付平台证书访问器\ncertificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchID)\n// 3. 使用证书访问器初始化 `notify.Handler`\nhandler := notify.NewNotifyHandler(mchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor))\n// 4. 使用client进行接口调用\n// ...\n```\n\n+ 方法三：使用本地的微信支付平台证书和商户 APIv3 密钥初始化 `Handler`。\n\n适用场景：首次通过工具下载平台证书到本地，后续使用本地管理的平台证书进行验签与解密。\n\n```go\n// 1. 初始化商户API v3 Key及微信支付平台证书\nmchAPIv3Key := \"\u003cyour apiv3 key\u003e\"\nwechatPayCert, err := utils.LoadCertificate(\"\u003cyour wechat pay certificate\u003e\")\n// 2. 使用本地管理的微信支付平台证书获取微信支付平台证书访问器\ncertificateVisitor := core.NewCertificateMapWithList([]*x509.Certificate{wechatPayCert})\n// 3. 使用apiv3 key、证书访问器初始化 `notify.Handler`\nhandler := notify.NewNotifyHandler(mchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor))\n```\n\n建议：为了正确使用平台证书下载管理器，你应阅读并理解 [如何使用平台证书下载管理器](FAQ.md#如何使用平台证书下载管理器)。\n\n### 验签与解密\n\n将支付回调通知中的内容，解析为 `payments.Transaction`。\n\n```go\ntransaction := new(payments.Transaction)\nnotifyReq, err := handler.ParseNotifyRequest(context.Background(), request, transaction)\n// 如果验签未通过，或者解密失败\nif err != nil {\n\tfmt.Println(err)\n\treturn\n}\n// 处理通知内容\nfmt.Println(notifyReq.Summary)\nfmt.Println(transaction.TransactionId)\n```\n\n将 SDK 未支持的回调消息体，解析至 `map[string]interface{}`。\n\n```go\ncontent := make(map[string]interface{})\nnotifyReq, err := handler.ParseNotifyRequest(context.Background(), request, \u0026content)\n// 如果验签未通过，或者解密失败\nif err != nil {\n\tfmt.Println(err)\n\treturn\n}\n// 处理通知内容\nfmt.Println(notifyReq.Summary)\nfmt.Println(content)\n```\n\n## 敏感信息加解密\n\n为了保证通信过程中敏感信息字段（如用户的住址、银行卡号、手机号码等）的机密性，\n\n+ 微信支付要求加密上行的敏感信息\n+ 微信支付会加密下行的敏感信息\n\n详见 [接口规则 - 敏感信息加解密](https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/min-gan-xin-xi-jia-mi)。\n\n### （推荐）使用敏感信息加解密器\n\n敏感信息加解密器 `cipher.Cipher` 能根据 API 契约自动处理敏感信息：\n\n+ 发起请求时，开发者设置原文，加密器自动加密敏感信息，并设置 `Wechatpay-Serial` 请求头\n+ 收到应答时，解密器自动解密敏感信息，开发者得到原文\n\n使用敏感信息加解密器，只需通过 `option.WithWechatPayCipher` 为 `core.Client` 添加加解密器：\n\n```go\nclient, err := core.NewClient(\n    context.Background(),\n// 一次性设置 签名/验签/敏感字段加解密，并注册 平台证书下载器，自动定时获取最新的平台证书\n    option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),\n    option.WithWechatPayCipher(\n        encryptors.NewWechatPayEncryptor(downloader.MgrInstance().GetCertificateVisitor(mchID)),\n        decryptors.NewWechatPayDecryptor(mchPrivateKey),\n    ),\n)\n```\n\n### 使用加解密算法工具包\n\n#### 步骤一：获取微信支付平台证书\n\n请求的敏感信息，使用微信支付平台证书中的公钥加密。推荐 [使用平台证书下载管理器](FAQ.md#如何使用平台证书下载管理器) 获取微信支付平台证书，或者 [下载平台证书](FAQ.md#如何下载微信支付平台证书)。\n\n#### 步骤二：加解密\n\n使用工具包 [utils](utils) 中的函数，手动对敏感信息加解密。\n\n```go\npackage utils\n\n// EncryptOAEPWithPublicKey 使用公钥加密\nfunc EncryptOAEPWithPublicKey(message string, publicKey *rsa.PublicKey) (ciphertext string, err error)\n// EncryptOAEPWithCertificate 使用证书中的公钥加密\nfunc EncryptOAEPWithCertificate(message string, certificate *x509.Certificate) (ciphertext string, err error)\n\n// DecryptOAEP 使用私钥解密\nfunc DecryptOAEP(ciphertext string, privateKey *rsa.PrivateKey) (message string, err error)\n```\n\n[rsa_crypto_test.go](utils/rsa_crypto_test.go) 中演示了如何使用以上函数做敏感信息加解密。\n\n#### 步骤三：设置 `Wechatpay-Serial` 请求头\n\n请求的敏感信息加密后，在 HTTP 请求头中添加微信支付平台证书序列号 `Wechatpay-Serial`。该序列号用于告知微信支付加密使用的证书。\n\n使用 `core.Client` 的 `Request` 方法来传输自定义 HTTPHeader。\n\n```go\n// Request 向微信支付发送请求\n//\n// 相比于 Get / Post / Put / Patch / Delete 方法，本方法支持设置更多内容\n// 特别地，如果需要为当前请求设置 Header，应使用本方法\nfunc (client *Client) Request(\n\tctx context.Context,\n\tmethod, requestPath string,\n\theaderParams http.Header,\n\tqueryParams url.Values,\n\tpostBody interface{},\n\tcontentType string,\n) (result *APIResult, err error)\n\n// 示例代码\n// 微信支付平台证书序列号，对应加密使用的私钥\nheader.Add(\"Wechatpay-Serial\", \"5157F09EFDC096DE15EBE81A47057A72*******\")\nresult, err := client.Request(\n\tctx,\n\t\"POST\",\n\t\"https://api.mch.weixin.qq.com/v3/profitsharing/receivers/add\",\n\theader,\n\tnil,\n\tbody,\n\t\"application/json\")\n\n```\n\n## 自定义签名生成器与验证器\n\n当默认的本地签名和验签方式不适合你的系统时，实现 `Signer` 或者 `Verifier` 来定制签名和验签。\n\n比如，你把商户私钥集中存储，业务系统通过远程调用获得请求签名。\n\n```golang\n// 签名器\ntype CustomSigner struct {\n}\n\nfunc (s *CustomSigner) Sign(ctx context.Context, message string) (*auth.SignatureResult, error) {\n    // TODO: 远程调用获取签名信息\n    return \u0026auth.SignatureResult{MchID: \"xxx\", MchCertificateSerialNo: \"xxx\", Signature: \"xxx\"}, nil\n}\n\n// 校验器\ntype CustomVerifier struct {\n}\n\nfunc (v *CustomVerifier) Verify(ctx context.Context, serial, message, signature string) error {\n    // TODO: 远程调用验签\n    return nil\n}\n```\n\n当你需要使用自定的签名器和校验器时，这样创建客户端\n\n```golang\npackage core_test\n\nimport (\n\t\"context\"\n\n\t\"path/to/your/custom_signer\"\n\t\"path/to/your/custom_verifier\"\n\n\t\"github.com/wechatpay-apiv3/wechatpay-go/core\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/core/auth/credentials\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/core/auth/validators\"\n\t\"github.com/wechatpay-apiv3/wechatpay-go/core/option\"\n)\n\nfunc NewCustomClient(ctx context.Context, mchID string) (*core.Client, error) {\n\tsigner := \u0026custom_signer.CustomSigner{\n\t\t// ... \n\t}\n\tverifier := \u0026custom_verifier.CustomVerifier{\n\t\t// ...\n\t}\n\n\topts := []core.ClientOption{\n\t\toption.WithSigner(signer),\n\t\toption.WithVerifier(verifier),\n\t}\n\n\treturn core.NewClient(ctx, opts...)\n}\n```\n\n### 使用公钥验证微信支付签名\n\n如果你的商户是全新入驻，且仅可使用微信支付的公钥验证应答和回调的签名，请使用微信支付公钥和公钥 ID 初始化。\n\n```go\nvar (\n\twechatpayPublicKeyID       string = \"00000000000000000000000000000000\"          // 微信支付公钥ID\n)\n\nwechatpayPublicKey, err = utils.LoadPublicKeyWithPath(\"/path/to/wechatpay/pub_key.pem\")\nif err != nil {\n\tpanic(fmt.Errorf(\"load wechatpay public key err:%s\", err.Error()))\n}\n    \n// 初始化 Client\nopts := []core.ClientOption{\n\toption.WithWechatPayPublicKeyAuthCipher(\n\t\tmchID,\n\t\tmchCertificateSerialNumber, mchPrivateKey,\n\t\twechatpayPublicKeyID, wechatpayPublicKey),\n}\nclient, err := core.NewClient(ctx, opts...)\n\n// 初始化 notify.Handler\nhandler := notify.NewNotifyHandler(\n\tmchAPIv3Key, \n\tverifiers.NewSHA256WithRSAPubkeyVerifier(wechatpayPublicKeyID, *wechatPayPublicKey))\n```\n\n如果你既有微信支付平台证书，又有公钥。那么，你可以在商户平台自助地从微信支付平台证书切换到公私钥，或者反过来。\n在切换期间，回调要同时支持使用平台证书和公钥的验签。 \n\n请参考下文，使用微信平台证书访问器和公钥一起初始化 `NotifyHandler`。\n\n```go\n// 初始化 notify.Handler\nhandler := notify.NewNotifyHandler(\n\tmchAPIv3Key,\n\tverifiers.NewSHA256WithRSACombinedVerifier(certificateVisitor, wechatpayPublicKeyID, *wechatPayPublicKey))\n```\n\n## 常见问题\n\n常见问题请见 [FAQ.md](FAQ.md)。\n\n## 如何参与开发\n\n微信支付欢迎来自社区的开发者贡献你们的想法和代码。请你在提交 PR 之前，先提一个对应的 issue 说明以下内容：\n\n+ 背景（如，遇到的问题）和目的\n+ **着重**说明你的想法\n+ 通过代码或者其他方式，简要的说明是如何实现的，或者它会是如何使用\n+ 是否影响现有的接口\n\n[#35](https://github.com/wechatpay-apiv3/wechatpay-go/issues/35) 是一个很好的参考。\n\n### 测试\n\n开发者提交的代码，应能通过本 SDK 所有的测试用例。\n\nSDK 在单元测试中使用了 [agiledragon/gomonkey](https://github.com/agiledragon/gomonkey) 和 [stretchr/testify](https://github.com/stretchr/testify)，测试前请确认相关的依赖。使用以下命令获取所有的依赖。\n\n```bash\ngo get -t -v\n```\n\n由于 `gomonkey` 的原因，在执行测试用例时需要携带参数 `-gcflags=all=-l`。使用以下命令发起测试。\n\n```bash\ngo test -gcflags=all=-l ./...\n```\n\n## 联系微信支付\n\n如果你发现了 BUG，或者需要的功能还未支持，或者有任何疑问、建议，欢迎通过 [issue](https://github.com/wechatpay-apiv3/wechatpay-go/issues) 反馈。\n\n也欢迎访问微信支付的 [开发者社区](https://developers.weixin.qq.com/community/pay)。\n\n### 帮助微信支付改进 SDK\n\n为了向广大开发者提供更好的使用体验，微信支付诚挚邀请您反馈使用微信支付 APIv3 SDK中的感受。\n您的反馈将对改进 SDK 大有帮助，[点击参与问卷调查](https://wj.qq.com/s2/8774719/ef10/)。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwechatpay-apiv3%2Fwechatpay-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwechatpay-apiv3%2Fwechatpay-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwechatpay-apiv3%2Fwechatpay-go/lists"}