支付接口中一次性令牌使用,防止游戏盗刷金币
<?php
session_start();
// 用户提交订单后,获取订单相关信息
$pid = $_POST['product_id']; // 假设这是用户购买的产品ID
$trade_no = date("YmdHis") . mt_rand(10000, 99999); // 生成交易编号
$out_trade_no = $trade_no; // 假设外部交易编号与交易编号相同
$type = 'wxpay'; // 假设这是微信支付
$name = '游戏商品名称'; // 假设这是用户购买的商品名称
$money = $_POST['amount']; // 假设这是用户支付的金额
// 生成一次性令牌(可以是随机字符串或者哈希值)
$one_time_token = bin2hex(random_bytes(16));
// 将一次性令牌保存到session中
$_SESSION['one_time_token'] = $one_time_token;
// 构造支付请求URL,包含一次性令牌参数
$payment_url = "https://my-payment-gateway.com/pay?pid={$pid}&trade_no={$trade_no}&out_trade_no={$out_trade_no}&type={$type}&name={$name}&money={$money}&one_time_token={$one_time_token}";
?>
我们首先获取了用户提交的订单信息,然后生成了一次性令牌并将其保存在session中。接着,我们构造了一个支付请求URL,其中包含了所有必要的参数以及一次性令牌。
然后,在你的支付网关回调处理页面(例如notify.php)中,你可以验证接收到的一次性令牌是否有效:
<?php
session_start();
// 获取请求中的一次性令牌
$received_one_time_token = isset($_GET['one_time_token']) ? $_GET['one_time_token'] : '';
// 检查一次性令牌是否存在于session中且未过期
if (isset($_SESSION['one_time_token']) && $_SESSION['one_time_token'] === $received_one_time_token) {
// 验证通过,执行正常的回调处理逻辑
// 清除session中的一次性令牌,防止重复使用
unset($_SESSION['one_time_token']);
} else {
// 验证失败,可能是恶意请求或令牌已过期
die('Invalid one-time token');
}
?>
当用户提交订单后,我们会生成一个包含一次性令牌的支付请求URL,并将用户重定向到这个URL进行支付。在支付完成后,支付网关会发送回调请求到你的notify.php,此时你需要验证接收到的一次性令牌是否有效。如果有效,则执行正常的回调处理逻辑;否则,拒绝处理请求。这样可以防止恶意用户通过修改URL来伪造回调请求并盗取游戏金币。