用thinkphp进行微信开发的整体设计思考

用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失败!‘);

           }

      

   }

 

时间: 2024-10-12 23:23:25

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

微信开发之架构设计

微信作为一款app,提供了友好的用户体验,在开发微信应用时,我们应该尽可能得让自己的网页像webapp一样.用户使用我们的网页,就好像在使用微信内置的app,这样用户才会喜欢我们的网站. 本文将讲解微信开发的前期准备,包括微信开发上的一些坑.架构上的设计.接口上需要注意的地方,全部来自自己的开发经验,如有不对,请指正. 微信开发的坑 1.微信授权 微信中涉及到了OAuth2.0网页授权,正因为这样,我理所当然的用这个接口来读取用户的基本信息,包括头像.用户名等,因为之前了解过淘宝的公众平台,大家

最新angular微信开发ThinkPHP视频

AngularJS 下载链接: http://pan.baidu.com/s/1sltmWTR#list/path=%2F AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的是:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注入等等. 微信开发 下载链接:http://pan.baidu.com/s/1sltmWTR#list/path

轻松玩儿转微信开发1——综述

写在前面的话:现在公司都在搞自己的微信公众号,有朋友也会问到我怎么搞,讲过一些内容后,感觉还是写写文章吧,通过一系列的文章,对微信开发能有一个整体的认识,这样就能够根据自己的需求,解决相应的问题.为了能够对微信开发更加得心应手,我会尽量少说微信文档的内容,尽量用自己的大土话,把相关的内容给讲清楚.这一篇是头一篇,尽量不去讲一些具体的细节,算是一个总体的交代吧. ======正文开始======= 1.为什么要进行微信开发? 自己或公司弄一个微信公众号,通过后台的提供的功能,很多情况下都能够满足我

分享基于Android系统的XMPP即时通讯技术项目实战(仿微信开发架构,自定义控件)

即时通讯技术是 网络技术中的明珠.即时通讯产品改变了人们的生活习惯.经过十几年的发展,即时通讯功能的应用也逐渐从专门软件才能实现的功能逐渐成为标准配置.即时通讯技术的应用不仅仅只是用于社交领域,在大多的协同工作领域,以及需要分布结构的网络通讯领域都是非常重要的.讲师本人在android领域有多年的开发经验,在即时通讯系统方面也有深入的研究.在本课程中,详细讲解了android开发中要解决的一些主要的问题,即时通讯在客户端实现的过程,并手把手的进行操作,方便学习和理解.因为课时的原因,对于一些初级

支付系统整体设计:整体架构设计以及注意要点(三)

一般来说,银行会提供两种支付途径:无跳转的快捷支付接口和带跳转的网银接口.前者在绑卡,支付的时候,不需要跳到银行页面上去处理,后者则需要在银行的网银页面上完成.显然前者对用户来说体验要好多了,用户流程不会被打断.快捷支付要求支付系统在本地保存用户的支付信息,如卡号,登记手机.系统要确保这些信息不被泄漏.风险非常好,所以大部分银行要求接入方必须经过ADSS检验才能够接入快捷支付. 这种固定方式的接入有单点故障的问题,一旦某个渠道出问题,绑定的支付方式就无法使用.改进策略是为每个支付方式定义多个渠道

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

一.前沿 微信公众平台由于没有提供针对语言的开发包,只公布了一个基于Http协议的接口和加解密的算法sdk,这样给微信公众号的开发者带来很多工作量,除了实现业务逻辑外,还需要自己处理底层的接口协议细节,因此选择一个良好的sdk能够节省这样的工作量,而目前已经有不少的开源sdk可供使用,java语言的微信公众号sdk也有不少,那么作为java开发者我们应该如何选择呢?我将带着各位对java开源的一些微信公众号的sdk进行各方面的对比分析,为读者选择适合自己的sdk包提供一些帮助. 二.为什么要用w

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

WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一.包含button.cell.dialog. progress. toast.article.actionsheet.icon等各式元素. git地址: https://github.com/weui/weui

微信开发python+django两个月的成功经历,django是个好框架!

时间:大三 上学期没有用微信内置浏览器而纯对话开发,坑了自己好一下. 下学期选错bottle框架,以为轻量好,谁知开发中什么都自己来很痛苦. 选对了框架django,终于在大三最后的个把月里写出了里程碑式的现在这个微信端,自己都感动到,作为我大三一年web开发的终结吧. 亮点1:自带后台管理 亮点2:后台权限管理 亮点3:微信回复规则设置去代码化,图形界面. 亮点4:一平台多网店 技巧:微信规则不匹配时不能回复吗?不是,规则包含空字符总能匹配任意文本,请看下面的微信规则截图. 后台 选择botl

微信开发调试工具

首先,微信公众号分两种类型和两种情况,两种类型分别是订阅号和服务号,两种情况是,已认证或未认证的订阅号.他们分别具体的接口权限大家可以在微信后台的"开发者中心-接口权限"看到. 如下图所示是我的接口权限: 以上显示"未获得"的接口状态,就是需要订阅号或服务号微信认证之后才有拥有的权限. 简单说,未认证的订阅号只有基础支持.自动回复和发送回复消息的接口,只有实现一些较简单的数据交互功能,例如本公众号(需要特别说明一下,本公众号也是未认证的订阅号,关于自定义菜单是一个微