2.微信公众号开发:简单封装基本微信基本操作类

<?php
/**
 * 微信公众平台操作类
 */
class WeChat
{
    private $_appid;
    private $_appsecret;
    //微信公众平台请求开发者的服务器需要token
    private $_token;

    //标识qrcodeticket的类型,是永久还是临时
    const QRCODE_TYPE_TEMP = 1;
    const QRCODE_TYPE_TEMP_STR = 2;
    const QRCODE_TYPE_LIMIT = 3;
    const QRCODE_TYPE_LIMIT_STR = 4;

    /**
     * 构造函数
     * @param string $id     appid
     * @param string $secret app秘钥
     */
    public function __construct($id,$secret,$token){
        $this->_appid=$id;
        $this->_appsecret=$secret;
        $this->_token=$token;
    }

    /**
     * 用于第一次验证URl合法性
     */
    public function firstValid(){
        //校验签名的合法性
        if($this->_checkSignature()){
            //签名合法,告知微信服务器
            echo $_GET[‘echostr‘];
        }
    }
    /**
     * 验证签名
     * @return [type] [description]
     */
    private function _checkSignature(){
        //获取由微信服务器发过来的数据
        $signature = $_GET[‘signature‘];
        $timestamp = $_GET[‘timestamp‘];
        $nonce = $_GET[‘nonce‘];
        //开始验证数据
        $tmp_arr =  array($this->_token,$timestamp,$nonce);
        sort($tmp_arr,SORT_STRING);
        $tmp_str = implode($tmp_arr);
        $tmp_str = sha1($tmp_str);
        //对比数据
        if ($signature == $tmp_str) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 消息类型判断
     * @return array
     */
    public function responseMsg()
    {
        //因为很多都设置了register_globals禁止,不能用$GLOBALS["HTTP_RAW_POST_DATA"] 改用file_get_contents("php://input")即可
        $postStr = file_get_contents("php://input");
        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);
            //用户发送的消息类型判断
            switch ($RX_TYPE)
            {
                case "text":    //文本消息
                    return array(‘type‘=>‘text‘,‘msg‘=>‘文本‘,‘obj‘=>$postObj);
                    break;
                case "image":   //图片消息
                    return array(‘type‘=>‘image‘,‘msg‘=>‘图片‘,‘obj‘=>$postObj);
                    break;

                case "voice":   //语音消息
                    return array(‘type‘=>‘voice‘,‘msg‘=>‘语音‘,‘obj‘=>$postObj);
                    break;
                case "video":   //视频消息
                    return array(‘type‘=>‘video‘,‘msg‘=>‘视频‘,‘obj‘=>$postObj);
                    break;
                case "location"://位置消息
                    return array(‘type‘=>‘location‘,‘msg‘=>‘位置‘,‘obj‘=>$postObj);
                    break;
                case "link":    //链接消息
                    return array(‘type‘=>‘link‘,‘msg‘=>‘链接‘,‘obj‘=>$postObj);
                    break;
                default:
                return array(‘type‘=>‘unknow msg type‘,‘msg‘=>‘未知‘,‘obj‘=>$postObj);
                    break;
            }
        }else {
            echo "";
            exit;
        }
    }

    /**
     * 获取 access_tonken值
     * @param string $token_file 用来存储的文件
     * @return access_token
     */
    public function getAccessToken($token_file=‘./access_token‘){
        //处理是否过期问题,将access_token存储到文件
        $life_time = 7200;
        if (file_exists($token_file) && time() - filemtime($token_file) < $life_time) {
            // 存在有效的access_token 直接返回文件内容
            return file_get_contents($token_file);
        }
        //接口URL
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->_appid."&secret=".$this->_appsecret;
        //发送GET请求
        $result = $this->_request(‘get‘,$url);
        if (!$result) {
            return false;
        }
        //处理数据
        $result_obj = json_decode($result);
        //写入到文件
        file_put_contents($token_file, $result_obj->access_token);
        return $result_obj->access_token;
    }

    /**
     * 获取Ticket
     * @param string $content 二维码内容
     * @param int $type 二维码类型 1 临时整形 2临时字符串 3永久整形 4永久字符串
     * @param int $expire 有效时间
     * @return ticket
     */
    public function getQRCodeTicket($content,$type=2,$expire=604800){
        $access_token = $this->getAccessToken();
        $url = ‘https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=‘.$access_token;
        $type_list = array(
                self::QRCODE_TYPE_TEMP => ‘QR_SCENE‘,
                self::QRCODE_TYPE_TEMP_STR => ‘QR_STR_SCENE‘,
                self::QRCODE_TYPE_LIMIT=>‘QR_LIMIT_SCENE‘,
                self::QRCODE_TYPE_LIMIT_STR=>‘QR_LIMIT_STR_SCENE‘
            );
        $action_name = $type_list[$type];
        //post发送的数据
        switch ($type){
            case self::QRCODE_TYPE_TEMP:
                $data_arr[‘expire_seconds‘]=$expire;
                $data_arr[‘action_name‘] = $action_name;
                $data_arr[‘action_info‘][‘scene‘][‘scene_id‘] = $content;
                break;
            case self::QRCODE_TYPE_TEMP_STR:
                $data_arr[‘expire_seconds‘]=$expire;
                $data_arr[‘action_name‘] = $action_name;
                $data_arr[‘action_info‘][‘scene‘][‘scene_str‘] = $content;
                break;
            case self::QRCODE_TYPE_LIMIT:
                $data_arr[‘action_name‘] = $action_name;
                $data_arr[‘action_info‘][‘scene‘][‘scene_id‘] = $content;
                break;
            case self::QRCODE_TYPE_LIMIT_STR:
                $data_arr[‘action_name‘] = $action_name;
                $data_arr[‘action_info‘][‘scene‘][‘scene_str‘] = $content;
                break;
        }
        $data = json_encode($data_arr);
        $result = $this->_request(‘post‘,$url,$data);
        if(!$result){
            return false;
        }
        $result_obj = json_decode($result);
        return $result_obj->ticket;
    }

    /**
      * 根据ticket获取二维码
      * @param int|string $content qrcode内容标识
      * @param [type] $file 存储为文件的地址,如果null直接输出
      * @param integer $type 类型
      * @param integer $expire 如果是临时,标识有效期
      * @return  [type]
     */
    public function getQRCode($content,$file=NULL,$type=2,$expire=604800){
        //获取ticket
        $ticket = $this->getQRCodeTicket($content,$type=2,$expire=604800);
        $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket";
        //发送,取得图片数据
        $result = $this->_request(‘get‘,$url);
        if($file){
            file_put_contents($file,$result);
        }else{
            header(‘Content-Type:image/jpeg‘);
            echo $result;
        }
    }    

    /**
     * 封装发送http请求
     * @param string $method 请求方式 get/post
     * @param string $url 请求目标的url
     * @param array $data post发送的数据
     * @param bool $ssl 是否为https协议
     * @return 响应主体
     */
    private function _request($method=‘get‘,$url,$data=array(),$ssl=true){
        //curl完成,先开启curl模块
        //初始化一个curl资源
        $curl = curl_init();
        //设置curl选项
        curl_setopt($curl,CURLOPT_URL,$url);//url
        //请求的代理信息
        $user_agent = isset($_SERVER[‘HTTP_USER_AGENT‘])?$_SERVER[‘HTTP_USER_AGENT‘]: ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4‘;
        curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);
        //referer头,请求来源
        curl_setopt($curl,CURLOPT_AUTOREFERER,true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 30);//设置超时时间
        //SSL相关
        if($ssl){
            //禁用后,curl将终止从服务端进行验证;
            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
            //检查服务器SSL证书是否存在一个公用名
            curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);
        }
        //判断请求方式post还是get
        if(strtolower($method)==‘post‘) {
            /**************处理post相关选项******************/
            //是否为post请求 ,处理请求数据
            curl_setopt($curl,CURLOPT_POST,true);
            curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
        }
        //是否处理响应头
        curl_setopt($curl,CURLOPT_HEADER,false);
        //是否返回响应结果
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);

        //发出请求
        $response = curl_exec($curl);
        if (false === $response) {
            echo ‘<br>‘, curl_error($curl), ‘<br>‘;
            return false;
        }
        //关闭curl
        curl_close($curl);
        return $response;
    }

}

