微信红包
一、前言:
这里主要讲述的是微信服务号给关注用户发送微信红包的相关内容;主要使用的业务场景有:1、业务员匆匆销员的奖励;2、现场会议互动抽奖;3、微信推广转发奖励;4、其他等等等,大开脑洞想把.
二、系统业务流程:
发放红包的大致流程:1、用户关注公众号;2、验证并绑定用户,主要是后台系统录入用户姓名手机号等信息,在微信公众号中根据手机短信验证码将用户的openid与后台系统的用户信息绑定;3、用户上传相关凭证;4、后台人工审核;5、发送红包;6、查询发送成果.
以上是大致的流程,但对于不同的业务场景可能有些步骤可以省略或者必要增加步骤;以上主要是针对促销员奖励功能的实际应用步骤.
三、微信红包功能开发步调:
1、申请认证服务号,然后申请微信支付功能:
微信红包功能位置
2、点击产物设置,设置微信红包的参数:
设置微信红包的参数
3、点击开发文档,查看微信红包的相关开发文档,进行开发:
开发文档
四、PHP实现单个红包发送的部门代码:
//微信服务号单个红包发送的功能实现,使用了CI框架,数据库是mysql
//数据表wx_hongbao中存放的是红包待发送队列
protected function _sendsinglehongbao($fid)//$fid是发送队列表wx_hongbao的主键
{
//防止重新发放,只要有状态成果都不再发送,openid不正确的也跳过
$row=$this->db->query("select * from wx_hongbao where fid='".$fid."' and LENGTH(fopenid)>10")->row_array();
if($row['fid']=='')
{
return 'checkerror:红包记录无或红包信息不完整或openid差错';
}
else
{
if($row['fsendresult']!==NULL&&$row['fsendresult']!=='')
return 'checkerror:不克不及重复发送红包';
else
{
$fopenid=$row['fopenid'];
$famt=$row['famt']*100;
$fmemo=$row['fhongbaoname'].'-'.$row['fhongbaomemo'];
}
}
if($famt>20000)
return 'checkerror:单个红包金额不克不及超过200元';
//检查余额限制,wx_balance表中可以扩充类型进行控制,好比对每个用户进行余额限制
$row=$this->db->query("select fbalanceamt from wx_balance")->row_array();
$fbalanceamt=$row['fbalanceamt'];
if(is_numeric($fdeptamt))
{
if($fbalanceamt
return 'checkerror:余额不敷';
}
else
return 'checkerror:余额异常';
//检查当天用户接收红包个数,跨越10个则终止发送
$today=date("Y-m-d");
$starttime=strtotime($today);
$endtime=strtotime($today.' 23:59:59');
$row=$this->db->query("select count(fid) as fcount from wx_hongbao where fopenid='".$fopenid
."' and fsendresult!='返回失败' and fsendtime>".$starttime." and fsendtimerow_array();
$fcount=$row['fcount'];
if($fcount>=10)
{
return 'checkerror:用户当天接收红包超10个';
}
//微信红包api调用发红包
$MCHID='xxxxxxxxxx';//微信支付商户号
$KEY='1ADxxxxxxxxxxxxxxxxxx75C';//本身在微信支付商户后台设置的API密钥
$mch_billno=$MCHID.date("Ymd").substr('000000000'.$fid,-10);//生成订单号
$url='https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';//现金红包哀求地址
$data = array(
'nonce_str' => $this->createNonceStr(),
'mch_billno' =>$mch_billno, //订单号
'mch_id' => $MCHID,
'wxappid' => $this->wx_config['appid'],
'send_name' => 'xxxx',
're_openid' => $fopenid,
'total_amount' => $famt,
'total_num' => 1, //发放送人数
'wishing' => $fmemo, //祝福语
'client_ip' => '61.xxx.xxx.xxx', //调用服务器ip
'act_name' => '员工奖励', //活动名称
'remark' => 'xxxx员工奖励!', //备注
'scene_id' => 'PRODUCT_4', //发放红包使用场景,红包金额大于200时必传
);
//提前更新,防止网络差错造成没有返回信息
$this->db->query("update wx_hongbao set fsendtime=".time().",mch_billno='".$mch_billno."' where fid= ".$fid);
$data['sign'] = $this->sign($data,$KEY);
$result = $this->curl_post_ssl($url, $this->toxml($data));//哀求发送红包
//保留接收到微信回复消息,用于异常问题排查
$filename='sendhongbao'.date ('Ymdh', time () ).'.txt';
$filePath = getcwd()."/uploadfiles/weixinmsg/".$filename;
$myfile = fopen($filePath, "a+") or die("Unable to open file!");
fwrite($myfile, $result."\r\n\r\n");
fclose($myfile);
//处理微信支付返回成果
$result = $this->fromxml($result);
if(!empty($result) && $result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS')
{
$data = array(
'return_msg'=> $result['return_msg'].'_初始状态:发送胜利',
'send_listid' => $result['send_listid'],
'fsendopenid' => $result['re_openid'],
'fsendresult'=>'发送胜利'
);
$this->db->update('wx_hongbao', $data, "fid = ".$fid." and (fsendresult='' or fsendresult is null)");
$data = array(
'fhongbaoid' => $fid,
'famt' => ($famt/100),
'fsendtime' => time(),
'fmemo'=>wxmsg:'.$result['return_msg'].',wxmcno:'.$result['mch_billno']
);
$this->db->insert('wx_log', $data);
return 'success';
}
else
{
$return_msg='失败';
if(strstr($result['return_msg'],"请稍后使用原单号查询发放结果"))//此种情况是微信没有返回结果,但往往发送胜利
$return_msg='稍后查询成果';
$data = array(
'return_msg'=> $result['return_msg'].'_初始状态:'.$return_msg,
'send_listid' => $result['send_listid'],
'fsendopenid' => $result['re_openid'],
'fsendresult'=>$return_msg
);
$this->db->update('wx_hongbao', $data, "fid = ".$fid." and (fsendresult='' or fsendresult is null)");
return 'error:红包发送返回失败';
}
}
备注:对于更多代码功能欢迎交流学习,个人实际应用的项目是实现了匆匆销员的奖励.