×

php独立微信红包系统

php独立微信红包系统(php 红包算法)

admin admin 发表于2023-03-21 07:14:09 浏览63 评论0

抢沙发发表评论

本文目录一览:

php 个人微信接口可以发红包吗

可以,具体$arr['openid']='ojgTTt8oF9VdYcGsJMACHpA-jy1U'; $arr['hbname']="提现申请"; $arr['body']="您的提现申请已经成功"; $arr['fee']=1; $comm = new Common_util_pub(); $re = $comm-sendhongbaoto($arr); var_dump($re);

注意证书位置和 商户后台设置的key需要修改.

?php header("Content-type: text/html; charset=utf-8"); class Common_util_pub { /** * hbname 红包名称 fee 红包金额 /元 body 内容 openid 微信用户id * @param undefined $arr * * @return */ public function sendhongbaoto($arr){ //$comm = new Common_util_pub(); $data['mch_id'] = '120005402'; $data['mch_billno'] = '120005402'.date("Ymd",time()).date("His",time()).rand(1111,9999); $data['nonce_str'] = self::createNoncestr(); $data['re_openid'] = $arr['openid']; $data['wxappid'] = 'wx8axxxxxbac4905'; $data['nick_name'] = $arr['hbname']; $data['send_name'] = $arr['hbname'];如果你还有不明白的话,可以问我,我自己在后盾人学习了。(m´・ω・`)m-php独立微信红包系统

求大神!公众号后台如何自动回复红包?如何将微信红包接入php网站?

你这个是某猪的源码吧,他这个源码估计是没有发红包的开发,所以不能直接发红包的,而且这种免费源码还有泄漏的风险,不建议使用。一般来说做了这个红包支付的接口,直接调用关注时回复发送红包就可以了。

PHP微信红包拼手气算法与扫雷

如下需求

需要将1元的红包,拆分成10个,每一个红包的金额均不相等,接受用户的输入 个数和金额,并且红包个数的最小金额,和最大金额不能大于输入金额。

由于微信红包的火热,一些红包爱好者就出现了红包扫雷的菠菜玩法,有群红包、H5游戏,可以是手气佳者、也可以是尾数符合者,玩法多种多样。

而一般脱离微信外的程序、游戏、网页、APP、都是差不多跟机器人在玩,前期让你赚钱,后期慢慢割你韭菜,和币圈合约是一个道理。

后期会持续更新和剖析扫雷红包机器人和其通过盈亏比例调节割韭菜等细节

(二)微信红包高并发系统设计方案(1)

2017年1月28日,正月初一,微信公布了用户在除夕当天收发微信红包的数量——142亿个,而其收发峰值也已达到76万每秒。百亿级别的红包,如何保障并发性能与资金安全?这给微信带来了超级挑战。面对挑战,微信红包在分析了业界“秒杀”系统解决方案的基础上,采用了 SET化、请求排队串行化、双维度分库表 等设计,形成了独特的高并发、资金安全系统解决方案。实践证明,该方案表现稳定,且实现了除夕夜系统零故障运行。概要:-php独立微信红包系统

一、业务 特点 :海量的并发要求;严格的安全级别

二、技术 难点 :并发请求抢锁;事务级操作量级大;事务性要求严格

三、解决高并发问题 通常 使用的 方案 :

1.使用内存操作替代实时的DB事务操作(优点:内存操作替代磁盘操作,提高了并发性能。)

2使用乐观锁替代悲观锁。应用于微信红包系统,则会存在下面三个问题:滚并返回失败;并发大失败,小成功。DB压力大。

四、微信 红包 系统的高并发解决 方案 :

1.系统垂直SET化,分而治之。

2.逻辑Server层将请求排队,解决DB并发问题。

3.双维度库表设计,保障系统性能稳定

类似“秒杀”活动,群里发一个红包=“秒杀”商品上架;抢红包的动作=“秒杀”的查询库存;拆红包=“秒杀”

同一时间有10万个群里的用户同时在发红包,那就相当于同一时间有10万个“秒杀”活动发布出去。10万个微信群里的用户同时抢红包,将产生海量的并发请求。

微信红包是微信支付的一个商户,提供资金流转服务。

用户发红包=购买一笔“钱”(在微信红包这个商户上),并且收货地址是微信群。当用户支付成功后,红包“发货”到微信群里,群里的用户拆开红包后,微信红包提供了将“钱”转入折红包用户微信零钱的服务。

资金交易业务比普通商品“秒杀”活动有更高的安全级别要求。普通的商品“秒杀”商品由商户提供,库存是商户预设的,“秒杀”时可以允许存在“超卖”、“少卖”的情况。但是对于微信红包,100元不可以被拆出101元;领取99元时,剩下的1元在24小时过期后要精确地退还给发红包用户,不能多也不能少。-php独立微信红包系统

在介绍微信红包系统的技术难点之前,先介绍下简单的、典型的商品“秒杀”系统的架构设计,如下图所示。

该系统由接入层、逻辑服务层、存储层与缓存构成。Proxy处理请求接入,Server承载主要的业务逻辑,Cache用于缓存库存数量、DB则用于数据持久化。

一个“秒杀”活动,对应DB中的一条库存记录。当用户进行商品“秒杀”时,系统的主要逻辑在于DB中库存的操作上。一般来说,对DB的操作流程有以下三步:

a. 锁库存

b. 插入“秒杀”记录

c. 更新库存

a.锁库存是为了 避免 并发请求时出现“ 超卖 ”情况。同时要求这 三步操作 需要在 一个事务 中完成(难点:并发请求抢锁)。

第一个事务完成提交之前这个锁一直被第一个请求占用,后面的所有请求需要 排队等待 。同时参与“秒杀”的用户越多,并发进DB的请求越多,请求 排队越严重 。

红包系统的设计上, 除了并发请求抢锁之外,还有以下两个突出难点 :

首先,事务级操作量级大 。上文介绍微信红包业务特点时提到,普遍情况下同时会有数以万计的微信群在发红包。这个业务特点映射到微信红包系统设计上,就是有数以万计的“并发请求抢锁”同时在进行。这使 得DB的压力 比普通单个商品“库存”被锁要大很多倍。-php独立微信红包系统

其次,事务性要求严格 。微信红包系统本质上是一个资金交易系统,相比普通商品“秒杀”系统有更高的事务级别要求。

普通商品“秒杀”活动系统,解决高并发问题的方案,大体有以下几种:

如图2所示,将“实时扣库存”的行为上移到 内存Cache中操作 ,内存Cache操作成功直接给Server返回成功,然后 异步落DB持久化 。

优点:提高了并发性能。

缺点: 在内存操作 成功 但 DB持久化失败 ,或者内存 Cache故障 的情况下,DB持久化会 丢数据 ,不适合微信红包这种资金交易系统。

商品“秒杀”系统中,乐观锁的具体应用方法,是在DB的“库存”记录中维护一个版本号。在更新“库存”的操作进行前,先去DB获取当前版本号。在更新库存的事务提交时,检查该版本号是否已被其他事务修改。如果版本没被修改,则提交事务,且版本号加1;如果版本号已经被其他事务修改,则回滚事务,并给上层报错。-php独立微信红包系统

这个方案解决了“并发请求抢锁”的问题,可以提高DB的并发处理能力。

应用于微信红包系统,则会存在下面三个问题 :

1.在并发抢到相同版本号的拆红包请求中, 只有一个能拆红包成功 , 其他的请求 将事务回滚并返回失败,给用户 报错 ,用户体验完全不可接受。

2.将会导致 第一时间 同时拆红包的用户有一部分直接 返回失败 ,反而那些“ 手慢 ”的用户,有可能因为 并发减小 后拆红包 成功 ,这会带来用户体验上的负面影响。

3.会带来 大数量 的 无效 更新 请求 、事务 回滚 ,给 DB 造成不必要的额外 压力 。

微信红包用户发一个红包时,微信红包系统生成一个ID作为这个红包的唯一标识。接下来这个红包的所有发红包、抢红包、拆红包、查询红包详情等操作,都根据这个ID关联。

红包系统根据这个红包ID,按一定的规则(如按ID尾号取模等),垂直上下切分。切分后,一个垂直链条上的逻辑Server服务器、DB统称为一个SET。

各个SET之间相互独立,互相解耦。并且同一个红包ID的所有请求,包括发红包、抢红包、拆红包、查详情详情等,垂直stick到同一个SET内处理,高度内聚。通过这样的方式,系统将所有红包请求这个巨大的洪流分散为多股小流,互不影响,分而治之,如下图所示。-php独立微信红包系统

这个方案解决了同时存在海量事务级操作的问题,将海量化为小量。

红包系统是资金交易系统,DB操作的事务性无法避免,所以会存在“并发抢锁”问题。但是如果到达DB的事务操作(也即拆红包行为)不是并发的,而是串行的,就不会存在“并发抢锁”的问题了。

按这个思路,为了使拆红包的事务操作串行地进入DB,只需要将请求在 Server层以FIFO ( 先进先出 )的方式排队,就可以达到这个效果。从而问题就集中到Server的FIFO队列设计上。

微信红包系统设计了分布式的、轻巧的、灵活的FIFO队列方案。其具体实现如下:

首先,将同一个红包ID的所有请求stick到同一台Server。

上面SET化方案已经介绍,同个红包ID的所有请求,按红包ID stick到同个SET中。不过在同个SET中,会存在多台Server服务器同时连接同一台DB(基于容灾、性能考虑,需要多台Server互备、均衡压力)。-php独立微信红包系统

为了使同一个红包ID的所有请求,stick到同一台Server服务器上,在SET化的设计之外,微信红包系统添加了一层基于红包ID hash值的分流,如下图所示。

其次,设计单机请求排队方案。

将stick到同一台Server上的所有请求在被接收进程接收后,按红包ID进行排队。然后 串行地进入worker进程 (执行业务逻辑)进行处理,从而达到 排队 的效果,如下图所示。

最后,增加memcached控制并发。

为了 防止 Server中的请求队列过载导致队列被降级,从而所有请求 拥进DB ,系统增加了与Server服务器同机部署的 memcached ,用于控制拆同一个红包的 请求并发数 。

具体来说,利用memcached的 CAS原子累增操作 ,控制同时进入 DB执行拆红包事务的请求数 ,超过预先设定数值则 直接拒绝服务 。用于 DB负载升高时的降级 体验。

通过以上三个措施,系统有效地 控制了DB的“并发抢锁” 情况。

红包系统的分库表规则,初期是根据 红包ID的hash值 分为多库多表。随着红包数据量逐渐增大,单表数据量也逐渐增加。而DB的性能与单表数据量有一定相关性。当单表数据量达到一定程度时,DB性能会有大幅度下降,影响系统性能稳定性。采用 冷热分离 ,将历史冷数据与当前热数据分开存储,可以解决这个问题。-php独立微信红包系统

系统在以 红包ID维度 分库表的基础上,增加了以 循环天分表的维度 ,形成了 双维度分库表 的特色。

具体来说,就是分库表规则像db_xx.t_y_dd设计,其中,xx/y是红包ID的 hash值后三位 ,dd的取值范围在01~31,代表一个月天数最多 31 天。

通过这种双维度分库表方式,解决了DB单表数据量膨胀导致性能下降的问题,保障了系统性能的稳定性。同时,在热冷分离的问题上,又使得数据搬迁变得简单而优雅。

综上所述,微信红包系统在解决高并发问题上的设计,主要采用了SET化分治、请求排队、双维度分库表等方案,使得单组DB的并发性能 提升了8倍 左右,取得了很好的效果。

微信红包的技术原理是怎样的

class Wxapi {

private $app_id = 'wxXXXXXXXXXXXX'; //公众账号appid,首先申请与之配套的公众账号

private $app_secret = 'XXXXXXXXXXXXXXXXXXXXXXXX';//公众号secret,用户获取用户授权token

private $app_mchid = 'XXXXXXXX';//商户号id

function __construct(){

//do sth here....

}

/**

* 微信支付

* @param string $openid 用户openid

*/

public function pay($re_openid)

{

include_once('WxHongBaoHelper.php');

$commonUtil = new CommonUtil();

$wxHongBaoHelper = new WxHongBaoHelper();

$wxHongBaoHelper-setParameter("nonce_str", $this-great_rand());

//随机字符串,丌长于 32 位

$wxHongBaoHelper-

setParameter("mch_billno", $this-app_mchid.date('YmdHis').rand(1000, 9999));

//订单号

$wxHongBaoHelper-setParameter("mch_id", $this-app_mchid);//商户号

$wxHongBaoHelper-setParameter("wxappid", $this-app_id);

$wxHongBaoHelper-setParameter("nick_name", '红包');//提供方名称

$wxHongBaoHelper-setParameter("send_name", '红包');//红包发送者名称

$wxHongBaoHelper-setParameter("re_openid", $re_openid);//相对于医脉互通的openid

$wxHongBaoHelper-setParameter("total_amount", 100);//付款金额,单位分

$wxHongBaoHelper-setParameter("min_value", 100);//最小红包金额,单位分

$wxHongBaoHelper-setParameter("max_value", 100);//最大红包金额,单位分

$wxHongBaoHelper-setParameter("total_num", 1);//红包収放总人数

$wxHongBaoHelper-setParameter("wishing", '感谢您参与红包派发活动,祝您新年快乐!');

//红包祝福

$wxHongBaoHelper-setParameter("client_ip", '127.0.0.1');//调用接口的机器 Ip 地址

$wxHongBaoHelper-setParameter("act_name", '红包活动');//活劢名称

$wxHongBaoHelper-setParameter("remark", '快来抢!');//备注信息

$postXml = $wxHongBaoHelper-create_hongbao_xml();

$url = '';

$responseXml = $wxHongBaoHelper-curl_post_ssl($url, $postXml);

//用作结果调试输出

//echo htmlentities($responseXml,ENT_COMPAT,'UTF-8');

$responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);

return $responseObj-return_code;

}

获取随机字符串方

1

2

3

4

5

6

7

8

9

10

11

/**

* 生成随机数

*/

public function great_rand(){

$str = '1234567890abcdefghijklmnopqrstuvwxyz';

for($i=0;$i30;$i++){

$j=rand(0,35);

$t1 .= $str[$j];

}

return $t1;

}

签名算法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

/**

例如:

appid: wxd111665abv58f4f

mch_id: 10000100

device_info: 1000

Body: test

nonce_str: ibuaiVcKdpRxkhJA

第一步:对参数按照 key=value 的格式,并按照参数名 ASCII 字典序排序如下:

stringA="appid=wxd930ea5d5a258f4fbody=testdevice_info=1000mch_i

d=10000100nonce_str=ibuaiVcKdpRxkhJA";

第二步:拼接支付密钥:

stringSignTemp="stringAkey=192006250b4c09247ec02edce69f6a2d"

sign=MD5(stringSignTemp).toUpperCase()

="9A0A8659F005D6984697E2CA0A9CF3B7"

*/

protected function get_sign(){

define('PARTNERKEY',"QSRXXXXXXXXXXXXXXXXXXXXX");

try {

if (null == PARTNERKEY || "" == PARTNERKEY ) {

throw new SDKRuntimeException("密钥不能为空!" . "br");

}

if($this-check_sign_parameters() == false) { //检查生成签名参数

throw new SDKRuntimeException("生成签名参数缺失!" . "br");

}

$commonUtil = new CommonUtil();

ksort($this-parameters);

$unSignParaString = $commonUtil-formatQueryParaMap($this-parameters, false);

$md5SignUtil = new MD5SignUtil();

return $md5SignUtil-

sign($unSignParaString,$commonUtil-trimString(PARTNERKEY));

}catch (SDKRuntimeException $e)

{

die($e-errorMessage());

}

}

CURL请求以及发送证书

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

function curl_post_ssl($url, $vars, $second=30,$aHeader=array())

{

$ch = curl_init();

//超时时间

curl_setopt($ch,CURLOPT_TIMEOUT,$second);

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);

//cert 与 key 分别属于两个.pem文件

//请确保您的libcurl版本是否支持双向认证,版本高于7.20.1

curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).DIRECTORY_SEPARATOR.

'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_cert.pem');

curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).DIRECTORY_SEPARATOR.

'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_key.pem');

curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).DIRECTORY_SEPARATOR.

'zhengshu'.DIRECTORY_SEPARATOR.'rootca.pem');

if( count($aHeader) = 1 ){

curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);

}

curl_setopt($ch,CURLOPT_POST, 1);

curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);

$data = curl_exec($ch);

if($data){

curl_close($ch);

return $data;

}

else {

$error = curl_errno($ch);

//echo "call faild, errorCode:$error\n";

curl_close($ch);

return false;

}

}

入口文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

@require "pay.php";

//获取用户信息

$get = $_GET['param'];

$code = $_GET['code'];

//判断code是否存在

if($get=='access_token' !empty($code)){

$param['param'] = 'access_token';

$param['code'] = $code;

$packet = new Packet();

//获取用户openid信息

$userinfo = $packet-_route('userinfo',$param);

if(empty($userinfo['openid'])){

exit("NOAUTH");

}

//调取支付方法

$packet-_route('wxpacket',array('openid'=$userinfo['openid']));

}else{

$packet-_route('userinfo');

}

怎么样使用php仿微信红包分配

红包有很多种,你应该说的那个随机分配金额的那个吧。

不过有什么难点呢,红包不过是一个链接,最简单的,点了以后减掉已经领取的,给个剩下的随机数就好了吧。