开发框架为we7

所需参数:appid,appSecret,MchId,API密钥

<?php
/**
* 微信红包的类
*
*/ CLASS WXHongBao { private $mch_id = "111111";//商户ID写死
private $wxappid = "22222222";//微信公众号,写死
private $client_ip = "119.29.80.114"; //调用红包接口的主机的IP,服务端IP,写死,即脚本文件所在的IP
private $apikey = "33333333";//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_type; //分裂红包参数,在sendgroup中进行定义,是常量 ALL_RAND //证书,在构造函数中定义,注意!
private $apiclient_cert; //= getcwd()."/apiclient_cert.pem";
private $apiclient_key;// = getcwd()."/apiclient_key.pem"; //分享参数
private $isShare = false; //有用?似乎是无用参数,全部都不是必选和互相依赖的参数
private $share_content = "";
private $share_url ="";
private $share_imgurl = ""; private $wxhb_inited; private $api_hb_group = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";//裂变红包
private $api_hb_single = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; private $error = "ok"; //init /**
* WXHongBao::__construct()
* 步骤
* new(openid,amount)
* setnickname
* setsend_name
* setwishing
* setact_name
* setremark
* send()
* @return void
*/
function __construct(){
//好像没有什么需要构造函数做的
$this->wxhb_inited = false;
$this->apiclient_cert = getcwd()."/apiclient_cert.pem";
$this->apiclient_key = getcwd()."/apiclient_key.pem";
} public function err(){
return $this->error;
}
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 = "金额参数错误";
return;
}elseif($amount<100){
$this->error = "金额太小";
return;
}elseif($amount>20000){
$this->error = "金额太大";
return;
} $this->gen_nonce_str();//构造随机字串
$this->gen_mch_billno();//构造订单号
$this->setOpenId($toOpenId);
$this->setAmount($amount);
$this->wxhb_inited = true; //标记微信红包已经初始化完毕可以发送 //每次new 都要将分享的内容给清空掉,否则会出现残余被引用
$this->share_content= "";
$this->share_imgurl = "";
$this->share_url = "";
} /**
* WXHongBao::send()
* 发出红包
* 构造签名
* 注意第二参数,单发时不要改动!
* @return boolean $success
*/
public function send($url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack",$total_num = 1){ if(!$this->wxhb_inited){
$this->error .= "(红包未准备好)";
return false; //未初始化完成
} $this->total_num = $total_num; $this->gen_Sign(); //生成签名 //构造提交的数据
$xml = $this->genXMLParam(); //debug
file_put_contents("hbxml.txt",$xml); //提交xml,curl
//$url = "https://api.mch.weixin.qq.com/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' ){
return true;
}else{
$this->error = $rsxml->return_msg;
return false;
} }else{
$this->error = curl_errno($ch); curl_close($ch);
return false;
} } /**
* WXHongBao::sendGroup()
* 发送裂变红包,参数为裂变数量
* @param integer $num 3-20
* @return
*/
public function sendGroup($num=3){
$this->amt_type = "ALL_RAND";//$amt; 固定值。发送裂变红包组文档指定参数,随机
return $this->send($this->api_hb_group,$num);
} public function getApiSingle(){
return $this->api_hb_single;
} public function getApiGroup(){
return $this->api_hb_group;
} public function setNickName($nick){
$this->nick_name = $nick;
} public function setSendName($name){
$this->send_name = $name;
} public function setWishing($wishing){
$this->wishing = $wishing;
} /**
* WXHongBao::setActName()
* 活动名称
* @param mixed $act
* @return void
*/
public function setActName($act){
$this->act_name = $act;
} public function setRemark($remark){
$this->remark = $remark;
} public function setOpenId($openid){
$this->re_openid = $openid;
} /**
* WXHongBao::setAmount()
* 设置红包金额
* 文档有两处冲突描述
* 一处指金额 >=1 (分钱)
* 另一处指金额 >=100 < 20000 [1-200元]
* 有待测试验证!
* @param mixed $price 单位 分
* @return void
*/
public function setAmount($price){
$this->total_amount = $price;
$this->min_value = $price;
$this->max_value = $price;
}
//以下方法,为设置分裂红包时使用
public function setHBminmax($min,$max){
$this->min_value = $min;
$this->max_value = $max;
} public function setShare($img="",$url="",$content=""){ //https://mmbiz.qlogo.cn/mmbiz/MS1jaDO92Ep4qNo9eV0rnItptyBrzUhJqT8oxSsCofdxibnNWMJiabaqgLPkDaEJmia6fqTXAXulKBa9NLfxYMwYA/0?wx_fmt=png
//http://mp.weixin.qq.com/s?__biz=MzA5Njg4NTk3MA==&mid=206257621&idx=1&sn=56241da30e384e40771065051e4aa6a8#rd
$this->share_content = $content;
$this->share_imgurl = $img;
$this->share_url = $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_name;// if($this->total_num==1){ //这些是裂变红包用不上的参数,会导致签名错误
$param["client_ip"]=$this->client_ip;
$param["max_value"]=$this->max_value;
$param["min_value"]=$this->min_value;
$param["nick_name"]=$this->nick_name;
} $param["mch_billno"] = $this->mch_billno; //
$param["mch_id"]=$this->mch_id;//
$param["nonce_str"]=$this->nonce_str; //
$param["re_openid"]=$this->re_openid;//
$param["remark"]=$this->remark; //
$param["send_name"]=$this->send_name;//
$param["total_amount"]=$this->total_amount;//
$param["total_num"]=$this->total_num; //
$param["wishing"]=$this->wishing;//
$param["wxappid"]=$this->wxappid;// if($this->share_content) $param["share_content"] = $this->share_content;
if($this->share_imgurl) $param["share_imgurl"] = $this->share_imgurl;
if($this->share_url) $param["share_url"] = $this->share_url; if($this->amt_type) $param["amt_type"] = $this->amt_type; // ksort($param); //按照键名排序...艹,上面排了我好久 //$sign_raw = http_build_query($param)."&key=".$this->apikey;
$sign_raw = "";
foreach($param as $k => $v){
$sign_raw .= $k."=".$v."&";
}
$sign_raw .= "key=".$this->apikey; //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>"; return $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").$rndstr;
}
}    
?> 然后实例化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(); }else{ echo "红包发送成功"; }

