微信摇一摇抽奖活动 微信摇奖
微信开发摇一摇抽奖活动,基于场景二维码进行多店面的区分,场景二维码放置于不同店面中,用户扫码关注或直接进入公众号,弹出活动连接(非此场景二维码进入的用户无法查看连接),点击连接进入页面,摇奖。(奖项基于数量和中奖率进行设置)代码放置于百度bae平台。
基本流程:
1.微信扫码关注,获取活动链接
基础代码如下:
//接收事件消息
private function receiveEvent($object)
{
// global $weixin;
$openid = $object->FromUserName;
$content = "";
switch ($object->Event)
{
//区分来源,推送不同信息
case "subscribe":
$content = "关注花容月貌化妆品,拥有花容月貌容颜!";
// $content .= (!empty($object->EventKey))?("\n来自二维码场景 ".str_replace("qrscene_","",$object->EventKey)):"";
if(!empty($object->EventKey)){
//写入店面id
$shopid = str_replace("qrscene_","",$object->EventKey);
//数据库积分
include "./credits.php";
//是否重复关注
if(is_join($openid)){
$content .= "您已经参与过抽奖活动啦!每人只有一次摇奖机会哦!";
}else{
//问题:老用户同时需要写入数据库 获取二维码时写入
add_user($openid,$shopid);
$content .= "摇一摇,赢大奖! <a href='http://icecry.duapp.com/h5/index.php?openid=".$openid."&shopid=".$shopid."'>点击参与</a>";
}
}
break;
case "unsubscribe":
$content = "您已取消关注!";
break;
case "SCAN":
$shopid = str_replace("qrscene_","",$object->EventKey);
//此处直接返回是否参与活动,如果未参与返回链接
include "./credits.php";
//是否重复关注 是否关注后未抽奖
$content = is_join($openid);
if(is_join($openid)){
$content = "您已经参与过抽奖活动啦!每人只有一次摇奖机会哦!";
}else{
//考虑已经关注的用户,写入数据库
add_user($openid, $shopid);
$content = "摇一摇,赢大奖! <a href='http://icecry.duapp.com/h5/index.php?openid=".$openid."&shopid=".$shopid."'>点击参与</a>";
}
//要实现统计分析,则需要扫描事件写入数据库,这里可以记录 EventKey及用户OpenID,扫描时间
break;
case "CLICK":
switch ($object->EventKey)
{
case "kefu":
$content = "您好,花容月貌6号客服为您服务!";
break;
}
break;
default:
// $content = "receive a new event: ".$object->Event;
$content = "未知的消息类型,请直接联系我们的在线客服。";
break;
}
if(is_array($content)){
if (isset($content[0])){
$result = $this->transmitNews($object, $content);
}else if (isset($content['MusicUrl'])){
$result = $this->transmitMusic($object, $content);
}
}else{
$result = $this->transmitText($object, $content);
}
return $result;
}
credits.php文件用于检测用户是否已参与,并提供新用户写入数据库的方法
微信摇一摇代码:
if(window.DeviceMotionEvent){
window.addEventListener('devicemotion',deviceMotionHandler, false);
}else{
alert('呃~ 您的手机太古老了,换个手机试试吧!');
}
var SHAKE_THRESHOLD = 500;
var last_update = 0;
var x, y, z, last_x, last_y, last_z;
function deviceMotionHandler(eventData){
var acceleration =eventData.accelerationIncludingGravity;
//alert(newDate().getTime());
var curTime = new Date().getTime();
// alert(curTime - last_update);
if ((curTime - last_update)> 300) {
var diffTime = curTime -last_update;
last_update = curTime;
x = acceleration.x;
y = acceleration.y;
z = acceleration.z;
var speed = Math.abs(x +y + z - last_x - last_y - last_z) / diffTime * 10000;
if (speed > SHAKE_THRESHOLD) {
// 摇一摇执行播放那个函数
playVid();
var openid = document.getElementById("openid").value;
var shopid = document.getElementById("shopid").value;
window.location.href = 'prize.php?openid='+openid+'&shopid='+shopid;
}
last_x = x;
last_y = y;
last_z = z;
}
}
function playVid()
{
$(document).on('touchstart', function() {
myVideo.load()
})
var myVideo = document.getElementById("video1");
myVideo.play();
}
摇动手机后,根据设置的判断条件进行跳转,并在新的页面中配置奖项和摇奖函数(注意页面的传递务必添加openid等参数)
中奖函数:
function get_rand($proArr) {
$result = '';
//概率数组的总概率精度
$proSum = array_sum($proArr);
//概率数组循环
foreach ($proArr as $key => $proCur) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $proCur){
$result = $key;
break;
}else{
$proSum -= $proCur;
}
}
unset ($proArr);
return $result;
}
依据数据库返回结果,对已抽完的奖项进行unset,防止再次中奖
奖项配置:
$prize_arr = array(
'0' => array('id'=>1,'prize'=>'一等奖:手机','pic'=>'images/prize1.jpg','v'=>0),
'1' => array('id'=>2,'prize'=>'二等奖:','pic'=>'images/prize2.jpg','v'=>5),
'2' => array('id'=>3,'prize'=>'三等奖:','pic'=>'images/prize3.jpg','v'=>10),
'3' => array('id'=>4,'prize'=>'四等奖:','pic'=>'images/prize4.jpg','v'=>20),
'4' => array('id'=>5,'prize'=>'未抽中','pic'=>'images/noprize.jpg','v'=>65),
);
v为中奖概率,总和为100,即1的中奖概率为5%
各流程注意判断用户是否已参与抽奖,如果参与直接跳转到result.php展示中奖结果即可。
代码下载:微信摇一摇抽奖活动代码.rar
非扫码用户无法通过分享进入活动,也可以考虑使用js来隐藏右上角分享按钮。