资讯专栏INFORMATION COLUMN

使用 Zephir 写 PHP 扩展之微信集合框架

gaosboy / 2718人阅读

摘要:简介使用开发的微信集合框架,能够轻松的集成到你的中。安装安装环境依赖安装现在直编译了和版本,可以点击下边的地址下载。

简介

使用 Zephir 开发的微信集合框架,能够轻松的集成到你的 PHP 中。经过了简单的测试。

当然还有很多功能没有完善和实现,以及文档的欠缺,我会抽取时间一点一点的完善。

安装 Linux
  

安装环境依赖

#Ubuntu

    sudo apt-get install php5-dev php5-mysql gcc libpcre3-dev

#Fedora

    sudo yum install php-devel php-mysqlnd gcc libtool

#RHEL

    sudo yum install php-devel php-mysql gcc libtool

#Suse

    yast2 -i php5-pear php5-devel php5-mysql gcc
  

安装

git clone https://git.coding.net/widuu/wechat.git 
cd wechat/ext && ./install
Windows
  

现在直编译了php5.6和php5.5版本,可以点击下边的地址下载。

DLL List
PHP 5.6 5.6 Non Thread Safe (NTS) x86
5.6 Thread Safe (TS) x86
5.6 Non Thread Safe (NTS) x64
5.6 Thread Safe (TS) x64
PHP 5.5 5.5 Non Thread Safe (NTS) x86
5.5 Thread Safe (TS) x86
5.5 Non Thread Safe (NTS) x64
5.5 Thread Safe (TS) x64
Contributing

登录 https://coding.net 或 https://github.com

仓库地址分布:

Coding仓库:https://coding.net/u/widuu/p/wechat/git

github仓库:http://github.com/widuu/wechat

创建您的特性分支 (git checkout -b my-new-feature)

提交您的改动 (git commit -am "Added some feature")

将您的改动记录提交到远程 git 仓库 (git push origin my-new-feature)

然后到 coding 网站的该 git 远程仓库的 my-new-feature 分支下发起 Pull Request

联系方式

Email: admin#widuu.com <#换成@>
Blog:http://www.widuu.com
WeiBo:http://weibo.com/widuu

核心代码

