= $prize ?>
獎項設置:
一等獎:iPhone 15 Pro 獎品數量:10
二等獎:AirPods Pro 獎品數量:50
三等獎:京東卡 100元 獎品數量:200
活動說明:
中獎用戶請準確填寫收貨地址,我們將以貨到付款方式郵寄!
祝您好運!再來一次
刮刮卡、大轉盤等抽獎活動核心邏輯一致:概率控制 + 獎池管理 + 防刷機制。本文提供完整 PHP 後端獎品邏輯、前端刮刮互動、微信公眾號介面整合代碼。
decr("prize_stock:{$prize_id}") 返回值 < 0 則改為「謝謝參與」
?>
刮刮卡抽獎
= $prize ?>
獎項設置:
一等獎:iPhone 15 Pro 獎品數量:10
二等獎:AirPods Pro 獎品數量:50
三等獎:京東卡 100元 獎品數量:200
活動說明:
中獎用戶請準確填寫收貨地址,我們將以貨到付款方式郵寄!
祝您好運!再來一次
responseMsg();
class WechatCallbackapiTest {
public function responseMsg() {
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)) {
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$time = time();
$textTpl = "
%s
0
";
$newsTpl = "
%s
1
-
0
";
$keyword = trim($postObj->Content);
if ($keyword == '抽獎' || $keyword == '刮刮卡') {
$url = "https://yourdomain.com/prize.php";
$resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time,
'刮刮樂翻天', '我就要去刮刮樂,抽獎去!',
'https://yourdomain.com/ggk/ggk.jpg', $url);
echo $resultStr;
} elseif (!empty($keyword)) {
$msgType = "text";
$contentStr = "請輸入:'抽獎' 參與活動";
echo sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
} else {
$msgType = "text";
$contentStr = "歡迎關注!回復『抽獎』參與刮刮卡活動";
echo sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
}
}
}
private function checkSignature() {
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$tmpArr = array(TOKEN, $timestamp, $nonce);
sort($tmpArr);
return sha1(implode($tmpArr)) == $signature;
}
}
// Lua 腳本:原子檢查庫存並扣減
$luaScript = "
local stock = redis.call('GET', KEYS[1])
if stock and tonumber(stock) > 0 then
return redis.call('DECR', KEYS[1])
else
return -1
end
";
function drawPrize($prizePools) {
// $prizePools = [['id'=>1, 'name'=>'iPhone', 'weight'=>10, 'stock_key'=>'prize:1'], ...]
$totalWeight = array_sum(array_column($prizePools, 'weight'));
$rand = mt_rand(1, $totalWeight);
$accumulated = 0;
foreach ($prizePools as $pool) {
$accumulated += $pool['weight'];
if ($rand <= $accumulated) {
// 原子扣減
$remaining = $redis->eval($luaScript, 1, $pool['stock_key']);
if ($remaining >= 0) {
return $pool;
}
// 庫存不足,標記並重新抽獎(遞迴或迴圈)
break;
}
}
return ['id' => 0, 'name' => '謝謝參與'];
}
// 中獎記錄表
CREATE TABLE `lottery_record` (
`id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`user_id` BIGINT UNSIGNED NOT NULL,
`prize_id` INT UNSIGNED NOT NULL,
`prize_name` VARCHAR(100) NOT NULL,
`status` TINYINT DEFAULT 0 COMMENT '0待發獎 1已發獎 2用戶拒收',
`express_no` VARCHAR(50) DEFAULT '',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX `idx_user` (`user_id`),
INDEX `idx_status` (`status`)
);
刮刮卡核心在於 前端 wScratchPad 視覺互動 + 後端加權隨機算法 + 獎池原子扣減 + 微信圖文消息入口。生產環境必須補強:獎池庫存管理、防刷風控、中獎記錄審計、發獎流程閉環。