PHP随机生成几组不同的数据实现发红包功能
使用PHP发红包,当我们输入红包数量和总金额后,PHP会根据这两个值进行随机分配每个金额,保证每个人都能领取到一个红包,每个红包金额不等,就是要求红包金额要有差异,所有红包金额总额应该等于总金额。
查看演示 下载源码
我们先来分析下规律。
设定总金额为10元,有N个人随机领取:
N=1 第一个
则红包金额=X元;
N=2 第二个
为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数。
第二个红包=10-第一个红包金额;
N=3 第三个
红包1=0.01至9.99之间的某个随机数
红包2=0.01至(10-红包1-0.01)的某个随机数
红包3=10-红包1-红包2
……
于是我们得到一个规律,在分配当前红包金额时,先预留剩余红白所需最少金额,然后在0.01至总金额-预留金额间取随机数,得到的随机数就是当前红包分配的金额。
实际应用中,程序先将红包金额分配好,即发红包时,红包个数以及每个红包的金额都分配好了,那么用户来抢红包时,我们随机给用户返回一个红包即可。
红包分配代码:
$total=20;//红包总金额
$num=10;// 分成10个红包,支持10人随机领取
$min=0.01;//每个人最少能收到0.01元
for ($i=1;$i<$num;$i++)
{
$safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限
$money=mt_rand($min*100,$safe_total*100)/100;
$total=$total-$money;
echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 ';
}
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';
运行以上代码,会输出以下结果:
第1个红包,金额2.08元,余额17.92元
第2个红包,金额1.81元,余额16.11元
第3个红包,金额0.15元,余额15.96元
第4个红包,金额1.61元,余额14.35元
第5个红包,金额1.11元,余额13.24元
第6个红包,金额1.51元,余额11.73元
第7个红包,金额1.21元,余额10.52元
第8个红包,金额2.58元,余额7.94元
第9个红包,金额5.4元,余额2.54元
第10个红包,金额2.54元,余额0元
请求Url | https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack |
---|---|
是否需要证书 | 是(证书及使用说明详见商户证书) |
请求方式 | POST |
字段名 | 字段 | 必填 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
随机字符串 | nonce_str | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 随机字符串,不长于32位 |
签名 | sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 详见签名生成算法 |
商户订单号 | mch_billno | 是 | 10000098201411111234567890 | String(28) | 商户订单号(每个订单号必须唯一) 组成: mch_id+yyyymmdd+10位一天内不能重复的数字。
接口根据商户订单号支持重入, 如出现超时可再调用。
|
商户号 | mch_id | 是 | 10000098 | String(32) | 微信支付分配的商户号 |
子商户号 | sub_mch_id | 否 | 10000090 | String(32) | 微信支付分配的子商户号,受理模式下必填 |
公众账号appid | wxappid | 是 | wx8888888888888888 | String(32) | 商户appid |
商户名称 | send_name | 是 | 天虹百货 | String(32) | 红包发送者名称 |
用户openid | re_openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String(32) | 接收红包的种子用户(首个用户) 用户在wxappid下的openid
|
总金额 | total_amount | 是 | 1000 | int | 红包发放总金额,即一组红包金额总和,包括分享者的红包和裂变的红包,单位分 |
红包发放总人数 | total_num | 是 | 3 | int | 红包发放总人数,即总共有多少人可以领到该组红包(包括分享者) |
红包金额设置 | amt_type | 是 | ALL_RAND | String(32) | 红包金额设置方式 ALL_RAND—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额
ALL_SPECIFIED—全部自定义
SEED_SPECIFIED—种子红包自定义,其他随机
|
各红包金额 | amt_list | 否 | 200|100|100 | String(256) | 各红包具体金额,自定义金额时必须设置,单位分 |
红包祝福语 | wishing | 是 | 感谢您参加猜灯谜活动,祝您元宵节快乐! | String(128) | 红包祝福语 |
活动名称 | act_name | 是 | 猜灯谜抢红包活动 | String(32) | 活动名称 |
备注 | remark | 是 | 猜越多得越多,快来抢! | String(256) | 备注信息 |
商户logo的url | logo_imgurl | 否 | https://wx.gtimg.com/mch/img/ico-logo.png | String(128) | 商户logo的url(暂未开放) |
背景水印图片 | watermark_imgurl | 否 | https://wx.gtimg.com/mch/img/ico-logo.png | String(128) | 背景水印图片url |
详情页banner图 | banner_imgurl | 否 | https://wx.gtimg.com/mch/img/ico-logo.png | String(128) | 红包详情页面的banner图片url |
<xml> <sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>
<mch_id><![CDATA[888]]></mch_id>
<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>
<send_name><![CDATA[send_name]]></send_name>
<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
<total_amount><![CDATA[200]]></total_amount>
<amt_type><![CDATA[ALL_RAND]]></amt_type>
<amt_list><![CDATA[200|100|100]]></amt_list>
<total_num><![CDATA[3]]></total_num>
<wishing><![CDATA[恭喜发财]]></wishing>
<act_name><![CDATA[新年红包]]></act_name>
<remark><![CDATA[新年红包]]></remark>
<logo_imgurl><![CDATA[https://xx/img/wxpaylogo.png]]></logo_imgurl>
<share_content><![CDATA[share_content]]></share_content>
<share_url><![CDATA[https://xx/img/wxpaylogo.png]]></share_url>
<share_imgurl><![CDATA[https:/xx/img/wxpaylogo.png]]></share_imgurl>
<watermark_imgurl><![CDATA[https:/xx/img/wxpaylogo.png]]></watermark_imgurl>
<banner_imgurl><![CDATA[https:/xx/img/wxpaylogo.png]]></banner_imgurl>
<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>
</xml>
|
字段名 | 变量名 | 必填 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
返回状态码 | return_code | 是 | SUCCESS | String(16) | SUCCESS/FAIL 此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
|
返回信息 | return_msg | 否 | 签名失败 |
String(128) | 返回信息,如非空,为错误原因 签名失败
参数格式校验错误
|
以下字段在return_code为SUCCESS的时候有返回 | |||||
签名 | sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 生成签名方式详见签名生成算法 |
业务结果 | result_code | 是 | SUCCESS | String(16) | SUCCESS/FAIL |
错误代码 | err_code | 否 | SYSTEMERROR | String(32) | 错误码信息 |
错误代码描述 | err_code_des | 否 | 系统错误 | String(128) | 结果信息描述 |
以下字段在return_code 和result_code都为SUCCESS的时候有返回 | |||||
商户订单号 | mch_billno | 是 | 10000098201411111234567890 | String(28) | 商户订单号(每个订单号必须唯一) 组成: mch_id+yyyymmdd+10位一天内不能重复的数字
|
商户号 | mch_id | 是 | 10000098 | String(32) | 微信支付分配的商户号 |
公众账号appid | wxappid | 是 | wx8888888888888888 | String(32) | 商户appid |
用户openid | re_openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String(32) | 接收红包的种子用户(首个用户) 用户在wxappid下的openid
|
总付款金额 | total_amount | 是 | 1000 | int | 总付款金额,单位分 |
发放成功时间 | send_time | 是 | 20150227091010 | String(14) | 红包发放成功时间,格式为yyyyMMddHHmmss,如2015年02月27日9点10分10秒表示为20150227091010 |
微信单号 | send_listid | 是 | 1000000000201502270093647546 | String(32) | 微信红包订单号 |
<xml> <return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[发放成功.]]></return_msg>
<result_code><![CDATA[SUCCESS]]></result_code>
<err_code><![CDATA[0]]></err_code>
<err_code_des><![CDATA[发放成功.]]></err_code_des>
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>
<mch_id>10010404</mch_id>
<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>
<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
<total_amount>3</total_amount>
<send_time>20150227091010</send_time>
<send_listid>1000000000201502270093647546</send_listid>
</xml>
|
<xml> <return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[系统繁忙,请稍后再试.]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[268458547]]></err_code>
<err_code_des><![CDATA[系统繁忙,请稍后再试.]]></err_code_des>
<mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno>
<mch_id>10010404</mch_id>
<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>
<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
<total_amount>3</total_amount>
</xml>
|
错误码
|
描述
|
解决方案
|
---|---|---|
CA_ERROR
|
请求未携带证书,或请求携带的证书出错
|
到商户平台下载证书,请求带上证书后重试。
|
SIGN_ERROR
|
商户签名错误
|
按文档要求重新生成签名后再重试。
|
FREQ_LIMIT
|
受频率限制
|
请对请求做频率控制
|
XML_ERROR
|
请求的xml格式错误,或者post的数据为空
|
检查请求串,确认无误后重试
|
PARAM_ERROR
|
参数错误
|
请查看err_code_des,修改设置错误的参数
|
OPENID_ERROR
|
Openid错误
|
根据用户在商家公众账号上的openid,获取用户在红包公众账号上的openid 错误。请核对商户自身公众号appid和用户在此公众号下的openid。
|
NOTENOUGH
|
余额不足
|
商户账号余额不足,请登录微信支付商户平台充值
|
FATAL_ERROR
|
重复请求时,参数与原单不一致
|
使用相同商户单号进行重复请求时,参数与第一次请求时不一致,请检查并修改参数后再重试。
|
TIME_LIMITED
|
企业红包的发送时间受限
|
请北京时间0:00-8:00时间之外触发红包赠送
|
SECOND_OVER_LIMITED
|
企业红包的按分钟发放受限
|
每分钟发送红包数量不得超过1800个;(可联系微信支付wxhongbao@tencent.com调高额度)
|
DAY_ OVER_LIMITED
|
企业红包的按天日发放受限
|
单个商户日发送红包数量不大于10000个;(可联系微信支付wxhongbao@tencent.com调高额度)
|
MONEY_LIMIT
|
红包金额发放限制
|
每个红包金额必须大于1元,小于1000元(可联系微信支付wxhongbao@tencent.com调高额度至4999元)
|
XML_ERROR
|
请求的xml格式错误,或者post的数据为空
|
检查请求串,确认无误后重试
|
SEND_FAILED
|
红包发放失败,请更换单号再重试
|
原商户单号已经失败,如果还要对同一个用户发放红包, 需要更换新的商户单号再试。
|
SYSTEMERROR
|
系统繁忙,请再试。
|
可用同一商户单号再次调用,只会发放一个红包
|
写个二维数组的多元素排序,多元素排序类似sql中的order by sort,date,下面代码考虑性能问题,只涉及2个元素进行排序。
代码区:
function multipleArraySort($old_arr,$arr1,$arr2){
//排序第一个元素
$old_arr = array_sort($old_arr,$arr1[0],$arr1[1]);
$temp_array = $new_temp_array = array();
foreach($old_arr as $k => $v){
$key_count = count($old_arr)-1;
//第一个元素数相等,放入临时数组
if($v[$arr1[0]] == $old_arr[$k-1][$arr1[0]] || empty($temp_array)){
$temp_array[$k] = $v;
}
if(($v[$arr1[0]] != $old_arr[$k-1][$arr1[0]] && !empty($temp_array)) || $key_count == $k){
//添加最新元素
$temp_array[$k] = $v;
//数组大于1时,进行排序处理
if(count($temp_array)>1){
if($key_count != $k){
//删除最后一个(与上一个不相等元素)
unset($temp_array[$k]);
}
//不是最后或者最后相同,进行排序
if($key_count != $k || $v[$arr1[0]] == $old_arr[$k-1][$arr1[0]]){
//排序第二个元素
$temp_array = array_sort($temp_array,$arr2[0],$arr2[1]);
}
//排序后把排序的数组,插入原数组排序前位置
$count = count($new_temp_array)==0 ? 0 : count($new_temp_array);
foreach($temp_array as $val_t){
$new_temp_array[$count] = $val_t;
$count++;
}
//写入新数组后清空原数组
$temp_array = array();
//添加最新元素
$temp_array[$k] = $v;
}
}
}
return $new_temp_array;
}
//根据数组元素排序
function array_sort($arr,$keys,$type='asc'){
$keysvalue = $new_array = array();
//获取元素值,生成新数组
foreach ($arr as $k=>$v){
$keysvalue[$k] = $v[$keys];
}
//排序,默认为正序
if($type == 'asc'){
asort($keysvalue);
}else{
arsort($keysvalue);
}
reset($keysvalue);
$count_s = 0;
//恢复键值
foreach ($keysvalue as $k=>$v){
$new_array[$count_s] = $arr[$k];
$count_s++;
}
return $new_array;
}
调用方法:
$old_arr = array(
array('id'=>1,'sort'=>1,'date'=>'1405648791'),
array('id'=>2,'sort'=>1,'date'=>'1405649791'),
array('id'=>3,'sort'=>2,'date'=>'1405647791'),
);
$arr1 = array('sort','desc');
$arr2 = array('date','desc');
$newArr = multipleArraySort($old_arr,$arr1,$arr2);
var_dump($newArr);
打印结果:
作开发的朋友都知道百度地址或其它的google地址及火星,高德地图它们的坐标值都是不一样的,如果我们希望从高德地图转换到百度地址是需要转换坐标的否则就不准了,下面来看一个高德地图和百度地图坐标转换php程序。高德地图和百度地图坐标转换php程序
代码如下 | 复制代码 |
|
坐标解释:
1、GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。谷歌,腾讯,高德都在用这个坐标体系。
2、BD-09,百度坐标系。
本文我们来介绍最简单的用php获取 PHP、MySQL 和 Apache 版本信息的代码,只需一句代码就搞定,非常实用。有时我们安装或者开发的 PHP+MYSQL+Apache 的应用程序对环境版本有要求,这时我们可以用下面的代码查询 PHP、MySQL 和 Apache 版本信息看是否满足我们的需求。
1.直接获取 PHP 的版本
<?php
echo 'PHP 版本:' . phpversion();
?>
2.直接获取 MySQL 版本
<?php
mysql_connect('127.0.0.1','root','');
echo 'MySQL 版本:' . mysql_get_server_info();
?>
3.获取 Apache 版本
<?php
echo 'Apache 版本:' . apache_get_version();
?>
如果我们要查询更详细的 PHP 配置,可以直接用下面一句代码:
<?php
phpinfo();
?>
linux,apache,php,mysql常用的查看版本信息的方法
1. 查看linux的内核版本,系统信息,常用的有三种办法:
uname -a; more /etc/issue; cat /proc/version;
2. 查看apache的版本信息,如果是通过yum,或者是rpm安装的,可以使用rpm -qa |gerp httpd 来查看;
还可以通过httpd -v来查询;
当然,安装好apache后,可以直接elink回环查看apache的信息。
3.查看php的版本信息,如果是通过yum,或者是rpm包安装的,可以使用rpm -qa |grep php来查看;
同样,也可以使用php -v来查看php的版本信息;
一般情况下,大多是通过安装lamp后,使用phpinfo的测试页来查看安装的php的信息;
具体办法为在/var/www/下新建index.php文件,具体内容即
php phpinfo();
?>
即可。然后在/etc/httpd/conf/httpd.conf文件中添加index.php类型,然后重启httpd,即可得到如下结果。
4. 查看mysql的版本信息,如果是通过yum安装的,或者是rpm包安装的,可以使用rpm -qa |grep mysql 来查看;
也可以使用mysql -v 或者是--help|grep Distrib来查看;
也可以进入mysql,然后通过命令select version();来查看;
或者是status;命令查看。
个人觉得这些是比较常用的方法,当然肯定会有更加有效,更加便捷的办法和途径。
相关文章
- php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
jQuery+slidereveal实现的面板滑动侧边展出效果
我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
- 本文介绍两种使用 php 生成二维码的方法。 (1)利用google生成二维码的开放接口,代码如下: /** * google api 二维码生成【QRcode可以存储最多4296个字母数字类型的任意文本,具体可以查看二维码数据格式】 * @param strin...2015-10-21
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
SQLMAP结合Meterpreter实现注入渗透返回shell
sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25- 这篇文章主要介绍了C#生成随机数功能,涉及C#数学运算与字符串操作相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 关于生成唯一数字ID的问题,是不是需要使用rand生成一个随机数,然后去数据库查询是否有这个数呢?感觉这样的话有点费时间,有没有其他方法呢?当然不是,其实有两种方法可以解决。 1. 如果你只用php而不用数据库的话,那时间戳+随...2015-11-24
- 复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04
- 下面小编就为大家带来一篇jQuery为动态生成的select元素添加事件的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-09-01
- 经常制作开发不同的网站的后台,写过很多种不同的后台导航写法。 最终积累了这种最写法,算是最好的吧...2013-09-29
- 这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG)。 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (...2014-06-07
- js生成随机数主要用到了内置的Math对象的random()方法。用法如:Math.random()。它返回的是一个 0 ~ 1 之间的随机数。有了这么一个方法,那生成任意随机数就好理解了。比如实际中我们可能会有如下的需要: (1)生成一个 0 - 1...2015-10-21
- 本文我们需要解决的问题是如何实现Http请求来实现通信,解决Android 2.3 版本以后无法使用Http请求问题,下面请看正文。 Android开发中使用HttpClient来开发Http程序...2016-09-20
- 验证码是一个现在WEB2.0中常见的一个功能了,像注册、登录又或者是留言页面,都需要注册码来验证当前操作者的合法性,我们会看到有些网站没有验证码,但那是更高级的验证了,...2016-11-25
- 复制代码 代码如下:function getTagStyle(){ $minFontSize=8; //最小字体大小,可根据需要自行更改 $maxFontSize=18; //最大字体大小,可根据需要自行更改 return 'font-size:'.($minFontSize+lcg_value()*(abs($maxFo...2013-10-04