用thinkphp进行微信开发的整体设计思考
http://www.2cto.com/weixin/201504/388423.html
2015-04-09      0个评论       作者:明之暗夜
收藏    我要投稿

因为项目中很多地方都涉及到微信接口的调用 比如很多前台模块需要用到 后台模块也有少许调用 其他模块也可能会需要调用  为了让他们都能很方便的直接调用 我把他们独立成为一个模块 这个模块包含了基础的微信接口和微信jssdk

具体的设计请参考下面  当然如果有更好的建议可以共同交流

我先建立了一个新的模块叫Weixin 并在其下面建立了控制器BaseController 也就是一个微信类

这个微信基类 我是这样定义的


?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 <?php
/**
 *微信开发的公共类(不含支付 如需要可自行加入)
 *
 */
namespace Weixin\Controller;
use Think\Controller;
use Com\WechatAuth;  
use Com\Jssdk;      
class  BaseController extends Controller {
    public $appId;
    public $appSecret;
    public $WechatAuth;
    public $jssdk;
    public function _initialize(){
        $config = F('DB_CONFIG_DATA');   //获取配置信息
        if(!$config){
            $config = api('Config/lists');
            F('DB_CONFIG_DATA',$config);
        }
        C($config); //添加配置
        $this->appId = C('WEIXIN_CONFIG.appId');   
        $this->appSecret = C('WEIXIN_CONFIG.appSecret');
        $this->WechatAuth =  new WechatAuth($this->appId,$this->appSecret);
        $this->jssdk = new Jssdk($appId,$appSecret);   //调用微信Jssdk
        // $this->signPackage = $this->jssdk->GetSignPackage();
    }
?>

下面是我微信sdk包的部署目录结构供参考

这些部署好后 在任意模块中引入的方法是


?

1

$Weixin = new \Weixin\Controller\BaseController();

下面我用实例来讲述如何使用

1,获取用户信息(不管微信用户是否关注了公众号  下面代码大部分为注释内容 其实很少)


?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public function mytest () {       
         
        $Weixin = new \Weixin\Controller\BaseController();
 
        $domain = C('WEB_DOMAIN');
            $request_url = $_SERVER['REQUEST_URI'];
            $redirect_url = $domain.$request_url;
          if(!isset($_GET['code'])){           
               header('Location:  https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$Weixin->appId.'&redirect_uri='.$redirect_url.'&response_type=code&scope=snsapi_base&state=1/');
               exit;          
           }
            $code = $_GET['code'];      
        $access_token_arr = $Weixin->WechatAuth ->getAccessToken('code',$code);   //oauth2.0网页授权的access_token
        //$access_token_arr数据结构如下
        /* Array
        (
            [access_token] => OezXcEiiBSKSxW0eoylIeLrIQT6NoDaXZIUcW_1wOj_TwSQ_Jqp2CBj0RLBbgvBCkzyZ74E6066btMwNPj6JYaR_TPn9PH02FgR4APr7iOhihlYgosPEyDZIVJXduuvUj3ay5cVYpv_TDA3TBNvLiA
            [expires_in] => 7200
            [refresh_token] => OezXcEiiBSKSxW0eoylIeLrIQT6NoDaXZIUcW_1wOj_TwSQ_Jqp2CBj0RLBbgvBCzJ6lw18Bb-cy9yUp2Tojmp48u_95jVHl1WTODEM0Z3yAPY8sORIlF0Gw8_99eEXsCagdc29djCjEWv2TovkPig
            [openid] => o0r2njtFSolnsaBoVP5MxjhNjUlg
            [scope] => snsapi_base
        )*/
        $globals_access_token = $Weixin->WechatAuth->getAccessToken();    //全局access_token
 
        $userInfo = $Weixin->WechatAuth->userInfo($access_token_arr['openid']); //通过全局access_token获取用户基本信息 未关注是array('subscribe'=>0,'openid')
 
        if(!$userInfo['subscribe']){ //用户未关注  只能通过网页授权api获取用户信息
            $data = array();
            $data['access_token'] = $access_token_arr['access_token'];
                        $data['openid'] = $access_token_arr['openid'];
                        $userinfo = $Weixin->WechatAuth->getUserInfo($data);
                        p($userinfo);//打印信息
                        /*
                Array(
                    [openid] => o0r2njtFSolnsaBoVP5MxjhNjUlg
                    [nickname] => 呼啦啦
                    [sex] => 1
                    [language] => zh_CN
                    [city] =>
                    [province] =>
                    [country] => 赞比亚
                    [headimgurl] => http://wx.qlogo.cn/mmopen/rBgkzASpGRQLPXPDlEGmPoHl35qjwaA8s4WfOncETZm7kDGEVicEJZORzO73m7ib9Av7AK7icLrfl1nmhxGsglmzJRcnryNPy6T/0
                    [privilege] => Array
                        (
                        )
 
                )
            */
 
 
        }else{  //关注了公众号 直接返回用户信息
 
            p($userInfo);  //打印信息
            /*
                Array(
                    [subscribe] => 1
                    [openid] => o0r2njtFSolnsaBoVP5MxjhNjUlg
                    [nickname] => 呼啦啦
                    [sex] => 1
                    [language] => zh_CN
                    [city] =>
                    [province] =>
                    [country] => 赞比亚
                    [headimgurl] => http://wx.qlogo.cn/mmopen/rBgkzASpGRQLPXPDlEGmPoHl35qjwaA8s4WfOncETZm7kDGEVicEJZORzO73m7ib9Av7AK7icLrfl1nmhxGsglmzJRcnryNPy6T/0
                    [subscribe_time] => 1427793013
                    [remark] =>
                )
            */
 
        }
         
 
    }

由于微信开发自身机制的原因,在这里要说明的是,thinkphp官方给的wechatAuth包 中并没有对access_token进行缓存,还需要进行适当修改 下面仅以wechatAuth.class.php文件修改为例说明 (网页授权的token, jssdk中的ticket 也要做类似如下的缓存,在此就不一一说明了)


?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 /**
    * 构造方法,调用微信高级接口时实例化SDK
    * @param string $appid  微信appid
    * @param string $secret 微信appsecret
    * @param string $token  获取到的access_token
    */
   public function __construct($appid, $secret, $token = null){
       if($appid && $secret){
           $this->appId     = $appid;
           $this->appSecret = $secret;
           if(!empty($token)){
               $this->accessToken = $token;
           }else{
               $this->getAccessToken();
           }
       } else {
           throw new \Exception('参数错误!');
       }
   }
 
 
    /**
    * 获取access_token,用于后续接口访问
    * @return array access_token信息,包含 token 和有效期
    */
   public function getAccessToken($type = 'client', $code = null){
       
            $param = array(
                    'appid'  => $this->appId,
                    'secret' => $this->appSecret
               );
 
           switch ($type) {
               case 'client':
                   if(S('globals_access_token')){
                       $this->accessToken = S('globals_access_token');
                       return S('globals_access_token');
                       break;
                   }
                   $param['grant_type'] = 'client_credential';
                   $url = "{$this->apiURL}/token";
                   break;
 
               case 'code':
                   $param['code'] = $code;
                   $param['grant_type'] = 'authorization_code';
                   $url = "{$this->oauthApiURL}/oauth2/access_token";
                   break;
                
               default:
                   throw new \Exception('不支持的grant_type类型');
                   break;
           }
 
           $token = self::http($url, $param);
           $token = json_decode($token, true);
 
           if(is_array($token)){
               if(isset($token['errcode'])){
                   throw new \Exception($token['errmsg']);
               } else {
                   if($type == 'client'){
                       S('globals_access_token',$token['access_token'],7000);
                   }
 
                   $this->accessToken = $token['access_token'];
                   
                   return $token;
               }
           } else {
               throw new \Exception('获取微信access_token失败!');
           }
 
 
 
       
   }
 

用thinkphp进行微信开发的整体设计思考的更多相关文章

  1. 2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程

    2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程 所有项目均带有软件,笔记,视频,源码 日期   课程(空内容代表放假) 2015/7/10 星期五 开学典礼 ...

  2. thinkphp 实现微信公众号开发(一)

    打算用php做一个微信公众号管理平台.用thinkphp框架 教程上面是是应用下面会自动生成Lib文件夹.但是我的3.2.3自动生成目录不一样 我修改了我项目文件夹下面的IndexController ...

  3. Mybatis原理分析之二:框架整体设计

    1.引言 本文主要讲解Mybatis的整体程序设计,理清楚框架的主要脉络.后面文章我们再详细讲解各个组件. 2.整体设计 2.1 总体流程 (1)加载配置并初始化       触发条件:加载配置文件 ...

  4. WeUI 为微信 Web 服务量身设计-h5前端框架

    WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一.包含button.cell.dialog. progress. toas ...

  5. 微信开发系列——微信订阅号前端开发利器:WeUI

    前言:年前的两个星期,学习了下微信公众号的开发.后端基本能够基于盛派的第三方sdk能搞定大部分事宜.剩下的就是前端了,关于手机端的浏览器的兼容性,一直是博主的一块心病,因为博主一直专注于bootstr ...

  6. legend2---开发日志1(legend的数据库整体设计思路是什么)

    legend2---开发日志1(legend的数据库整体设计思路是什么) 一.总结 一句话总结:不同种类的物品分不同的表放,不放到一个物品表里,取所有物品时一个个表的取就好了 不同种类的物品分不同的表 ...

  7. WeUI 是由微信官方设计团队专为微信移动 Web 应用设计的 UI 库

    WeUI 是由微信官方设计团队专为微信移动 Web 应用设计的 UI 库. WeUI 是一套同微信原生视觉体验一致的基础样式库,为微信 Web 开发量身设计,可以令用户的使用感知更加统一.包含butt ...

  8. 微信开发之如何使用开发工具--weixin-java-tools

    一.前沿 微信公众平台由于没有提供针对语言的开发包,只公布了一个基于Http协议的接口和加解密的算法sdk,这样给微信公众号的开发者带来很多工作量,除了实现业务逻辑外,还需要自己处理底层的接口协议细节 ...

  9. 每周荐书:机器学习、Java虚拟机、微信开发(评论送书)

    每周荐书:机器学习.Java虚拟机.微信开发(评论送书) 感谢大家对每周荐书栏目的支持,先公布下上周中奖名单 年精心雕琢,难得的"理论 + 实战案例 + 趟坑经验"总结 从需求分析 ...

随机推荐

  1. redis 认证密码

    [root@cache01 ~]# grep "requirepass" /app/server/redis/conf/6379.conf # If the master is p ...

  2. JUC回顾之-CyclicBarrier底层实现和原理

    1.CyclicBarrier 字面意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事情是让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时候,屏障才会开门.所有被 ...

  3. hdu 1728:逃离迷宫(DFS,剪枝)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 用DTD约束XML详解及示例

    文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. dtd的三种引入方式    (1)引入外部的dtd文件 <!DOCTYPE 根元素名称 SYSTE ...

  5. PHP 5.4 中经 htmlspecialchars 转义后的中文字符串为空,DeDeCMS在PHP5.4下编辑器中文不显示问题

    在加入 发布招聘功能的时候,出现问题了,就是修改招聘信息的时候.编辑器内容不显示,只显示英文,中文不显示,以前记得开发此功能没这问题啊!然后各种原因找不出,没办法,从编辑器函数入手,一步一步查,查到 ...

  6. 《为ipad而设计 打造畅销APP》读书笔记

    (1)应用应该对用户程序持ipad的变化做出响应 (2)要设计出确实出色的触摸屏交互界面需要能够触摸到自己的设计,反复触摸,直到找到感觉 (3)chipmunk physics 2D的物理图形库 (4 ...

  7. c++ map和mutimaps 插入值

    (1)运用value_type std::map<std::string, float> col1; col1.insert(std::map<std::string,float&g ...

  8. CMYK印刷色

    一,介绍 CMYK也称作印刷色彩模式,顾名思义就是用来印刷的. 它和RGB相比有一个很大的不同:RGB模式是一种发光的色彩模式,CMYK是一种依靠反光的色彩模式. CMYK——即青.洋红(品红).黄. ...

  9. 利用Python的三元表达式解决Odoo中工资条中城镇、农村保险的问题

    Python中没有像C#中有三元表达式 A?B:C 但在python中可以通过 A if condition else B 的方式来达到同样的效果. 例如 : 1 if True else 0 输出 ...

  10. CSS3 Media Queries在iPhone4和iPad上的运用

    CSS3 Media Queries的介绍在W3CPlus上的介绍已有好几篇文章了,但自己碰到的问题与解决的文章还是相对的较少.前几天在<修复iPhone上submit按钮bug>上介绍了 ...