php微信公众帐号发送红包的更多相关文章

  1. [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)

    我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是怎样在微信公众平台使用QQ表情, ...

  2. [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收

    我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是如何在微信公众平台使用QQ表情, ...

  3. SQLSERVER走起微信公众帐号全新改版 全新首页

    SQLSERVER走起微信公众帐号全新改版 全新首页 今天,SQLSERVER走起微信公众帐号增加了首页功能 虽然还是订阅号,不过已经对版面做了比较大的修改,希望各位亲用得放心.用得安心O(∩_∩)O ...

  4. SSH框架构建微信公众帐号服务器小技巧

    SSH框架构建微信公众帐号服务器小技巧 熟悉struts2和servlet的同学应该清楚,struts2的方法多样性弥补了servlet单一的doGet 和doPost方法.如果自己的公众账号服务器是 ...

  5. 欢迎大家关注我的微信公众帐号小q机器人(xiaoqrobot)(转)

    一个偶然的机会让我接触到了微信公众平台,赶紧加了几个交流群了解下相关情况,突然间发现好像全部的APP开发人员都在研究微信公众帐号的开发,而我显得有些落舞了.至于为什么热度会这么高,我想一个数字足以说明 ...

  6. 【php学习之路】微信公众帐号

          上个月开始学习php,算上中间放假的时间差不多有一个月了.这段时间呢,每天上班没事的时候不慌不忙的看下php,刚开始也只是看下php中文手册,看完一遍好像没什么感觉.于是就想啊,做个什么东 ...

  7. SQLSERVER走起微信公众帐号已经开通搜狗微信搜索

    SQLSERVER走起微信公众帐号已经开通搜狗微信搜索 请打开下面链接 http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM ...

  8. [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)

    引言及内容概要 距离写上一篇文章<自定义菜单的创建及菜单事件响应>整整过了两个月的时间,那时公众平台还没有开放view类型的菜单.在不久前,微信公众平台悄悄开放了view类型的菜单,却没有 ...

  9. 微信公众帐号开发。大家是用框架还是自己写的流程。现在遇到若干问题。请教各路大仙 - V2EX

    微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙 - V2EX 微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙

随机推荐

  1. 字符串分割与数组的分割 split()VSsplice()&slice()

    一.作用对象 1.split()方法是对字符串的操作:splice()和slice()是对数组的操作.slice()也可用于字符串. 二.参数 1.split(separator,howmany) 参 ...

  2. nginx之依据IP做限制

    环境如下: [root@localhost ~]# cat /etc/issueCentOS release 6.5 (Final)Kernel \r on an \m[root@localhost ...

  3. python bottle 框架开发任务管理系统 V_1.0版

    经过1-2个星期的开发,现在开发了个半成品(UI现在比较烂,因为我的前端本来就很差,将就下吧),大概功能如下:用户功能(添加.删除.修改),添加部门功能,任务管理功能(添加.删除.修改,详细).项目管 ...

  4. 【转】arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别

    原文网址:http://www.veryarm.com/296.html 命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch - 体系架 ...

  5. plsql在64位机器下读取tnsname.ora 及oracle_home异常的解决办法

    问题是: 我在自己电脑(win7  64bit)上安装了oracle的64位数据库   通过sqlplus能正常连接 主要是安装pl/sql时   我是这样安装的1.在网上下载了个instantcli ...

  6. Contains Duplicate II 解答

    Question Given an array of integers and an integer k, find out whether there are two distinct indice ...

  7. hdu 4502 吉哥系列故事——临时工计划_简单dp

    题意:        俗话说一分钱难倒英雄汉,高中几年下来,吉哥已经深深明白了这个道理,因此,新年开始存储一年的个人资金已经成了习惯,不过自从大学之后他不好意思再向大人要压岁钱了,只能把唯一的希望放到 ...

  8. 关于 Private strand flush not complete

    网友发来告警日志,原本是关于一个死锁的情形,而另外的一个问题则是从redo log buffer写出到redo log file出现了不能分配新的日志,Private strand flush not ...

  9. OpenRisc-45-or1200的ID模块分析

    引言 之前,我们分析了or1200流水线的整体结构,也分析了流水线中IF级,EX级,本小节我们来分析ID(insn decode)级的一些细节. 1,基础 or1200的pipeline的ID阶段包含 ...

  10. 对Linux 专家非常有用的20 个命令

    谢谢你你给了我们在这篇文章前两个部分的喜欢,美言和支持.在第一部分文章中我们讨论了那些都只是切换到 Linux 和linux新手所需的必要知识的用户的命令. 对 Linux 新手非常有用的 20 个命 ...