wechatpay-go完全指南:快速集成微信支付APIv3的终极教程

wechatpay-go完全指南:快速集成微信支付APIv3的终极教程

【免费下载链接】wechatpay-go 微信支付 APIv3 的官方 Go Library 【免费下载链接】wechatpay-go 项目地址: 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 【免费下载链接】wechatpay-go 项目地址: https://gitcode.com/gh_mirrors/we/wechatpay-go

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值