目录

搜索

内容详情

投稿

0 0

/**

 * 发放红包

 * @author huqinlou

 * @version 2015年8月31日 下午6:46:58

 */

class WechatHongbao{


    public $shop;

    public $param;

    

    public function __construct($shop){

        $this->shop=$shop;

    }

    


    

    /**

     * 发放红包

     * @param $opend_id 用户ID

     * @param $money 红包金额

     * @param $wishing 祝福语

     * @author huqinlou

     * @version 2015年9月6日 下午5:38:20

     */

    public function send($opend_id,$money,$wishing,$act_name){

        //$opend_id='oXb25t15QaqMng5RHQV0uWFvCb6s';        

        $param['nonce_str']=$this->create_noncestr(32);

        $param['mch_billno']=$this->shop['mch_id'].date('Ymd').substr(time(), 5,5).rand(10000,99999);//唯一订单号组成:mch_id+yyyymmdd+10位一天内不能重复的数字

        $param['mch_id']=$this->shop['mch_id'];

        $param['wxappid']=$this->shop['wxappid'];

        $param['send_name']=$this->shop['send_name'];

        $param['re_openid']=$opend_id;

        $param['total_amount']=$money;

        $param['total_num']=1;

        $param['wishing']=$wishing;

        $param['client_ip']='127.0.0.1';

        $param['act_name']=$act_name;

        $param['remark']=$act_name;

        $param['sign']=$this->make_sign($param);

        

        $xml = new \SimpleXMLElement('<xml></xml>');

        self::data2xml($xml, $param);

        $send_xml=$xml->asXML();

        

        $result=$this->curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack', $send_xml);

        $this->param=$param;

        return $result;

    }

    

    

    /**

     * 数据XML编码

     * @param  object $xml  XML对象

     * @param  mixed  $data 数据

     * @param  string $item 数字索引时的节点名称

     * @return string

     */

    public function data2xml($xml, $data, $item = 'item') {

        foreach ($data as $key => $value) {

            /* 指定默认的数字key */

            is_numeric($key) && $key = $item;

            /* 添加子元素 */

            if(is_array($value) || is_object($value)){

                $child = $xml->addChild($key);

                self::data2xml($child, $value, $item);

            } else {

                if(is_numeric($value)){

                    $child = $xml->addChild($key, $value);

                } else {

                    $child = $xml->addChild($key);

                    $node  = dom_import_simplexml($child);

                    $cdata = $node->ownerDocument->createCDATASection($value);

                    $node->appendChild($cdata);

                }

            }

        }

    }

    

   

    

    /**

     * 使用证书post请求

     * @author huqinlou

     * @version 2015年9月2日 下午3:51:45

     */

    public function curl_post_ssl($url, $vars, $second=30,$aHeader=array())

    {

        $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,getcwd().'/../hongbao_cert/'.$this->shop['wxappid'].'/apiclient_cert.pem');

        curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/../hongbao_cert/'.$this->shop['wxappid'].'/apiclient_key.pem');


        //第二种方式,两个文件合成一个.pem文件

        //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.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);

        if($data){

            curl_close($ch);

            return $this->parse_result($data);

        }else{

            $error = curl_errno($ch);

            curl_close($ch);

            return false;

        }

    }

    

    

    /**

     * 解析返回数据

     * @author huqinlou

     * @version 2015年9月6日 下午5:22:52

     */

    public function parse_result($data){

        $xml = new \SimpleXMLElement($data);

        $xml || exit;

        foreach ($xml as $key => $value) {

            $new_data[$key] = strval($value);

        }

        return $new_data;

    }


    

    

    /**

     * 创建随机数

     * @author huqinlou

     * @version 2015年9月6日 下午6:56:55

     */

    public function create_noncestr( $length= 32 ) {

        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";

        $str ="";

        for ( $i = 0; $i < $length; $i++ )  {

            $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);

        }

        return $str;

    }


    

    

    /**

     * 格式化参数格式化成url参数

     * @author huqinlou

     * @version 2015年9月7日 上午11:26:32

     */

    public function to_url_params($param)

    {

        $buff = "";

        foreach ($param as $k => $v)

        {

            if($k != "sign" && $v != "" && !is_array($v)){

                $buff .= $k . "=" . $v . "&";

            }

        }

        $buff = trim($buff, "&");

        return $buff;

    }


    

    

    /**

     * 生成签名

     * @author huqinlou

     * @version 2015年9月7日 上午11:26:40

     */

    public function make_sign($param)

    {

        //签名步骤一:按字典序排序参数

        ksort($param);

        $string = $this->to_url_params($param);

        //签名步骤二:在string后加入KEY

        $string = $string . "&key=".$this->shop['api_key'];

        //签名步骤三:MD5加密

        $string = md5($string);

        //签名步骤四:所有字符转为大写

        $result = strtoupper($string);

        return $result;

    }

    

    

    

    

    

    

    

    

    

    


}