初级8 分钟阅读
Public Key 模式 - 前端直接跳转
前端直接通过 URL 参数跳转到支付页面,无需后端服务器。适合纯前端项目快速集成。
什么是 Public Key 模式?
Public Key 模式允许你的前端直接构造一个带签名的 URL,然后跳转到 PonponPay 的支付页面完成支付。无需搭建后端服务器,非常适合静态网站、前端应用等场景。
获取 Public Key
- 登录 PonponPay 商户后台
- 进入「前端集成」页面
- 启用前端集成功能
- 复制显示的 Public Key (pub_xxx 格式)
- 配置域名白名单
域名白名单配置
为了安全,Public Key 只能在配置的域名下使用。请在商户后台添加你的网站域名(支持通配符)。
⚠️ 开发环境可以添加 localhost,生产环境请使用实际域名。支持子域名通配符如 *.example.com
URL 参数说明
必填参数
| 参数 | 类型 | 说明 |
|---|---|---|
public_key | string | 商户 Public Key |
amount | number | 支付金额(小数点后2位) |
currency | string | 币种 (USDT/USDC/BUSD) |
network | string | 网络 (tron/ethereum/bsc/polygon/solana) |
timestamp | string | 时间戳(毫秒) |
signature | string | 参数签名 |
可选参数
| 参数 | 类型 | 说明 |
|---|---|---|
order_id | string | 商户订单号(最长32字符) |
redirect_url | string | 支付完成跳转地址 |
notify_url | string | Webhook 回调地址 |
参数签名
为了防止参数篡改,所有参数都需要使用 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 协议