微信处理类
来源:互联网 发布:手机淘宝上传宝贝教程 编辑:程序博客网 时间: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
- 微信处理类
- 微信支付--工具类--处理二维码
- 微信处理红包
- 微信退款处理
- 微信开发-Token处理
- 微信防盗链处理
- 微信对账单处理
- 微信支付--工具类--处理XML数据
- 微信开发专题---6微信消息处理
- 关于微信处理模块阅读
- 微信定时长服务,处理思路
- 微信平台下两种消息处理流程
- 微信业务处理:职责链模式
- 微信支付--异步处理支付结果
- PHP 微信 Emoji表情处理
- 微信朋友圈图片处理策略
- 微信新消息,任务栏一闪一闪问题处理
- 微信朋友圈图片处理策略
- 描述指针数组和数组指针的区别
- 使用Spring MVC统一异常处理实战
- Eclipse SVN插件的帐号、密码修改
- 二进制中1的个数
- 最长连续递增子序列
- 微信处理类
- 深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
- Java 枚举7常见种用法
- ABAP实战屏幕SCREEN设计(二)
- 强悍的 ubuntu —— 配置开机启动项
- 使用Spring的AOP实现接口方法执行时间记录
- keil .sct分散加载文件及其应用(重点必看)
- linux挂载新磁盘、分区和开机自动挂载
- Android5.0+(Percent 百分比布局)