GolangPay 聚合支付系统

购买系统加TG:[@gsosos] https://t.me/gsosos

基于 Golang + Beego + Vue 微服务架构的新一代聚合支付系统,开箱即用、高并发、高安全

Go 语言 微服务架构 60+ 支付通道 Beego / Gin Vue3 前端

文档目录

01
系统概述
产品定位、核心优势与适用场景
02
架构设计
微服务架构图与技术栈选型
03
模块说明
8 个模块职责与端口分配
04
支付流程
下单到到账的完整链路
05
功能清单
支付/结算/运营/风控全功能
06
部署指南
编译、配置、Docker、Nginx
07
接口接入
签名规则、下单、回调、SDK
08
安全与风控
加密传输、风控引擎、合规
09
性能与并发
TPS 对比、goroutine 模型
10
常见问题
高频 Q&A 与排障指南

系统概述

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 产品,统一管理

技术支持

购买后针对每个客户单独创建群,至少指定一名技术支持人员提供售后服务:

  • 系统部署指导
  • 二次开发指导
  • 反馈 Bug 的修复
  • 需求的收集
注意:技术支持不包含软件开发环境搭建、Go 语言基础辅导,仅限 GolangPay 系统业务技术交流。
← 返回文档中心

架构设计

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 / GinMVC 架构、中间件丰富
前端框架Vue3 + Layui前后端分离,运营/商户/代理三端独立
服务通信Dubbo跨服务 RPC 调用
数据库MySQL 5.7+ / 8.0业务数据持久化
缓存Redis 6.0+热点数据、分布式锁、Session
消息队列RabbitMQ / Kafka异步通知、订单解耦
定时任务自研 golangpay-task对账、结算、风控评分单节点跑批
监控Prometheus + 链路追踪全链路指标与告警
API 文档Swagger自动生成,接口即文档
容器化Docker镜像 < 30MB,秒级启动

设计原则

微服务解耦

各模块独立编译部署,通过 Dubbo 接口通信,故障隔离、独立扩缩容

统一接口抽象

支付通道统一接口封装,新增通道零侵入,30 分钟对接完成

CSP 并发模型

goroutine + channel 解耦订单/通知/风控三大流,避免锁风暴

云原生友好

容器镜像小、启动快,Kubernetes 天然亲和,弹性伸缩

← 返回文档中心

模块说明

GolangPay 由 8 个模块组成,其中 4 个为公共库(编译时引用),4 个为运行态服务(独立部署),另有 1 个定时任务服务。

模块总览

