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

简介: 用thinkphp进行微信开发的整体设计思考http://www.2cto.com/weixin/201504/388423.html2015-04-09      0 个评论       作者:明之暗夜收藏    我要投稿 因为项目中很多地方都涉及到微信接口的调用 比如很多前台模...
用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] => 赞比亚
                     [privilege] => Array
                         (
                         )
 
                 )
             */
 
 
         } else //关注了公众号 直接返回用户信息
 
             p($userInfo);  //打印信息
             /*
                 Array(
                     [subscribe] => 1
                     [openid] => o0r2njtFSolnsaBoVP5MxjhNjUlg
                     [nickname] => 呼啦啦
                     [sex] => 1
                     [language] => zh_CN
                     [city] =>
                     [province] =>
                     [country] => 赞比亚
                     [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失败!' );
            }
 
 
 
       
    }

 

目录
相关文章
|
11天前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
57 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
26天前
|
监控 前端开发 应用服务中间件
小游戏源码开发搭建技术栈和服务器配置流程
近些年不同场景游戏层出不穷,现就小游戏开发技术应用及功能详细剖析!
|
1月前
|
Dart 前端开发 架构师
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
122 26
|
9月前
|
JavaScript Java 测试技术
“村游网”系统的微信小程序开发ssm附带文章和源代码设计说明文档ppt
“村游网”系统的微信小程序开发ssm附带文章和源代码设计说明文档ppt
48 0
dapp众筹矩阵公排互助系统开发指南详细丨功能需求丨案例项目丨方案项目丨源码程序
Requirement analysis and planning: Clarify the system's goals and functional requirements. Understand the characteristics and working methods of the DApp crowdfunding matrix mutual assistance system. Collect user requirements, define the crowdfunding mechanism, matrix common ranking algorithm, and m
|
敏捷开发 安全 网络安全
区块链商城开发稳定版丨区块链商城系统开发功能逻辑/规则设计/案例开发/详细项目/源码说明
Decentralized trust: The blockchain mall eliminates the need for trust intermediaries in traditional e-commerce platforms through its decentralized characteristics. All transaction information is publicly recorded on the blockchain, allowing buyers and sellers to mutually verify and trust the authen
|
人工智能 API 区块链
Web3技术丨佛萨奇系统开发技术介绍(代码搭建)原力佛萨奇系统丨MetaForce开发逻辑方案
Web3技术丨佛萨奇系统开发技术介绍(代码搭建)原力佛萨奇系统丨MetaForce开发逻辑方案
237 0
|
存储 算法 关系型数据库
MetaForce佛萨奇2.0系统丨MetaForce佛萨奇2.0系统开发(方案及详细)丨MetaForce佛萨奇2.0现成源码部署
 随机性调度算法:即针对同一批交易调度产生的交易执行顺序是随机的,即使同一节点针对同一批交易连续运行两次调度算法产生的结果也可能不同。此类算法往往调度速度较快,其难点在于验证节点如何保证执行顺序与提案节点一致并得到相同的执行结果。因此,交易的执行顺序必须打包至区块中并由其他节点据此验证。
|
算法 安全 区块链
|
小程序 API JavaScript
带你读《微信小程序商城开发:界面设计实战》之二:小程序基础知识
本书是讲解微信小程序前端界面设计的入门书籍,有详细的理论知识、布局分析、逻辑分析,还有丰富的实战案例以及详细的代码解说,具有很强的实用性。

热门文章

最新文章