微信开发之----封装微信红包类

来源:互联网 发布:电脑淘宝怎么延长收货 编辑:程序博客网 时间:2024/05/17 12:03

现在,你过年、过节、生日的时候听得最多的是什么?礼物?money?祝福?相信你已经猜到了,我要红包。OK,微信红包已经是彻底的融入到了我们的日常生活中。那对于我们程序开发人员来说,了解红包的发放机制就显得十分重要了。红包的发放可以网页发放同样也可以手机发放(其实两者都是调用了红包接口,本质上没有什么大的差别),今天我们要了解的就是开发者模式下的红包发放。

关于微信红包的详细理论介绍我在这里就不累述了,我今天主要是讲微信红包的一个类接口,通过该类接口的调用就可以实现红包的发放。

废话少说,下面直接上代码。

<?phpheader("Content-type: text/html; charset=utf-8");/* * 现金红包类  *  */class Common_util_pub{/*** hbname 红包名称 *  fee 红包金额 /元  *  body 内容 *  openid 微信用户id* @return*/public function sendhongbaoto($arr){$data['mch_id'] = '自己填-------------------------';<span style="font-family: Arial, Helvetica, sans-serif;">//微信商户id</span>$data['mch_billno'] = $data['mch_id'].date("Ymd",time()).date("His",time()).rand(1111,9999); //随机字符串$data['nonce_str'] = self::createNoncestr();$data['re_openid'] = $arr['openid'];//微信用户id$data['wxappid'] = '自己填-------------------------';//开发者账号$data['nick_name'] = $arr['hbname'];//昵称$data['send_name'] = $arr['hbname'];//真实姓名$data['total_amount'] = $arr['fee']*100;//红包金额  $data['min_value'] = $arr['fee']*100;//在这里要说明一下,微信红包至少1元$data['max_value'] = $arr['fee']*100;$data['total_num'] = 1;//红包数量$data['client_ip'] = $_SERVER['REMOTE_ADDR'];//ip地址$data['act_name'] = '测试活动';$data['remark'] = '备注一下';$data['wishing'] = $arr['body'];if(!$data['re_openid']) { $rearr['return_msg']='缺少用户openid'; return $rearr;}$data['sign'] = self::getSign($data);$xml = self::arrayToXml($data);$url ="https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";//微信红包发放接口$re = self::wxHttpsRequestPem($xml,$url);$rearr = self::xmlToArray($re);return  $rearr;}/*** 函数用途描述* @date: 2016-9-4 下午4:03:34* @author: ydm* @param: $value* @return:*/function trimString($value){$ret = null;if (null != $value) {$ret = $value;if (strlen($ret) == 0) {$ret = null;}}return $ret;}/** * 作用:产生随机字符串,不长于32位 */public function createNoncestr( $length = 32 ) {$chars = "abcdefghijklmnopqrstuvwxyz0123456789";  $str ="";for ( $i = 0; $i < $length; $i++ )  {  $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);  }  return $str;}/** * 作用:格式化参数,签名过程需要使用 */function formatBizQueryParaMap($paraMap, $urlencode){$buff = "";ksort($paraMap);foreach ($paraMap as $k => $v){    if($urlencode)    {   $v = urlencode($v);}$buff .= $k . "=" . $v . "&";}$reqPar="";if (strlen($buff) > 0) {$reqPar = substr($buff, 0, strlen($buff)-1);}return $reqPar;}/** * 作用:生成签名 */public function getSign($Obj){foreach ($Obj as $k => $v){$Parameters[$k] = $v;}//签名步骤一:按字典序排序参数ksort($Parameters);$String = $this->formatBizQueryParaMap($Parameters, false);//签名步骤二:在string后加入KEY$String = $String."&key="."自己填-------------------------商户key";//签名步骤三:MD5加密$String = md5($String);//签名步骤四:所有字符转为大写$result_ = strtoupper($String);return $result_;}/** * 作用:array转xml */    publicfunction 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;     }/** * 作用:将xml转为array */public function xmlToArray($xml){        //将XML转为array                $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $array_data;}  /**  * 微信请求  * @param  $vars 要发送的数据  * @param  $url 要请求的url地址  * @param  $second 超时时间  * @return 成功、失败  */    public function wxHttpsRequestPem( $vars,$url, $second=30,$aHeader=array()){        $ch = curl_init();//curl初始化       /* 设置curl参数*/       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);       curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');       curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).'/hongbao/apiclient_cert.pem');       curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');       curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).'/hongbao/apiclient_key.pem');       curl_setopt($ch,CURLOPT_CAINFO,'PEM');       curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/hongbao/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);//执行url请求,发送相应的数据 返回结果       if($data){            curl_close($ch);//关闭连接            return $data;        }       else {          $error = curl_errno($ch);         echo "call faild, errorCode:$error\n";          curl_close($ch);         return false;       }     }}?>

OK,上面已经定义了红包类,我们只需要实例化红包发放类就可以现在红包的制定发放。

在这里,我要说明以下几点

(1)我们这里是通过程序实现的红包发放,需要具有微信商户平台账号,且开启了相应功能

(2)红包发放需要CA证书,需要在微信商户平台上下载并放置到正确的目录下。

(3)微信红包发放接口是post请求,我们需要借助php的内置函数crul完成url请求以及响应

0 0
原创粉丝点击