模块端口类型说明
golangpay公共库公共方法、实体 Bean、API 接口定义,供所有服务复用
golangpay-core公共库核心包:Dubbo 服务接口定义、实体 Bean、公共工具类
golangpay-service公共库所有核心业务方法封装,供其他模块引用后调用
golangpay-z-api-base公共库支付接口的基础包,通道对接公共逻辑
golangpay-pay12309运行服务支付网关核心:商户支付接口 + 所有支付通道对接实现
golangpay-manage12306运行服务运营平台(接口 + 管理界面,前后端分离)
golangpay-merchant12306运行服务商户系统(接口 + 管理界面,前后端分离)
golangpay-agent12304运行服务代理商系统(接口 + 管理界面,前后端分离)
golangpay-task12310定时任务对账服务、结算服务(必须单节点部署

模块详解

golangpay(公共库)

项目根模块,定义所有公共实体(如 Order、Merchant、Channel)、工具方法(签名、加密、序列化)和 Dubbo 服务接口。其他模块通过 import 引用,一条 import 即可被所有服务复用。

golangpay-core(核心包)

包含 Dubbo 服务接口定义、实体 Bean 以及公共引用和常用工具类。是模块间通信的契约层,接口变更需同步所有消费方。

golangpay-service(业务层)

封装所有核心业务方法:订单处理、通道路由、商户管理、风控评估、结算逻辑等。供 manage、merchant、agent、pay 等模块引用调用,避免业务逻辑散落各处。

golangpay-z-api-base(支付基础包)

支付接口的基础包,封装与第三方通道交互的公共逻辑:HTTP 客户端、签名/验签、证书加载、超时重试等。新增通道时继承此包实现统一接口即可。

golangpay-pay(支付网关)

系统核心模块,提供商户访问的支付接口,并对接所有支付通道实现。封装微信、支付宝、云闪付、快捷、代付等 60+ 通道,支持"一码付"动态路由。

golangpay-manage(运营平台)

前后端分离架构,提供全局数据看板、商户/代理管理、通道配置、费率设置、系统参数等功能。Vue3 前端 + Go 后端 API。

golangpay-merchant(商户系统)

商户自助管理平台,支持订单查询、交易统计、API 密钥管理、通道配置、结算查询等功能。

golangpay-agent(代理商系统)

多级代理体系管理,支持独立登录、下级商户管理、佣金结算、通道分配等功能。

golangpay-task(定时任务)

单节点部署的定时任务服务,负责自动对账(勾兑通道对账单)、结算跑批(T0/T1/D1 打款)、风控评分等。包含 Telegram 机器人告警通知。

部署提示:golangpay、golangpay-core、golangpay-service、golangpay-z-api-base 为公共库模块,不独立运行。运行态服务共 5 个:pay、manage、merchant、agent、task。task 必须单节点部署,避免对账/结算重复执行。
← 返回文档中心

支付流程

一次完整的支付请求从用户下单到最终到账,经历以下核心步骤:

用户下单 商户系统 支付网关 风控校验 通道路由 第三方通道 异步回调 订单完成

详细流程说明

  1. 用户下单 — 用户在商户侧选择商品并发起支付请求。
  2. 商户系统请求网关 — 商户后端调用 GolangPay 支付网关 API(/api/pay/unified_order),传入订单号、金额、支付方式等参数。
  3. 支付网关接收golangpay-pay 统一接收请求,进行参数校验和签名验证。
  4. 风控校验 — 下单即触发 200+ 条风控规则(IP、设备指纹、频次、黑名单),3ms 内返回决策;异常订单自动冻结并推送告警。
  5. 通道路由 — 根据支付方式、通道权重、费率、可用性动态选择最优支付通道。
  6. 第三方通道扣款 — 请求微信/支付宝/云闪付等第三方支付通道完成扣款。
  7. 异步回调通知 — 第三方通道通过 notify_url 回调支付结果,网关验签后更新订单状态。
  8. 订单完成 — 商户通过回调或主动查询确认支付结果,完成业务闭环。

时序图

用户        商户后端       支付网关       风控引擎      第三方通道
 │            │              │             │             │
 │──下单──→   │              │             │             │
 │            │──统一下单──→ │             │             │
 │            │              │──风控评估──→│             │
 │            │              │←──通过/拒绝─│             │
 │            │              │──通道请求──────────────→│
 │            │              │             │             │
 │←──支付页面──────────────────────────────────────────│
 │──完成支付──────────────────────────────────────→│
 │            │              │←──异步回调──────────────│
 │            │              │──验签+更新订单           │
 │            │←──回调通知── │             │             │
 │            │──返回success─│             │             │
 │←──业务结果─│              │             │             │

回调通知机制

支付完成后,网关向商户 notify_url 发送 POST 请求,包含签名信息。商户需:

  1. 验证签名有效性(防篡改)
  2. 校验订单金额一致性
  3. 处理业务逻辑(发货、充值等)
  4. 返回字符串 success 确认接收
重要:若商户未返回 success,网关会按策略重试通知(通常 3-5 次,间隔递增)。重复回调需做幂等处理,避免业务重复执行。

退款流程

商户发起退款 网关校验 通道退款 回调通知 退款完成

支持部分退款和全额退款,退款资金原路返回至用户支付账户。

代付流程

商户发起代付 审核(可选) 打款队列 通道代付 结果通知

支持手动/自动打款、批量代付、失败自动重试。结算周期 T0/T1/D1 自由配置。

← 返回文档中心

功能清单

5.1 支付能力

扫码支付

微信/支付宝主扫、被扫,支持一码付动态路由

H5 支付

手机浏览器唤起微信/支付宝完成支付

JSAPI 支付

微信公众号/小程序内支付

APP 支付

原生 APP 调起微信/支付宝 SDK

快捷支付

银行卡快捷签约与支付

代付/代扣

批量代付、自动打款、失败重试

云闪付

银联云闪付二维码支付

一码付

统一收款码,自动识别微信/支付宝,动态路由到对应通道

5.2 资金与结算

功能说明
实时分账支持红包、支付宝分账、收付通等多级商户资金归集,避免"二清"风险
结算审核二级审核 + 打款队列,支持手动/自动打款、批量代付
T+0/T+1/D+1结算周期自由配置,按商户/通道灵活设定
自动对账golangpay-task 定时拉取通道对账单,自动勾兑订单,差错单自动标记
手动对账支持上传对账文件,手动勾兑差错订单
资金流水全链路资金流水追踪,可追溯每笔资金动向

5.3 运营管理

功能说明
运营平台全局数据看板、商户/代理管理、通道配置、费率设置
代理商系统多级代理体系、独立登录、佣金结算、下级商户管理
商户系统订单查询、交易统计、API 密钥管理、通道配置、结算查询
权限管理前后端分离,权限粒度到按钮级,支持角色自定义
通道管理60+ 通道配置、权重设置、启停控制、费率管理
数据看板实时交易量、成功率、通道排名、异常告警一览

5.4 风控系统

功能说明
实时风控下单即跑 200+ 规则(IP/设备指纹/频次/黑名单),3ms 内返回决策
自动冻结异常订单自动冻结,并推送 Telegram 群告警
singleflight 去重防止并发重复出款,杜绝资损
黑名单管理IP/手机号/银行卡/商户多维度黑名单,支持手动和自动添加
风控评分综合多维度评分模型,风控决策可配置阈值
告警通知Telegram 机器人实时告警,异常事件秒级触达

5.5 系统运维

功能说明
灰度发布支持按商户/通道灰度切换,平滑上线
Prometheus 监控全链路指标采集,Grafana 看板可视化
链路追踪分布式链路追踪,快速定位性能瓶颈
Swagger 文档API 文档自动生成,接口变更即时同步
日志管理结构化日志,支持 ELK 集中采集与检索
通道降级通道异常 30 秒内自动降级,保障支付可用性
← 返回文档中心

部署指南

6.1 环境要求

组件版本要求说明
Go1.18+推荐 1.21+,支持最新特性
MySQL5.7+ / 8.0推荐 8.0,业务数据持久化
Redis6.0+缓存、分布式锁、Session
RabbitMQ / Kafka按需选择异步通知、订单解耦
Nginx1.18+负载均衡与反向代理
Git2.0+源码拉取

6.2 编译与打包

# 克隆项目
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-*

6.3 配置文件

各模块通过 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

6.4 数据库初始化

# 创建数据库
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;"

6.5 启动服务

# 按顺序启动各服务(后台运行)
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"
推荐:生产环境使用 systemd 或 supervisor 管理进程,确保崩溃自动重启。

6.6 Nginx 反向代理配置

# /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/;
    }
}

