微信处理类

来源:互联网 发布:手机淘宝上传宝贝教程 编辑:程序博客网 时间:2024/05/17 14:29

这个类是用来配合上面 微信消息类的


require_once __DIR__.'/message.php';/** * Class Weixin * 与微信通讯的类 */class Weixin extends Base{    //公众号APPID    public $appid;    /**     * @var SRow     */    public $row;    /**     * 构造方法     * Weixin constructor.     * @param $appid string 公众号的APPID     */    public function __construct($appid)    {        $this->appid=$appid;        $this->row=MPublicNumber::row公众号信息($appid);    }    /**     * 从微信 更新Token     * @return bool     */    private function updateToken(){        $appId=$this->appid;        $secret=$this->row['AppSecret'];        //请求微信获取TOKEN的接口        $ret = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appId . '&secret=' . $secret);        //请求失败        if (!$ret) {            return false;        }        //请求成功,解码        $decode = json_decode($ret);        $token = $decode->access_token;        //获取失败        if (!$token) {            return false;        }        MPublicNumber::update访问令牌($appId,$token);        //返回新的TOKEN        return $token;    }    /**     * 获取一个Token,如果需要,更新Token     * @return bool     */    private function token(){        //从数据库中取TOKEN        $token = $this->row['AccessToken'];        // 小于微信规定的7200秒时间间隔,则返回当前access token,否则从微信服务器读取新的AccessToken,并记录到本地        //预留30秒冗余        if (time() - strtotime($this->row['AccessToken更新时间']) < 7200 - 30) {            //正常返回            return $token;        }        return self::updateToken();    }    /**     * 从微信获取一个用户的信息     * @param $openId     * @return SimpleXMLElement     */    public function userinfo($openId){        //微信 API Token        $token = $this->token();        //获取个人信息        $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" . $token . "&openid=$openId&lang=zh_CN";        $vsInfo = self::call($url);        if (!$vsInfo) {            return false;        }        //返回个人信息        return json_decode($vsInfo);    }    /**     * 使用CURL访问一个链接     * @param $url     * @param bool $params     * @param array $header     * @return mixed     */    static private function curl($url, $params = false, $header = array()){        $ch = curl_init();        curl_setopt_array($ch,array(            CURLOPT_POST=>1,            CURLOPT_CONNECTTIMEOUT=> 60,            CURLOPT_RETURNTRANSFER=> 1,            CURLOPT_FOLLOWLOCATION=> 1,            CURLOPT_SSL_VERIFYPEER=>FALSE,            CURLOPT_HTTPGET=>true,            CURLOPT_TIMEOUT=>30,            CURLOPT_USERAGENT=>'Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0',            CURLOPT_URL=>$url,            CURLOPT_HTTPHEADER=> $header        ));        if($params !== false){ curl_setopt($ch, CURLOPT_POSTFIELDS , $params);}        $result = curl_exec($ch);        curl_close($ch);        return $result;    }    /**     * 通常的调用微信接口,会自动更新Token     * @param $url     * @param array $data     * @return bool|mixed     */    private function call($url,$data=array()){        $r = self::curl($url,$data);        if(strstr($r,'access_token is invalid')){            $token = self::updateToken();            $url=preg_replace('/([\?&]access_token=)([^&]+)(&.*)?/','$1'.$token.'$3',$url);            //再次调用            $r = self::curl($url,$data);        }        return $r;    }    /**     * 构造一个鉴权链接     * @param $url string 跳转地址,不要带参数,没用,不会传递的     * @param $state string 这个会传递给跳转地址     * @return string     */    private function transmit($url,$state){        return "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appid}&redirect_uri={$url}&response_type=code&scope=snsapi_base&state={$state}#wechat_redirect";    }    /**     * 构造一个菜单地址,使用鉴权链接     * @param $controller string 控制器名称     * @param $p1 string 具体应用的参数     * @param $p2 string 具体应用的参数     * @param $p3 string 具体应用的参数     * @param $p4 string 具体应用的参数     * @param $p5 string 具体应用的参数     * @return string     */    public function transmitUrl($controller,$p1=null,$p2=null,$p3=null,$p4=null,$p5=null){        $url=urlencode(G_WX_ROUTE_PAGE);        $state=implode('~',[ $this->appid,$controller,$p1,$p2,$p3,$p4,$p5]);        return $this->transmit($url,$state);    }    /**     * 验证请求是否来自微信     * @param $signature     * @param $timestamp     * @param $nonce     * @return bool     */    public  function verify($signature, $timestamp, $nonce)    {        $token = $this->token();        $tmpArr = array($token, $timestamp, $nonce);        sort($tmpArr, SORT_STRING);        $tmpStr = implode($tmpArr);        $tmpStr = sha1($tmpStr);        return $tmpStr == $signature ;    }    /**     * 发送消息     * @param MsgSend $msg 消息对象     * @return mixed     */    public function send(MsgSend $msg){        Ice::log('weixin-send',$msg,'msg');        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$this->token();        $ret =$this->call($url,$msg->toJson());        $jsonRet=json_decode($ret);        if($jsonRet and isset($jsonRet->errcode) and $jsonRet->errcode=='0') {            MPublicNumber::add消息发送记录成功($msg, $this->appid);        }else{            MPublicNumber::add消息发送记录失败($msg, $this->appid,$ret);        }        return $ret;    }    /**     * 发送模板消息     * @param $templateId string 模板ID     * @param $openid     * @param array $data     * @return mixed     */    public function template($templateId, $openid, array $data){        $url='https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$this->token();        $cont=json_encode(array(            'touser'=>$openid,            'template_id'=>$templateId,            'url'=>'',            'data'=>$data        ),JSON_UNESCAPED_UNICODE);        $ret=self::call($url,$cont);        $json=json_decode($ret);        return $json->msgid;    }    /**     * 设置公众号的菜单     * @param array $menu     * @return bool|mixed     */    public function menu(array $menu){        $url="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$this->token();        return $this->call($url,json_encode($menu,JSON_UNESCAPED_UNICODE));    }    /**     * 根据Code获取用户的openid,在鉴权链接之后进行     * @param $code     * @return mixed     */    public function getOpenID($code){        $appid=$this->appid;        $secret=$this->row['AppSecret'];        $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$secret}&code={$code}&grant_type=authorization_code";        $ret=self::curl($url);        $json=json_decode($ret);        return $json->openid;    }    /**     * 获取返回消息的XML,此时补充From     * @param MsgReply $reply     * @return string     */    public function reply(MsgReply $reply){        $reply->FromUserName=$this->row['公众号oid'];        return $reply->toXML();    }    /**     * 常用的方法,静态化, 生成一条回复给某人的文本消息     * @param $appid string  公众号APPID     * @param $ToUserName string 用户的OPENID     * @param $content string 要回复的文本消息     * @return string     */    static public function replyText($appid,$ToUserName,$content){        //构造一个微信对象,使用指定的公众号        $class=new self($appid);        //构造回复用的文本消息        $msg=new MsgReplyText($content);        //指定回复用户        $msg->ToUserName=$ToUserName;        //生成回复内容(XML)        return $class->reply($msg);    }    /**     * 从微信方获取二维码     * @param $scene_id string 场景ID     * @param $permernent bool 是否永久     * @return bool|mixed     */    public function qrCode($scene_id, $permernent){        $token = $this->token();        if ($permernent) {            //永久            $data=json_encode(array(                'action_name'=>'QR_LIMIT_STR_SCENE',                'action_info'=>array(                    'scene'=>array(                        'scene_str'=>$scene_id,                    )                )            ));        } else {            //临时            $data=json_encode(array(                'expire_seconds'=>36000,                'action_name'=>'QR_SCENE',                'action_info'=>array(                    'scene'=>array(                        'scene_id'=>$scene_id,                    )                )            ));        }        $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' . $token;        $ret= self::call($url, $data);        return $ret;    }    /**     * 常用的方法,向一个指定用户发送文本消息     * @param $appid string 公众号APPID     * @param $ToUserName string 目标用户名     * @param $content string 发送的文本内容     * @return mixed     */    static public function sendText($appid,$ToUserName,$content){        /* @var $class Weixin*/        $class=new self($appid);        $msg=new MsgSendText($ToUserName,$content);        return $class->send($msg);    }    /**     * 发送一条带链接的消息     * @param $appid string 公众号APPID     * @param $ToUserName string 目的用户OPENID     * @param $title string 消息标题     * @param $content string 消息内容     * @param $url string URL地址(点击跳转)     * @param $picurl string 图片地址     * @return bool|mixed     */    static public function sendHref($appid,$ToUserName,$title,$content,$url,$picurl=''){        /* @var $class Weixin*/        $class=new self($appid);        $item=new MsgSendNewsItem($title,$content,$url,$picurl);        $msg=new MsgSendNews($ToUserName,array($item));        return $class->send($msg);    }    /**     * 上传媒体文件     * @param string $type  文件类型     * @param $fileName string 本地文件名     * @return bool|string 媒体编号     */    public function uploadTemporary($fileName,$type='image'){        $token = $this->token();        $url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={$token}&type={$type}";        $result = self::call($url, array('filename'=>'@'.$fileName));        $obj = json_decode($result);        if ($obj->media_id) {            return $obj->media_id;        }        return false;    }    /**     * 下载临时素材     * @param $media_id string 素材编号     * @return string 文件内容     */    public function downloadTemporary($media_id){        $token=$this->token();        $url="https://api.weixin.qq.com/cgi-bin/media/get?access_token={$token}&media_id={$media_id}";        $result=self::call($url);        return $result;    }    /**     * 上传永久素材     * @param $fileName string 文件名     * @param $title string 标题     * @param $introduce string 简介     * @param string $type string 文件类型     * @return mixed 对象,其中包括url,media_id     */    public function uploadPermanent($fileName,$title,$introduce,$type='image'){        $token=$this->token();        $url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={$token}&type={$type}";        $result = self::call($url, array(            'media'=>'@'.$fileName,            'description'=>json_encode(array('title'=>$title,'introduce'=>$introduce))        ));        return json_decode($result);    }    /**     * 上传永久图文素材     * @param MaterialNews $news     * @return mixed     */    public function uploadPermanentNews(MaterialNews $news){        $token=$this->token();        $url="https://api.weixin.qq.com/cgi-bin/material/add_news?access_token={$token}";        $result=self::call($url,$news->toJSON());        return $result->media_id;    }    /**     * 从微信获取二维码图片     * @param $ticket string 二维码的TICKET     * @return mixed 图片内容     */    static function qrcodeDownload($ticket)    {        $url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' . urlencode($ticket);        $ch = curl_init($url);        curl_setopt($ch, CURLOPT_HEADER, 0);        curl_setopt($ch, CURLOPT_NOBODY, 0);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        $pkg = curl_exec($ch);        curl_close($ch);        return $pkg;    }    public function curl_post_ssl($vars, $second=30,$aHeader=array())    {        $url="https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";        $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);        curl_setopt($ch,CURLOPT_SSLCERT,'./zhengshu/apiclient_cert.pem');        curl_setopt($ch,CURLOPT_SSLKEY,'./zhengshu/apiclient_key.pem');//    curl_setopt($ch,CURLOPT_CAINFO,"./zhengshu/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);        if($data){            curl_close($ch);            return $data;        }        else {            $error = curl_errno($ch);            echo "call faild, errorCode:$error\n";            curl_close($ch);            return false;        }    }    /**     * 发送红包     * @param $keyPath string 证书的物理路径     * @param $appid string 微信公众号的APPID     * @param $openID string 用户的OPENID     * @param $mch_id string 商户编号     * @param $send_name string 商户名称     * @param $amount int 金额(元)     * @param $wishing string 祝福语     * @param $act_name string 活动名称     * @param $remark string 备注     * @param $key string 密钥     * @return bool|mixed     */    public static function sendRedPack($keyPath,$appid,$openID,$mch_id,$send_name,$amount,$wishing,$act_name,$remark,$key){        $xml=self::redPackXML($appid,$openID,$mch_id,$send_name,$amount,$wishing,$act_name,$remark,$key);        $url="https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";        $ch = curl_init();        //超时时间        curl_setopt($ch,CURLOPT_TIMEOUT,30);        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_SSLCERT,$keyPath.'/apiclient_cert.pem');        curl_setopt($ch,CURLOPT_SSLKEY,$keyPath.'/apiclient_key.pem');        curl_setopt($ch,CURLOPT_POST, 1);        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);        $data = curl_exec($ch);        if($data){            curl_close($ch);            return $data;        }        $error = curl_errno($ch);        echo "call faild, errorCode:$error\n";        curl_close($ch);        return false;    }    /**     * 查询红包状态     * @param $keyPath string 证书的物理路径     * @param $mch_billno string 商户发放红包的商户订单号     * @param $mch_id string 微信支付分配的商户号     * @param $appid string 微信公众号的APPID     * @param $bill_type string 商通过商户订单号获取红包信息名称     * @return bool|mixed     */    public static function getHBInFo($keyPath,$mch_billno,$mch_id,$appid,$bill_type){        $xml=self::HBInFoXML($mch_billno,$mch_id,$appid,$bill_type);        $url="https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo";        $ch = curl_init();        //超时时间        curl_setopt($ch,CURLOPT_TIMEOUT,30);        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_SSLCERT,$keyPath.'/apiclient_cert.pem');        curl_setopt($ch,CURLOPT_SSLKEY,$keyPath.'/apiclient_key.pem');        curl_setopt($ch,CURLOPT_POST, 1);        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);        $data = curl_exec($ch);        if($data){            curl_close($ch);            return $data;        }        $error = curl_errno($ch);        echo "call faild, errorCode:$error\n";        curl_close($ch);        return false;    }    private static function redPackXML($appid,$openID,$mch_id,$send_name,$amount,$wishing,$act_name,$remark,$key){        $商户订单号 = $mch_id.date('Ymd').rand(1000000000,9999999999);        $nonce_str = STool::randomString(30);        $data=[            'act_name'=>$act_name,            'client_ip'=>STool::getServerHost(),            'mch_billno'=>$商户订单号,            'mch_id'=>$mch_id,            'nonce_str'=>$nonce_str,            're_openid'=>$openID,            'remark'=>$remark,            'send_name'=>$send_name,            'total_amount'=>$amount,            'total_num'=>1,            'wishing'=>$wishing,            'wxappid'=>$appid,        ];        ksort($data);        Ice::log('weixinhongbao',$data,'data');        $sign = strtoupper(md5(http_build_query(array_merge($data,['key'=>$key]))));        return '<xml>'.cdatas(array_merge($data,['sign'=>$sign])).'</xml>';    }    private static function HBInFoXML($mch_billno,$mch_id,$appid,$bill_type){        $nonce_str = STool::randomString(30);        $data=[            'mch_billno'=>$mch_billno,            'mch_id'=>$mch_id,            'appid'=>$appid,            'bill_type'=>$bill_type,            'nonce_str'=>$nonce_str,        ];        asort($data);        $sign = strtoupper(md5(http_build_query($data)));        return '<xml>'.cdatas(array_merge($data,['sign'=>$sign])).'</xml>';    }}

0 0
原创粉丝点击