wechatpay-go完全指南:快速集成微信支付APIv3的终极教程
【免费下载链接】wechatpay-go 微信支付 APIv3 的官方 Go Library 项目地址: https://gitcode.com/gh_mirrors/we/wechatpay-go
wechatpay-go是微信支付APIv3的官方Go语言客户端代码库,为开发者提供了便捷的接口调用、请求签名、应答验签、回调通知处理等功能,帮助开发者快速实现微信支付功能集成。
为什么选择wechatpay-go?
wechatpay-go作为微信支付官方SDK,具有以下核心优势:
- 完整的接口支持:覆盖微信支付APIv3所有核心功能,包括支付、退款、转账、优惠券等服务,详见接口介绍。
- 安全可靠:内置请求签名和应答验签机制,确保交易安全;支持敏感信息加解密,保护用户数据隐私。
- 易于使用:提供简洁的API设计和丰富的示例代码,降低开发门槛,新手也能快速上手。
- 灵活扩展:支持自定义签名生成器与验证器,满足不同场景的需求。
快速开始:wechatpay-go安装与初始化
环境准备
在开始之前,请确保你的开发环境满足以下要求:
- Go 1.13及以上版本
- 已注册微信支付商户账号,并获取商户号、商户API证书、商户APIv3密钥等信息
安装wechatpay-go
使用Go Modules管理项目依赖,在项目目录中执行以下命令安装wechatpay-go:
go get -u github.com/wechatpay-apiv3/wechatpay-go
初始化客户端
初始化core.Client是使用wechatpay-go的第一步,客户端将负责处理请求签名、验签等核心功能。以下是初始化客户端的示例代码:
package main
import (
"context"
"log"
"github.com/wechatpay-apiv3/wechatpay-go/core"
"github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/utils"
)
func main() {
var (
mchID string = "190000****" // 商户号
mchCertificateSerialNumber string = "3775B6A45ACD588826D15E583A95F5DD********" // 商户证书序列号
mchAPIv3Key string = "2ab9****************************" // 商户APIv3密钥
)
// 从本地文件中加载商户私钥
mchPrivateKey, err := utils.LoadPrivateKeyWithPath("/path/to/merchant/apiclient_key.pem")
if err != nil {
log.Fatal("load merchant private key error")
}
ctx := context.Background()
// 初始化client,并启用自动定时获取微信支付平台证书的能力
opts := []core.ClientOption{
option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
}
client, err := core.NewClient(ctx, opts...)
if err != nil {
log.Fatalf("new wechat pay client err:%s", err)
}
}
注意:商户私钥是重要的安全凭证,请勿暴露在公共场合,如上传到Github或写在客户端代码中。
核心功能实战:API调用示例
wechatpay-go提供了丰富的API接口,以下是几个常用功能的实现示例。
JSAPI下单
JSAPI支付是微信支付的一种方式,适用于在微信内H5页面发起支付。以下是JSAPI下单的示例代码:
import (
"log"
"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
)
func JsapiPrepay(client *core.Client) {
svc := jsapi.JsapiApiService{Client: client}
// 调用PrepayWithRequestPayment方法下单,并获取调起支付所需的参数和签名
resp, result, err := svc.PrepayWithRequestPayment(context.Background(),
jsapi.PrepayRequest{
Appid: core.String("wxd678efh567hg6787"),
Mchid: core.String("1900009191"),
Description: core.String("Image形象店-深圳腾大-QQ公仔"),
OutTradeNo: core.String("1217752501201407033233368018"),
NotifyUrl: core.String("https://www.weixin.qq.com/wxpay/pay.php"),
Amount: &jsapi.Amount{
Total: core.Int64(100), // 订单总金额,单位为分
},
Payer: &jsapi.Payer{
Openid: core.String("oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"), // 用户在商户appid下的唯一标识
},
},
)
if err == nil {
log.Println("prepay_id:", resp.PrepayId)
// 此处可获取调起支付的参数,如appId、timeStamp、nonceStr、package、signType、paySign等
} else {
log.Println("JSAPI prepay error:", err)
}
}
查询订单
订单创建后,可通过订单号查询订单状态。以下是查询订单的示例代码:
func QueryOrder(client *core.Client) {
svc := jsapi.JsapiApiService{Client: client}
// 根据微信支付订单号查询
resp, result, err := svc.QueryOrderById(context.Background(),
jsapi.QueryOrderByIdRequest{
TransactionId: core.String("4200000985202103031441826014"), // 微信支付订单号
Mchid: core.String("1900009191"),
},
)
if err == nil {
log.Println("order status:", resp.TradeState)
log.Println("order amount:", *resp.Amount.Total)
} else {
log.Println("query order error:", err)
}
}
回调通知处理
微信支付会在订单状态发生变更时,向商户配置的 notify_url 发送回调通知。wechatpay-go提供了便捷的回调通知处理功能,包括验签和解密。
以下是处理回调通知的示例代码:
import (
"fmt"
"net/http"
"github.com/wechatpay-apiv3/wechatpay-go/core/notify"
"github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers"
"github.com/wechatpay-apiv3/wechatpay-go/services/payments"
"github.com/wechatpay-apiv3/wechatpay-go/core/downloader"
)
func NotifyHandler(w http.ResponseWriter, r *http.Request) {
mchAPIv3Key := "2ab9****************************" // 商户APIv3密钥
// 获取微信支付平台证书访问器
certificateVisitor := downloader.MgrInstance().GetCertificateVisitor("190000****") // 商户号
// 初始化notify.Handler
handler := notify.NewNotifyHandler(mchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor))
// 解析回调通知
transaction := new(payments.Transaction)
notifyReq, err := handler.ParseNotifyRequest(context.Background(), r, transaction)
if err != nil {
fmt.Println("parse notify error:", err)
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte("fail"))
return
}
// 处理通知内容
fmt.Println("notify summary:", notifyReq.Summary)
fmt.Println("transaction id:", transaction.TransactionId)
fmt.Println("order amount:", *transaction.Amount.Total)
// 向微信支付返回成功响应
w.WriteHeader(http.StatusOK)
w.Write([]byte("success"))
}
进阶功能:敏感信息加解密
为保护用户敏感信息,微信支付要求对敏感信息进行加密传输。wechatpay-go提供了敏感信息加解密器,可自动处理敏感信息的加解密。
以下是使用敏感信息加解密器的示例代码:
client, err := core.NewClient(
context.Background(),
// 设置签名/验签/敏感字段加解密,并注册平台证书下载器
option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
option.WithWechatPayCipher(
encryptors.NewWechatPayEncryptor(downloader.MgrInstance().GetCertificateVisitor(mchID)),
decryptors.NewWechatPayDecryptor(mchPrivateKey),
),
)
启用加解密器后,发起请求时,开发者只需设置原文,加密器会自动加密敏感信息;收到应答时,解密器会自动解密敏感信息,开发者直接获取原文即可。
常见问题与解决方案
在使用wechatpay-go的过程中,可能会遇到一些常见问题,以下是部分问题的解决方案:
如何获取商户API证书和APIv3密钥?
商户API证书和APIv3密钥需要在微信支付商户平台获取。具体步骤可参考微信支付官方文档:商户API证书。
如何处理接口调用错误?
wechatpay-go将服务器返回的4xx和5xx错误转换为APIError,开发者可通过以下方式处理:
result, err := client.Get(ctx, "https://api.mch.weixin.qq.com/v3/certificates")
if err != nil {
if core.IsAPIError(err, "INVALID_REQUEST") {
// 处理无效请求错误
} else if core.IsAPIError(err, "SIGN_ERROR") {
// 处理签名错误
}
// 处理其他错误
}
更多常见问题请参考FAQ.md。
总结
wechatpay-go作为微信支付APIv3的官方Go语言客户端,为开发者提供了便捷、安全、可靠的微信支付集成方案。通过本文的介绍,你已经了解了wechatpay-go的安装、初始化、核心API调用以及进阶功能的使用。
如果你在使用过程中遇到问题,欢迎通过issue反馈,也可以访问微信支付的开发者社区获取帮助。
希望本教程能帮助你快速集成微信支付功能,祝你的项目开发顺利!
【免费下载链接】wechatpay-go 微信支付 APIv3 的官方 Go Library 项目地址: https://gitcode.com/gh_mirrors/we/wechatpay-go
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



