需求描述:双11进行聚合收款享金额立减活动。

重点要求:对付款人限制参与活动次数,对单个收款码限制每日参与次数,对每个运营区域限制每日立减金额,避免恶意刷单;金额在限制范围内,增大随机性;付款响应速度不能明显变慢影响体验。

/*** 获取随机立减金额* 规则:*      1、同一付款人活动期间立减上限 5 次,单笔最高立减幅度为付款金额的5%,且金额最多 5 元*      2、单个收款码每天获取立减金额次数(含取消付款的)最多 200 次*      2、不同运营区域,每天累计获取的立减金额(含取消付款的),根据实际需要分别设定* @collect_money 付款金额* @payer_id 付款人身份标志,由前端获取终端浏览器指纹并缓存记录* @code 收款码* @operator_code 运营区域代码* @rNumer 生成编号*/public function get_red_num($collect_money = 0, $payer_id = 'payer', $code = '',     $operator_code = '', $rNumer){#--非活动时段直接返回0:#$hour = date('H');#if ($hour < 6 || $hour > 22) return 0;#--非活动日直接返回0:#if (in_array(date('w'), ['1', '2', '3', '4', '5'])) return 0;#--小额付款0.5以下,不予立减if ($collect_money < 0.5) return 0;#--默认值:$money = 0;#--采用redis存取记录:if (class_exists('redis')) {#--实例化并连接redis$redis = new \redis();$redis->connect('127.0.0.1', 6699);#--身份标志作为键$log = $redis->get($payer_id);#--记录付款次数if (false === $log) {#--新增$log = [$payer_id => 1,];} else {#--追加$log = json_decode($log, true);#--判断付款人是否当天首次付款,并记录次数if (isset($log[$payer_id])) {$log[$payer_id] += 1;} else {$log[$payer_id] = 1;}}#--更新redis$redis->set($payer_id, json_encode($log), 2592000);#--根据活动规则,生成立减金额if ($log[$payer_id] < 6) {#--收款金额的5%,作为参考值$collect_money1 = round($collect_money * 0.05, 2);#--收款金额 >= 1元的,通过 get_small_num() 方法获取不大于收款金额的值$money = ($collect_money >= 1) ? $this->get_small_num($collect_money1) : 0;#--上限 5 元if ($money > 5) $money = 5;} else {#--超过参与次数,仅享受最低1分立减金$money = 0.01;}#--小额付款(0.5-0.99)立减金调小,避免刷单if ($collect_money < 1) $money = 0.02;#--今日、昨日时间,用来拼接key$time = date('m') . date('d');$time1 = time();$time1 = date('m', $time1 - 86400) . date('d', $time1 - 86400);#--累减活动金额$all_money = $redis->get($operator_code.$time);if (false === $all_money) {#--不同运营区域每天活动金额,可根据活动进展调整$all_money = 0;if ($operator_code == 'OPE0001') $all_money = 1000;if ($operator_code == 'OPE0002') $all_money = 2000;#--每天将昨日活动剩余金额保存记录$yestoday_money = $redis->get($operator_code . $time1);if (false !== $yestoday_money) {#write_log($operator_code . '运营区域昨日使用活动金额:' . (round(($all_money - $yestoday_money), 2)) . '元', __DIR__);}}#--累计单店获取立减金额收款笔数$store_num = $redis->get($code.$time);if (false === $store_num) {#--单店笔数初始值$store_num = 1;#--每天将昨日单店笔数记录$yestoday_num = $redis->get($code . $time1);if (false !== $yestoday_num) {#write_log('码牌'.$code . '昨日获取立减金额次数:' . $yestoday_num . '次', __DIR__);}}else{$store_num++;}#--当天活动资金用完或刷取立减金额超200次,不再立减if ($all_money < $money || $store_num > 200){return 0;}else{$redis->set($operator_code.$time, $all_money - $money, 86400);$redis->set($code.$time, $store_num, 2592000);}#--保存立减记录Db::name('red_log')->insert(['payer_id' => $payer_id,'rNumer' => $rNumer,'pay_time' => date('Y-m-d H:i:s'),'operator_code' => $operator_code,'code' => $code,'pay_amount' => $collect_money,'all_amount' => $all_money - $money,'reduction_amount' => $money]);}#--返回结果:return $money;}/*** 生成不大于参考值的随机数* @numer 参考数*/public function get_small_num($numer){#--生成随机金额的个位数,$arr 可以增加数组中某个数值的比例,以增加该数值命中机率$arr = [0, 0, 2, 0, 0, 1, 0, 4, 3, 1, 1, 2, 0, 5, 1, 2, 0, 0, 5, 0, 2, 0, 2, 0, 3, 4, 0, 2];$money = $arr[array_rand($arr)];if ($money > $numer && $numer < 6) $money = rand(0, floor($numer));#--生成随机金额的小数点后1位$arr = [0, 1, 2, 3, 5, 6, 7, 8, 9];if ($numer > 0.1) $money += $arr[array_rand($arr)] * 0.1;#--生成随机金额的小数点后第2位,立减金额、付款金额尾数不含0、4、6$arr = [1, 2, 3, 5, 7, 8, 9];$money += $arr[array_rand($arr)] * 0.01;#--返回结果:if ($money > $numer) {return $this->get_small_num($numer);} else {return $money;}}

TP5下使用redis进行随机立减的简明实例相关推荐

  1. 【薅羊毛】银联云闪付 话费充值满50 随机立减1-10元

    活动时间  2020年4月8日-2020年5月7日, 每天10:00-23:00. 活动内容  用户在云闪付APP内手机充值板块为本人手机号码进行话费充值,选择云闪付支付可享满50元随机立减,最高优惠 ...

  2. 微信支付携手云闪付APP上线支付立减新优惠

    3月24日消息,随着数字经济.数字金融的高速发展,支付领域的互联互通不断深化.近日,微信支付联合银联云闪付APP更新上线了"助力抗疫·微信小程序多重礼"活动,新增"满10 ...

  3. 浅析微信支付:开通社交立减金活动、创建立减金及领取使用的相关文档和源码

    本文是[浅析微信支付]系列文章的第十七篇,主要讲解在在微信平台中,如何创建优惠券,开通社交立减金,并为用户配置发送立减金. 上篇文章已经为大家讲解了如何在微信公众平台创建优惠券并为用户发券,这片文章是 ...

  4. 浅析微信支付:开通社交立减金活动、创建立减金及领取使用的相关文档和源码...

    本文是[浅析微信支付]系列文章的第十七篇,主要讲解在在微信平台中,如何创建优惠券,开通社交立减金,并为用户配置发送立减金. 上篇文章已经为大家讲解了如何在微信公众平台创建优惠券并为用户发券,这片文章是 ...

  5. 微信免充值代金券与免充值立减券与单品券活动验收流程

    功能介绍 为支持商户免充值营销经费开展运营活动,提升运营效率,微信支付特开发免充值营销产品功能.商户开通该产品功能后,可免费使用微信支付提供的免充值代金券.立减.折扣等营销工具.商户配置使用免充值代金 ...

  6. php5.5n的redis,TP5源码 Redis操作便捷类库

    # TP5源码 Redis操作便捷类库 > app\base\controller\Redis ~~~ /** * Created by PhpStorm. * Power by Mikkle ...

  7. 浅析微信支付:商户平台代金券或立减优惠开通、指定用户代金券发放、查询等

    本文是[浅析微信支付]系列文章的第十四篇,主要讲解在如何开通商户平台的代金券或立减优惠功能,商家向指定用户发送代金券,查询发送记录,代金券信息等. 浅析微信支付系列已经更新十四篇了哟-,没有看过的朋友 ...

  8. UA MATH575B 数值分析下 统计物理的随机模拟方法5

    UA MATH575B 数值分析下 统计物理的随机模拟方法5 Ising Model Gibbs Sampling Glauber Dynamics 这一讲介绍Ising Model,它是MCMC与G ...

  9. redis lua 抽奖 PHP,通过redis+lua实现加减库存

    一. 场景 下单后库存校验或者秒杀场景下,有很多利用"锁"的方案来解决问题.但是加锁其实是一件性价比很低的事,所以我们采用用redis+lua的方式来实现这个功能. 二. 思路 阶 ...

最新文章

  1. 夏夏的php开发笔记开写啦
  2. 转让app后AppStore应用名称下面所有者显示问题
  3. Bit,Byte,Word,Dword,Qword
  4. 图解VS2010打包全过程
  5. SpringBoot2.1.9 多MongoDB配置
  6. 看完这篇还不会kafka,我跪榴莲!
  7. 帝国cms模板仿礼品销售网站
  8. python数值积分_python实现数值积分的Simpson方法实例分析
  9. inode linux_Linux中的inode是什么?
  10. 入门必学 | R语言程序包的安装与使用指南
  11. 商业计划书-智能导盲仗
  12. DeFi中的关键——智能合约 | 白话区块链入门220
  13. 什么是水晶报表_看不懂财务报表?别方!二十年老会计教你做财务报表分析
  14. flash制作文字笔顺_汉字标准读音与笔顺Flash版
  15. 轻松学会分布式事务算法
  16. manchi翻译中文 mi_求这一段意大利文歌词中文翻译(MiManchi)?
  17. 小程聊微服务-自己动手扩展分布式调用链
  18. 超声波风速风向仪介绍
  19. python pexpect_python pexpect总结
  20. 用VB.NET(Visual Basic 2010)封装EXCEL VBA为DLL_COM组件(一)

热门文章

  1. 揭秘自恢复保险丝与电压之间“不能说的秘密”
  2. Online Judge
  3. Java基础之throws和throw关键字
  4. #47-D: incompatible redefinition of macro STM32F40_41xxx
  5. 263欲停止e话通服务
  6. 一文读懂元宇宙生态Plato Farm,治理通证PLATO的价值
  7. libgif.js javascript拆分gif动图并导出保存为json格式文件(记录纯代码)
  8. Bing地图切片原理
  9. USB转串口线无法正常工作解决
  10. insert 用法总结