骑士CMS(74cms)增加积分充值卡(积分包优惠)功能
积分充值卡说明
1、只能使用支付宝(不提供其它支付方式的代码,勿扰!)、 74CMS版本:3.4;
2、积分充值卡可后台设置卡的金额和内含的积分数(详见下文的效果图),如400RMB充值卡可充入800积分;
3、此功能用于优惠打折;
效果预览:
操作步骤:
零、添加数据表
注意表前缀!content字段暂未使用,可以删除。
-- 创建 point-packs 表 CREATE TABLE IF NOT EXISTS `#@_point_packs` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL COMMENT '名称', `price` float(6,1) NOT NULL COMMENT '价格', `points` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '积分', `small_img` varchar(80) DEFAULT NULL COMMENT '缩略图', `content` mediumtext COMMENT '介绍', `addtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加日期', PRIMARY KEY (`id`), KEY `addtime` (`addtime`) ) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='积分包' AUTO_INCREMENT=1; -- 修改 order 表 ALTER TABLE `#@_order` ADD `otype` tinyint(1) NOT NULL DEFAULT '0' COMMENT '订单类型,0默认,1积分包' AFTER `utype`;
一、网站后台
1、增加入口链接
打开 /admin/templates/default/sys/admin_left_tools.htm
<!-- 在 --> <li ><a href="admin_gifts.php" target="mainFrame" >礼品卡</a></li> <!-- 下边再加一行:--> <li ><a href="admin_point_packs.php" target="mainFrame" >{#$QISHI.points_byname#}充值卡</a></li>
2、新建后台积分卡管理程序文件“/admin/admin_point_packs.php”,内容为:
<?php /* * 积分充值卡 */ define('IN_QISHI',true); require_once(dirname(__FILE__).'/../data/config.php'); require_once(dirname(__FILE__).'/include/admin_common.inc.php'); require_once(ADMIN_ROOT_PATH.'include/admin_point_packs_fun.php'); // 这个积分充值卡文件需要创建,见下一步 require_once(ADMIN_ROOT_PATH.'include/upload.php'); $act = !empty($_GET['act']) ? trim($_GET['act']) : 'list'; $smarty->assign('act',$act); check_permissions($_SESSION['admin_purview'],"point_packs"); $smarty->assign('pageheader',$_CFG['points_byname'].'充值卡'); if($act == 'list') { get_token(); require_once(QISHI_ROOT_PATH.'include/page.class.php'); $oederbysql=" order BY id DESC"; $wheresql=""; $joinsql=""; $total_sql="SELECT COUNT(*) AS num FROM ".table('point_packs').$joinsql.$wheresql; $total=$db->get_total($total_sql); $page = new page(array('total'=>$total, 'perpage'=>$perpage)); $currenpage=$page->nowindex; $offset=($currenpage-1)*$perpage; $list = get_point_packs($offset, $perpage,$joinsql.$wheresql.$oederbysql); // $smarty->assign('category',get_gifts_category()); $smarty->assign('list',$list); $smarty->assign('total',$total); $smarty->assign('page',$page->show(3)); $smarty->assign('navlabel',"list"); $smarty->display('point_packs/admin_point_packs_list.htm'); } elseif($act == 'add') { get_token(); $smarty->assign('navlabel',"add"); $smarty->display('point_packs/admin_point_packs_add.htm'); } elseif($act == 'add_save') { check_token(); $setsqlarr['name']=!empty($_POST['name'])?trim($_POST['name']):adminmsg('请填写名称!',1); $setsqlarr['price']=floatval($_POST['price']); $setsqlarr['points'] =intval($_POST['points']); $setsqlarr['content'] =$_POST['content']; if($_FILES['small_img']['name']) { $upfiles_dir.=date("Y/m/d/"); make_dir($upfiles_dir); $small_img=_asUpFiles($upfiles_dir, "small_img", 1024*2, 'jpg/gif/png',true); $makefile=$upfiles_dir.$small_img; make_dir($thumb_dir.date("Y/m/d/")); makethumb($makefile,$thumb_dir.date("Y/m/d/"),$thumbwidth=360,$thumbheight=180); $setsqlarr['small_img']=date("Y/m/d/").$small_img; } $setsqlarr['addtime']=time(); $link[0]['text'] = "返回".$_CFG['points_byname']."充值卡列表"; $link[0]['href'] = '?act=list'; !inserttable(table('point_packs'),$setsqlarr)?adminmsg("添加失败!",0):adminmsg("添加成功!",2,$link); } elseif($act == 'edit') { get_token(); $id=intval($_GET['id']); $rs=get_one($id); $smarty->assign('rs',$rs); $smarty->assign('upfiles_dir',$upfiles_dir); $smarty->assign('thumb_dir',$thumb_dir); $smarty->assign('navlabel',"rs"); $smarty->display('point_packs/admin_point_packs_edit.htm'); } elseif($act == 'del_img') { check_token(); $id=intval($_GET['id']); $img=$_GET['img']; $sql="update ".table('point_packs')." set Small_img='' where id=".$id." LIMIT 1"; $db->query($sql); @unlink($upfiles_dir.$img); @unlink($thumb_dir.$img); adminmsg("删除缩略图成功!",2); } elseif($act == 'edit_save'){ check_token(); $id=intval($_POST['id']); $setsqlarr['name']=!empty($_POST['name'])?trim($_POST['name']):adminmsg('请填写名称!',1); $setsqlarr['price']=floatval($_POST['price']); $setsqlarr['points'] =intval($_POST['points']); $setsqlarr['content'] =$_POST['content']; if($_FILES['small_img']['name']) { $upfiles_dir.=date("Y/m/d/"); make_dir($upfiles_dir); $small_img=_asUpFiles($upfiles_dir, "small_img", 1024*2, 'jpg/gif/png',true); $makefile=$upfiles_dir.$small_img; make_dir($thumb_dir.date("Y/m/d/")); makethumb($makefile,$thumb_dir.date("Y/m/d/"),$thumbwidth=360,$thumbheight=180); $setsqlarr['small_img']=date("Y/m/d/").$small_img; } $link[0]['text'] = "查看修改结果"; $link[0]['href'] = '?act=edit&id='.$id; $link[1]['text'] = "返回列表"; $link[1]['href'] = '?act=list'; !updatetable(table('point_packs'),$setsqlarr," id='$id' ")?adminmsg("修改失败!",0):adminmsg("修改成功!",2,$link); } elseif($act == 'del') { check_token(); $id=$_REQUEST['id']; $num=del($id); if ($num>0) { adminmsg("删除成功!共删除".$num."行",2); } else { adminmsg("删除失败!",0); } } else{ exit('Here is another world.'); } ?>
3、新建后台积分卡管理程序模板:
建立目录:/admin/templates/default/point_packs/admin_point_packs_add.htm 建立文件:/admin/templates/default/point_packs/admin_point_packs_edit.htm /admin/templates/default/point_packs/admin_point_packs_list.htm /admin/templates/default/point_packs/admin_point_packs_nav.htm
内容见附件:点击下载
4、新建后台积分卡功能函数文件:admin/include/admin_point_packs_fun.php
<?php /* * 74cms 积分充值卡 */ if(!defined('IN_QISHI')) { die('Access Denied!'); } function get_point_packs($offset, $perpage, $sql= '') { global $db,$_CFG; $limit=" LIMIT ".$offset.','.$perpage; $result = $db->query("SELECT * FROM ".table('point_packs').$sql.$limit); while($row = $db->fetch_array($result)) { $row_arr[] = $row; } return $row_arr; } function del($id) { global $db; if(!is_array($id)) $id=array($id); $return=0; $sqlin=implode(",",$id); if (preg_match("/^(\d{1,10},)*(\d{1,10})$/",$sqlin)) { if (!$db->query("Delete from ".table('point_packs')." WHERE id IN (".$sqlin.") ")) return false; $return=$return+$db->affected_rows(); } return $return; } function get_one($id) { global $db; $sql = "select * from ".table('point_packs')." where id=".intval($id)." LIMIT 1"; return $db->getone($sql); } ?>
5、修改订单生成功能,增加订单类型以区分默认订单和积分充值卡订单
a、修改 /include/fun_company.php 中的 add_order() 为:
//增加订单 function add_order($uid,$oid,$amount,$payment_name,$description,$addtime,$points='',$setmeal='',$utype='1',$otype='0,0'){ // 注,后边增加了一个 $otype 参数(orderType),格式“1,积分充值卡ID” global $db; $otype = explode(',', $otype); // 新加行: 这个 otype 是新增加的参数,用于区别积分充值卡订单,格式“1,积分充值卡ID” 16:40 2014年2月25日 星期二 $setsqlarr['otype']=$otype[0]; // 新加行 $setsqlarr['notes']= empty($otype[1]) ? '' : $otype[1]; // 新加行:使用此字段为积分充值卡记录所选积分充值卡的ID $setsqlarr['uid']=intval($uid); // 从这行开始,下边的代码没有关于增加积分充值卡的改动 $setsqlarr['oid']=$oid; $setsqlarr['amount']=$amount; $setsqlarr['payment_name']=$payment_name; $setsqlarr['description']=$description; $setsqlarr['addtime']=$addtime; $setsqlarr['points']=$points; $setsqlarr['setmeal']=$setmeal; $setsqlarr['utype']=$utype; write_memberslog($uid,1,3001,$_SESSION['username'],"添加订单,编号{$oid},金额{$amount}元"); $userinfo=get_user_info($uid); //sendemail $mailconfig=get_cache('mailconfig'); if ($mailconfig['set_order']=="1" && $userinfo['email_audit']=="1" && $amount>0) { global $_CFG; $paymenttpye=get_payment_info($payment_name); dfopen("{$_CFG['site_domain']}{$_CFG['site_dir']}plus/asyn_mail.php?uid={$uid}&key=".asyn_userkey($uid)."&act=set_order&oid={$oid}&amount={$amount}&paymenttpye={$paymenttpye['byname']}"); } //sendemail //sms $sms=get_cache('sms_config'); if ($sms['open']=="1" && $sms['set_order']=="1" && $userinfo['mobile_audit']=="1" && $amount>0) { global $_CFG; $paymenttpye=get_payment_info($payment_name); dfopen("{$_CFG['site_domain']}{$_CFG['site_dir']}plus/asyn_sms.php?uid={$uid}&key=".asyn_userkey($uid)."&act=set_order&oid={$oid}&amount={$amount}&paymenttpye={$paymenttpye['byname']}"); } //sms return inserttable(table('order'),$setsqlarr,true); }
b、修改 /include/fun_company.php 中的 order_paid() ,积分充值卡的订单单独处理,代码:
//付款后开通 function order_paid($v_oid) { global $db,$timestamp,$_CFG; $order=$db->getone("select * from ".table('order')." WHERE oid ='{$v_oid}' AND is_paid= '1' LIMIT 1 "); // 积分充值卡代码开始: if ($order && 1== $order['otype']){ // upall:积分充值卡 2014-02-26 09:41:48 Wednesday // 设置为已付款 $user=get_user_info($order['uid']); $sql = "UPDATE ".table('order')." SET is_paid= '2',payment_time='{$timestamp}' WHERE oid='{$v_oid}' LIMIT 1 "; if (!$db->query($sql)) return false; if($order['amount']=='0.00'){$ismoney=1; }else{$ismoney=2;} // 该积分充值卡是否被删除 $pointPacksId = (int)$order['notes']; $r = $db->getone("SELECT `points`,`name` FROM ".table('point_packs')." WHERE id = '$pointPacksId' LIMIT 1"); empty($r)?showmsg('您选购的'.$_CFG['points_byname'].'充值卡不存在'):''; // 充值 report_deal($order['uid'],1,$r['points']); $user_points=get_user_points($order['uid']); $notes=date('Y-m-d H:i',time()). " 通过[". get_payment_info($order['payment_name'],true). "]成功购买". $_CFG['points_byname']. "充值卡[". $r['name']. "](+{$r['points']}".$_CFG['points_byname']."),(剩余:{$user_points}),订单:{$v_oid}"; write_memberslog($order['uid'],1,9001,$user['username'],$notes); //会员套餐变更记录。会员购买成功。2表示:会员自己购买 write_setmeallog($order['uid'],$user['username'],$notes,2,$order['amount'],$ismoney,1); } elseif ($order && 1 != $order['otype']) { // 积分充值卡代码结束(上边的IF添加了一个条件) $user=get_user_info($order['uid']); $sql = "UPDATE ".table('order')." SET is_paid= '2',payment_time='{$timestamp}' WHERE oid='{$v_oid}' LIMIT 1 "; if (!$db->query($sql)) return false; if($order['amount']=='0.00'){ $ismoney=1; }else{ $ismoney=2; } if ($order['points']>0) { report_deal($order['uid'],1,$order['points']); $user_points=get_user_points($order['uid']); $notes=date('Y-m-d H:i',time())."通过:".get_payment_info($order['payment_name'],true)." 成功充值 ".$order['amount']."元,(+{$order['points']}),(剩余:{$user_points}),订单:{$v_oid}"; write_memberslog($order['uid'],1,9001,$user['username'],$notes); //会员套餐变更记录。会员购买成功。2表示:会员自己购买 write_setmeallog($order['uid'],$user['username'],$notes,2,$order['amount'],$ismoney,1); } elseif ($order['setmeal']>0) { set_members_setmeal($order['uid'],$order['setmeal']); $setmeal=get_setmeal_one($order['setmeal']); $notes=date('Y-m-d H:i',time())."通过:".get_payment_info($order['payment_name'],true)." 成功充值 ".$order['amount']."元并开通{$setmeal['setmeal_name']}"; write_memberslog($order['uid'],1,9002,$user['username'],$notes); //会员套餐变更记录。会员购买成功。2表示:会员自己购买 write_setmeallog($order['uid'],$user['username'],$notes,2,$order['amount'],$ismoney,2,1); } } //sendemail $mailconfig=get_cache('mailconfig'); if ($mailconfig['set_payment']=="1" && $user['email_audit']=="1" && $order['amount']>0) { dfopen("{$_CFG['site_domain']}{$_CFG['site_dir']}plus/asyn_mail.php?uid={$order['uid']}&key=".asyn_userkey($order['uid'])."&act=set_payment"); } //sendemail //sms $sms=get_cache('sms_config'); if ($sms['open']=="1" && $sms['set_payment']=="1" && $user['mobile_audit']=="1" && $order['amount']>0) { dfopen("{$_CFG['site_domain']}{$_CFG['site_dir']}plus/asyn_sms.php?uid={$order['uid']}&key=".asyn_userkey($order['uid'])."&act=set_payment"); } //sms return true; }
二、会员后台
1、编辑程序文件:/user/company/company_service.php
a、编辑“elseif ($act==’order_add’)”块,在display前增加:
// 接入积分充值卡功能 2014-02-25 14:24:00 Tuesday $s = 'SELECT * FROM '.table('point_packs').' ORDER BY id ASC'; $q = $db->query($s); while($r = $db->fetch_array($q)) {$point_packs[] = $r; } $smarty->assign('point_packs',$point_packs); $smarty->assign('thumb_dir',"../../data/".$_CFG['updir_thumb']."/");
b、增加一个“else if”,代码:
elseif ($act=='point_pack_order') // upall:积分充值卡 2014-02-25 15:11:09 Tuesday { if (empty($company_profile['companyname'])) { $link[0]['text'] = "填写企业资料"; $link[0]['href'] = 'company_info.php?act=company_profile'; showmsg("请先填写您的企业资料!",1,$link); } $myorder=get_user_order($_SESSION['uid'],1); $order_num=count($myorder); if (count($order_num)>=5) { $link[0]['text'] = "立即查看"; $link[0]['href'] = '?act=order_list&is_paid=1'; showmsg("未处理的订单不能超过 5 条,请先处理后再次申请!",1,$link,true,8); } $id = (int)$_GET['id']; $s = "SELECT `name`,`price` FROM ".table('point_packs')." WHERE id=".intval($id)." LIMIT 1"; $r = $db->getone($s); empty($r) ? showmsg('您要购买的'.$_CFG['points_byname'].'充值卡不存在') : ''; $amount = $r['price']; $name = $r['name']; $payment_name='alipay';// empty($_POST['payment_name'])?showmsg("请选择付款方式!",1):$_POST['payment_name']; $paymenttpye=get_payment_info($payment_name); if (empty($paymenttpye)) showmsg("支付方式错误!",0); $fee=number_format(($amount/100)*$paymenttpye['fee'],1,'.','');//手续费 $order['oid']= date('Ymd',time())."-".$paymenttpye['partnerid']."-".date('His',time());//订单号 $order['v_url']=$_CFG['site_domain'].$_CFG['site_dir']."include/payment/respond_".$paymenttpye['typename'].".php"; $order['v_amount']=$amount+$fee; $points=$amount*$_CFG['payment_rate']; $order_id=add_order($_SESSION['uid'],$order['oid'],$amount,$payment_name,'购买'.$_CFG['points_byname']."充值卡($name):".$points, $timestamp,$points,'',1,$pointPacks="1,$id"); if ($order_id){ $link[0]['text'] = "现在去付款"; $link[0]['href'] = "?act=payment&order_id=".$order_id; $link[1]['text'] = "查看订单"; $link[1]['href'] = '?act=order_list'; showmsg('充值订单添加成功!',2,$link,true,5); } else { showmsg("添加订单失败!",0); } }
2、编辑模板文件:/templates/你的模板文件夹/member_company/company_order_add.htm,在合适的位置增加代码:
<style> /* 这里的样式根据自己需要可单独编写,非必需 */ .c { clear: both;} .r { float: right;} #pointPacks { margin: 10px 0; border: solid 1px #D8D8D8; background-color: #F8F8F8;} #pointPacks dt { height: 35px; line-height: 35px; text-indent: 10px; font-weight: bold; border-bottom: solid 1px #D8D8D8; font-size: 14px;} #pointPacks dd { padding: 10px;}#pointPacks dd li { float: left; width: 50%; margin: 10px 0; position: relative;} #pointPacks dd li .thumb { position:relative; margin:0 auto;} #pointPacks dd li .thumb,#pointPacks dd li .thumb img { width: 360px; height: 180px;} #pointPacks dd li .thumb img { position: absolute; left: 0; top: 0; background-color: #C95800; border-radius: 5px;} #pointPacks dd li .buy { display:none; position:absolute; left:0; top:0; width:360px; height:180px; text-align:center; background-color:#884400; background-color: rgba(136,68,0,.7); color:#FFF; text-align:center; line-height: 180px; font-size: 48px; border-radius:5px; left:18px; } #pointPacks dd li.hover .buy, #pointPacks dd li:hover .buy {display:block; } #pointPacks dd li .title {display:none; font-weight: bold; color: #C00; } #pointPacks dd li .points {color: #FFF; position: absolute; left: 80px; top: 110px; font-size: 18px; } #pointPacks dd li .price {position:absolute; right: 75px; top: 135px; font-size: 28px;line-height: 30px;} </style> <dl id="pointPacks"> <dt>购买{#$QISHI.points_byname#}充值卡</dt> <dd> <ul> {#foreach from=$point_packs item=list#} <li> <div class="thumb" href=""><img src="{#$thumb_dir#}{#$list.small_img#}" alt="{#$list.name#}" /></div> <div class="info"> <span class="title"> {#$list.name#} </span> <span class="price"> ¥{#$list.price|number_format:2#} </span> <span class="points"> {#$list.points#}{#$QISHI.points_byname#} </span> <a class="buy" href="?act=point_pack_order&id={#$list.id#}" class="r">立即购买</a> </div> </li> {#/foreach#} </ul> <div class="c"></div> </dd> </dl>
<完>