php微信公众帐号发送红包

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: 小 | 中 | 大 | 超大  

开发框架为we7

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

<?php/**

* 微信红包的类

**/CLASSWXHongBao {PRivate$mch_id= "111111";//商户ID写死private$wxappid= "22222222";//微信公众号,写死private$client_ip= "119.29.80.114";//调用红包接口的主机的IP,服务端IP,写死,即脚本文件所在的IPprivate$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= "";//接收方的openIDprivate$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";

}publicfunctionerr(){return$this->error;

}publicfunctionerror(){return$this->err();

}/**

* WXHongBao::newhb()

* 构造新红包

* @param mixed $toOpenId

* @param mixed $amount 金额分

* @return void*/publicfunctionnewhb($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*/publicfunctionsend($url= "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack",$total_num= 1){if(!$this->wxhb_inited){$this->error .= "(红包未准备好)";returnfalse;//未初始化完成}$this->total_num =$total_num;$this->gen_Sign();//生成签名

//构造提交的数据$xml=$this->genXMLParam();//debugfile_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'){returntrue;

}else{$this->error =$rsxml->return_msg;returnfalse;

}

}else{$this->error = curl_errno($ch);

curl_close($ch);returnfalse;

}

}/**

* WXHongBao::sendGroup()

* 发送裂变红包,参数为裂变数量

* @param integer $num 3-20

* @return*/publicfunctionsendGroup($num=3){$this->amt_type = "ALL_RAND";//$amt; 固定值。发送裂变红包组文档指定参数,随机return$this->send($this->api_hb_group,$num);

}publicfunctiongetApiSingle(){return$this->api_hb_single;

}publicfunctiongetApiGroup(){return$this->api_hb_group;

}publicfunctionsetNickName($nick){$this->nick_name =$nick;

}publicfunctionsetSendName($name){$this->send_name =$name;

}publicfunctionsetWishing($wishing){$this->wishing =$wishing;

}/**

* WXHongBao::setActName()

* 活动名称

* @param mixed $act

* @return void*/publicfunctionsetActName($act){$this->act_name =$act;

}publicfunctionsetRemark($remark){$this->remark =$remark;

}publicfunctionsetOpenId($openid){$this->re_openid =$openid;

}/**

* WXHongBao::setAmount()

* 设置红包金额

* 文档有两处冲突描述

* 一处指金额 >=1 (分钱)

* 另一处指金额 >=100 < 20000 [1-200元]

* 有待测试验证!

* @param mixed $price 单位 分

* @return void*/publicfunctionsetAmount($price){$this->total_amount =$price;$this->min_value =$price;$this->max_value =$price;

}//以下方法,为设置分裂红包时使用publicfunctionsetHBminmax($min,$max){$this->min_value =$min;$this->max_value =$max;

}publicfunctionsetShare($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;

}privatefunctiongen_nonce_str(){$this->nonce_str =strtoupper(md5(mt_rand().time()));//确保不重复而已}privatefunctiongen_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($paramas$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*/publicfunctiongenXMLParam(){$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*/privatefunctiongen_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=newWXHongBao();

$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"红包发送成功";

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有