wechat.zep

        namespace Wechat;

        class Wechat extends Wechatabstract{


            /**
             * 发送者id
             */

            protected _tousername { get,set };

            /**
             * wechat id
             */

            protected _fromusername { get,set };

            /**
             * 事件类型
             */

            protected _msgtype { get,set };

            /**
             * 事件
             */

            protected _event { get,set };

            /**
             * 创建时间
             */

            protected _createtime { get,set };

            /**
             * 文本消息内容   
             */

            protected _content { get,set };

            /**
             * 消息id
             */

            protected _msgid { get,set };

            /**
             * 图片链接
             */

            protected _picurl { get,set };

            /**
             * 媒体id
             */

            protected _mediaid { get,set };

            /**
             * 语音格式
             */

            protected _format { get,set };

            /**
             * 缩略图的媒体id
             */

            protected _thumbmediaid { get,set };

            /**
             * 地理位置维度
             */

            protected _location_x { get,set };

            /**
             * 地理位置经度
             */

            protected _location_y { get,set };

            /**
             * 地图缩放大小
             */

            protected _scale { get,set };

            /**
             * 地理位置信息
             */

            protected _label { get,set };

            /**
             * 消息标题
             */

            protected _title { get,set };

            /**
             * 消息描述
             */

            protected _description { get,set };

            /**
             * 消息链接
             */

            protected _url { get,set };

            /**
             * TOKEN URL
             */

            const TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?";

            /**
             * User URL
             */

            const USER_URL = "https://api.weixin.qq.com/cgi-bin/user/";

            /**
             * Menu URL
             */

            const MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/";

            /**
             * 接收 POST 信息
             * @author widuu 
             */

            public function getRequest(){
                if this->isPost() {
                    var key,value;
                    let this->_request_data = this->getInfo(true);
                    if this->_debug {
                        if empty this->_request_data{
                            this->log("[ERROR".date("Y-m-d H:i:s",time())."] Request Data NULL
");       
                        }
                    };
                    if !empty this->_request_data{
                        for key,value in this->_request_data {
                            let key = "_".strtolower(key);
                            if isset this->{key} {
                                let this->{key} = value;
                            }

                        }
                        return this->_request_data;
                    }

                }else{
                    return false;
                }

            }

            /**
             * 返回消息方法
             * @param  string type
             * @param  (array|string) type
             * @return boolean
             * @author widuu 
             */

            public function response(string! type=null,info){
                if empty this->_request_data {
                    return false;
                }
                var  tpl;
                let  tpl = this->getTpl(type,info);
                if this->_debug {
                    if empty tpl{
                        this->log("[ERROR".date("Y-m-d H:i:s",time())."] Get Response XML Type Error
");     
                    }
                };
                echo tpl;
            }

            /**
             * 订阅事件
             * @author widuu 
             */

            public function subscribe(string! type="text", info){
                if empty this->_request_data {
                    return false;
                }

                if(this->_event == "subscribe"){
                    this->response(type,info);
                    return;
                }
            }

            /**
             * 获取Token
             * @param string appid 
             * @param string secret
             * @return array
             * @author widuu 
             */

            public function getToken(string! appid="",string! secret=""){
                if (empty appid || empty secret) {
                    throw new Exception("getToken Method Parameter does not allow nulls",4001);
                };
                var tokenUrl,urlQurey,result;
                let urlQurey = ["grant_type":"client_credential","appid":appid,"secret":secret];
                let tokenUrl = Wechat::TOKEN_URL.http_build_query(urlQurey);
                let result   = this->httpGet(tokenUrl);
                return json_decode(result,true);
            }

            /**
             * 获取用户信息
             * @param string type 
             * @param string token
             * @param string openid
             * @return array
             * @author widuu 
             */

            public function getUser(string! type=null,string! token="",string openid=""){
                if empty token || empty type {
                    throw new Exception("Parameter does not allow nulls",4002);
                }
                var url,param,result;
                switch(type){
                    case "userinfo" :
                        let param  = ["access_token":token,"openid":openid,"lang":"zh_CN"];
                        let url    = Wechat::USER_URL."info?".http_build_query(param);
                        let result = this->httpGet(url);
                        break;
                    case "userlist" :
                        let param  = ["access_token":token,"next_openid":openid];
                        let url    = Wechat::USER_URL."get?".http_build_query(param);
                        let result = this->httpGet(url);
                        break;
                    default:
                        return false;
                }

                return json_decode(result,true);
            }

            /**
             * 设置用户备注
             * @param string token 
             * @param string openid
             * @param string remarke
             * @return array
             * @author widuu 
             */

            public function setRemark(string! token=null,string! openid=null,string! remarke=null)->boolean{
                var remarkUrl,postInfo,result;
                let remarkUrl = Wechat::USER_URL."info/updateremark?access_token=".token;
                let postInfo  = ["openid":openid,"remark":remarke];
                let result    = this->httpPost(remarkUrl,postInfo);
                if  !result {
                    return false;
                }
                return  json_decode(result,true);
            }

            /**
             * 获取自定义菜单
             * @author widuu 
             */

            public function Menu(string!type = null,string! token =null,array info = null){
                var menu_url,result;
                switch(type){
                    case "get":
                        let menu_url = Wechat::MENU_URL."get?access_token=".token;
                        let result   = this->httpGet(menu_url);
                        break;
                    case "delete":
                        let menu_url = Wechat::MENU_URL."delete?access_token=".token;
                        let result   = this->httpGet(menu_url);
                        break;
                    case "create":
                        if typeof info != "array" || empty info {
                            throw new Exception("create param error",4005);
                        }
                        let menu_url = Wechat::MENU_URL."create?access_token=".token;
                        let result   = this->httpPost(menu_url,info);
                      default :
                        return false;
                }

                if !empty result{
                    return json_decode(result,true);
                }else{
                    throw new Exception("Response Error",4003);
                }
            }

            /**
             * 获取变量的方法
             * @param  string name
             * @return boolean | string
             * @author widuu 
             */

            public function _get(string! name){
                let name = "_".name;
                if isset this->{name} {
                    return this->{name};
                }
                return false;
            }

            /**
             * 设置变量的方法
             * @param string   name
             * @param          value
             * @return boolean 
             * @author widuu 
             */

            public function _set(string! name,value) ->boolean{
                let name = "_".name;
                if isset this->{name} {
                    let this->{name} = value;
                    return true;
                }
                return false;
            }

            /**
             * 设置变量的方法
             * @param string   name
             * @param          value
             * @return boolean 
             * @author widuu 
             */

            protected function getTpl(string! type=null,info){
                //组织 xml
                var tpl;
                let tpl = "_fromusername."]]>_tousername."]]>".time()."";
                switch (type){
                    case "text":
                        let tpl .= "";
                        break;
                    case "image":
                        let tpl .= "";
                        break;
                    case "voice":
                        let tpl .= "";
                        break;
                    case "video":
                        let tpl .= " ";
                        break;
                    case "music":
                        if typeof info != "array"{
                            return false;
                        }
                        let tpl .= "<![CDATA[".info["title"]."]]>";
                        break;
                    case "news" :
                        if typeof info != "array"{
                            return false;
                        }
                        var num;
                        if  isset info["title"] {
                            let num = 1;
                        }else{
                            let num = count(info);
                        }   
                        let tpl .= "".num."".this->getNews(info)."";
                        break;
                    default :
                        return false;
                }

                let tpl.= "";
                return tpl;

            }

            /**
             * 判断请求方法
             * @author widuu 
             */

            private function isPost() -> boolean {
                if strtolower(_SERVER["REQUEST_METHOD"]) == "post" {
                    return  true;
                }
                return false;
            }

            /**
             * 获取新闻
             * @author widuu 
             */

            private function getNews(array! info){
                var value,tpl = "";
                if  isset info["title"] {
                    let tpl.="<![CDATA[".info["title"]."]]>";
                }else{
                    for _,value in info {
                        let tpl.="<![CDATA[".value["title"]."]]>";
                    }
                }
                return tpl;
            }

            /**
             * 微信验证
             * @author widuu 
             */

            static public function valid(string! token = null){
                var signature,timestamp,nonce,tmpArr,tmpStr,echoStr;
                let signature = _GET["signature"];
                let timestamp = _GET["timestamp"];
                let nonce     = _GET["nonce"];
                let echoStr   = _GET["echostr"]; 
                let tmpArr    = [ token, timestamp, nonce ];
                sort(tmpArr, SORT_STRING);
                let tmpStr = implode( "", tmpArr );
                let tmpStr = sha1( tmpStr );

                if  tmpStr == signature {
                    echo echoStr;
                }else{
                    return false;
                }
            }

            /**
             * 设置URL过期时间
             * @author widuu 
             */

            public static function setTimeout(int! timeout = 1){
                 globals_set("curl_timeout", timeout);
                 return true;
            }

            /**
             * HTTP GET 方法
             * @param  string url 
             * @author widuu 
             */

            protected function httpGet(string! url="") { 
                var curlHandle, content,timeout ;
                let timeout    = globals_get("curl_timeout");
                let curlHandle = curl_init(); 
                curl_setopt( curlHandle , CURLOPT_URL, url ); 
                curl_setopt( curlHandle , CURLOPT_RETURNTRANSFER, 1 ); 
                curl_setopt( curlHandle , CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt( curlHandle , CURLOPT_SSL_VERIFYHOST, false);
                curl_setopt( curlHandle , CURLOPT_TIMEOUT, timeout ); 
                let content = curl_exec( curlHandle );
                curl_close( curlHandle ); 
                return content; 
            }

            /**
             * HTTP POST 方法
             * @param  string url 
             * @param  array  info
             * @author widuu 
             */ 

            protected function httpPost(string! url=null ,array info){
                var curlHandle, content,timeout ;
                if typeof info != "array"{
                    throw new Exception("infomation must be type array",4004);
                }
                let timeout    = globals_get("curl_timeout");
                let curlHandle = curl_init( url );    
                curl_setopt(curlHandle, CURLOPT_HEADER, 0);    
                curl_setopt(curlHandle, CURLOPT_RETURNTRANSFER, 1);    
                curl_setopt(curlHandle, CURLOPT_POST, 1);    
                curl_setopt(curlHandle, CURLOPT_POSTFIELDS, json_encode(info,JSON_UNESCAPED_UNICODE));  
                curl_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt(curlHandle, CURLOPT_SSL_VERIFYHOST, false);
                curl_setopt(curlHandle ,CURLOPT_TIMEOUT, timeout ); 
                let content = curl_exec( curlHandle );    
                curl_close( curlHandle ); 
                return content; 
            }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20957.html

相关文章

  • PHP扩展开发教程1 - 相关开发技术对比及介绍

    摘要:四使用语言开发是我重点推荐的扩展开发框架,简明易懂,功能强大,开发效率高,代码易维护,执行速度快。优点三支持,的扩展开发有两套扩展开发框架,分别支持,,虽然框架代码有两个,但是接口却是一样的。 PHP扩展是高级PHP程序员必须了解的技能之一,对于一个初入门的PHP扩展开发者,怎么才能开发一个成熟的扩展,进入PHP开发的高级领域呢?本系列开发教程将手把手带您从入门进入高级阶段。本教程系列...

    alaege 评论0 收藏0
  • 使用 Zephir 轻松构建 PHP 扩展

    摘要:简介通过扩展,我们可以在代码中使用一些特定的方法大部分的扩展都是用写的。这个目录与我们的扩展同名。我们先来在扩展中创建一个类,使用此类来渲染。接下来命令行执行以下命令来编译扩展第一次运行以上命令时,会初始化一些东西。 showImg(https://segmentfault.com/img/remote/1460000018698586); 简介: 通过 PHP 扩展, 我们可以在 p...

    gaosboy 评论0 收藏0
  • PHP7 安装Phalcon框架

    摘要:是什么是开源全功能栈使用扩展编写针对高性能优化的框架。也是松耦合的,可以根据项目的需要任意使用其他对象。安装支持版本的不支持普通方式的编译安装,只能通过安装。因此安装之前,请先安装。 Phalcon 是什么? Phalcon 是开源、全功能栈、使用 C 扩展编写、针对高性能优化的 PHP 5 框架。 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类的方式暴露出来...

    kidsamong 评论0 收藏0
  • PHP 扩展开发】Zephir 基础篇

    摘要:变量作为函数返回值时,必须声明为动态类型。动态变量与中的变量基本完全相同支持在使用时改变类型。比较运算符在运算时考虑变量类型,如果是动态变量与一致。与不一致,语句可以没有,表示忽略所有异常。 上一篇 《Zephir 简介》 简单介绍了环境搭建,编写了一个的简单示例。这一篇继续介绍 Zephir 基础。 基本语法Zephir 中,每个文件都必须有且只有一个类,每个类都必须有一个命名空间,...

    wawor4827 评论0 收藏0
  • 微信支付PHP SDK微信公众号支付代码详解

    摘要:微信支付接口下载官方文档参考配置公众号信息我们先进行测试,所以先把测试授权目录和测试白名单添加上。在申请微信支付后发来的邮件中可以找到,则根据邮件提示拜访官方我们首先需要的是支付。 微信php支付接口demo下载https://pay.weixin.qq.com/wik... 官方文档参考https://pay.weixin.qq.com/wik... 1. 配置公众号信息showIm...

    jimhs 评论0 收藏0

发表评论

0条评论

gaosboy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<