上一文《微信服务号红包发放》写得太过仓促,所以把接口实现的方式分开到此文中。下文直接给出代码,看不懂的,看完不知道怎么用的请绕道。
<?php /* 微信发放红包 */ /* V 1.0 */ /* by tiandi */ /* www.tiandiyoyo.com */ /* 2015.3.5 */ define("APIKEY",""); //微信现金红包api key define("PATHCERT",""); //cert存放位置,不放在网站下 define("PATHKEY",""); //key存放位置,不放在网站下 define("PATHCA",""); //ca存放位置,不放在网站下 class wxhb { var $para; function wxhb() { } function __construct() { } function set_para($key,$value){ $this->para[$key] = $value; } function create_noncestr( $length = 24 ) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str =""; for ( $i = 0; $i < $length; $i++ ) { $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str; } function check_sign_para(){ if($this->para["nonce_str"] == null || $this->para["mch_billno"] == null || $this->para["mch_id"] == null || $this->para["wxappid"] == null || $this->para["nick_name"] == null || $this->para["send_name"] == null || $this->para["re_openid"] == null || $this->para["total_amount"] == null || $this->para["max_value"] == null || $this->para["total_num"] == null || $this->para["wishing"] == null || $this->para["client_ip"] == null || $this->para["act_name"] == null || $this->para["remark"] == null || $this->para["min_value"] == null ) { return false; } return true; } function create_sign(){ if($this->check_sign_para() == false) { echo "签名参数错误!"; } ksort($this->para); $tempsign = ""; foreach ($this->para as $k => $v){ if (null != $v && "null" != $v && "sign" != $k) { $tempsign .= $k . "=" . $v . "&"; } } $tempsign = substr($tempsign, 0, strlen($tempsign)-1); //去掉最后的& $tempsign .="&key=". APIKEY; //拼接APIKEY return strtoupper(md5($tempsign)); } function create_xml(){ $this->set_para('sign', $this->create_sign()); return $this->ArrayToXml($this->para); } function ArrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) { if (is_numeric($val)) { $xml.="<".$key.">".$val."</".$key.">"; } else $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; } $xml.= "</xml>"; return $xml; } function curl_post_ssl($url, $vars, $second=30) { $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文件 curl_setopt($ch,CURLOPT_SSLCERT,PATHCERT); curl_setopt($ch,CURLOPT_SSLKEY,PATHKEY); curl_setopt($ch,CURLOPT_CAINFO,PATHCA); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); 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); curl_close($ch); return false; } } }
使用时调用,并配置参数。
define("APPID",""); //公众号 define('MCHID', ""); //商户号 $money = 100; $mch_billno = MCHID.date('YmdHis').rand(1000, 9999); //订单号 $act_name = "红包"; //活动名称,没鸟用,目前微信版本里没显示的地方 $wxhb = new wxhb(); $wxhb->set_para("nonce_str", $wxhb->create_noncestr()); //随机字符串 $wxhb->set_para("mch_billno", $mch_billno); //订单号 $wxhb->set_para("mch_id", MCHID); //商户号 $wxhb->set_para("wxappid", APPID); //公众号 $wxhb->set_para("nick_name", '昵称'); //昵称,没鸟用,目前微信版本里没显示的地方 $wxhb->set_para("send_name", '网站名'); //红包发送者名称 $wxhb->set_para("re_openid", $openid); //发放者openid $wxhb->set_para("total_amount", $money); //付款金额,单位分 $wxhb->set_para("min_value", $money); // 最小红包金额,单位分 $wxhb->set_para("max_value", $money); // 最大红包金额,单位分 $wxhb->set_para("total_num", 1); //红包发放总人数 $wxhb->set_para("wishing", '恭喜恭喜!'); //红包祝福诧 $wxhb->set_para("client_ip", ''); //调用接口的机器 Ip 地址 $wxhb->set_para("act_name", $act_name); //活动名称 //下面的都没鸟用,目前微信版本里没显示的地方 $wxhb->set_para("remark", '');//备注信息 $wxhb->set_para("logo_imgurl", ''); //商户logo的url $wxhb->set_para("share_content", ''); //分享文案 $wxhb->set_para("share_url", ''); //分享链接 $wxhb->set_para("share_imgurl", ''); //分享的图片url $postxml = $wxhb->create_xml(); $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack'; $response = $wxhb->curl_post_ssl($url, $postxml); $responseObj = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA);
部分代码来自微信开发团队的DEMO。
文章评分14次,平均分3.6:★★★☆☆