6.7 Docker 部署(推荐)

# 各模块 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:

6.8 部署检查清单

检查项验证方法
MySQL 连接查看 pay 服务日志是否成功连接数据库
Redis 连接redis-cli ping 返回 PONG
支付网关可达curl http://localhost:12309/health
Nginx 代理浏览器访问 http://pay.yourdomain.com
定时任务单节点确认 task 服务仅运行一个实例
证书文件确认微信/支付宝证书路径可读
重要:golangpay-task(定时任务)必须单节点部署,避免对账/结算重复执行。其他服务可多实例水平扩展。
← 返回文档中心

接口接入教程

7.1 接入前准备

  1. 在运营平台创建商户,获取 merchant_idapi_key
  2. 配置支付通道(微信/支付宝等)的商户参数
  3. 设置异步回调地址 notify_url(必须公网可访问)
  4. 根据业务需求选择支付方式(扫码/H5/JSAPI/APP 等)
  5. 准备签名工具(MD5 或 RSA2)

7.2 签名规则

所有 API 请求均需签名验证,确保数据传输安全:

  1. 将所有非空请求参数按参数名 ASCII 升序排列
  2. 拼接为 key1=value1&key2=value2&key=api_key 格式
  3. 对拼接字符串做 MD5 或 RSA2 签名
  4. 将签名结果放入 sign 参数

MD5 签名示例(Go)

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[:])
}

7.3 统一下单接口

