TP3.2 引入微信类
首先建立一个入口IndexController.php文件
<?php
namespace Home\Controller;
use Think\Controller;
use Com\Wechat;
/**
* 微信控制器
* 主要获取首页聚合数据
*/
class IndexController extends Controller { //系统首页
public function index(){ $token = 'weixin'; //微信后台填写的TOKEN
/* 加载微信SDK */
$wechat =new Wechat($token); /* 获取请求信息 */
$data = $wechat->request();
if($data && is_array($data)){
$content = '123'; //回复内容,回复不同类型消息,内容的格式有所不同
$type = 'text'; //回复消息的类型
/* 响应当前请求(自动回复) */
$wechat->response($content, $type);
} } }
在Home模块下建立Com文件夹存放当前独立的类、
<?php
/**
* 微信封装类[请求或响应消息类型]
* @author huangguojin
* time 2015-7-14
*/
namespace Com; class Wechat {
/* 消息类型常量 */
const MSG_TYPE_TEXT = 'text';
const MSG_TYPE_IMAGE = 'image';
const MSG_TYPE_VOICE = 'voice';
const MSG_TYPE_VIDEO = 'video';
const MSG_TYPE_MUSIC = 'music';
const MSG_TYPE_NEWS = 'news';
const MSG_TYPE_LOCATION = 'location';
const MSG_TYPE_LINK = 'link';
const MSG_TYPE_EVENT = 'event'; /* 事件类型常量 */
const MSG_EVENT_SUBSCRIBE = 'subscribe';
const MSG_EVENT_SCAN = 'SCAN';
const MSG_EVENT_LOCATION = 'LOCATION';
const MSG_EVENT_CLICK = 'CLICK';
const MSG_EVENT_MASSSENDJOBFINISH = 'MASSSENDJOBFINISH';
/**
* 微信推送过来的数据
* @var array
*/
private $data = array();
/**
* 构造方法,用于实例化微信SDK
* 自动回复消息时实例化该SDK
* @param string $token 微信后台填写的TOKEN
*/
public function __construct($token){ echo "222";die;
if($token){
self::auth($token) || exit; if(IS_GET){
exit($_GET['echostr']);
} else {
$xml = file_get_contents("php://input");
$xml = new \SimpleXMLElement($xml);
$xml || exit; foreach ($xml as $key => $value) {
$this->data[$key] = strval($value);
}
}
} else {
throw new \Exception('参数错误!');
}
} /**
* 获取微信推送的数据
* @return array 转换为数组后的数据
*/
public function request(){
return $this->data;
} /**
* * 响应微信发送的信息(自动回复)
* @param array $content 回复信息,文本信息为string类型
* @param string $type 消息类型
*/
public function response($content, $type = self::MSG_TYPE_TEXT){
/* 基础数据 */
$data = array(
'ToUserName' => $this->data['FromUserName'],
'FromUserName' => $this->data['ToUserName'],
'CreateTime' => NOW_TIME,
'MsgType' => $type,
); /* 按类型添加额外数据 */
$content = call_user_func(array(self, $type), $content);
if($type == self::MSG_TYPE_TEXT || $type == self::MSG_TYPE_NEWS){
$data = array_merge($data, $content);
} else {
$data[ucfirst($type)] = $content;
} /* 转换数据为XML */
$xml = new \SimpleXMLElement('<xml></xml>');
self::data2xml($xml, $data);
exit($xml->asXML());
} /**
* 回复文本消息
* @param string $text 回复的文字
*/
public function replyText($text){
return $this->response($text, self::MSG_TYPE_TEXT);
} /**
* 回复图片消息
* @param string $media_id 图片ID
*/
public function replyImage($media_id){
return $this->response($media_id, self::MSG_TYPE_IMAGE);
} /**
* 回复语音消息
* @param string $media_id 音频ID
*/
public function replyVoice($media_id){
return $this->response($media_id, self::MSG_TYPE_VOICE);
} /**
* 回复视频消息
* @param string $media_id 视频ID
* @param string $title 视频标题
* @param string $discription 视频描述
*/
public function replyVideo($media_id, $title, $discription){
return $this->response(func_get_args(), self::MSG_TYPE_VIDEO);
} /**
* 回复音乐消息
* @param string $title 音乐标题
* @param string $discription 音乐描述
* @param string $musicurl 音乐链接
* @param string $hqmusicurl 高品质音乐链接
* @param string $thumb_media_id 缩略图ID
*/
public function replyMusic($title, $discription, $musicurl, $hqmusicurl, $thumb_media_id){
return $this->response(func_get_args(), self::MSG_TYPE_MUSIC);
} /**
* 回复图文消息,一个参数代表一条信息
* @param array $news 图文内容 [标题,描述,URL,缩略图]
* @param array $news1 图文内容 [标题,描述,URL,缩略图]
* @param array $news2 图文内容 [标题,描述,URL,缩略图]
* ... ...
* @param array $news9 图文内容 [标题,描述,URL,缩略图]
*/
public function replyNews($news, $news1, $news2, $news3){
return $this->response(func_get_args(), self::MSG_TYPE_NEWS);
} /**
* 回复一条图文消息
* @param string $title 文章标题
* @param string $discription 文章简介
* @param string $url 文章连接
* @param string $picurl 文章缩略图
*/
public function replyNewsOnce($title, $discription, $url, $picurl){
return $this->response(array(func_get_args()), self::MSG_TYPE_NEWS);
} /**
* 数据XML编码
* @param object $xml XML对象
* @param mixed $data 数据
* @param string $item 数字索引时的节点名称
* @return string
*/
protected static function data2xml($xml, $data, $item = 'item') {
foreach ($data as $key => $value) {
/* 指定默认的数字key */
is_numeric($key) && $key = $item; /* 添加子元素 */
if(is_array($value) || is_object($value)){
$child = $xml->addChild($key);
self::data2xml($child, $value, $item);
} else {
if(is_numeric($value)){
$child = $xml->addChild($key, $value);
} else {
$child = $xml->addChild($key);
$node = dom_import_simplexml($child);
$cdata = $node->ownerDocument->createCDATASection($value);
$node->appendChild($cdata);
}
}
}
} /**
* 对数据进行签名认证,确保是微信发送的数据
* @param string $token 微信开放平台设置的TOKEN
* @return boolean true-签名正确,false-签名错误
*/
protected static function auth($token){
/* 获取数据 */
$data = array($_GET['timestamp'], $_GET['nonce'], $token);
$sign = $_GET['signature']; /* 对数据进行字典排序 */
sort($data, SORT_STRING);
/* 生成签名 */
$signature = sha1(implode($data));
return $signature === $sign;
}
/**
* 构造文本信息
* @param string $content 要回复的文本
*/
private static function text($content){
$data['Content'] = $content;
return $data;
} /**
* 构造图片信息
* @param integer $media 图片ID
*/
private static function image($media){
$data['MediaId'] = $media;
return $data;
} /**
* 构造音频信息
* @param integer $media 语音ID
*/
private static function voice($media){
$data['MediaId'] = $media;
return $data;
} /**
* 构造视频信息
* @param array $video 要回复的视频 [视频ID,标题,说明]
*/
private static function video($video){
$data = array();
list(
$data['MediaId'],
$data['Title'],
$data['Description'],
) = $video; return $data;
} /**
* 构造音乐信息
* @param array $music 要回复的音乐[标题,说明,链接,高品质链接,缩略图ID]
*/
private static function music($music){
$data = array();
list(
$data['Title'],
$data['Description'],
$data['MusicUrl'],
$data['HQMusicUrl'],
$data['ThumbMediaId'],
) = $music; return $data;
} /**
* 构造图文信息
* @param array $news 要回复的图文内容
* [
* 0 => 第一条图文信息[标题,说明,图片链接,全文连接],
* 1 => 第二条图文信息[标题,说明,图片链接,全文连接],
* 2 => 第三条图文信息[标题,说明,图片链接,全文连接],
* ]
*/
private static function news($news){
$articles = array();
foreach ($news as $key => $value) {
list(
$articles[$key]['Title'],
$articles[$key]['Description'],
$articles[$key]['Url'],
$articles[$key]['PicUrl']
) = $value; if($key >= 9) break; //最多只允许10条图文信息
}
$data['ArticleCount'] = count($articles);
$data['Articles'] = $articles; return $data;
} }
<?php
/**
* 微信封装类访问高级接口
* @author huangguojin
* time 2015-7-14
*/
namespace Com;
class WechatAuth { /* 消息类型常量 */
const MSG_TYPE_TEXT = 'text';
const MSG_TYPE_IMAGE = 'image';
const MSG_TYPE_VOICE = 'voice';
const MSG_TYPE_VIDEO = 'video';
const MSG_TYPE_MUSIC = 'music';
const MSG_TYPE_NEWS = 'news';
const MSG_TYPE_LOCATION = 'location';
const MSG_TYPE_LINK = 'link';
const MSG_TYPE_EVENT = 'event'; /* 二维码类型常量 */
const QR_SCENE = 'QR_SCENE';
const QR_LIMIT_SCENE = 'QR_LIMIT_SCENE'; /**
* 微信开发者申请的appID
* @var string
*/
private $appId = ''; /**
* 微信开发者申请的appSecret
* @var string
*/
private $appSecret = ''; /**
* 获取到的access_token
* @var string
*/
private $accessToken = ''; /**
* 微信api根路径
* @var string
*/
private $apiURL = 'https://api.weixin.qq.com/cgi-bin'; /**
* 微信媒体文件根路径
* @var string
*/
private $mediaURL = 'http://file.api.weixin.qq.com/cgi-bin'; /**
* 微信二维码根路径
* @var string
*/
private $qrcodeURL = 'https://mp.weixin.qq.com/cgi-bin'; private $requestCodeURL = 'https://open.weixin.qq.com/connect/oauth2/authorize'; private $oauthApiURL = 'https://api.weixin.qq.com/sns'; /**
* 构造方法,调用微信高级接口时实例化SDK
* @param string $appid 微信appid
* @param string $secret 微信appsecret
* @param string $token 获取到的access_token
* @author huangguojin
*/
public function __construct($appid, $secret, $token = null){
if($appid && $secret){
$this->appId = $appid;
$this->appSecret = $secret; if(!empty($token)){
$this->accessToken = $token;
}
} else {
throw new \Exception('参数错误!');
}
} public function getRequestCodeURL($redirect_uri, $state = null,
$scope = 'snsapi_userinfo'){ $query = array(
'appid' => $this->appId,
'redirect_uri' => $redirect_uri,
'response_type' => 'code',
'scope' => $scope,
); if(!is_null($state) && preg_match('/[a-zA-Z0-9]+/', $state)){
$query['state'] = $state;
} $query = http_build_query($query);
return "{$this->requestCodeURL}?{$query}#wechat_redirect";
} /**
* 获取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':
$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 {
$this->accessToken = $token['access_token'];
return $token;
}
} else {
throw new \Exception('获取微信access_token失败!');
}
} /**
* 获取授权用户信息
* @param string $token acess_token
* @param string $lang 指定的语言
* @return array 用户信息数据,具体参见微信文档
*/
public function getUserInfo($token, $lang = 'zh_CN'){
$query = array(
'access_token' => $token['access_token'],
'openid' => $token['openid'],
'lang' => $lang,
); $info = self::http("{$this->oauthApiURL}/userinfo", $query);
return json_decode($info, true);
} /**
* 上传媒体资源
* @param string $filename 媒体资源本地路径
* @param string $type 媒体资源类型,具体请参考微信开发手册
*/
public function mediaUpload($filename, $type){
$param = array(
'access_token' => $this->accessToken,
'type' => $type
); $filename = realpath($filename);
if(!$filename) throw new \Exception('资源路径错误!'); $file = array('media' => "@{$filename}");
$url = "{$this->mediaURL}/media/upload";
$data = self::http($url, $param, $file, 'POST'); return json_decode($data, true);
} /**
* 获取媒体资源下载地址
* 注意:视频资源不允许下载
* @param string $media_id 媒体资源id
* @return string 媒体资源下载地址
*/
public function mediaGet($media_id){
$param = array(
'access_token' => $this->accessToken,
'media_id' => $media_id
); $url = "{$this->mediaURL}/media/get?";
return $url . http_build_query($param);
} /**
* 给指定用户推送信息
* 注意:微信规则只允许给在48小时内给公众平台发送过消息的用户推送信息
* @param string $openid 用户的openid
* @param array $content 发送的数据,不同类型的数据结构可能不同
* @param string $type 推送消息类型
*/
public function messageCustomSend($openid, $content, $type = self::MSG_TYPE_TEXT){ //基础数据
$data = array(
'touser'=>$openid,
'msgtype'=>$type,
); //根据类型附加额外数据
$data[$type] = call_user_func(array(self, $type), $content); return $this->api('message/custom/send', $data);
} /**
* 发送文本消息
* @param string $openid 用户的openid
* @param string $text 发送的文字
*/
public function sendText($openid, $text){
return $this->messageCustomSend($openid, $text, self::MSG_TYPE_TEXT);
} /**
* 发送图片消息
* @param string $openid 用户的openid
* @param string $media 图片ID
*/
public function sendImage($openid, $media){
return $this->messageCustomSend($openid, $media, self::MSG_TYPE_IMAGE);
} /**
* 发送语音消息
* @param string $openid 用户的openid
* @param string $media 音频ID
*/
public function sendVoice($openid, $media){
return $this->messageCustomSend($openid, $media, self::MSG_TYPE_VOICE);
} /**
* 发送视频消息
* @param string $openid 用户的openid
* @param string $media_id 视频ID
* @param string $title 视频标题
* @param string $discription 视频描述
*/
public function sendVideo(){
$video = func_get_args();
$openid = array_shift($video);
return $this->messageCustomSend($openid, $video, self::MSG_TYPE_VIDEO);
} /**
* 发送音乐消息
* @param string $openid 用户的openid
* @param string $title 音乐标题
* @param string $discription 音乐描述
* @param string $musicurl 音乐链接
* @param string $hqmusicurl 高品质音乐链接
* @param string $thumb_media_id 缩略图ID
*/
public function sendMusic(){
$music = func_get_args();
$openid = array_shift($music);
return $this->messageCustomSend($openid, $music, self::MSG_TYPE_MUSIC);
} /**
* 发送图文消息
* @param string $openid 用户的openid
* @param array $news 图文内容 [标题,描述,URL,缩略图]
* @param array $news1 图文内容 [标题,描述,URL,缩略图]
* @param array $news2 图文内容 [标题,描述,URL,缩略图]
* ... ...
* @param array $news9 图文内容 [标题,描述,URL,缩略图]
*/
public function sendNews(){
$news = func_get_args();
$openid = array_shift($news);
return $this->messageCustomSend($openid, $news, self::MSG_TYPE_NEWS);
} /**
* 发送一条图文消息
* @param string $openid 用户的openid
* @param string $title 文章标题
* @param string $discription 文章简介
* @param string $url 文章连接
* @param string $picurl 文章缩略图
*/
public function sendNewsOnce(){
$news = func_get_args();
$openid = array_shift($news);
$news = array($news);
return $this->messageCustomSend($openid, $news, self::MSG_TYPE_NEWS);
} /**
* 创建用户组
* @param string $name 组名称
*/
public function groupsCreate($name){
$data = array('group' => array('name' => $name));
return $this->api('groups/create', $data);
} /**
* 查询所有分组
* @return array 分组列表
*/
public function groupsGet(){
return $this->api('groups/get', '', 'GET');
} /**
* 查询用户所在的分组
* @param string $openid 用户的OpenID
* @return number 分组ID
*/
public function groupsGetid($openid){
$data = array('openid' => $openid);
return $this->api('groups/getid', $data);
} /**
* 修改分组
* @param number $id 分组ID
* @param string $name 分组名称
* @return array 修改成功或失败信息
*/
public function groupsUpdate($id, $name){
$data = array('id' => $id, 'name' => $name);
return $this->api('groups/update', $data);
} /**
* 移动用户分组
* @param string $openid 用户的OpenID
* @param number $to_groupid 要移动到的分组ID
* @return array 移动成功或失败信息
*/
public function groupsMemberUpdate($openid, $to_groupid){
$data = array('openid' => $openid, 'to_groupid' => $to_groupid);
return $this->api('groups/member/update', $data);
} /**
* 用户设备注名
* @param string $openid 用户的OpenID
* @param string $remark 设备注名
* @return array 执行成功失败信息
*/
public function userInfoUpdateremark($openid, $remark){
$data = array('openid' => $openid, 'remark' => $remark);
return $this->api('user/info/updateremark', $data);
} /**
* 获取指定用户的详细信息
* @param string $openid 用户的openid
* @param string $lang 需要获取数据的语言
*/
public function userInfo($openid, $lang = 'zh_CN'){
$param = array('openid' => $openid, 'lang' => $lang);
return $this->api('user/info', '', 'GET', $param);
} /**
* 获取关注者列表
* @param string $next_openid 下一个openid,在用户数大于10000时有效
* @return array 用户列表
*/
public function userGet($next_openid = ''){
$param = array('next_openid' => $next_openid);
return $this->api('user/get', '', 'GET', $param);
} /**
* 创建自定义菜单
* @param array $button 符合规则的菜单数组,规则参见微信手册
*/
public function menuCreate($button){
$data = array('button' => $button);
return $this->api('menu/create', $data);
} /**
* 获取所有的自定义菜单
* @return array 自定义菜单数组
*/
public function menuGet(){
return $this->api('menu/get', '', 'GET');
} /**
* 删除自定义菜单
*/
public function menuDelete(){
return $this->api('menu/delete', '', 'GET');
} /**
* 创建二维码,可创建指定有效期的二维码和永久二维码
* @param integer $scene_id 二维码参数
* @param integer $expire_seconds 二维码有效期,0-永久有效
*/
public function qrcodeCreate($scene_id, $expire_seconds = 0){
$data = array(); if(is_numeric($expire_seconds) && $expire_seconds > 0){
$data['expire_seconds'] = $expire_seconds;
$data['action_name'] = self::QR_SCENE;
} else {
$data['action_name'] = self::QR_LIMIT_SCENE;
} $data['action_info']['scene']['scene_id'] = $scene_id;
return $this->api('qrcode/create', $data);
} /**
* 根据ticket获取二维码URL
* @param string $ticket 通过 qrcodeCreate接口获取到的ticket
* @return string 二维码URL
*/
public function showqrcode($ticket){
return "{$this->qrcodeURL}/showqrcode?ticket={$ticket}";
} /**
* 长链接转短链接
* @param string $long_url 长链接
* @return string 短链接
*/
public function shorturl($long_url){
$data = array(
'action' => 'long2short',
'long_url' => $long_url
); return $this->api('shorturl', $data);
} /**
* 调用微信api获取响应数据
* @param string $name API名称
* @param string $data POST请求数据
* @param string $method 请求方式
* @param string $param GET请求参数
* @return array api返回结果
*/
protected function api($name, $data = '', $method = 'POST', $param = ''){
$params = array('access_token' => $this->accessToken); if(!empty($param) && is_array($param)){
$params = array_merge($params, $param);
} $url = "{$this->apiURL}/{$name}";
if(!empty($data)){
//保护中文,微信api不支持中文转义的json结构
array_walk_recursive($data, function(&$value){
$value = urlencode($value);
});
$data = urldecode(json_encode($data));
} $data = self::http($url, $params, $data, $method); return json_decode($data, true);
} /**
* 发送HTTP请求方法,目前只支持CURL发送请求
* @param string $url 请求URL
* @param array $param GET参数数组
* @param array $data POST的数据,GET请求时该参数无效
* @param string $method 请求方法GET/POST
* @return array 响应数据
*/
protected static function http($url, $param, $data = '', $method = 'GET'){
$opts = array(
CURLOPT_TIMEOUT => 30,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
); /* 根据请求类型设置特定参数 */
$opts[CURLOPT_URL] = $url . '?' . http_build_query($param); if(strtoupper($method) == 'POST'){
$opts[CURLOPT_POST] = 1;
$opts[CURLOPT_POSTFIELDS] = $data; if(is_string($data)){ //发送JSON数据
$opts[CURLOPT_HTTPHEADER] = array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data),
);
}
} /* 初始化并执行curl请求 */
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch); //发生错误,抛出异常
if($error) throw new \Exception('请求发生错误:' . $error); return $data;
} /**
* 构造文本信息
* @param string $content 要回复的文本
*/
private static function text($content){
$data['content'] = $content;
return $data;
} /**
* 构造图片信息
* @param integer $media 图片ID
*/
private static function image($media){
$data['media_id'] = $media;
return $data;
} /**
* 构造音频信息
* @param integer $media 语音ID
*/
private static function voice($media){
$data['media_id'] = $media;
return $data;
} /**
* 构造视频信息
* @param array $video 要回复的视频 [视频ID,标题,说明]
*/
private static function video($video){
$data = array();
list(
$data['media_id'],
$data['title'],
$data['description'],
) = $video; return $data;
} /**
* 构造音乐信息
* @param array $music 要回复的音乐[标题,说明,链接,高品质链接,缩略图ID]
*/
private static function music($music){
$data = array();
list(
$data['title'],
$data['description'],
$data['musicurl'],
$data['hqmusicurl'],
$data['thumb_media_id'],
) = $music; return $data;
} /**
* 构造图文信息
* @param array $news 要回复的图文内容
* [
* 0 => 第一条图文信息[标题,说明,图片链接,全文连接],
* 1 => 第二条图文信息[标题,说明,图片链接,全文连接],
* 2 => 第三条图文信息[标题,说明,图片链接,全文连接],
* ]
*/
private static function news($news){
$articles = array();
foreach ($news as $key => $value) {
list(
$articles[$key]['title'],
$articles[$key]['description'],
$articles[$key]['url'],
$articles[$key]['picurl']
) = $value; if($key >= 9) break; //最多只允许10条图文信息
} $data['articles'] = $articles;
return $data;
} }
自动加载到系统中。在Application/Common/Conf/config.php 映射到对应的文件
/* 模块相关配置 */
'AUTOLOAD_NAMESPACE' => array(
'Addons' => ONETHINK_ADDON_PATH,
'Com' => APP_PATH . 'Home/Com'
), //扩展模块列表
访问:localhost/XXXX/Index
TP3.2 引入微信类的更多相关文章
- Thinkphp 零散知识点(caa/js路径,引入第三方类,ajax返回,session/cookie)
一.关于JS和CSS路径问题 1.找路径是从入口文件index.php来找的,而不是从文件本身所在位置来找, 因为我们访问时是访问的入口文件 2.在存放JS和CSS的时候可以放到public文件夹下 ...
- 引入DecimalFormat类进行数字格式化操作
引入语句:import java.text.DecimalFormat; 首先创建DecimalFormat类对象,利用类对象调用Format()方法进行格式化操作.这里有两种方法:①.Decimal ...
- laravel 5.2 引入第三方类
composer 安装类依赖包 很受用 也很方便 但是要是一个有一定规模的公司技术团队 因为要照顾大局 还是引入类好些 下面是引入类的方法 1.首先在app目录下创建一个新的文件夹,命名Tools(可 ...
- C++引入自定义类(同一项目下 和 不同项目下的 区别)
今天遇到的问题,使用其他项目中的类时,引入头文件无效,然后发现如下: 项目B: 自定义类B BPro.h #include<iostream> using namespace std; c ...
- eclipse引入jar类包的源代码
为了方便查看源代码,有时候需要对jar类包,引入源代码. 下载源代码 源代码是zip或者rar的压缩包 引入到项目中
- lumen框架学习01——引入自定义类和函数
引入自定义的functions.php文件,首先把functions.php文件放在app的目录下,然后通过根目录的composer.json文件引入,具体操作如下图: 引入类文件也是一样,具体可参考 ...
- Springboot UT 引入某些类
http://www.infoq.com/cn/articles/Unit-Testing-Complete-Integration-Testing-Begins https://segmentfau ...
- TP3.2校验微信公众号||小程序 服务器地址
1.在TP3.2里面,写一个控制器,用来校验微信公众号||小程序的服务器地址 <?php namespace Home\Controller; use Think\Controller; hea ...
- laravel之引入验证码类
1.将验证码类文件夹放入到指定的位置,放入位置可以自定义 2.在控制器中引入验证码文件 3.在验证码文件中可以根据自己的需要,对验证码的内容进行编辑(包括背景,画线,边框,内容) 4.在入口文件中开启 ...
随机推荐
- 《你不知道的 CSS》之等比例缩放的盒子
你肯定已经知道,对于一个 img 元素而言,你可以单独地修改它的 width 或者 height 属性来设置它的大小,同时图片的比例还能够保持不变. 如下图所示,最上面是原始大小的图片,下面两张则分别 ...
- iOS:创建静态库及其使用
本篇来自转载,原创链接为:http://my.oschina.net/leejan97/blog/284193 摘要: 静态库文件可以有效的将功能封装和细节隐藏 ios 静态库 static lib ...
- python 操作solr索引数据
测试代码1: def test(self): data = {", "*字段名*": u"我是一个大好人"}}} params = {"bo ...
- python连接mysql并插入数据(自用)
#coding=utf-8 import MySQLdb db = MySQLdb.connect("IP","用户名","密码",&quo ...
- 【DP】【单调队列】【NOI2005】瑰丽华尔兹
340. [NOI2005] 瑰丽华尔兹 ★★★ 输入文件:adv1900.in 输出文件:adv1900.out 简单对照 时间限制:1 s 内存限制:128 MB [任务描写叙述] 你跳过华尔兹吗 ...
- S3C6410+FPGA+2*RTL8211 驱动 iperf測试
驱动也写的差点儿相同了,所以有必要測试下性能怎样?本次採用了iperf进行測试.而且对照了下s3c6410+ks8851的測试结果 1.iperf怎样交叉编译? https://iperf.fr/ 官 ...
- Win7如何查看自己得Win7版本号
如何查看Windows 7详细系统版本号? --Windows 7系统知识100问之七十一 责任编辑:姜惠田作者:IT168 老姜 2009-08-05 前言:微软新一代操作系统Windows 7 ...
- Selenium webdriver Java 操作IE浏览器
V1.0版本:直接新建WebDriver使用 import org.openqa.selenium.WebDriver; import org.openqa.selenium.ie.InternetE ...
- activiti入门3排他网关,并行网管,包括网关,事件网关
网关用来控制流程的流向 网关能够消费也能够生成token. 网关显示成菱形图形,内部有有一个小图标. 图标表示网关的类型. 基本分支 首先 利用 流程变量 写个带有分支的一个基本流程 流程图: wa ...
- iOS开发-XCode常用快捷键整理
前言:如果我们能够掌握并巧妙地使用快捷键,可以大大加快我们的工作效率,这个对经常使用快捷键的人们来说,应该很容易理解.因此我们需要做的是,针对于自己经常使用的快捷键去进行记忆.我不会推荐你们去把所有的 ...