PonponPay
初级8 分钟阅读

Public Key 模式 - 前端直接跳转

前端直接通过 URL 参数跳转到支付页面,无需后端服务器。适合纯前端项目快速集成。

什么是 Public Key 模式?

Public Key 模式允许你的前端直接构造一个带签名的 URL,然后跳转到 PonponPay 的支付页面完成支付。无需搭建后端服务器,非常适合静态网站、前端应用等场景。

获取 Public Key

  1. 登录 PonponPay 商户后台
  2. 进入「前端集成」页面
  3. 启用前端集成功能
  4. 复制显示的 Public Key (pub_xxx 格式)
  5. 配置域名白名单

域名白名单配置

为了安全,Public Key 只能在配置的域名下使用。请在商户后台添加你的网站域名(支持通配符)。

⚠️ 开发环境可以添加 localhost,生产环境请使用实际域名。支持子域名通配符如 *.example.com

URL 参数说明

必填参数

参数类型说明
public_keystring商户 Public Key
amountnumber支付金额(小数点后2位)
currencystring币种 (USDT/USDC/BUSD)
networkstring网络 (tron/ethereum/bsc/polygon/solana)
timestampstring时间戳(毫秒)
signaturestring参数签名

可选参数

参数类型说明
order_idstring商户订单号(最长32字符)
redirect_urlstring支付完成跳转地址
notify_urlstringWebhook 回调地址

参数签名

为了防止参数篡改,所有参数都需要使用 HMAC-SHA256 算法进行签名。

签名算法

import CryptoJS from 'crypto-js';

function generateSignature(params, publicKey) {
  // 1. 过滤并排序参数
  const sortedKeys = Object.keys(params)
    .filter(k => k !== 'signature')
    .sort();
  
  // 2. 拼接参数字符串
  const paramString = sortedKeys
    .map(key => `${key}=${params[key]}`)
    .join('&');
  
  // 3. 添加密钥
  const signString = `${paramString}&key=${publicKey}`;
  
  // 4. HMAC-SHA256 签名
  const signature = CryptoJS.HmacSHA256(signString, publicKey)
    .toString();
  
  return signature;
}

// 示例
const params = {
  public_key: 'pub_xxx',
  amount: '100.00',
  currency: 'USDT',
  network: 'tron',
  timestamp: '1704067200000'
};

const signature = generateSignature(params, 'pub_xxx');
console.log(signature);

使用示例

以下是各种前端框架的使用示例:

import CryptoJS from 'crypto-js';

// 配置
const PUBLIC_KEY = 'pub_your_public_key_here';
const PAYMENT_URL = 'https://checkout.ponponpay.com';

// 生成签名
function generateSignature(params, publicKey) {
  // 1. 按参数名排序
  const sortedKeys = Object.keys(params).filter(k => k !== 'signature').sort();
  
  // 2. 拼接参数字符串
  const paramString = sortedKeys
    .map(key => `${key}=${params[key]}`)
    .join('&');
  
  // 3. 添加密钥
  const signString = `${paramString}&key=${publicKey}`;
  
  // 4. HMAC-SHA256 签名
  const signature = CryptoJS.HmacSHA256(signString, publicKey).toString();
  
  return signature;
}

// 创建支付链接
function createPaymentUrl(amount, currency, network) {
  const params = {
    public_key: PUBLIC_KEY,
    amount: amount.toFixed(2),
    currency: currency,
    network: network,
    timestamp: Date.now().toString()
  };
  
  // 生成签名
  params.signature = generateSignature(params, PUBLIC_KEY);
  
  // 构造 URL
  const url = `${PAYMENT_URL}/checkout?${new URLSearchParams(params)}`;
  
  return url;
}

// 使用示例
const paymentUrl = createPaymentUrl(100, 'USDT', 'tron');
window.location.href = paymentUrl;

安全注意事项

  • 签名验证:所有请求都会验证签名,防止参数篡改
  • 时间戳验证:请求时间戳必须在5分钟内,防止重放攻击
  • 域名验证:严格验证请求来源域名,必须在白名单中
  • Public Key 可以公开:Public Key 可以安全地暴露在前端代码中
  • HTTPS 传输:生产环境请使用 HTTPS 协议