# 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_idstring商户号
out_trade_nostring商户订单号(商户侧唯一)
total_feeint金额(单位:分)
bodystring商品描述
pay_typestring支付方式:wechat_scan/alipay_scan/wechat_h5/alipay_h5/wechat_jsapi/wechat_app/alipay_app/quick_pay
notify_urlstring异步回调地址(公网可访问)
spbill_create_ipstring客户端 IP
openidstring用户 openid(JSAPI 支付必填)
nonce_strstring随机字符串
signstring签名

响应示例

{
    "code": 0,
    "msg": "success",
    "data": {
        "order_id": "GP2026061200001",
        "pay_url": "https://pay.example.com/qrcode/xxx",
        "qr_code": "weixin://wxpay/bizpayurl?pr=xxx"
    }
}

7.4 订单查询接口

# 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"
    }
}

7.5 退款接口

# 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签名结果"
}

7.6 异步回调通知

支付完成后,网关向商户 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签名结果"
}

回调处理要点

  1. 验签:对除 sign 外所有参数按签名规则重新计算,比对 sign 是否一致
  2. 金额校验:核对回调金额与原订单金额是否一致
  3. 幂等处理:同一订单可能收到多次回调,需做幂等判断
  4. 响应确认:处理完成后返回字符串 success
重要:商户收到回调后必须验签,处理完成后返回字符串 success,否则网关会按策略重试通知。

7.7 Go SDK 快速接入(go-pay/gopay)

如果只需 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 是商业版四方支付系统,提供完整运营/商户/代理/风控/结算能力。

7.8 新增支付通道

基于 GolangPay 的统一接口设计,新增通道只需 4 步:

  1. golangpay-pay 下创建新通道实现文件
  2. 实现统一支付接口(下单、查询、退款、回调验签)
  3. 在通道路由表中注册新通道
  4. 在运营平台配置通道参数和费率

据官方文档,熟练开发者约 30 分钟可完成一个新通道的对接。

← 返回文档中心

安全与风控

支付系统的安全是底线。GolangPay 从传输安全、代码安全、风控引擎和合规四个维度构建金融级安全体系。

8.1 传输安全

层级措施详情
外部通信TLS1.3 + 双向证书校验所有对外 HTTPS 通信强制 TLS1.3,双向 mTLS 校验防止中间人攻击
通道报文RSA/AES 混合加密与第三方通道的报文进行二次 RSA/AES 混合加密,满足《条码支付规范》要求
内部存储SM4 国密算法敏感字段(姓名、卡号)采用 SM4 国密算法落地加密
密钥管理KMS 托管密钥托管在密钥管理服务(KMS),即使硬盘被盗也无法解密

8.2 代码安全

Go 编译型语言天然具备安全优势,对比 PHP 解释型语言:

✅ Go(编译型)

编译后以二进制运行,无法反编译还原源码,杜绝"源码泄露 → 植入后门 → 二次传播"的灰色产业链

❌ PHP(解释型)

源码明文部署,容易被盗取植入后门并二次传播,安全隐患极大

并发安全原语

机制用途说明
sync.Map并发安全字典替代 map + mutex,读多写少场景性能更优
atomic原子操作计数器、标志位等无需加锁的原子更新
singleflight请求去重防止缓存击穿,同一时刻只执行一次请求
context超时联动级联取消,杜绝"僵尸协程"堆积
分布式锁跨实例互斥Redis 分布式锁,防止多实例重复出款

8.3 实时风控引擎

GolangPay 内置 200+ 风控规则引擎,下单即触发评估,3ms 内返回决策

风控维度

维度规则示例
IP 风控同一 IP 高频下单、代理 IP 识别、地区异常
设备指纹设备唯一标识、虚拟机/模拟器检测
频次限制单商户/单用户下单频次、金额累计阈值
黑名单IP/手机号/银行卡/商户黑名单,自动+手动维护
金额异常异常大额、整数金额、频繁小额测试
行为分析交易时间模式、支付方式偏好突变

风控响应

  • 通过 — 正常放行,进入通道路由
  • 告警 — 放行但标记,推送 Telegram 群通知
  • 冻结 — 订单自动冻结,需人工审核
  • 拒绝 — 直接拒绝交易,返回失败

8.4 安全案例复盘

2024 年某头部四方平台被"薅羊毛"

原因:PHP 版系统存在 SQL 注入 + 并发竞争,导致重复出款,损失 3000 万

迁移 GolangPay 后:通过 singleflight 去重 + 分布式锁,至今零资损

8.5 合规保障

合规要求GolangPay 应对
央行《条码支付规范》通道报文二次 RSA/AES 混合加密,满足加密要求
《非银支付条例》"核心系统代码自主可控"Go 编译型语言更易通过审计,PHP 脚本型方案面临牌照风险
"二清"风险规避实时分账支持,多级商户资金归集,避免资金沉淀
数据安全法敏感字段 SM4 加密、密钥 KMS 托管、日志脱敏
← 返回文档中心

性能与并发

GolangPay 充分发挥 Go 语言的并发优势,在同等硬件条件下性能碾压 PHP 同类系统。

9.1 性能基准数据

以下数据来自 2025 年压力测试报告(8C16G 容器环境):

指标GolangPay (Go)PHP 同类系统对比
TPS12,0001,200(CPU 跑满)10x 提升
P99 延迟38ms2,000ms+50x 降低
并发连接50 万 goroutine~1,000 线程500x 提升
内存占用Go 协程 ≈ Java 线程 1/2020x 节省
容器镜像< 30 MB极轻量
启动时间毫秒级秒级快一个量级

9.2 并发模型:goroutine + channel(CSP)

GolangPay 采用 Go 语言原生的 CSP 并发模型,以 goroutine 为轻量级执行单元,channel 为通信管道,三大核心 channel 解耦业务流:

┌──────────────┐
│  HTTP 请求    │
└──────┬───────┘
       ▼
┌──────────────┐    // epoll + 自定义时间轮
│  网关层接收    │──→ 1ms 级超时熔断
└──────┬───────┘    30s 内通道自动降级
       ▼
┌──────────────┐
│  goroutine   │──→ 单机 50 万协程轻松拉起
└──────┬───────┘    内存占用仅为 Java 线程 1/20
       ▼
┌──────────────────────────────────────┐
│  三大 channel 解耦(CSP 模型)         │
│                                       │
│  ┌─────────────┐                     │
│  │ 订单队列 ch  │──→ 下单/查询/退款    │
│  └─────────────┘                     │
│  ┌─────────────┐                     │
│  │ 通知队列 ch  │──→ 回调/告警/推送    │
│  └─────────────┘                     │
│  ┌─────────────┐                     │
│  │ 风控事件 ch  │──→ 规则评估/冻结     │
│  └─────────────┘                     │
└──────────────────────────────────────┘

CSP vs 共享内存

✅ CSP 模型(GolangPay)

goroutine 间通过 channel 通信,不共享内存,天然避免锁竞争和数据竞争,代码简洁易维护

❌ 共享内存(传统方案)

多线程共享内存需要加锁,高并发下锁风暴导致性能急剧下降,代码复杂且容易死锁

9.3 网络层优化

优化点实现效果
epoll 多路复用Go runtime 内置 epoll,单线程处理万级连接低 CPU 消耗支撑高并发
自定义时间轮网关层实现 1ms 精度时间轮超时熔断精度高,避免僵尸连接
通道自动降级通道异常检测 + 自动切换30 秒内完成降级,保障支付可用性
连接池复用HTTP 连接池、数据库连接池减少连接建立开销

9.4 云原生优势

镜像极小

编译后单文件 < 30MB,容器镜像轻量,拉取和启动速度极快

弹性伸缩

弹性伸缩速度是 JVM 的 5 倍,流量洪峰"秒级扩容"

成本降低

同等 TPS 下硬件成本降低约 60%

多核打满

Go 的 M:P:G 调度模型可将 128 核打满,传统解释型语言单进程仅利用 8-16 核

9.5 性能调优建议

场景调优方向具体措施
高并发下单减少锁竞争使用 sync.Map 替代 map+mutex、singleflight 防缓存击穿
回调通知异步化通知走 channel + goroutine 池,不阻塞主流程
数据库压力读写分离MySQL 主从、Redis 缓存热点查询
通道延迟超时控制context 设置合理超时,避免级联阻塞
内存优化对象复用sync.Pool 复用 BodyMap 对象,减少 GC 压力
← 返回文档中心

常见问题

💬 系统相关

Q: GolangPay 支持哪些支付通道?