本来可以获取access_token url验证 判断消息类型等

原文地址:https://www.cnblogs.com/wordblog/p/10586731.html

时间: 2024-10-13 10:43:48

2.微信公众号开发:简单封装基本微信基本操作类的相关文章

微信公众号开发简单的网页授权登陆获取用户基本信息

由于业务需要,近期在做微信公众号开发,其中一个模块是微信用户点击个人中心访问可以得到次微信用户的头像昵称国家省份等基本信息. 但由于业务需求,这块功能暂时用不上了,但这功能的实现毕竟是自己花费几天时间搞出来的,觉得以后会用的上,暂且记录一下实现过程. 首先:获取用户信息的过程属于微信网页授权登陆,再做这一块之前请先阅读微信开发文档以熟悉基本的开发过程: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 微信开发文档

微信公众号开发_如何接入微信支付?[网页发起支付]

开发背景 在微信公众号中,需要获取支付功能 前提 公众号已经开通支付功能[未开通的自行百度] 实现步骤 接入JSSDK JSSDK使用步骤 参考微信JS-SDK说明文档 使用JSSDK中的 微信支付 API wx.chooseWXPay({ timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写.但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: 'abc', // 支付签名随机串,不长于 32

微信公众号开发纪要(4)-调用微信扫一扫功能

在微信公众号页面中调用微信扫一扫功能,就是调用微信JS-SDK.让JS-SDK完成调用摄像头扫描,然后我们将扫描结果进行业务操作.微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验.如何调用微信JS-SDK,在微信公众平台技术文档中的微信网页开发-->微信JS-SDK说明文档中有详细

基于springboot微信公众号开发,几分钟学会微信自动回复

效果图 1.准备工作 申请微信订阅号(个人只能申请订阅号,而且没什么功能,也无法认证),申请完毕,点击 开发=>基本配置,如下图: 服务器配置需要有 域名 80端口,我猜你没有,这里推荐个实用工具,pagekite,下载链接, 这个工具需要 python2.7以上环境,还有邮箱一个,一个邮箱一个月,邮箱这东西大家懂得, 用pagekite申请完域名,就可以用自己的电脑做订阅号服务器了. 2.服务器代码 创建个springboot工程 pom.xml <properties> <pr

微信公众号开发(一)微信验证开发者服务器接口

微信验证开发者服务器接口 微信验证开发者服务器接口 如图所示,开发者可填写自己服务器的验证token的接口地址,以及自定义的token(博主申请的测试号,使用natapp来进行内网穿透) 目的:帮助微信服务器和开发者服务器互相识别,以防恶意攻击 流程图如下(不知道博客园怎么显示md流程图,有知道的仁兄告知):(取自微信公众平台技术文档) st=>start: 开启服务 ipop1=>inputoutput: 接收到数据[不确定是谁发来的] op1=>operation: 尝试提取出sig

微信公众号开发系列-Http请求包基类

HttpHelper请求包基类,支持get请求和POS要求.以促进微通道交互界面的开发,为了准备的人机交互界面,背部. 1.HttpHelper帮助基类 [csharp] view plaincopy using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Net; using System.Net.Security; n

微信公众号开发工具包,封装常用接口等

微信公众号开发套件 涵盖微信提供的大多数常用接口,具体实现功能如下: 一.消息管理 1.模板消息.支持单个用户发送和批量发送,支持同步发送和一步发送. 2.一次性订阅消息. 3.客服消息.包括下发文本.图片等. 二.菜单管理 1.自定义菜单创建.查询.删除.个性化菜单配置等功能. 三.素材管理 1.获取临时素材 2.获取永久素材 3.删除素材 4.获取素材总数 5.获取素材列表 四.账号管理 1.生成带参数的二维码 2.长连接转短连接 五.用户管理 1.用户标签管理 2.设置用户备注名称 3.获

.net微信公众号开发——群发消息

作者:王先荣    本文将介绍微信公众号开发中用于群发消息的类MassMessage,包括:(1)MassMessage类:(2)群发:(3)删除:(4)预览:(5)查询发送状态:(6)接收推送群发结果事件.    源代码地址:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/tree/master/PublicAccount/MassMessage    演示地址:http://www.xrwang.net/Example/M

微信公众号开发C#系列-9、多公众号集中管理

1.概述 通过前面8篇关于微信开发相关文章的学习,我们已经对微信常用开发有了一个比较深入的了解.前面的文章都是基于某一特定公众号的,在现实业务中同一单位个体运营着不至一个公众号,此时就需要对多个公众号集中管理,随意切换.本篇文章主要介绍多公众号集中管理的方法.表设计.设置默认公众号.生成指定格式的URL资源服务器.刷新Access_Token等. 2.公众号集中管理的方法 我们知道操作微信公众号时微信服务器都会返回相应的信息到我们自己的中转服务器上,涉及多个微信公众号管理时,我们就需要知道是那个

微信公众号开发技术基础(二):外网映射工具ngrok的简介和使用

本文结构:(一)用法(二)示例(三)qydev ngrok的下载链接及相关网站 微信公众号开发的时候,微信服务器是需要访问我们的一个公网服务器地址的,但我们又是在本地调试自己的程序的,那怎样让微信服务器能访问到我们本地的服务器呢?那就需要用外网映射工具,将本地IP映射成公网IP,这样就能在公网上访问本地服务了,这里使用ngrok.ngrok原版程序的服务器是在国外的,访问速度极慢或者干脆访问不了,所以这里提供一个服务器搭建在国内的基于ngrok的一个软件:qydev,百度网盘下载链接见文章结尾.