程序实现微信红包算法及实现会用到存储过程吗

您所在的位置: &
微信产品经理和架构师们是靠什么扛住了10亿个红包?
微信产品经理和架构师们是靠什么扛住了10亿个红包?
微信这么大的流量,尤其是瞬间的峰值,对于任何团队和架构师都是一个极大的挑战,我们也在想,微信团队会用什么样的办法扛住了抢红包的流量?
微信这么大的流量,尤其是瞬间的峰值,对于任何团队和架构师都是一个极大的挑战,我们也在想,微信团队会用什么样的办法扛住了抢红包的流量,正巧今天腾讯大讲堂的公共账号就分发出了这篇文章,尽管没有从具体的技术细节上介绍,但在宏观策略上还是相当地有学习的价值,分享给大家。
400倍的挑战
今年微信红包方式与去年用户与用户之间互发红包相比,摇红包的方式对业务量来说是一个极大的爆发,光是除夕10:30送出的一波红包就达到了1.2亿个,已经是2014年除夕夜峰值的400倍之巨(2014年峰值每分钟被拆开红包数量仅2.5W个)!
进入抢红包环节,后台数据瞬间飙升
发10亿红包,难在哪里?
微信团队总结下来有三大难点:
快&&如何保证用户快速摇到红包?
准&&如何保证摇到的红包能成功拆开?
稳&&如何保证拆开的红包能分享出去?
大量用户在同一时间摇红包,瞬间产生每秒千万级的请求,这个量级的请求如果不加以疏导处理直接到达后台,必定会导致后端服务过载甚至崩溃。上文中除夕当天后台监控数据曲线便能说明一切&&在前台重重的分流减压下,后台服务器负载仍然瞬间飙升十倍以上。
三大应对策略齐上阵
对于以上三个难点,微信后台开发团队主要通过三大应对策略应对:有损服务,柔性可用,大系统小做
有损服务-追求高可用和快速响应。
什么是有损服务?有损服务是通过精心拆分产品流程,选择性牺牲一部分数据一致性和完整性从而保证核心功能绝大多数运行。这是腾讯在PC时代积累下来的一种特色运营策略&&在资源一定的前提下,互联网条件千变万化的场景中,量力而为,满足用户的核心需求。
微信红包的核心点是摇,拆,分享红包,整个系统设计时必须尽最大可能保证这三个步骤一气呵成,任何关联系统出现异常的时候马上进行系统降级,防止引起系统雪崩。
系统降级可以分为两个方面,一是把核心功能进行分拆和简化,通过辅助轻量化的服务实现,确保最短关键路径的可行,比方说在接入层置入摇红包逻辑,将每秒千万级请求转化为每秒万级的红包请求,再传到红包服务的后端逻辑,降低雪崩的可能性。
点评:有损服务就是让重要的事情先做,重要的人物先行。这在现实中也很常见,军人买票优先,领导视察封路,让领导车先行,我等小民等待也是这个路子。
同时后端采用异步分拆,接收到用户请求时仅进行合法性验证,验证完成后直接告知成功,后续业务逻辑进入异步队列进行处理,减少了用户的等待时间,也极大降低了峰值雪崩的概率。
耗时最长的入账操作,直接跳过,异步处理
另外一方面是采取过载保护措施:
微信红包的过载保护在客户端已提前预埋了策略,在连接失败或超时情况下会有相应提示,减少用户重复请求次数。接入层面也会进行自我保护,针对频繁发出请求的客户端限制响应速度,并对系统负载划分出若干等级,达到不同阈值时引导客户端使用不同限速速率;在异常情况出现时,采取减少红包数,异步限流降低拆/分享红包的速率等措施减轻服务器端压力;与此同时,微信红包还有全程压测流程,对整个业务链接进行自动提前评估,防止过载。
点评:在前端挡住对后端流量的进入,比如出现通信失败时,当前这个用户,对后台已经不会有什么压力了。
这画面你可能没见过,它其实早已在手机待命
在有损服务思想的重重保护下,第一波的摇红包体验活动中,微信红包几乎满分通过考验,其中过载保护的作用相当明显,在客户端、接入层层减压、过滤,最终仅把十万级压力传递到后台。
柔性可用-细化场景把握核心需求。
柔性可用是在有损服务价值观支持下的方法,重点在于实际上会结合用户使用场景,根据资源消耗,调整产品策略,设计几个级别不同的用户体验场景,保证尽可能成功返回关键数据,并正常接受请求,绝不轻易倒下。
柔性服务更具有产品的思维性质,意义在于深刻理解产品每一个场景的核心价值,把握用户在每一个场景中的核心需求,设计不同层次的满足核心诉求的办法,对柔性服务在微信红包中的实践,红包团队也有相应的措施,主要可以分为几大类。
1、系统容灾:面对大规模的请求量,系统容灾必不可少,容灾一般可分为逻辑层容灾和数据层容灾,这次微信后台开发团队在容灾布置中采用30%切换的逻辑层方案,即核心服务都能做到最多1/3服务器出问题的情况下自动容灾切换以保证服务质量,提高预警级别换取系统的可用性。
2、资源隔离:顾名思义就是把资源进行隔离减少服务支路间的影响,从逻辑入手,在资源逻辑中,当A服务同时分派任务给BC服务时,设定单个最大分配上限值,避免任意一个支路出问题影响整个服务链条,这样即使部分服务出现问题也不会影响到整个服务的崩塌。
3、快速拒绝:当服务过载时尽早拒绝请求,由服务调用方换机重试避免单一服务器重试过载,快速拒绝和有损服务中的及早拒绝是一个概念的方法,从过程的源头将问题解决,成本越低,影响越小,前端保护后端的方式来解决问题。
点评:这里面需要指出一点的是,客户端跟Web 系统不同,做这种操作的前提,是提前预计到关键路径,在客户端的版本更新中,将相关的指令和策略埋入,当接受数据获取异常时,在客户端自动就降低请求频率,比如一次请求失败,用户肯定想二次再刷,但是可能实际上没有向后端请求,而是直接返回,请客户稍安勿躁,如果不提前埋入,到有问题时才处理是来不及的。
4、支付分组:从支付环节入手,将所有红包分为50个组,放在50个单独的set上互不影响,单组set出问题最多只影响1/50用户,保证多数人服务不受干扰。分组set化也是柔性可用的一个重要技术手段,这一思维非常类似于现实生活中的集装箱思维&&通过标准化,规模化的箱体设计,应对复杂多样的货物,使每个流通环节既独立又不失灵活。
5、流量预加载:从客户端入手,将语音图片等极消耗流量的资源提前让客户端自动下载预置好,提前将流量洪峰疏导,并在活动当天CDN将准备数百G带宽应对,这块也与过载保护中的快慢分离是相通的,将耗流量的服务提前加载避免高峰期间的冲突。
点评:这是提前准备,从各个路径上,把缓存用到彻底。
大系统小做-保证进程的功能单一
大系统小做应该来说,是一种意识,他的核心思想是将功能复杂较大的系统,化大为小,减少模块耦合,降低关联性,用多个独立的模块来实现整体系统的功能,大系统小做采用的是化繁为简,分而治之,便于开发和迅速实现。
微信红包如此庞大的后台系统,模块也相当之多,而这次的模块微信开发后台团队采用了系统高度模块化的方式,分成一个个高度自制的小系统,形成高内聚低耦合的格局,每个模块之间不会过分依赖对方,这样的好处是不会因为任何一个模块而影响全部服务,避免牵一发动全身的风险,实现真正的灰度服务。
点评:降低耦合,增加问题处理时的难度和平时的可维护性。
海量服务能力决定成败
从2014的滴滴打车,到2015的微信红包,腾讯用一个个案例,去证明自身在海量服务方面的实力。事实上,真正支撑起微信红包顺畅运营的幕后英雄,正是腾讯内部一个叫做&海量之道2.0&的技术体系。有损服务,柔性服务,大系统小做三大手段也是脱胎于此体系中。移动互联网大战硝烟味愈浓,BAT都在为争夺支付入口使出浑身解数,在业务从起步到小跑再到腾飞的过程中,巨头背后的海量服务能力将对其最终成败有着来越发深远的影响。
【责任编辑: TEL:(010)】
关于&&&&的更多文章
刚过去的新年假期,微信红包以一种舍我其谁的架势再次出现在公众
既然强大的Android Studio来了,有什么理由不去用呢?
讲师: 34人学习过讲师: 133人学习过讲师: 266人学习过
你心爱的那些移动游戏为什么会如此吸引你?就是那些你
本专题意在帮助想要了解Android的人能快速上手Android
今天,圣诞的到来,相信大家都收到礼物了吧,如果没收
本书结合JSP和Servlet的最新规范,从基本的语法和规范入手,以经验为后盾,以实用为目标,以实例为导向,以实践为指导,深入浅出
Windows Phone专家
Android开发专家
51CTO旗下网站这是我的个人博客,但我期待你的参与...MSN:(将#改成@)
微信公众号,企业号发红包的实现.
作者:yihaomen 日期:
年底了,各个企业都在搞年会活动,想不想让年会也“互联网+”一把?作为一个企业老板,还在拉人头建群发红包?其实,你可以试试用企业号发红包!现在,用企业号发红包,不开发也可以哦。首先,你当然是需要有一个企业号,然后把想发红包的人拉进来,邀请关注。如果你的企业号未开通微信支付,请在企业号管理端【服务中心-微信支付】申请开通。再完成以下两步,你就可以通过企业号直接发红包了!1. 在企业号管理端转换openID由于企业号管理平台和微信支付商户平台是两套不一样的系统,所以我们要先把企业号的userID转换为openID才可以在微信支付商户发放红包。在企业号管理员【服务中心-微信支付-微信红包/企业转账】中选择获取openID在页面中选择要发放红包的应用及范围提交后系统会自动为你转换。成功后可下载openID文件在微信支付商户平台发放红包。也可以下载对应文件,查看userID与openID的对应关系如何发送红包,看腾讯帮助文档: 发送红包后,直接可以看到。如果具备开发能力,可以自己开发, 调用接口参考在这里:
| 查看次数: -
游客发言不需要密码.
禁止表情转换
禁止自动转换链接
禁止自动转换关键字
虽然发表评论不用注册,但是为了保护您的发言权,建议您.微信红包的随机算法是怎样实现的?
RT。我考虑了一个简单的算法:比如100元,由10个人分,那么平均一个人是10元钱。然后付款后,系统开始分份儿。第一份:系统由0~10元之间随机一个数,作为这一份的钱数,设x1。第二份:剩下的钱(100-x1),系统由0~(100-x1)/(10-1)随机一个数,作为这份的钱数,设x2.。。。第n份:剩下的钱(100-x1-x2-...-xn),系统由0~(100-x1-x2-...-xn-1)/(10-n)随机一个数,作为这个份的钱数,设为xn当用户进来拿红包的时候,系统由0~9之间随机一个数,随机到几,就取第几份红包,然后将这个数存到list里。当之后的用户抽到相同的随机数时,则将这个数+1,如遇相同再+1,直至list满,红包发完。------------------------------------------------我这么实现可以么??或者大家有更好的办法????
按时间排序
其实我更在意红包的存储方式,毕竟红包就算过期,还是有各个人的抽取结果,难道都在cache吗?
最佳出现在中间的概率更高,第一个就算是最佳,金额也不高
几个极端例子:亲测过1、11个人抢2000块,第一个人50+,第二个人140+,后面9个都是200;2、2个人抢300元,100,200;3、2个人抢399元,199,200;4、2个人抢159元,159,200很好奇微信红包真实算法
看了上面大神的算法,我的内心是崩溃的,又一次感觉到了自己的小白。虽然我木有上面大神的精确计算,但是自己通过几次发红包也摸索出来一个小规律,和自己聊天多的人每次抢到的红包钱数是最多的,当然也有和自己不是好友也抢到大金额的,但是这种比例比较少。
后抢手气最佳机会大?
抢红包就图个乐呵,看大家玩的这么开心,我就放心了。
我哪里会知道
100块钱,10个人分,先拿出10块钱,一人一份,保证每个人都至少有一块钱,然后剩下的90块钱用插板法来分,构造一个长度为90的数列,随机找一个点(包括头尾),插入一个点,然后把这个点看做数列的一部分,此时数列长度为91,在随机找一个位置,插入一个点,直到插满9个点(人数-1)为止,然后按照点的位置把数列拆开,每一段数列的长度就是这个人分得的第二笔钱,加上原先每人有的1块,这样钱就分完了。
关于这个问题我本来觉得挺简单的,我也是参考了几位大神的意见做得算法,但是老板嫌结果分布的太均匀,但是要想让他不均匀就会导致分布有问题,这也如几位大神所写的那样,为了证明这个问题,我还写了一段简单的代码,还能生成一个图表用来显示结果分布大神们的回答用了各种图表,但是想必看的人也很手痒想亲自尝试,所以我把我的代码分享出来让大家都能玩。作为对大神们回答的补充吧,需要安装nodejs,很简单,所有人都能玩。
我来做的话,就在客户端分好,服务端验证一下就完了
今年各种红包不能再火了,在过年期间抢过很多红包,也发过不少红包。在这个过程中,难免对红包算法产生一点好奇。今天发现原来这么多知友都在思考这个问题,我也把个人的想法写在这里作为一个补充。以下描述针对微信红包。很多人给出的答案,感觉可能已经很接近真实情况了。不过,发现几乎所有答案似乎都忽略了一个重要条件:每个人领到的红包不能超过200。举个例子:比如给2个人发总额为399的红包,可能是1个人拿到200,1个人拿到199;而不可能是1个人拿到198,1个人拿到201。再比如,发400元红包给2个人,肯定两个人都拿到200,而没有其它可能性。实际上,发总额为401给2个人是不被允许的(这个很容易验证)。“每个人领到的红包不能超过200”这个条件会对红包随机算法的编写产生比较大的影响:随机的下限不能简单的认为是0.01。比如前面举的例子399分给2个人,第一份随机出来不能低于199,否则第2个人就得比200多了。所以,考虑了这个条件之后的红包算法可能大致如下:把总额为S的红包随机分成N份:从i=1开始,当需要生成第i份(1&=i&=N)的时候,前面(i-1)份金额已经生成,这时要考虑最坏情况下后面(N-i)份即使都是200也仍然能将总额S分完。即:在闭区间[max{0.01,S-前面(i-1)份的总额-(N-i)*200}, min{S-前面(i-1)份的总额, 200}-(N-i)*0.01)]上以均匀分布随机出一个数额,作为第i份金额。其中,减去(N-i)*0.01是保证后面的(N-i)份至少各保留0.01。这样写仍然不太严谨,因为闭区间的终点有可能小于起点(有一种特殊情况,恰好出现[200,199.99]这样的闭区间)。为了避免这种情况发生,准确的闭区间应该是这样:设A=max{0.01,S-前面(i-1)份的总额-(N-i)*200}, B=min{S-前面(i-1)份的总额, 200}-(N-i)*0.01,那么闭区间为[A, max{A,B}]。上述算法具体实施时,最晚到第一个抢红包的人出现之前,必须将N份金额全部算出。每个人(包含第一个人)在抢红包时只是在N份算好的金额中以均匀分布随机选出一份。暂时不考虑这样做分得是否均匀(均匀是个模糊的概念),逻辑上来说,这样的一个算法能够保证每个人至少拿到0.01,至多拿到200,而且恰好分光所有红包总额。对于一般的小红包来说,随机区间起点A总是等于0.01,随机出来的金额也到不了200。但如果人均金额比较大且人数较多,生成到某一份时,A会出现大于0.01的情况,然后后面的生成过程就类似一个阻尼震荡,逐步把随机区间逼到一个狭小的范围内而接近200,导致出现200的概率升高,而一旦出现A=200,后面的也必须是200。实际上,在抢大额红包的过程中,会出现一个现象:只要有人抢到200,一般都是不止一个人抢到200。可见200在所有可能的数字中的特殊性。而抢红包的任意两个人在除了200之外的其它数额上恰好一致的可能性就微乎其微(比如两个人都抢到了5.34,这种可能性出现概率极低,但200一般都不会单个出现)。另外,不排除微信的算法中可能为了避免随机金额过于悬殊,在某些情况下对随机区间做一些微调,特别是在总金额小的情况下(但个人认为很可能不是把随机上限改为平均值的这种做法)。但微调后的区间绝对不能超过上述计算的上下限。没有亲自写算法验证,如有疏漏,敬请谅解!
我试过发0.03元,分成3个红包,他们领取完后每个都是0.01,哈哈哈哈哈说明不会出现为0的红包。假设你包了m元,分成n份,假设第i份的红包数额为Si(随机生成的,至少为0.01) 那么sum Si
s.t. i~[1,...,n]我感觉一个简单的方法,就是,s1
随机从0到m 取一个数,为S1;s2
随机从0到m-S1 取一个数,为S2;s3
随机从0到m-S1S2 取一个数,为S3;。。。这样的方法,不知道能不能保证每个人领取的红包的数学期望都一致?
看了上面那么多答案,一个文科没脑数学鸡蛋屌丝狗决定狗带了……“为什么抢个红包这么简单的事情居然都能衍生出编程和数学题来?还能不能简简单单轻轻松松抢红包了???”(╯°□°)╯︵ ┻━┻
我觉得很简单的就是一个多维平面上的随机点吧。
本人的一个实现,基本保证均匀与公平,每个人最小抢到一分钱,最大就是指定的限额。有待改进。上照片吧。最后的图表是模拟600个人分5000元钱的结果。
歪个楼,我刚刚发现一个规律:发n个红包,总金额为¥(n+1)×0.01,那么最后一个必然¥0.02、手气最佳。如图这个算法有bug相同的操作在QQ红包上则是第一个0.02,后面的均为0.01,支付宝红包似乎没有这种规律
还有一种根据id用户差分随机排布的混合算法 避免网速优先选择权
n个一分钱随机分给m个人 (n &= m)那么对于每个人相当于经历了n次概率为p=1/m的贝努利实验。因此每个人获得的金额x符合二项分布,即。接下来开始hack......产生符合二项分布的随机数有成熟的算法。hack之后,虽然不能保证概率分布一致,抢红包就是为了惊喜吗?
我的思路是预先分配红包金额,再随机抽取红包。把总金额抽象为一条离散点构成的线段,邻点间隔0.01,最小刻度0.1,最大刻度为总金额。设红包数为n,在线段上随机产生不重合的n-1个位置,设置一个阈值t,在线段两端和所有随机点中,若存在间隔小于t的相邻点,则重新产生随机点(防止红包金额过于悬殊)。各点间隔即为每个红包的金额。发呆时候想的,还没写程序测过效果→_→
大多数答案默认generator是真正随机的,但其实是pseudo random。假设错误,想也没有必要。php实现微信发红包
作者:Ningsir
字体:[ ] 类型:转载 时间:
现在微信发红包比较流行,大家都会使用微信发红包,马上又该过年了,发红包又要开始了,小编这就给大家分享一个php实现微信发红包程序的算法,非常的实用,这里推荐给小伙伴们,有需要的朋友可以参考下。
本文实例讲述了php实现的微信红包算法。分享给大家供大家参考。具体如下:
具体代码:
* 微信红包的类
CLASS WXHongBao {
private $mch_id = "111111";//商户ID写死
private $wxappid = "";//微信公众号,写死
private $client_ip = "119.29.80.114"; //调用红包接口的主机的IP,服务端IP,写死,即脚本文件所在的IP
private $apikey = "";//pay的秘钥值
private $total_num = 1;//发放人数。固定值1,不可修改
private $nick_name = "微信产品中心公众号"; //红包商户名称
private $send_name = "微信产品中心公众号";//红包派发者名称
private $wishing = "祝福语"; //
private $act_name = "红包活动"; //活动名称
private $remark = "活动备注";
private $nonce_str = "";
private $mch_billno = "";
private $re_openid = "";//接收方的openID
private $total_amount = 1 ;//红包金额,单位 分
private $min_value = 1;//最小金额
private $max_value = 1; //根据接口要求,上述3值必须一致
private $sign = ""; //签名在send时生成
private $amt_ //分裂红包参数,在sendgroup中进行定义,是常量 ALL_RAND
//证书,在构造函数中定义,注意!
private $apiclient_ //= getcwd()."/apiclient_cert.pem";
private $apiclient_// = getcwd()."/apiclient_key.pem";
//分享参数
private $isShare = //有用?似乎是无用参数,全部都不是必选和互相依赖的参数
private $share_content = "";
private $share_url ="";
private $share_imgurl = "";
private $wxhb_
private $api_hb_group = "https://api.mch./mmpaymkttransfers/sendgroupredpack";//裂变红包
private $api_hb_single = "https://api.mch./mmpaymkttransfers/sendredpack";
private $error = "ok"; //init
* WXHongBao::__construct()
* new(openid,amount)
* setnickname
* setsend_name
* setwishing
* setact_name
* setremark
* @return void
function __construct(){
//好像没有什么需要构造函数做的
$this-&wxhb_inited =
$this-&apiclient_cert = getcwd()."/apiclient_cert.pem";
$this-&apiclient_key = getcwd()."/apiclient_key.pem";
public function err(){
return $this-&
public function error(){
return $this-&err();
* WXHongBao::newhb()
* 构造新红包
* @param mixed $toOpenId
* @param mixed $amount 金额分
* @return void
public function newhb($toOpenId,$amount){
if(!is_numeric($amount)){
$this-&error = "金额参数错误";
}elseif($amount&100){
$this-&error = "金额太小";
}elseif($amount&20000){
$this-&error = "金额太大";
$this-&gen_nonce_str();//构造随机字串
$this-&gen_mch_billno();//构造订单号
$this-&setOpenId($toOpenId);
$this-&setAmount($amount);
$this-&wxhb_inited = //标记微信红包已经初始化完毕可以发送
//每次new 都要将分享的内容给清空掉,否则会出现残余被引用
$this-&share_content= "";
$this-&share_imgurl = "";
$this-&share_url = "";
* WXHongBao::send()
* 发出红包
* 构造签名
* 注意第二参数,单发时不要改动!
* @return boolean $success
public function send($url = "https://api.mch./mmpaymkttransfers/sendredpack",$total_num = 1){
if(!$this-&wxhb_inited){
$this-&error .= "(红包未准备好)";
//未初始化完成
$this-&total_num = $total_
$this-&gen_Sign(); //生成签名
//构造提交的数据
$xml = $this-&genXMLParam();
file_put_contents("hbxml.txt",$xml);
//提交xml,curl
//$url = "https://api.mch./mmpaymkttransfers/sendredpack";
$ch = curl_init();
curl_setopt($ch,CURLOPT_TIMEOUT,10);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,$this-&apiclient_cert);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,$this-&apiclient_key);
if( count($aHeader) &= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
if($data){
curl_close($ch);
$rsxml = simplexml_load_string($data);
if($rsxml-&return_code == 'SUCCESS' ){
$this-&error = $rsxml-&return_
$this-&error = curl_errno($ch);
curl_close($ch);
* WXHongBao::sendGroup()
* 发送裂变红包,参数为裂变数量
* @param integer $num 3-20
public function sendGroup($num=3){
$this-&amt_type = "ALL_RAND";//$ 固定值。发送裂变红包组文档指定参数,随机
return $this-&send($this-&api_hb_group,$num);
public function getApiSingle(){
return $this-&api_hb_
public function getApiGroup(){
return $this-&api_hb_
public function setNickName($nick){
$this-&nick_name = $
public function setSendName($name){
$this-&send_name = $
public function setWishing($wishing){
$this-&wishing = $
* WXHongBao::setActName()
* 活动名称
* @param mixed $act
* @return void
public function setActName($act){
$this-&act_name = $
public function setRemark($remark){
$this-&remark = $
public function setOpenId($openid){
$this-&re_openid = $
* WXHongBao::setAmount()
* 设置红包金额
* 文档有两处冲突描述
* 一处指金额 &=1 (分钱)
* 另一处指金额 &=100 & 2元]
* 有待测试验证!
* @param mixed $price 单位 分
* @return void
public function setAmount($price){
$this-&total_amount = $
$this-&min_value = $
$this-&max_value = $
//以下方法,为设置分裂红包时使用
public function setHBminmax($min,$max){
$this-&min_value = $
$this-&max_value = $
public function setShare($img="",$url="",$content=""){
///mmbiz/MS1jaDO92Ep4qNo9eV0rnItptyBrzUhJqT8oxSsCofdxibnNWMJiabaqgLPkDaEJmia6fqTXAXulKBa9NLfxYMwYA/0?wx_fmt=png
//http://mp./s?__biz=MzA5Njg4NTk3MA==&mid=&idx=1&sn=5ee4aa6a8#rd
$this-&share_content = $
$this-&share_imgurl = $
$this-&share_url = $
private function gen_nonce_str(){
$this-&nonce_str = strtoupper(md5(mt_rand().time())); //确保不重复而已
private function gen_Sign(){
unset($param);
//其实应该用key重排一次 right?
$param["act_name"]=$this-&act_//
if($this-&total_num==1){ //这些是裂变红包用不上的参数,会导致签名错误
$param["client_ip"]=$this-&client_
$param["max_value"]=$this-&max_
$param["min_value"]=$this-&min_
$param["nick_name"]=$this-&nick_
$param["mch_billno"] = $this-&mch_
$param["mch_id"]=$this-&mch_//
$param["nonce_str"]=$this-&nonce_
$param["re_openid"]=$this-&re_//
$param["remark"]=$this-&
$param["send_name"]=$this-&send_//
$param["total_amount"]=$this-&total_//
$param["total_num"]=$this-&total_
$param["wishing"]=$this-&//
$param["wxappid"]=$this-&//
if($this-&share_content) $param["share_content"] = $this-&share_
if($this-&share_imgurl) $param["share_imgurl"] = $this-&share_
if($this-&share_url) $param["share_url"] = $this-&share_
if($this-&amt_type) $param["amt_type"] = $this-&amt_ //
ksort($param); //按照键名排序...艹,上面排了我好久
//$sign_raw = http_build_query($param)."&key=".$this-&
$sign_raw = "";
foreach($param as $k =& $v){
$sign_raw .= $k."=".$v."&";
$sign_raw .= "key=".$this-&
//file_put_contents("sign.raw",$sign_raw);//debug
$this-&sign = strtoupper(md5($sign_raw));
* WXHongBao::genXMLParam()
* 生成post的参数xml数据包
* 注意生成之前各项值要生成,尤其是Sign
* @return $xml
public function genXMLParam(){
$xml = "&xml&
&sign&".$this-&sign."&/sign&
&mch_billno&".$this-&mch_billno."&/mch_billno&
&mch_id&".$this-&mch_id."&/mch_id&
&wxappid&".$this-&wxappid."&/wxappid&
&nick_name&&![CDATA[".$this-&nick_name."]]&&/nick_name&
&send_name&&![CDATA[".$this-&send_name."]]&&/send_name&
&re_openid&".$this-&re_openid."&/re_openid&
&total_amount&".$this-&total_amount."&/total_amount&
&min_value&".$this-&min_value."&/min_value&
&max_value&".$this-&max_value."&/max_value&
&total_num&".$this-&total_num."&/total_num&
&wishing&&![CDATA[".$this-&wishing."]]&&/wishing&
&client_ip&&![CDATA[".$this-&client_ip."]]&&/client_ip&
&act_name&&![CDATA[".$this-&act_name."]]&&/act_name&
&remark&&![CDATA[".$this-&remark."]]&&/remark&
&nonce_str&".$this-&nonce_str."&/nonce_str&
if($this-&share_content) $xml .= "&share_content&&![CDATA[".$this-&share_content."]]&&/share_content&
if($this-&share_imgurl) $xml .= "&share_imgurl&&![CDATA[".$this-&share_imgurl."]]&&/share_imgurl&
if($this-&share_url) $xml .= "&share_url&&![CDATA[".$this-&share_url."]]&&/share_url&
if($this-&amt_type) $xml .= "&amt_type&&![CDATA[".$this-&amt_type."]]&&/amt_type&
$xml .="&/xml&";
* WXHongBao::gen_mch_billno()
* 商户订单号(每个订单号必须唯一)
组成: mch_id+yyyymmdd+10位一天内不能重复的数字。
接口根据商户订单号支持重入, 如出现超时可再调用。
* @return void
private function gen_mch_billno(){
//生成一个长度10,的阿拉伯数字随机字符串
$rnd_num = array('0','1','2','3','4','5','6','7','8','9');
$rndstr = "";
while(strlen($rndstr)&10){
$rndstr .= $rnd_num[array_rand($rnd_num)];
$this-&mch_billno = $this-&mch_id.date("Ymd").$
然后实例化class.
   $toOpenId = 'asdasdasd'; //接收红包的用户的微信OpenId
$hb = new WXHongBao();
$hb-&newhb($toOpenId,1000); //新建一个10元的红包,第二参数单位是 分,注意取值范围 1-200元
//以下若干项可选操作,不指定则使用class脚本顶部的预设值
$hb-&setNickName("土豪有限公司");
$hb-&setSendName("土豪");
$hb-&setWishing("恭喜发财");
$hb-&setActName("发钱活动");
$hb-&setRemark("任性一把");
//发送红包
if(!$hb-&send()){ //发送错误
echo $hb-&err();
echo "红包发送成功";
希望本文所述对大家的php程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 存储过程实现数据同步 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信