基于 Golang + Beego + Vue 微服务架构的新一代聚合支付系统,开箱即用、高并发、高安全
GolangPay 是一套基于 Go 语言开发的聚合支付系统(四方支付平台),采用 Golang + Beego + Vue 微服务架构,覆盖从支付网关、运营管理、代理分销到商户接入的全链路业务。
系统封装了微信支付、支付宝、云闪付、快捷支付、代付等 60+ 支付通道,支持"一码付"动态路由,并提供实时分账、动态风控、自动对账与结算等金融级能力。编译后单文件可执行,源码完全开放,适合有技术团队的企业直接运营或二次开发。
全量源码开放(Go + Layui),编译即部署,无需复杂环境配置。Swagger 文档自动生成,接口即文档。
原生 goroutine + channel CSP 模型,8C16G 容器稳定支撑 1.2 万 TPS,P99 延迟仅 38ms。
编译型语言杜绝源码泄露,TLS1.3 + RSA/AES 混合加密 + SM4 国密落地,密钥 KMS 托管。
统一支付接口设计,新增通道只需实现接口,30 分钟完成对接。灰度发布、Prometheus 监控全链路内置。
| 场景 | 说明 |
|---|---|
| 聚合支付平台 | 直接运营四方支付业务,服务多商户、多通道 |
| 企业收单系统 | 自有业务统一收款,对接多支付通道 |
| 代理商分销 | 多级代理体系,独立佣金结算 |
| 跨境支付 | 支持 PayPal 等国际通道,多币种结算 |
| SaaS 支付中台 | 作为支付中台嵌入 SaaS 产品,统一管理 |
购买后针对每个客户单独创建群,至少指定一名技术支持人员提供售后服务:
GolangPay 采用微服务模块化设计,各服务独立部署、通过 Dubbo 接口通信。整体分为接入层、业务层、核心层和数据层四个层次。
┌─────────────────────────────────────────────────────┐
│ 负载均衡 (Nginx) │
│ SSL 终结 / 域名路由 / 限流 │
├─────────┬──────────┬──────────┬──────────┬───────────┤
│ 运营平台 │ 商户系统 │ 代理系统 │ 核销系统 │ 支付网关 │
│ (manage) │(merchant)│ (agent) │ │ (pay) │
│ :12306 │ :12306 │ :12304 │ │ :12309 │
├─────────┴──────────┴──────────┴──────────┴───────────┤
│ golangpay-service (核心业务) │
│ 订单 / 通道 / 商户 / 风控 / 结算 业务逻辑 │
├───────────────────────────────────────────────────────┤
│ golangpay-core (公共实体 / Dubbo 接口 / 工具) │
├───────────────────────────────────────────────────────┤
│ golangpay-task (对账 / 结算 / 风控) :12310 │
├───────────────────────────────────────────────────────┤
│ MySQL │ Redis │ RabbitMQ / Kafka │ KMS │
└───────────────────────────────────────────────────────┘
| 层次 | 包含模块 | 职责 |
|---|---|---|
| 接入层 | Nginx + 前端静态资源 | 负载均衡、SSL 终结、域名路由、静态文件服务 |
| 应用层 | manage / merchant / agent / pay | 各端 HTTP 接口、页面渲染、参数校验 |
| 业务层 | golangpay-service | 核心业务逻辑:订单处理、通道路由、风控评估 |
| 基础层 | golangpay-core / golangpay-z-api-base | 公共实体、Dubbo 接口定义、支付接口基础包 |
| 任务层 | golangpay-task | 定时对账、结算跑批、风控评分(单节点) |
| 数据层 | MySQL / Redis / MQ / KMS | 数据持久化、缓存、异步消息、密钥管理 |
| 层级 | 技术选型 | 说明 |
|---|---|---|
| 后端语言 | Go (Golang) | 原生并发、编译型、高性能 |
| Web 框架 | Beego / Gin | MVC 架构、中间件丰富 |
| 前端框架 | Vue3 + Layui | 前后端分离,运营/商户/代理三端独立 |
| 服务通信 | Dubbo | 跨服务 RPC 调用 |
| 数据库 | MySQL 5.7+ / 8.0 | 业务数据持久化 |
| 缓存 | Redis 6.0+ | 热点数据、分布式锁、Session |
| 消息队列 | RabbitMQ / Kafka | 异步通知、订单解耦 |
| 定时任务 | 自研 golangpay-task | 对账、结算、风控评分单节点跑批 |
| 监控 | Prometheus + 链路追踪 | 全链路指标与告警 |
| API 文档 | Swagger | 自动生成,接口即文档 |
| 容器化 | Docker | 镜像 < 30MB,秒级启动 |
各模块独立编译部署,通过 Dubbo 接口通信,故障隔离、独立扩缩容
支付通道统一接口封装,新增通道零侵入,30 分钟对接完成
goroutine + channel 解耦订单/通知/风控三大流,避免锁风暴
容器镜像小、启动快,Kubernetes 天然亲和,弹性伸缩
GolangPay 由 8 个模块组成,其中 4 个为公共库(编译时引用),4 个为运行态服务(独立部署),另有 1 个定时任务服务。
| 模块 | 端口 | 类型 | 说明 |
|---|---|---|---|
golangpay | — | 公共库 | 公共方法、实体 Bean、API 接口定义,供所有服务复用 |
golangpay-core | — | 公共库 | 核心包:Dubbo 服务接口定义、实体 Bean、公共工具类 |
golangpay-service | — | 公共库 | 所有核心业务方法封装,供其他模块引用后调用 |
golangpay-z-api-base | — | 公共库 | 支付接口的基础包,通道对接公共逻辑 |
golangpay-pay | 12309 | 运行服务 | 支付网关核心:商户支付接口 + 所有支付通道对接实现 |
golangpay-manage | 12306 | 运行服务 | 运营平台(接口 + 管理界面,前后端分离) |
golangpay-merchant | 12306 | 运行服务 | 商户系统(接口 + 管理界面,前后端分离) |
golangpay-agent | 12304 | 运行服务 | 代理商系统(接口 + 管理界面,前后端分离) |
golangpay-task | 12310 | 定时任务 | 对账服务、结算服务(必须单节点部署) |
项目根模块,定义所有公共实体(如 Order、Merchant、Channel)、工具方法(签名、加密、序列化)和 Dubbo 服务接口。其他模块通过 import 引用,一条 import 即可被所有服务复用。
包含 Dubbo 服务接口定义、实体 Bean 以及公共引用和常用工具类。是模块间通信的契约层,接口变更需同步所有消费方。
封装所有核心业务方法:订单处理、通道路由、商户管理、风控评估、结算逻辑等。供 manage、merchant、agent、pay 等模块引用调用,避免业务逻辑散落各处。
支付接口的基础包,封装与第三方通道交互的公共逻辑:HTTP 客户端、签名/验签、证书加载、超时重试等。新增通道时继承此包实现统一接口即可。
系统核心模块,提供商户访问的支付接口,并对接所有支付通道实现。封装微信、支付宝、云闪付、快捷、代付等 60+ 通道,支持"一码付"动态路由。
前后端分离架构,提供全局数据看板、商户/代理管理、通道配置、费率设置、系统参数等功能。Vue3 前端 + Go 后端 API。
商户自助管理平台,支持订单查询、交易统计、API 密钥管理、通道配置、结算查询等功能。
多级代理体系管理,支持独立登录、下级商户管理、佣金结算、通道分配等功能。
单节点部署的定时任务服务,负责自动对账(勾兑通道对账单)、结算跑批(T0/T1/D1 打款)、风控评分等。包含 Telegram 机器人告警通知。
一次完整的支付请求从用户下单到最终到账,经历以下核心步骤:
/api/pay/unified_order),传入订单号、金额、支付方式等参数。golangpay-pay 统一接收请求,进行参数校验和签名验证。notify_url 回调支付结果,网关验签后更新订单状态。用户 商户后端 支付网关 风控引擎 第三方通道
│ │ │ │ │
│──下单──→ │ │ │ │
│ │──统一下单──→ │ │ │
│ │ │──风控评估──→│ │
│ │ │←──通过/拒绝─│ │
│ │ │──通道请求──────────────→│
│ │ │ │ │
│←──支付页面──────────────────────────────────────────│
│──完成支付──────────────────────────────────────→│
│ │ │←──异步回调──────────────│
│ │ │──验签+更新订单 │
│ │←──回调通知── │ │ │
│ │──返回success─│ │ │
│←──业务结果─│ │ │ │
支付完成后,网关向商户 notify_url 发送 POST 请求,包含签名信息。商户需:
success 确认接收success,网关会按策略重试通知(通常 3-5 次,间隔递增)。重复回调需做幂等处理,避免业务重复执行。支持部分退款和全额退款,退款资金原路返回至用户支付账户。
支持手动/自动打款、批量代付、失败自动重试。结算周期 T0/T1/D1 自由配置。
微信/支付宝主扫、被扫,支持一码付动态路由
手机浏览器唤起微信/支付宝完成支付
微信公众号/小程序内支付
原生 APP 调起微信/支付宝 SDK
银行卡快捷签约与支付
批量代付、自动打款、失败重试
银联云闪付二维码支付
统一收款码,自动识别微信/支付宝,动态路由到对应通道
| 功能 | 说明 |
|---|---|
| 实时分账 | 支持红包、支付宝分账、收付通等多级商户资金归集,避免"二清"风险 |
| 结算审核 | 二级审核 + 打款队列,支持手动/自动打款、批量代付 |
| T+0/T+1/D+1 | 结算周期自由配置,按商户/通道灵活设定 |
| 自动对账 | golangpay-task 定时拉取通道对账单,自动勾兑订单,差错单自动标记 |
| 手动对账 | 支持上传对账文件,手动勾兑差错订单 |
| 资金流水 | 全链路资金流水追踪,可追溯每笔资金动向 |
| 功能 | 说明 |
|---|---|
| 运营平台 | 全局数据看板、商户/代理管理、通道配置、费率设置 |
| 代理商系统 | 多级代理体系、独立登录、佣金结算、下级商户管理 |
| 商户系统 | 订单查询、交易统计、API 密钥管理、通道配置、结算查询 |
| 权限管理 | 前后端分离,权限粒度到按钮级,支持角色自定义 |
| 通道管理 | 60+ 通道配置、权重设置、启停控制、费率管理 |
| 数据看板 | 实时交易量、成功率、通道排名、异常告警一览 |
| 功能 | 说明 |
|---|---|
| 实时风控 | 下单即跑 200+ 规则(IP/设备指纹/频次/黑名单),3ms 内返回决策 |
| 自动冻结 | 异常订单自动冻结,并推送 Telegram 群告警 |
| singleflight 去重 | 防止并发重复出款,杜绝资损 |
| 黑名单管理 | IP/手机号/银行卡/商户多维度黑名单,支持手动和自动添加 |
| 风控评分 | 综合多维度评分模型,风控决策可配置阈值 |
| 告警通知 | Telegram 机器人实时告警,异常事件秒级触达 |
| 功能 | 说明 |
|---|---|
| 灰度发布 | 支持按商户/通道灰度切换,平滑上线 |
| Prometheus 监控 | 全链路指标采集,Grafana 看板可视化 |
| 链路追踪 | 分布式链路追踪,快速定位性能瓶颈 |
| Swagger 文档 | API 文档自动生成,接口变更即时同步 |
| 日志管理 | 结构化日志,支持 ELK 集中采集与检索 |
| 通道降级 | 通道异常 30 秒内自动降级,保障支付可用性 |
| 组件 | 版本要求 | 说明 |
|---|---|---|
| Go | 1.18+ | 推荐 1.21+,支持最新特性 |
| MySQL | 5.7+ / 8.0 | 推荐 8.0,业务数据持久化 |
| Redis | 6.0+ | 缓存、分布式锁、Session |
| RabbitMQ / Kafka | 按需选择 | 异步通知、订单解耦 |
| Nginx | 1.18+ | 负载均衡与反向代理 |
| Git | 2.0+ | 源码拉取 |
# 克隆项目
git clone https://github.com/bellonigloria513-hub/gaolangpay
cd golangpay
# 下载依赖
go mod download
# 编译各模块(Linux 环境)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o golangpay-manage ./golangpay-manage/
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o golangpay-merchant ./golangpay-merchant/
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o golangpay-agent ./golangpay-agent/
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o golangpay-pay ./golangpay-pay/
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o golangpay-task ./golangpay-task/
# 验证编译结果
ls -la golangpay-*
各模块通过 app.conf(Beego 默认配置文件)管理数据库连接、Redis 地址、服务端口等。
# app.conf 示例 (golangpay-pay)
appname = golangpay-pay
httpport = 12309
runmode = prod
# MySQL 配置
db.host = 127.0.0.1
db.port = 3306
db.user = root
db.password = your_password
db.name = golangpay
# Redis 配置
redis.host = 127.0.0.1:6379
redis.password =
redis.db = 0
# Dubbo 配置
dubbo.registry = zookeeper://127.0.0.1:2181
# 日志
log.level = info
log.path = /var/log/golangpay/pay.log
# 创建数据库
mysql -u root -p -e "CREATE DATABASE golangpay DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 导入初始化脚本(项目提供)
mysql -u root -p golangpay < sql/golangpay_init.sql
# 验证表结构
mysql -u root -p golangpay -e "SHOW TABLES;"
# 按顺序启动各服务(后台运行)
nohup ./golangpay-pay > /var/log/golangpay/pay.log 2>&1 &
nohup ./golangpay-manage > /var/log/golangpay/manage.log 2>&1 &
nohup ./golangpay-merchant > /var/log/golangpay/merchant.log 2>&1 &
nohup ./golangpay-agent > /var/log/golangpay/agent.log 2>&1 &
nohup ./golangpay-task > /var/log/golangpay/task.log 2>&1 &
# 检查服务状态
ps aux | grep golangpay
netstat -tlnp | grep -E "1230[4-9]|12310"
# /etc/nginx/conf.d/golangpay.conf
upstream pay_gateway {
server 127.0.0.1:12309;
# 多实例扩容
# server 127.0.0.1:12319;
}
upstream manage {
server 127.0.0.1:12306;
}
upstream merchant {
server 127.0.0.1:12306;
}
upstream agent {
server 127.0.0.1:12304;
}
server {
listen 80;
server_name pay.yourdomain.com;
# 支付网关
location /api/pay/ {
proxy_pass http://pay_gateway/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 运营平台
location /manage/ {
proxy_pass http://manage/;
}
# 商户系统
location /merchant/ {
proxy_pass http://merchant/;
}
# 代理商系统
location /agent/ {
proxy_pass http://agent/;
}
}
# 各模块 Dockerfile 示例
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 go build -o golangpay-pay ./golangpay-pay/
FROM alpine:latest
RUN apk add --no-cache ca-certificates tzdata
ENV TZ=Asia/Shanghai
COPY --from=builder /app/golangpay-pay /app/
COPY --from=builder /app/golangpay-pay/conf /app/conf
EXPOSE 12309
CMD ["/app/golangpay-pay"]
# docker-compose.yml 示例
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: your_password
MYSQL_DATABASE: golangpay
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
pay:
build: .
ports:
- "12309:12309"
depends_on:
- mysql
- redis
task:
build: .
ports:
- "12310:12310"
depends_on:
- mysql
- redis
volumes:
mysql_data:
redis_data:
| 检查项 | 验证方法 |
|---|---|
| MySQL 连接 | 查看 pay 服务日志是否成功连接数据库 |
| Redis 连接 | redis-cli ping 返回 PONG |
| 支付网关可达 | curl http://localhost:12309/health |
| Nginx 代理 | 浏览器访问 http://pay.yourdomain.com |
| 定时任务单节点 | 确认 task 服务仅运行一个实例 |
| 证书文件 | 确认微信/支付宝证书路径可读 |
merchant_id 和 api_keynotify_url(必须公网可访问)所有 API 请求均需签名验证,确保数据传输安全:
key1=value1&key2=value2&key=api_key 格式sign 参数package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"sort"
"strings"
)
func SignMD5(params map[string]string, apiKey string) string {
// 1. 按 key 升序排列
keys := make([]string, 0, len(params))
for k := range params {
if params[k] != "" && k != "sign" {
keys = append(keys, k)
}
}
sort.Strings(keys)
// 2. 拼接键值对
pairs := make([]string, 0, len(keys))
for _, k := range keys {
pairs = append(pairs, fmt.Sprintf("%s=%s", k, params[k]))
}
signStr := strings.Join(pairs, "&") + "&key=" + apiKey
// 3. MD5 签名
h := md5.Sum([]byte(signStr))
return hex.EncodeToString(h[:])
}
# POST /api/pay/unified_order
{
"merchant_id": "M100001",
"out_trade_no": "ORDER20260612001",
"total_fee": 100,
"body": "商品描述",
"pay_type": "wechat_scan",
"notify_url": "https://yourdomain.com/callback",
"spbill_create_ip": "127.0.0.1",
"nonce_str": "a1b2c3d4e5f6",
"sign": "MD5签名结果"
}
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| merchant_id | string | 是 | 商户号 |
| out_trade_no | string | 是 | 商户订单号(商户侧唯一) |
| total_fee | int | 是 | 金额(单位:分) |
| body | string | 是 | 商品描述 |
| pay_type | string | 是 | 支付方式:wechat_scan/alipay_scan/wechat_h5/alipay_h5/wechat_jsapi/wechat_app/alipay_app/quick_pay |
| notify_url | string | 是 | 异步回调地址(公网可访问) |
| spbill_create_ip | string | 否 | 客户端 IP |
| openid | string | 否 | 用户 openid(JSAPI 支付必填) |
| nonce_str | string | 是 | 随机字符串 |
| sign | string | 是 | 签名 |
{
"code": 0,
"msg": "success",
"data": {
"order_id": "GP2026061200001",
"pay_url": "https://pay.example.com/qrcode/xxx",
"qr_code": "weixin://wxpay/bizpayurl?pr=xxx"
}
}
# POST /api/pay/query_order
{
"merchant_id": "M100001",
"out_trade_no": "ORDER20260612001",
"nonce_str": "a1b2c3d4e5f6",
"sign": "MD5签名结果"
}
{
"code": 0,
"msg": "success",
"data": {
"order_id": "GP2026061200001",
"out_trade_no": "ORDER20260612001",
"trade_no": "第三方流水号",
"total_fee": 100,
"status": 1,
"pay_time": "2026-06-12 15:30:00"
}
}
# POST /api/pay/refund
{
"merchant_id": "M100001",
"out_trade_no": "ORDER20260612001",
"out_refund_no": "REFUND20260612001",
"total_fee": 100,
"refund_fee": 50,
"refund_reason": "用户申请退款",
"notify_url": "https://yourdomain.com/refund_callback",
"nonce_str": "a1b2c3d4e5f6",
"sign": "MD5签名结果"
}
支付完成后,网关向商户 notify_url 发送 POST 请求:
{
"merchant_id": "M100001",
"out_trade_no": "ORDER20260612001",
"order_id": "GP2026061200001",
"trade_no": "第三方流水号",
"total_fee": 100,
"status": 1,
"pay_time": "2026-06-12 15:30:00",
"sign": "MD5签名结果"
}
successsuccess,否则网关会按策略重试通知。如果只需 SDK 级别的支付通道集成(无需完整四方平台),可使用开源的 go-pay/gopay 库:
// 安装
go get github.com/go-pay/gopay
// 微信支付 V3 初始化
import (
"github.com/go-pay/gopay"
"github.com/go-pay/gopay/wechat/v3"
"github.com/go-pay/xlog"
)
func main() {
// 查看版本
xlog.Info("GoPay Version: ", gopay.Version)
// 初始化微信 V3 客户端
client, err := wechat.NewClientV3("apiKey")
if err != nil {
panic(err)
}
client.SetPlatformCert()
// 初始化支付宝 V3 客户端
// aliClient, err := alipay.NewClientV3("appId", "privateKey", false)
}
go-pay/gopay 是开源支付 SDK(Apache-2.0),提供微信/支付宝等通道的 API 封装;GolangPay 是商业版四方支付系统,提供完整运营/商户/代理/风控/结算能力。基于 GolangPay 的统一接口设计,新增通道只需 4 步:
golangpay-pay 下创建新通道实现文件据官方文档,熟练开发者约 30 分钟可完成一个新通道的对接。
支付系统的安全是底线。GolangPay 从传输安全、代码安全、风控引擎和合规四个维度构建金融级安全体系。
| 层级 | 措施 | 详情 |
|---|---|---|
| 外部通信 | TLS1.3 + 双向证书校验 | 所有对外 HTTPS 通信强制 TLS1.3,双向 mTLS 校验防止中间人攻击 |
| 通道报文 | RSA/AES 混合加密 | 与第三方通道的报文进行二次 RSA/AES 混合加密,满足《条码支付规范》要求 |
| 内部存储 | SM4 国密算法 | 敏感字段(姓名、卡号)采用 SM4 国密算法落地加密 |
| 密钥管理 | KMS 托管 | 密钥托管在密钥管理服务(KMS),即使硬盘被盗也无法解密 |
Go 编译型语言天然具备安全优势,对比 PHP 解释型语言:
编译后以二进制运行,无法反编译还原源码,杜绝"源码泄露 → 植入后门 → 二次传播"的灰色产业链
源码明文部署,容易被盗取植入后门并二次传播,安全隐患极大
| 机制 | 用途 | 说明 |
|---|---|---|
sync.Map | 并发安全字典 | 替代 map + mutex,读多写少场景性能更优 |
atomic | 原子操作 | 计数器、标志位等无需加锁的原子更新 |
singleflight | 请求去重 | 防止缓存击穿,同一时刻只执行一次请求 |
context | 超时联动 | 级联取消,杜绝"僵尸协程"堆积 |
| 分布式锁 | 跨实例互斥 | Redis 分布式锁,防止多实例重复出款 |
GolangPay 内置 200+ 风控规则引擎,下单即触发评估,3ms 内返回决策:
| 维度 | 规则示例 |
|---|---|
| IP 风控 | 同一 IP 高频下单、代理 IP 识别、地区异常 |
| 设备指纹 | 设备唯一标识、虚拟机/模拟器检测 |
| 频次限制 | 单商户/单用户下单频次、金额累计阈值 |
| 黑名单 | IP/手机号/银行卡/商户黑名单,自动+手动维护 |
| 金额异常 | 异常大额、整数金额、频繁小额测试 |
| 行为分析 | 交易时间模式、支付方式偏好突变 |
原因:PHP 版系统存在 SQL 注入 + 并发竞争,导致重复出款,损失 3000 万
迁移 GolangPay 后:通过 singleflight 去重 + 分布式锁,至今零资损
| 合规要求 | GolangPay 应对 |
|---|---|
| 央行《条码支付规范》 | 通道报文二次 RSA/AES 混合加密,满足加密要求 |
| 《非银支付条例》"核心系统代码自主可控" | Go 编译型语言更易通过审计,PHP 脚本型方案面临牌照风险 |
| "二清"风险规避 | 实时分账支持,多级商户资金归集,避免资金沉淀 |
| 数据安全法 | 敏感字段 SM4 加密、密钥 KMS 托管、日志脱敏 |
GolangPay 充分发挥 Go 语言的并发优势,在同等硬件条件下性能碾压 PHP 同类系统。
以下数据来自 2025 年压力测试报告(8C16G 容器环境):
| 指标 | GolangPay (Go) | PHP 同类系统 | 对比 |
|---|---|---|---|
| TPS | 12,000 | 1,200(CPU 跑满) | 10x 提升 |
| P99 延迟 | 38ms | 2,000ms+ | 50x 降低 |
| 并发连接 | 50 万 goroutine | ~1,000 线程 | 500x 提升 |
| 内存占用 | Go 协程 ≈ Java 线程 1/20 | — | 20x 节省 |
| 容器镜像 | < 30 MB | — | 极轻量 |
| 启动时间 | 毫秒级 | 秒级 | 快一个量级 |
GolangPay 采用 Go 语言原生的 CSP 并发模型,以 goroutine 为轻量级执行单元,channel 为通信管道,三大核心 channel 解耦业务流:
┌──────────────┐
│ HTTP 请求 │
└──────┬───────┘
▼
┌──────────────┐ // epoll + 自定义时间轮
│ 网关层接收 │──→ 1ms 级超时熔断
└──────┬───────┘ 30s 内通道自动降级
▼
┌──────────────┐
│ goroutine │──→ 单机 50 万协程轻松拉起
└──────┬───────┘ 内存占用仅为 Java 线程 1/20
▼
┌──────────────────────────────────────┐
│ 三大 channel 解耦(CSP 模型) │
│ │
│ ┌─────────────┐ │
│ │ 订单队列 ch │──→ 下单/查询/退款 │
│ └─────────────┘ │
│ ┌─────────────┐ │
│ │ 通知队列 ch │──→ 回调/告警/推送 │
│ └─────────────┘ │
│ ┌─────────────┐ │
│ │ 风控事件 ch │──→ 规则评估/冻结 │
│ └─────────────┘ │
└──────────────────────────────────────┘
goroutine 间通过 channel 通信,不共享内存,天然避免锁竞争和数据竞争,代码简洁易维护
多线程共享内存需要加锁,高并发下锁风暴导致性能急剧下降,代码复杂且容易死锁
| 优化点 | 实现 | 效果 |
|---|---|---|
| epoll 多路复用 | Go runtime 内置 epoll,单线程处理万级连接 | 低 CPU 消耗支撑高并发 |
| 自定义时间轮 | 网关层实现 1ms 精度时间轮 | 超时熔断精度高,避免僵尸连接 |
| 通道自动降级 | 通道异常检测 + 自动切换 | 30 秒内完成降级,保障支付可用性 |
| 连接池复用 | HTTP 连接池、数据库连接池 | 减少连接建立开销 |
编译后单文件 < 30MB,容器镜像轻量,拉取和启动速度极快
弹性伸缩速度是 JVM 的 5 倍,流量洪峰"秒级扩容"
同等 TPS 下硬件成本降低约 60%
Go 的 M:P:G 调度模型可将 128 核打满,传统解释型语言单进程仅利用 8-16 核
| 场景 | 调优方向 | 具体措施 |
|---|---|---|
| 高并发下单 | 减少锁竞争 | 使用 sync.Map 替代 map+mutex、singleflight 防缓存击穿 |
| 回调通知 | 异步化 | 通知走 channel + goroutine 池,不阻塞主流程 |
| 数据库压力 | 读写分离 | MySQL 主从、Redis 缓存热点查询 |
| 通道延迟 | 超时控制 | context 设置合理超时,避免级联阻塞 |
| 内存优化 | 对象复用 | sync.Pool 复用 BodyMap 对象,减少 GC 压力 |
支持微信支付、支付宝、云闪付、快捷支付、代付等 60+ 通道,支持"一码付"动态路由。具体通道列表可在运营平台通道管理页面查看。
GolangPay 为商业版系统,需通过官方购买获取完整源码。购买后获得所有 Go 服务端源码和 Layui 前端源码,可二次开发。详见 官方购买页面。
两者是独立项目。go-pay/gopay 是开源的 Go 语言支付 SDK(Apache-2.0 协议),提供微信/支付宝等支付通道的 API 封装;GolangPay 是商业版聚合支付系统(四方平台),提供完整的运营、商户、代理、风控、结算等业务能力。
支持。代理商系统独立部署,支持多级代理体系和佣金结算,权限粒度到按钮级。
task 模块负责对账和结算等定时任务,多实例会重复执行导致数据错误(如重复打款)。建议通过分布式锁或指定单节点调度保证唯一执行。
最低配置:4C8G 云主机即可运行全部服务。生产环境建议支付网关 8C16G 并部署多实例,其他服务 4C8G 即可。task 服务 2C4G 足够。
可以。项目提供 docker-compose.yml 模板,包含 MySQL、Redis 和各微服务容器的编排。适合开发和小规模生产环境。
notify_url 是否可从公网访问(用手机 4G 网络测试)successnotify_url 使用 HTTP POST 接收,非 GETsign 字段本身在 golangpay-pay 模块下创建新通道实现文件,实现统一接口(下单、查询、退款、回调验签),然后在通道路由表中注册,在运营平台配置参数和费率即可。约 30 分钟完成对接。
JSAPI(微信公众号/小程序)支付必须传 openid 参数。获取方式:
wx.login() 获取 code,后端换取 openid被冻结的订单会自动推送 Telegram 群告警,运营人员可在运营平台查看冻结原因,审核后可手动解冻或拒绝。
在运营平台 → 风控管理中可配置规则阈值、黑白名单、频次限制等。支持按商户、通道、支付方式单独配置。
GolangPay 内置三重保障:
singleflight — 同一订单号并发请求自动合并系统自动对账会标记差错单(长款/短款),运营人员可在运营平台查看并手动处理:
T0 结算需配置二级审核流程:系统自动初审 → 运营人工复核 → 自动打款。大额打款需二次确认。
购买后会分配专属技术支持群。也可通过以下渠道: