Files
MTKJPAY/mt-pay
qiube 84f74861bb feat(database): 初始化客户订单表结构
- 创建 customer_order 表,包含订单基本信息、客户信息、收货地址、支付信息等字段
- 设置订单状态和支付状态的默认值及注释说明
- 添加索引以优化查询性能,包括订单号、商品ID、状态和创建时间
- 指定表的存储引擎为 InnoDB,字符集为 utf8mb4

feat(common): 新增SKU状态枚举类

- 定义 SkuStatus 枚举,包含 ACTIVE 和 INACTIVE 两种状态
- 提供 getCode 和 getDescription 方法获取状态码和描述
- 实现 fromCode 静态方法用于根据状态码获取对应的枚举实例

docs(startup): 编写后端服务启动说明文档

- 添加启动后端服务的详细步骤和注意事项
- 说明正确的启动类位置及如何验证启动是否成功
- 提供常见问题诊断方法和解决方案
- 包含使用IDE、Maven命令和打包后的启动方式

feat(util): 新增字符串工具类

- 实现 isEmpty、isNotEmpty、isBlank、isNotBlank 等判断方法
- 提供 trim 方法去除字符串两端空白
- 添加 defaultIfEmpty 方法在字符串为空时返回默认值

docs(architecture): 编写系统架构完整性说明文档

- 描述后端和前端的完整架构组成及检查清单
- 说明系统的统一规范、代码复用、可扩展性和可维护性特点
- 展示包结构总览和最佳实践建议
- 对系统完整性进行评分并给出总结评价

docs(troubleshooting): 编写后端启动问题排查指南

- 针对前端无法连接后端的问题提供详细的排查流程
- 介绍多种启动后端服务的方法及常见失败原因
- 提供快速诊断命令和日志检查建议
- 列出需要提供的错误信息以便进一步协助

feat(config): 新增Web配置类支持跨域访问

- 配置 CORS 跨域资源共享规则,允许所有来源访问 /api/** 路径
- 设置允许的请求方法、请求头和凭证信息
- 添加日志记录跨域配置的过程和结果
2025-12-22 18:13:33 +08:00
..

MT Pay - PingPong支付对接

项目简介

本项目实现了PingPong支付平台的内嵌SDK接入支持收银台模式支付。

功能特性

  • 支付订单创建checkout接口
  • MD5/SHA256签名生成和验证
  • 支付回调处理
  • 订单状态查询
  • 收银台页面集成
  • 支付记录管理
  • 预授权支持AUTH/CAPTURE/VOID

技术栈

  • Spring Boot 4.0.0
  • Spring Data JPA
  • MySQL
  • Lombok
  • RestClient

数据库表结构

payment_order支付订单表

  • 存储支付订单基本信息
  • 包含商户订单号、PingPong交易流水号、金额、状态等

payment_record支付记录表

  • 存储支付操作记录
  • 包含回调记录、查询记录等

配置说明

application.properties 中配置以下参数:

# PingPong支付配置
pingpong.client-id=your-client-id          # PingPong商户号
pingpong.acc-id=your-acc-id                # PingPong商户店铺编号
pingpong.secret=your-secret-key            # 签名密钥
pingpong.sign-type=MD5                      # 签名类型MD5或SHA256
pingpong.gateway=https://sandbox-acquirer-payment.pingpongx.com  # API网关地址
pingpong.mode=sandbox                       # 环境模式sandbox/test/build

API接口

1. 创建支付订单

接口地址: POST /api/payment/checkout

请求示例:

{
  "accId": "2018092714313010016291",
  "amount": "20.00",
  "currency": "USD",
  "merchantTransactionId": "MTN193495030728",
  "paymentType": "SALE",
  "shopperResultUrl": "http://your-domain.com/api/callback/result",
  "shopperCancelUrl": "http://your-domain.com/api/callback/result",
  "signType": "MD5",
  "riskInfo": {
    "customer": {
      "firstName": "James",
      "lastName": "LeBron",
      "email": "demo@pingpongx.com",
      "phone": "15988890852",
      "registerTime": "20191101122000",
      "registerIp": "222.126.52.23",
      "orderTime": "20191201122000",
      "orderIp": "222.126.52.23"
    },
    "goods": [{
      "name": "Macaron",
      "description": "Colorful macaron",
      "sku": "20191201331",
      "averageUnitPrice": "20",
      "number": "1",
      "virtualProduct": "N"
    }],
    "shipping": {
      "firstName": "James",
      "lastName": "LeBron",
      "phone": "13588185079",
      "street": "1986 Broad Street",
      "postcode": "35222",
      "city": "Birmingham",
      "state": "Alabama",
      "country": "US"
    },
    "billing": {
      "firstName": "James",
      "lastName": "LeBron",
      "phone": "13588185079",
      "street": "1986 Broad Street",
      "postcode": "35222",
      "city": "Birmingham",
      "state": "Alabama",
      "country": "US"
    }
  },
  "notificationUrl": "http://your-domain.com/api/callback/pingpong"
}

响应示例:

{
  "code": "0000",
  "message": "订单创建成功",
  "data": {
    "merchantTransactionId": "MTN193495030728",
    "token": "vr_YVR8u7rn7C1gG97DOg5W0OxzazxNYIE56ShWjA4lJrY4wchTnb47oNmp-9ubP",
    "paymentUrl": "https://sandbox-pay-checkout.pingpongx.com/index.html?token=...",
    "status": "PENDING"
  }
}

2. 查询订单状态

接口地址: GET /api/payment/order/{merchantTransactionId}

3. 获取收银台页面

接口地址: GET /api/payment/checkout/page?token={token}

4. 支付回调接口

接口地址: POST /api/callback/pingpong

5. 支付结果页面

接口地址: GET /api/callback/result?merchantTransactionId={id}&status={status}

使用流程

  1. 创建支付订单

    • 调用 /api/payment/checkout 接口创建订单
    • 获取返回的 token
  2. 跳转到收银台

    • 方式1直接使用返回的 paymentUrl 跳转
    • 方式2调用 /api/payment/checkout/page?token={token} 获取收银台页面
  3. 用户完成支付

    • 用户在收银台页面完成支付
    • 支付完成后跳转到 shopperResultUrl
  4. 接收回调通知

    • PingPong会异步调用 notificationUrl 通知支付结果
    • 系统自动更新订单状态

注意事项

  1. 订单号唯一性merchantTransactionId 必须全局唯一,不可重复
  2. 金额格式amount 必须精确到两位小数,如 "20.00"
  3. 环境模式:开发测试使用 sandbox,生产环境必须使用 build
  4. 签名验证:所有回调都会进行签名验证,确保数据安全
  5. 风控信息riskInfo 中的 shippingbillinggoods 不能为空,影响交易成功率
  6. REVIEW状态:如果订单状态为 REVIEW,需要及时进行内部审核

预授权功能

AUTH预授权

  • 在创建订单时设置 paymentTypeAUTH

CAPTURE预授权完成

  • 调用二次交易接口,设置 paymentTypeCAPTURE
  • 需要在预授权成功后的7天内完成

VOID预授权撤销

  • 调用二次交易接口,设置 paymentTypeVOID
  • 只能全额撤销

开发说明

项目结构

com.mtkj.mtpay/
├── config/          # 配置类
├── controller/       # 控制器
├── dto/             # 数据传输对象
├── entity/          # 实体类
├── exception/       # 异常处理
├── repository/      # 数据访问层
└── service/         # 业务服务层

核心服务

  • SignatureService:签名生成和验证服务
  • PingPongPayServicePingPong API调用服务
  • PaymentOrderService:支付订单业务服务
  • CallbackService:回调处理服务

数据库初始化

项目启动后JPA会自动创建表结构。也可以手动执行SQL

-- 根据实体类自动生成,或参考实体类定义手动创建

测试

  1. 配置沙箱环境参数
  2. 调用创建订单接口
  3. 使用沙箱测试卡号完成支付测试

许可证

MIT