用thinkphp进行微信开发的整体设计思考
- 用thinkphp进行微信开发的整体设计思考
- http://www.2cto.com/weixin/201504/388423.html
-
因为项目中很多地方都涉及到微信接口的调用 比如很多前台模块需要用到 后台模块也有少许调用 其他模块也可能会需要调用 为了让他们都能很方便的直接调用 我把他们独立成为一个模块 这个模块包含了基础的微信接口和微信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进行微信开发的整体设计思考的更多相关文章
- 2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程
2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程 所有项目均带有软件,笔记,视频,源码 日期 课程(空内容代表放假) 2015/7/10 星期五 开学典礼 ...
- thinkphp 实现微信公众号开发(一)
打算用php做一个微信公众号管理平台.用thinkphp框架 教程上面是是应用下面会自动生成Lib文件夹.但是我的3.2.3自动生成目录不一样 我修改了我项目文件夹下面的IndexController ...
- Mybatis原理分析之二:框架整体设计
1.引言 本文主要讲解Mybatis的整体程序设计,理清楚框架的主要脉络.后面文章我们再详细讲解各个组件. 2.整体设计 2.1 总体流程 (1)加载配置并初始化 触发条件:加载配置文件 ...
- WeUI 为微信 Web 服务量身设计-h5前端框架
WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一.包含button.cell.dialog. progress. toas ...
- 微信开发系列——微信订阅号前端开发利器:WeUI
前言:年前的两个星期,学习了下微信公众号的开发.后端基本能够基于盛派的第三方sdk能搞定大部分事宜.剩下的就是前端了,关于手机端的浏览器的兼容性,一直是博主的一块心病,因为博主一直专注于bootstr ...
- legend2---开发日志1(legend的数据库整体设计思路是什么)
legend2---开发日志1(legend的数据库整体设计思路是什么) 一.总结 一句话总结:不同种类的物品分不同的表放,不放到一个物品表里,取所有物品时一个个表的取就好了 不同种类的物品分不同的表 ...
- WeUI 是由微信官方设计团队专为微信移动 Web 应用设计的 UI 库
WeUI 是由微信官方设计团队专为微信移动 Web 应用设计的 UI 库. WeUI 是一套同微信原生视觉体验一致的基础样式库,为微信 Web 开发量身设计,可以令用户的使用感知更加统一.包含butt ...
- 微信开发之如何使用开发工具--weixin-java-tools
一.前沿 微信公众平台由于没有提供针对语言的开发包,只公布了一个基于Http协议的接口和加解密的算法sdk,这样给微信公众号的开发者带来很多工作量,除了实现业务逻辑外,还需要自己处理底层的接口协议细节 ...
- 每周荐书:机器学习、Java虚拟机、微信开发(评论送书)
每周荐书:机器学习.Java虚拟机.微信开发(评论送书) 感谢大家对每周荐书栏目的支持,先公布下上周中奖名单 年精心雕琢,难得的"理论 + 实战案例 + 趟坑经验"总结 从需求分析 ...
随机推荐
- 在.NET下使用C# 控制Windows系统音量
C#开发Windows应用程序中经常需要去控制系统的音量,分两种方式: 1.使用Win Api控制 2.使用C++ dll控制 Win Api控制: 使用user32.dll和winmm.dll都可以 ...
- Sql server之路 (一)基础学习
查询 1.Select * from表名 2.Select 字段1,字段2,from表名 3.Select 字段1,字段2,...from表名 where 字段1 in('内容') 插入 1.inse ...
- 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数
[bzoj1051] [HAOI2006]受欢迎的牛 2014年1月8日7450 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...
- TCP和UDP Socket
1.tcp协议的编程 * 1:客户端.步骤 * 1:创建Socket对象,构造方法里需要指定服务端的ip地址和端口. * Socket socket = new S ...
- Android UDP
一.UDP协议全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议. 1.UDP是一个无连接协议,传输数据之前源端和终端不建立连接: 2.不维护连接状态,包括收发状态等 ...
- arcgis android 通过getExtent得到当前地图范围四个点的坐标
困扰了我很久的问题终于要得到解决了,先欢喜一下.我的目的是想做一个当程序完全退出后,再次打开程序地图直接显示上次程序退出前地图的范围.arcgis for android官方软件就有这个功能.网上搜索 ...
- login控件重载登陆方法
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 浅谈MySQL索引背后的数据结构及算法
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- 【UVa】11270 Tiling Dominoes
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- Graph database_neo4j 底层存储结构分析(6)
3.6 Node 数据存储 neo4j 中, Node 的存储是由 NodeStore 和 ArrayPropertyStore 2中类型配合来完成的. node 的label 内容是存在Array ...
我要投稿