支持微信支付、支付宝、云闪付、快捷支付、代付等 60+ 通道,支持"一码付"动态路由。具体通道列表可在运营平台通道管理页面查看。

Q: 如何获取源码?

GolangPay 为商业版系统,需通过官方购买获取完整源码。购买后获得所有 Go 服务端源码和 Layui 前端源码,可二次开发。详见 官方购买页面

Q: 开源版 go-pay/gopay 和 GolangPay 是什么关系?

两者是独立项目。go-pay/gopay 是开源的 Go 语言支付 SDK(Apache-2.0 协议),提供微信/支付宝等支付通道的 API 封装;GolangPay 是商业版聚合支付系统(四方平台),提供完整的运营、商户、代理、风控、结算等业务能力。

Q: 系统支持多级代理吗?

支持。代理商系统独立部署,支持多级代理体系和佣金结算,权限粒度到按钮级。

💬 部署相关

Q: golangpay-task 为什么必须单节点部署?

task 模块负责对账和结算等定时任务,多实例会重复执行导致数据错误(如重复打款)。建议通过分布式锁或指定单节点调度保证唯一执行。

Q: 部署最低硬件要求是多少?

最低配置:4C8G 云主机即可运行全部服务。生产环境建议支付网关 8C16G 并部署多实例,其他服务 4C8G 即可。task 服务 2C4G 足够。

Q: 能否只用 Docker Compose 一键部署?

可以。项目提供 docker-compose.yml 模板,包含 MySQL、Redis 和各微服务容器的编排。适合开发和小规模生产环境。

💬 接入相关

Q: 回调通知没收到怎么办?

  1. 检查 notify_url 是否可从公网访问(用手机 4G 网络测试)
  2. 确认商户端处理完成后返回了字符串 success
  3. 检查防火墙/安全组是否放行网关 IP
  4. 确认 notify_url 使用 HTTP POST 接收,非 GET
  5. 可在商户系统手动触发重发通知

Q: 签名验证失败怎么排查?

  1. 确认参与签名的参数不包含 sign 字段本身
  2. 检查空值参数是否被排除(空值不参与签名)
  3. 确认参数按 ASCII 升序排列
  4. 检查 API Key 是否正确(正式/沙箱环境区分)
  5. 确认编码为 UTF-8

Q: 如何新增一个支付通道?

golangpay-pay 模块下创建新通道实现文件,实现统一接口(下单、查询、退款、回调验签),然后在通道路由表中注册,在运营平台配置参数和费率即可。约 30 分钟完成对接。

Q: JSAPI 支付需要什么额外参数?

JSAPI(微信公众号/小程序)支付必须传 openid 参数。获取方式:

  1. 通过微信 OAuth2 授权接口获取用户 openid
  2. 小程序端通过 wx.login() 获取 code,后端换取 openid

💬 风控相关

Q: 订单被风控冻结了怎么办?

被冻结的订单会自动推送 Telegram 群告警,运营人员可在运营平台查看冻结原因,审核后可手动解冻或拒绝。

Q: 如何调整风控规则?

在运营平台 → 风控管理中可配置规则阈值、黑白名单、频次限制等。支持按商户、通道、支付方式单独配置。

Q: 如何防止重复出款?

GolangPay 内置三重保障:

  1. singleflight — 同一订单号并发请求自动合并
  2. 分布式锁 — 跨实例互斥,防止多节点重复处理
  3. 数据库唯一约束 — 订单号唯一索引,最终兜底

💬 结算相关

Q: 对账出现差错单怎么处理?

系统自动对账会标记差错单(长款/短款),运营人员可在运营平台查看并手动处理:

  • 长款(平台多收)— 可发起退款
  • 短款(平台少收)— 需核实后补收或核销

Q: T0 结算如何保证资金安全?

T0 结算需配置二级审核流程:系统自动初审 → 运营人工复核 → 自动打款。大额打款需二次确认。

💬 其他

Q: 技术支持包含哪些内容?

  • 系统部署指导
  • 二次开发指导
  • 反馈 Bug 的修复
  • 需求的收集
注意:技术支持不提供软件开发环境搭建、Go 语言基础辅导,仅限 GolangPay 系统业务技术交流。

Q: 遇到问题如何联系官方?

购买后会分配专属技术支持群。也可通过以下渠道:

← 返回文档中心