第一节: 公众号砸金蛋应用和笑话大全小程序介绍
笑话小程序简单界面
公众号砸金蛋营销应用功能介绍
1 用户只能在微信里面打开
2 必须先关注公众号才能才加活动 (发模板)
3 同一个用户和同一个手机号码只能参加一次
4 抽到红包发生奖金给用户,并发送模板消息给用户,用户可以点击再次回到指定页面
5 可以设定总金额
6 可以设定抽奖概率
微擎介绍
http://www.we7.cc/
微擎开发文档
http://s.we7.cc/index.php?c=wiki&do=view&id=1
1 框架介绍
2 应用市场介绍
3 优势介绍
微擎安装
http://s.we7.cc/index.php?c=store&a=static&do=install&
学习版(破解版) 【比较稳定】
3 微擎添加公众号
目标 :解决在微擎系统添加绑定公众号
准备材料: 微信公众号(演示用微信服务号)
步骤: 配置微擎 配置微信公众号
4 微擎插件模块安装(安装过程采坑排雷)
课程目标
1 了解在线安装应用
2 线下模块安装实操 (一种别人的模块 ,一种是我们自己开发的模块)
3 安装遇到的坑处理
现象 微擎/微赞安装模块时提示:此模块已设置版权保护,您只能通过云平台来安装
解决办法
修改打开 \framework\model\cloud.mod.php 文件,
有三处需要修改
1、注释掉第23、24、25行代码(位于函数cloud_prepare中)
//if(empty( W [ ′ s e t t i n g ′ ] [ ′ s i t e ′ ] [ ′ k e y ′ ] ) ∣ ∣ e m p t y ( _W['setting']['site']['key']) || empty( W[′setting′][′site′][′key′])∣∣empty(_W[‘setting’][‘site’][‘token’])) { // return error(’-1’, “您的程序需要在微赞云服务平台注册你的站点资料, 来接入云平台服务后才能使用相应功能.”); //}
2、注释掉第 36、37、38行代码(位于函数 cloud_m_prepare 中)
//if ($dat[‘content’] == ‘install-module-protect’) { // return error(’-1’, ‘此模块已设置版权保护,您只能通过云平台来安装。’); //}
3、注释掉第151、152、153行代码(位于函数 cloud_t_prepare 中)
//if ($dat[‘content’] == ‘install-theme-protect’) { // return error(’-1’, ‘此模板已设置版权保护,您只能通过云平台来安装。’); //}
注:不要用记事本打开文件编辑,用程序编辑器编辑,如EmEditor,Editplus,Sublime Text等,或者开发IDE等
5 微擎如何在开发者中心创建自己的开发插件模块
目标
1 成为微擎开发者 (花300元)
2 创建自己的插件模块详解
A 插件命名规则 (且只能以字母开头,格式如:aa1_bb1或aa_bb)
3 安装自己的插件模块
6 微擎模块工作流程
目标
1 了解插件模块安装流程
2 了解插件运行过程
插件前台
域名/app/index.php?i=2&c=entry&do=index&m=gold_eggs
do=index ===>site.php () 写前台方法 doMobileXXX
插件后台 写后台方法 doWebXXX
域名/web/index.php?c=site&a=entry&do=Confs&m=gold_eggs
do=Confs==> site.php ()
https://minbang.bendilaosiji.com/app/index.php?i=2&c=entry&eid=30
MVC
https://minbang.bendilaosiji.com/app/index.php?i=2&c=entry&do=index&m=gold_eggs
参考内容一
1、模块的代码复制
这个就不用多说了吧,当然需要把相应的addons文件夹里的模块复制到自己系统的目录里,不然不要做以下的事情了
2、数据库表结构修改
代码复制过来,如果有相应的xml安装包或者install.php文件,可以直接安装,但是我们这里讲的是没有,那只能把原来要复制的表结构记录复制过来,插入或更新到自己的服务器上,这样就可以正常的运行了,需要处理的表结构参见如下表:
ims_modules 模块表,一个模块应该有一个记录
ims_modules_bindings ,模块后台菜单表记录,一个模块有N多记录
ims_uni_account_modules,公众号应该有的权限及配置信息,如果没有可以忽略
3、后台更改权限
做过以上两步后,后台就能在系统-> 模块列表显示添加的模块了,如果还没有显示自己检查以上两步骤,这样修改套餐对应的套餐里的模块功能,使其公众号里的套餐具备新加入的模块功能,保存配置
4、使用手动添加的模块
保存配置后,进入相应的微信公众账号,进入模块里,查找相应功能,一般可以正常使用
参考内容二
执行 http://xxx.com/web/index.php?c=site&a=entry&eid=6 系统是如何找到具体模块中的对应方法的?下面简单梳理一下:
web目录下的index.php 包含了require ‘…/framework/bootstrap.inc.php’;
在bootstrap.inc.php的最后读取controller,action,do
$controller = $_GPC[‘c’];
$action = $_GPC[‘a’];
$do = $_GPC[‘do’];
index.php继续往下走,require _forward($controller, a c t i o n ) ; f u n c t i o n f o r w a r d ( action); function _forward( action);functionforward(c, $a) {
$file = IA_ROOT . ‘/web/source/’ . $c . ‘/’ . $a . ‘.ctrl.php’;
return $file;
}
包含了 /web/source/site/entry.ctrl.php
在entry.ctrl.php里:
从ims_modules_bindings表里读取eid=6的记录到$entry,然后根据记录加载模块,
s i t e = W e U t i l i t y : : c r e a t e M o d u l e S i t e ( site = WeUtility::createModuleSite( site=WeUtility::createModuleSite(entry[‘module’]);
define(‘IN_MODULE’, $entry[‘module’]);
…
m e t h o d = ′ d o W e b ′ . u c f i r s t ( method = 'doWeb' . ucfirst( method=′doWeb′.ucfirst(entry[‘do’]);
exit( s i t e − > site-> site−>method());
例如$entry[‘do’]是stores,那实际调用的方法是模块目录下site.php里的doWebStores
7 微擎常量变量/路由
目标
1 了解 微擎的预定义常量
2 了解 微擎的比较常用的变量
3 了解微擎路由
模块的前台路由
doMobile路由名字
https://minbang.bendilaosiji.com/app/index.php?i=2&c=entry&do=index&m=gold_eggs
模块后台路由
doWeb路由的名字
https://minbang.bendilaosiji.com/web/index.php?c=site&a=entry&do=confs&m=gold_eggs
4 使用微擎创建路由方法创建路由
URL
插播一条绝招
开启微擎的 开发者模式 .
学习目标
1 $this->template 的作用 类似smarty 模板引擎
这句话include $this->template(‘index’); 如果是写在模块的前台方法 function doMobileIndex(){}
Addons/gold_eggs/template/mobile/index.html
这句话include $this->template(‘index’); 如果是写在模块的后台方法 function doWebConfs(){}
Addons/gold_eggs/template/index.html
2 输出变量
3 循环
4 判断
5 PHP代码
6 创建url
7 调用模板
9 微擎数据库函数
官方文档http://s.we7.cc/index.php?c=wiki&do=view&id=1&list=173
目标
1 创建一个微擎要求的命名规则的数据表
Ims_模块名字_表名
Ims_gold_eggs_orders
增
int | boolean pdo_insert($tablename, $data = array(), $replace = false)
删
int | boolean pdo_delete($tablename, $condition = array(), $glue = ‘AND’)
改
array | boolean pdo_update($tablename, $data = array(), $condition, $glue = ‘AND’)
查
查单条
array | boolean pdo_get($tablename, $condition = array(), $fields = array());
查多条
array | boolean pdo_getall($tablename, $condition = array(), $fields = array(), k e y f i e l d = ′ ′ , keyfield = '', keyfield=′′,orderby = array(), $limit = array()) {
查多表
SELECT ims_little_pay_category . * , ims_little_pay_article . *
FROM ims_little_pay_article
INNER JOIN ims_little_pay_category ON ims_little_pay_article.cid = ims_little_pay_category.id
$sql=“select o.* , m.realname as realname,m.phone as phone,m.nickname as nickname ,a.title as title from " . tablename(“domall_zc_order”) . " o” . " left join " . tablename(“domall_zc_member”) . " m on m.openid=o.openid " . " left join " . tablename(“domall_zc_goods”) . " a on a.id=o.goods_id “.” $where ORDER BY o.ordersn DESC ";
1
-查询
o r d e r s e = p d o f e t c h a l l ( orderse=pdo_fetchall( orderse=pdofetchall(sql,$params);
数据基本操作
微擎系统数据库操作使用 PDO 兼容方式,以参数绑定的形式进行查询操作。
系统已对 PDO 兼容性进行检测及封装。下面具体说明一下数据库的几种基本操作方法。
tablename()
为了防止微擎系统的表与其它系统命名冲突,安装微擎时均会指定一个表前缀,在写SQL语句时,需要将表名称附加上表前缀。可以使用 tablename() 函数。
$sql = "SELECT * FROM ".tablename(‘users’);
echo $sql;
//输出 SELECT * FROM ims_users
范围条件操作
在微擎20160601以后的版本中,增加了pdo_get、pdo_getall、pdo_getcolumn、pdo_getslice、pdo_insert、pdo_update、pdo_delete的范围条件的支持,具体支持的范围操作符如下:
array(’>’, ‘<’, ‘<>’, ‘!=’, ‘>=’, ‘<=’, ‘NOT IN’, ‘not in’, ‘+=’, ‘-=’);
字段名与操作符组成条件数组的键名,字段名与操作符中间间隔一个空格,具体使用方法如下:
//获取acid大于269的公众号
$account = pdo_get(‘account’, array(‘acid >’ => ‘269’));
//增加一次用户的错误登录次数,两次变为2即可
pdo_update(‘users_failed_login’, array(‘count +=’ => 1), array(‘username’ => ‘mizhou’));
查询
查询是数据库操作中使用最频繁的操作,微擎系统封装了一些函数适用于不同的场景,以下逐个说明
pdo_get
根据条件(AND连接)到指定的表中获取一条记录
$tablename 参数指定要查询的数据表名,此处传入的表名不要使用tablename()函数
$condition 参数指定查询的条件,以是 AND 连接,支持大于,小于等范围条件。具体使用查看本章节第二段范围条件操作
$fields 参数指定查询返回的字段列表
l i m i t 参 数 指 定 查 询 表 中 获 取 一 条 记 录 a r r a y ∣ b o o l e a n p d o g e t ( limit 参数指定查询表中获取一条记录 array | boolean pdo_get( limit参数指定查询表中获取一条记录array∣booleanpdoget(tablename, $condition = array(), $fields = array());
示例:
//根据uid获取用户的用户名和用户Id信息
//生成的SQL等同于:SELECT username, uid FROM ims_users WHERE uid = ‘1’ LIMIT 1
$user = pdo_get(‘users’, array(‘uid’ => 1), array(‘username’, ‘uid’));
//生成的SQL等同于:SELECT username FROM ims_users WHERE username = ‘mizhou’ AND status = ‘1’ LIMIT 1
$user = pdo_get(‘users’, array(‘username’ => ‘mizhou’, ‘status’ => 1), array(‘username’));
pdo_getcolumn
根据条件(AND连接)到指定的表中获取一条记录的指定字段
$tablename 参数指定要查询的数据表名,此处传入的表名不要使用tablename()函数
$condition 参数指定查询的条件,以是 AND 连接,支持大于,小于等范围条件.。具体使用查看本章节第二段范围条件操作
$field 参数指定查询返回的字段
l i m i t 参 数 指 定 查 询 表 中 获 取 一 条 记 录 s t r i n g ∣ i n t p d o g e t c o l u m n ( limit 参数指定查询表中获取一条记录 string | int pdo_getcolumn( limit参数指定查询表中获取一条记录string∣intpdogetcolumn(tablename, $condition = array(), $field, $limit=1);
示例:
//根据uid获取用户的用户名
//生成的SQL等同于:SELECT username FROM ims_users WHERE uid = ‘1’ LIMIT 1
$username = pdo_getcolumn(‘users’, array(‘uid’ => 1), ‘username’,1);
pdo_getall
根据条件(AND连接)到指定的表中获取全部记录
$condition 参数指定查询的条件,以是 AND 连接,支持大于,小于等范围条件.。具体使用查看本章节第二段范围条件操作
$keyfield 参数传入一个已存在的字段名称,结果数组键值就为该字段,否则为自然排序
$orderby 参数指定查询结果按哪个字段排序
l i m i t 参 数 指 定 查 询 语 句 的 L I M I T 值 , a r r a y ( s t a r t , e n d ) 或 是 直 接 传 入 范 围 2 , 3 其 它 参 数 同 p d o g e t 函 数 a r r a y ∣ b o o l e a n p d o g e t a l l ( limit 参数指定查询语句的LIMIT值,array(start, end) 或是直接传入范围 2,3 其它参数同pdo_get函数 array | boolean pdo_getall( limit参数指定查询语句的LIMIT值,array(start,end)或是直接传入范围2,3其它参数同pdoget函数array∣booleanpdogetall(tablename, $condition = array(), $fields = array(), k e y f i e l d = ′ ′ , keyfield = '', keyfield=′′,orderby = array(), $limit = array()) {
示例:
//获取全部启用的用户
//生成的SQL等同于:SELECT * FROM ims_users WHERE status = ‘1’
$user = pdo_getall(‘users’, array(‘status’ => 1));
//获取从第一条数据开始的10条启用的用户
//生成的SQL等同于:SELECT * FROM ims_users WHERE status =’ 2’ ORDER BY uid,groupid LIMIT 0, 10
$user = pdo_getall(‘users’, array(‘status’ => 1), array() , ‘’ , array(‘uid’,‘groupid’) , array(1,10));
$user1 = pdo_getall(‘users’, array(‘status’ => 1), array() , ‘’ , ‘uid DESC’ , array(1,10));
pdo_getslice
根据条件(AND连接)到指定的表中获取某个区间的记录,此函数和 pdo_getall 的区别是可以指定limit 值
$condition 参数指定查询的条件,以是 AND 连接,支持大于,小于等范围条件.。具体使用查看本章节第二段范围条件操作
$limit 参数指定查询语句的LIMIT值,array(start, end) 或是直接传入范围 2,3
$total 参数指定查询结果的总条数,方便进行分页操作
o r d e r b y 参 数 指 定 查 询 结 果 按 哪 个 字 段 排 序 a r r a y ∣ b o o l e a n p d o g e t s l i c e ( orderby 参数指定查询结果按哪个字段排序 array | boolean pdo_getslice( orderby参数指定查询结果按哪个字段排序array∣booleanpdogetslice(tablename, $condition = array(), KaTeX parse error: Expected 'EOF', got '&' at position 18: …mit = array(), &̲total = null, $fields = array(), $keyfield = ‘’, $orderby = array())
示例:
//获取从第一条数据开始的10条启用的用户
//生成的SQL等同于$user = SELECT * FROM ims_users WHERE status =‘2’ ORDER BY uid,groupid LIMIT 0, 10
$user = pdo_getslice(‘users’, array(‘status’ => 2), array(1,10) , $total , array() , ‘’ , array(‘uid’,‘groupid’));
#####pdo_fetch
根据SQL语句,查询一条记录
$sql 参数指定要返回记录集的SQL语句
p a r a m s 参 数 指 定 为 S Q L 语 句 中 的 参 数 绑 定 传 值 , 防 止 S Q L 注 入 需 要 注 意 的 是 使 用 参 数 绑 定 时 , S Q L 语 中 等 号 后 不 需 要 使 用 引 号 , 传 入 的 值 必 须 与 绑 定 的 名 称 一 致 a r r a y ∣ b o o l e a n p d o f e t c h ( params 参数指定为SQL语句中的参数绑定传值,防止SQL注入 需要注意的是使用参数绑定时,SQL语中等号后不需要使用引号,传入的值必须与绑定的名称一致 array | boolean pdo_fetch( params参数指定为SQL语句中的参数绑定传值,防止SQL注入需要注意的是使用参数绑定时,SQL语中等号后不需要使用引号,传入的值必须与绑定的名称一致array∣booleanpdofetch(sql, $params = array());
示例:
// :uid 是参数的一个占位符,没有使用引号,传入的第二个参数中要与SQL中的占位名称相同
$user = pdo_fetch(“SELECT username, uid FROM “.tablename(‘users’).” WHERE uid = :uid LIMIT 1”, array(’:uid’ => 1));
// LIKE 占位的使用方法
$user = pdo_fetch(“SELECT * FROM “.tablename(‘users’).” WHERE username LIKE :username”, array(’:username’ => ‘%mizhou%’));
pdo_fetchcolumn
根据SQL语句,查询第一条记录的第N列的值,此语句与 pdo_fetch 使用相同,只是此函数返回的不是一个数组而是一个字符串
c o l u m n 参 数 指 定 返 回 记 录 集 的 第 几 列 数 据 s t r i n g ∣ b o o l e a n p d o f e t c h c o l u m n ( column 参数指定返回记录集的第几列数据 string | boolean pdo_fetchcolumn( column参数指定返回记录集的第几列数据string∣booleanpdofetchcolumn(sql, $params = array(), $column = 0)
示例:
// 获取用户的总数,返回的值是一个数字
$user_total = pdo_fetchcolumn("SELECT COUNT(*) FROM ".tablename(‘users’));
pdo_fetchall
根据SQL语句,查询全部记录,使用方法与pdo_fetch相同
array | boolean pdo_fetchall($sql, $params = array(), $keyfield = ‘’)
示例:
// 需要注意的是,返回的数组的键值为用户的uid
$user = pdo_fetchall("SELECT username, uid FROM ".tablename(‘users’), array(), ‘uid’);
####变更
以下说明插入,更新,删除操作的几个函数。
pdo_insert
对指定数据表插入一条新记录
$tablename 参数指定要插入记录的数据表名,此处传入的表名不要使用tablename()函数
$data 参数指定要插入的记录,格式为与数据表字段对应的关联数组
r e p l a c e 参 数 指 定 插 入 方 式 使 用 I N S E R T 语 句 或 是 R E P L A C E 语 句 ( 查 找 到 主 键 相 同 的 数 据 选 择 u p d a t e ) i n t ∣ b o o l e a n p d o i n s e r t ( replace 参数指定插入方式使用 INSERT 语句或是 REPLACE 语句(查找到主键相同的数据选择update) int | boolean pdo_insert( replace参数指定插入方式使用INSERT语句或是REPLACE语句(查找到主键相同的数据选择update)int∣booleanpdoinsert(tablename, $data = array(), $replace = false)
示例:
//添加一条用户记录,并判断是否成功
$user_data = array(
‘username’ => ‘mizhou1’,
‘status’ => ‘1’,
);
$result = pdo_insert(‘users’, u s e r d a t a ) ; i f ( ! e m p t y ( user_data); if (!empty( userdata);if(!empty(result)) {
$uid = pdo_insertid();
message(‘添加用户成功,UID为’ . $uid);
}
pdo_update
更新指定的数据表的记录
$glue 参数指定前面 c o n d i t i o n 数 组 条 件 的 关 联 字 A N D 或 是 O R a r r a y ∣ b o o l e a n p d o u p d a t e ( condition 数组条件的关联字 AND 或是 OR array | boolean pdo_update( condition数组条件的关联字AND或是ORarray∣booleanpdoupdate(tablename, $data = array(), $condition, $glue = ‘AND’)
示例:
//更uid等于2的用户的用户名
$user_data = array(
‘username’ => ‘mizhou2’,
);
$result = pdo_update(‘users’, u s e r d a t a , a r r a y ( ′ i d ′ = > 2 ) ) ; i f ( ! e m p t y ( user_data, array('id' => 2)); if (!empty( userdata,array(′id′=>2));if(!empty(result)) {
message(‘更新成功’);
}
pdo_delete
删除指定条件的数据
int | boolean pdo_delete($tablename, $condition = array(), $glue = ‘AND’)
示例:
//删除用户名为mizhou2的记录
r e s u l t = p d o d e l e t e ( ′ u s e r s ′ , a r r a y ( ′ u s e r n a m e ′ = > ′ m i z h o u 2 ′ ) ) ; i f ( ! e m p t y ( result = pdo_delete('users', array('username' => 'mizhou2')); if (!empty( result=pdodelete(′users′,array(′username′=>′mizhou2′));if(!empty(result)) {
message(‘删除成功’);
}
####运行SQL
当更新,插入,删除无法满足时,可以直接构造SQL语句进行操作
pdo_query
运行一条SQL语句
p a r a m s 指 定 S Q L 语 句 中 绑 定 参 数 的 值 , 参 数 占 位 与 p d o f e t c h 一 致 i n t ∣ b o o l e a n q u e r y ( params 指定SQL语句中绑定参数的值,参数占位与 pdo_fetch 一致 int | boolean query( params指定SQL语句中绑定参数的值,参数占位与pdofetch一致int∣booleanquery(sql, $params = array())
示例:
//更uid等于2的用户的用户名
$result = pdo_query(“UPDATE “.tablename(‘users’).” SET username = :username, age = :age WHERE uid = :uid”, array(’:username’ => ‘mizhou2’, ‘:age’ => 18, ‘:uid’ => 2));
//删除用户名为mizhou2的记录
r e s u l t = p d o q u e r y ( " D E L E T E F R O M " . t a b l e n a m e ( ′ u s e r s ′ ) . " W H E R E u i d = : u i d " , a r r a y ( ′ : u i d ′ = > 2 ) ) ; i f ( ! e m p t y ( result = pdo_query("DELETE FROM ".tablename('users')." WHERE uid = :uid", array(':uid' => 2)); if (!empty( result=pdoquery("DELETEFROM".tablename(′users′)."WHEREuid=:uid",array(′:uid′=>2));if(!empty(result)) {
message(‘删除成功’);
}
#####pdo_run
批量执行SQL语句
s t u f f 函 数 将 会 将 此 参 数 指 定 的 值 , 替 换 为 当 前 系 统 的 表 前 缀 。 注 : 与 p d o q u e r y 不 同 的 是 , p d o r u n 是 可 以 一 次 执 行 多 条 S Q L 语 句 , 每 条 S Q L 必 须 以 ; 分 隔 。 b o o l e a n r u n ( stuff 函数将会将此参数指定的值,替换为当前系统的表前缀。 注:与pdo_query不同的是,pdo_run是可以一次执行多条SQL语句,每条SQL必须以;分隔。 boolean run( stuff函数将会将此参数指定的值,替换为当前系统的表前缀。注:与pdoquery不同的是,pdorun是可以一次执行多条SQL语句,每条SQL必须以;分隔。booleanrun(sql, $stuff = ‘ims_’)
示例:
$sql = <<ims_multisearch
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT,
weid
int(10) unsigned NOT NULL,
PRIMARY KEY (id
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS ims_multisearch_fields
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT,
reid
int(10) unsigned NOT NULL,
type
tinyint(1) unsigned NOT NULL DEFAULT ‘1’,
title
varchar(255) NOT NULL,
PRIMARY KEY (id
),
KEY idx_reid
(reid
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
EOF;
pdo_run($sql);
辅助函数
pdo_fieldexists
检查表中是否存在某个字段
$tablename 参数指定要检查的表名称
f i e l d n a m e 参 数 指 定 要 检 查 是 否 存 在 的 字 段 名 b o o l e a n p d o f i e l d e x i s t s ( fieldname 参数指定要检查是否存在的字段名 boolean pdo_fieldexists( fieldname参数指定要检查是否存在的字段名booleanpdofieldexists(tablename, $fieldname)
示例:
//如果shopping_goods表中不存在credit字段,则新增credit字段
if(!pdo_fieldexists(‘shopping_goods’, ‘credit’)) {
pdo_query(“ALTER TABLE “.tablename(‘shopping_goods’).” ADD credit
int(11) NOT NULL DEFAULT ‘0’;”);
}
#####pdo_indexexists
检查表中是否存在某个索引
$tablename 参数指定要检查的表名称
i n d e x n a m e 参 数 指 定 要 检 查 是 否 存 在 的 索 引 名 b o o l e a n p d o i n d e x e x i s t s ( indexname 参数指定要检查是否存在的索引名 boolean pdo_indexexists( indexname参数指定要检查是否存在的索引名booleanpdoindexexists(tablename, $indexname)
示例:
//如果site_slide表中不存在multiid索引,则新增multiid索引
if (!pdo_indexexists(‘site_slide’, ‘multiid’)) {
pdo_query(“ALTER TABLE “.tablename(‘site_slide’).” ADD INDEX multiid
(multiid
);”);
}
pdo_tableexists
检查数据库中是否存在某个表
boolean pdo_tableexists($tablename)
pdo_debug
调试运行SQL语句,显示执行过的SQL的栈情况
o u t p u t 参 数 指 定 是 否 直 接 打 印 出 调 试 信 息 a r r a y d e b u g ( output 参数指定是否直接打印出调试信息 array debug( output参数指定是否直接打印出调试信息arraydebug(output = true, $append = array())
示例:
pdo_debug();
//调用该函数结果如下
Array
(
[0] => Array
(
[sql] => SET NAMES ‘utf8’;
[error] => Array
(
[0] => 00000
[1] =>
[2] =>
)
)
[1] => Array
(
[sql] => SELECT value
FROM ims_core_cache
WHERE key
=:key
[params] => Array
(
[:key] => setting
)
[error] => Array
(
[0] => 00000
[1] =>
[2] =>
)
)
)
深入教程
函数所在文件:framework/function/cache.mysql.func.php
目前微擎的个人真实调用:
$setting = $this->module[‘config’];
$aaaaa = $setting[‘copyright’];
在微擎微信公众号系统里面可以分为三类缓存:保存到数据库表core_cache中的数据库缓存、保存到文件的文件缓存和memcahe缓存,本教程介绍的是数据库缓存,也是微擎系统配置的默认缓存。
因为,处理数据库缓存的函数相对简单,所以,phpos微信网把这几个函数一起制作成一个教程。因为是对数据库表操作,所以,再怎么操作表,无非就是对表记录进行插入(增)、删除、修改和查询,所以,对应着数据库缓存函数也有插入缓存数据、删除缓存数据、修改缓存数据和查询缓存数据操作。
在微擎微信公众号系统里面缓存数据都保存到了缓存表core_cache里面,也就是说下面的函数都是对这个表这进行的增、删、改和查的操作。
表core_cache:
一、插入(写入)缓存数据
cache_write($key, $data)函数:这个在本站已经有详细的讲解了,这里不再多解释。
示例
load()->func(‘cache.mysql’);
cache_write(‘phpos’,array(‘webname’=>‘微信开发’,‘url’=>‘phpos.net’,‘title’=>array(‘微信开发’,‘微信公众号’)));
结果:
二、删除缓存数据
删除函数:cache_delete($key)
此函数的作用是:删除core_cache表中的某一条记录。
k e y 为 要 删 除 的 表 中 字 段 k e y 的 值 , 例 如 , 删 除 p h p o s 记 录 , 则 key 为要删除的表中字段key的值,例如,删除phpos记录,则 key为要删除的表中字段key的值,例如,删除phpos记录,则key=‘phpos’。
这个函数使用的sql语句是:
DELETE FROM ’ . tablename(‘core_cache’) . ’ WHERE key
=:key
这个参数 k e y 正 是 要 删 除 的 条 件 , 所 以 , 只 要 您 传 一 个 值 key正是要删除的条件,所以,只要您传一个值 key正是要删除的条件,所以,只要您传一个值key就可以把表中key字段对应的记录删除掉。
在这个函数里面使用了微擎微信公众号系统封装的数据库查询函数pdo_query($sql, $params),这个函数类似面向过程里面的mysql_query()执行一条sql语句。
示例
删除字段phpos对应的记录:
load()->func(‘cache.mysql’);
cache_delete(‘phpos’);
三、删除整个缓存表里面的记录,或是删除包含相同名称的记录。
删除函数:cache_clean($prefix = ‘’)
上面的函数是删除确定的某一条记录,而本函数删除的是整个表或是包含类似phpos:、web:、site:等字段的值的记录。
1)如果$prefix为空,则删除事个core_cache表中的数据。
并且,删除保存在全局变量$_W中的数据:
if ($result) {
unset($_W['cache']);
}
其中,$_W[‘cache’]是在文件bootstrap.inc.php里面定义的:
if(!in_array($_W[‘config’][‘setting’][‘cache’], array(‘mysql’, ‘file’, ‘memcache’))) {
KaTeX parse error: Expected 'EOF', got '}' at position 45: …e'] = 'mysql'; }̲ 这个条件里面的_W[‘config’][‘setting’][‘cache’]是在配置文件data/config.php配置的,默认是mysql,表示使用缓存数据使用“数据库缓存”。
2)如果KaTeX parse error: Expected '}', got 'EOF' at end of input: prefix不空,则删除与{prefix}:%匹配的数据。
示例:
load()->func(‘cache.mysql’);
cache_clean(‘website’);
或
cache_clean();
四、查询缓存数据
1)读取缓存数据函数:
cache_read($key)
读取表中某一条缓存数据的值:
SELECT value
FROM ’ . tablename(‘core_cache’) . ’ WHERE key
=:key’
从这个sql语句就可以看出这个函数查询的是表core_cache中的键为 k e y 对 应 的 值 , 并 且 , 使 用 函 数 i u n s e r i a l i z e r ( key对应的值,并且,使用函数iunserializer( key对应的值,并且,使用函数iunserializer(val)把查询出来的序列化的字符串转换成反序列化成字符串。
示例
load()->func(‘cache.mysql’);
print_r(cache_read(‘website’));
结果:Array ( [url] => www.phpos.net [title] => 微信网 )
2)查询所有符合条件的缓存数据函数:
cache_search($prefix)
查询sql语句:
$sql = 'SELECT * FROM ' . tablename('core_cache') . ' WHERE `key` LIKE :key';
$params = array();
$params[':key'] = "{$prefix}%";
$rs = pdo_fetchall($sql, $params);
从上面这段代码就可以看出这个函数是查询字段key的值包含{$prefix}的所有记录,这里使用了函数pdo_fetchall()查询出所有符合条件的记录。
最后,返回的是$result,也是一个数组。
示例
load()->func(‘cache.mysql’);
print_r(cache_search(‘website’));
结果:Array ( [website] => Array ( [url] => www.phpos.net [title] => 微信网 ) )
五、更新缓存数据
在这个文件cache.mysql.func.php里面,我们并没有发现更新缓存数据,难道不能更新吗?其实,写数据函数cache_write()里面在调用函数pdo_insert(‘core_cache’, $record, true)时,使用了插入数据函数的第三个参数true,如果使用这个参数,使用replace into语句插入数据,这条sql语句,会判断一下表中是否存在某一数据,如果存在则删除之,然后,再把要插入表的数据插入到表中。
所以,其实,这个写入数据函数本身就有更新数据的功能,所以,在这个文件里面并没有单独定义“更新”缓存数据。
10 微擎获取用户信息参数(openid,头像,地区等)
微信官方文档
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
微擎官方文档
http://s.we7.cc/index.php?c=wiki&do=view&id=1&list=549
目标
1 通过微擎函数 获取用户信息
2 自定义微信分享好友或朋友圈
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: ‘’, // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: ‘’, // 必填,生成签名的随机串
signature: ‘’,// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
11 微擎支付api(发起支付/验证支付)
微信支付开发文档: https://pay.weixin.qq.com/wiki/doc/api/index.html
微擎支付开发文档:http://s.we7.cc/index.php?c=wiki&do=view&id=1&list=360
学习目标
1 微擎支付参数配置
2 微信商户号开发配置
3 PHP发起支付
[https://minbang.bendilaosiji.com/app/./index.php?i=2&c=entry&do=zhifu&m=gold_eggs]
4 js发起支付
5 验证支付结果
[2018-06-06 11:00:13] trace /payment/wechat/notify.php? weid=; uniacid=2; acid=2; result=success; type=; from=notify; tid=20180606555252486608; uniontid=2018060611000700001468438396; transaction_id=; trade_type=JSAPI; follow=1; user=opqp80q1XnInacQ7cniTcFX65ngg; fee=1.00; tag={acid=2; uid=2; transaction_id=4200000133201806063859003646; }; is_usecard=0; card_type=0; card_fee=1.00; card_id=; paytime=1528254013;
//商品编号生成
(YmdHi)拼接上兑换表生成的Id
//订单号的生成
(YmdHi)拼接上订单表生成的Id
echo date(‘Ymd’) . str_pad(mt_rand(1, 99999), 5, ‘0’, STR_PAD_LEFT);
订单号常见的几种方式:
1.利用数据库主键值产生一个自增长的订单号(订单号即数据表的主键)
2.日期+自增长数字的订单号(比如:2012040110235662)
3.产生随机的订单号(65865325365966)
4.字母+数字字符串式,字母有包含特别意义,C02356652
订单号设计原则: 按需设计
用来检索订单详细信息的唯一特征码,可以利用订单号检索到下单日期、产品类别、颜色、尺码(或款式)、仓位等信息,订单号包含过多的信息有点“画蛇添足”的意味!只要按需设计即可!
订单号设计用户体验规则:
1.订单号无重复性;
2.如果方便客服的话,最好是“日期+自增数”样式的订单号,客服一看便知道订单是否在退货保障期限内容;
3.订单号长度尽量保持短(10位以内),方便用户,尤其电话投诉时,长的号码报错几率高,影响客服效率;
4.订单号尽量保持数字型(纯整数),在数据库订单索引查询中,长整数字型的数据索引与检索效率,远远高于文本型,因此尽量避免“字母+数字字符串式”!
做商城类项目经常需要生成唯一订单号,下面来个汇总!
方法一:
return date(‘Ymd’) . str_pad(mt_rand(1, 99999), 5, ‘0’, STR_PAD_LEFT);
方法二: 正在使用。。。
return date(‘Ymd’).substr(implode(NULL, array_map(‘ord’, str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
方法三:以前使用。。。
public function make_order($user_id)
{
return mt_rand(10,99)
. sprintf(’%010d’,time() - 946656000)
. sprintf(’%03d’, (float) microtime() * 1000)
. sprintf(’%03d’, (int) $user_id % 1000);
}
方法四:
$yCode = array(‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’);
$orderSn = $yCode[intval(date(‘Y’)) - 2011] . strtoupper(dechex(date(‘m’))) . date(‘d’) . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf(’%02d’, rand(0, 99));
12 微信企业付款到零钱
目标: 实现企业付款到零钱
步骤
1 下载支付证书
2 配置支付参数 (1 用户微信需要实名认证 2 提现最低要1元)
3 发起支付获取支付结果
企业付款微信官方文档 https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
require_once(dirname(FILE)."/pay.php");
//创建一个订单编号字符串,尽量不要重复
public function getordernums(){
$danhao = date(‘Ymd’).substr(implode(NULL, array_map(‘ord’, str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
return $danhao.mt_rand(1000, 9999);
}
https://minbang.bendilaosiji.com/app/index.php?i=2&c=entry&do=lingqian&m=gold_eggs
dirname(dirname(FILE));
假设__FILE__为 /home/web/config/config.php
上面的方法输出为 /home/web
dirname(dirname(FILE));得到的是文件上一层目录名
dirname(FILE);得到的是文件所在层目录名
13 微擎模板消息
[https://minbang.bendilaosiji.com/app/index.php?i=2&c=entry&do=Sendtpl&m=gold_eggs]
$data = array(
‘first’ => array(
‘value’ => “捐赠成功!”,
‘color’ => ‘#ff510’
),
‘orderProductPrice’ => array(
‘value’ => $money,
‘color’ => ‘#ff510’
),
‘orderProductName’ => array(
‘value’ => ‘为流浪狗捐款’,
‘color’ => ‘#ff510’
),
‘orderAddress’ => array(
‘value’ => ‘无’,
‘color’ => ‘#ff510’
),
‘orderName’ => array(
‘value’ => “2018” ,
‘color’ => ‘#ff510’
),
);
u r l = url= url=_W[‘siteroot’].“app/index.php?i=2&c=entry&do=create&m=stray_dog&ordernum=”.KaTeX parse error: Expected 'EOF', got '&' at position 22: …['ordernums']."&̲openid=".torder[‘openid’]."&did=".$torder[‘dogid’];
$account_api = WeAccount::create();
$result = a c c o u n t a p i − > s e n d T p l N o t i c e ( account_api->sendTplNotice( accountapi−>sendTplNotice(torder[‘openid’], ‘GqqCO3-KS5pZOR1EYfnG7j6o2kcD39nqoSd77pQK0J0’, d a t a , data, data,url);
14 phpqrcode生成带推广参数二维码
1 生成带参数的二维码
http://phpqrcode.sourceforge.net/
二维码在线识别 http://jiema.wwei.cn/
u s e r i n f o x = m c o a u t h u s e r i n f o ( userinfox=mc_oauth_userinfo( userinfox=mcoauthuserinfo(_W[‘uniacid’]);
require MB_ROOT . ‘/phpqrcode/qrlib.php’;
//QRcode::png(‘PHP QR Code ?’);
$value = $url;
$errorCorrectionLevel = “L”;
$matrixPointSize = “4.3”;
m a r g i n = " 1 " ; Q R c o d e : : p n g ( margin="1"; QRcode::png( margin="1";QRcode::png(value, MB_ROOT.’/haibao/code/’.$userinfo[‘openid’].’.png’, $errorCorrectionLevel, m a t r i x P o i n t S i z e , matrixPointSize, matrixPointSize,margin);
15 微擎合成二维码推广海报
1 推广 /获客
合成文字
$dst_path = IA_ROOT . ‘/addons/gold_eggs/posterbg.jpg’;
//创建图片的实例
d s t = i m a g e c r e a t e f r o m s t r i n g ( f i l e g e t c o n t e n t s ( dst = imagecreatefromstring(file_get_contents( dst=imagecreatefromstring(filegetcontents(dst_path));
//获取背景图片的宽高
list($dst_w, d s t h ) = g e t i m a g e s i z e ( dst_h) = getimagesize( dsth)=getimagesize(dst_path);
//打上文字
$font = IA_ROOT . ‘/addons/gold_eggs/yahei.ttf’;
b l a c k = i m a g e c o l o r a l l o c a t e ( black = imagecolorallocate( black=imagecolorallocate(dst, 0, 1, 0);//字体颜色
//用户昵称
imagefttext($dst, 30, 0, 100, 100, $black, $font, ‘cto学院’);
//输出图片
list($dst_w, $dst_h, d s t t y p e ) = g e t i m a g e s i z e ( dst_type) = getimagesize( dsttype)=getimagesize(dst_path);
switch (KaTeX parse error: Expected '}', got 'EOF' at end of input: … imagegif(dst);
break;
case 2://JPG
//header(‘Content-Type: image/jpeg’);
//imagejpeg( d s t ) ; i m a g e j p e g ( dst); imagejpeg( dst);imagejpeg(dst,IA_ROOT . ‘/addons/gold_eggs/haibao/124.jpg’);
break;
case 3://PNG
header('Content-Type: image/png');
imagepng($dst);
break;
default:
break;
}
imagedestroy($dst);
https://minbang.bendilaosiji.com/app/index.php?i=2&c=entry&do=haibao&m=gold_eggs
合成 图片
$dst_path = IA_ROOT . '/addons/gold_eggs/posterbg.jpg';
$src_path = IA_ROOT . '/addons/gold_eggs/haibao/1.jpg';
//$src_path = IA_ROOT . '/addons/gold_eggs/'.$userinfo['openid'].'.png';
//创建图片的实例
d s t = i m a g e c r e a t e f r o m s t r i n g ( f i l e g e t c o n t e n t s ( dst = imagecreatefromstring(file_get_contents( dst=imagecreatefromstring(filegetcontents(dst_path));
s r c = i m a g e c r e a t e f r o m s t r i n g ( f i l e g e t c o n t e n t s ( src = imagecreatefromstring(file_get_contents( src=imagecreatefromstring(filegetcontents(src_path));
//获取背景图片的宽高
list($dst_w, d s t h ) = g e t i m a g e s i z e ( dst_h) = getimagesize( dsth)=getimagesize(dst_path);
//获取水印图片的宽高
list($src_w, s r c h ) = g e t i m a g e s i z e ( src_h) = getimagesize( srch)=getimagesize(src_path);
//将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
imagecopymerge($dst, $src, 100, 100, 0, 0, $src_w, $src_h, 100);
//打上文字
$font = IA_ROOT . ‘/addons/gold_eggs/yahei.ttf’;
b l a c k = i m a g e c o l o r a l l o c a t e ( black = imagecolorallocate( black=imagecolorallocate(dst, 0, 1, 0);//字体颜色
//用户昵称
imagefttext($dst, 30, 0, 100, 100, $black, $font, ‘cto学院’);
//输出图片
list($dst_w, $dst_h, d s t t y p e ) = g e t i m a g e s i z e ( dst_type) = getimagesize( dsttype)=getimagesize(dst_path);
switch (KaTeX parse error: Expected '}', got 'EOF' at end of input: … imagegif(dst);
break;
case 2://JPG
//header(‘Content-Type: image/jpeg’);
//imagejpeg( d s t ) ; i m a g e j p e g ( dst); imagejpeg( dst);imagejpeg(dst,IA_ROOT . ‘/addons/gold_eggs/haibao/124.jpg’);
break;
case 3://PNG
header('Content-Type: image/png');
imagepng($dst);
break;
default:
break;
}
imagedestroy($dst);
生成文字水印
//文字水印
/打开图片/
//1.配置图片路径
$src = “4.jpg”;
//2.获取图片的信息(得到图片的基本信息)
i n f o = g e t i m a g e s i z e ( info = getimagesize( info=getimagesize(src );
//3.通过获取图片类型
t y p e = i m a g e t y p e t o e x t e n s i o n ( type = image_type_to_extension( type=imagetypetoextension(info[2],false);
//4.在内存中创建一个图片类型一样的图像
KaTeX parse error: Expected '}', got 'EOF' at end of input: …magecreatefrom{type}";
//5.图片复制到内存中
$image = f u n ( fun( fun(src);
/操作图片/
//1.设置字体的路径
$font = “STLITI.TTF”;//c盘windows/fonts
//2.填写水印内容
$content = ‘你好’;
//3.设置字体的颜色rgb和透明度
c o l = i m a g e c o l o r a l l o c a t e a l p h a ( col = imagecolorallocatealpha( col=imagecolorallocatealpha(image,255,255,255,50);
//4.写入文字
imagettftext( i m a g e , 20 , 0 , 20 , 30 , image,20,0,20,30, image,20,0,20,30,col, f o n t , font, font,content);
/输出图片/
//浏览器输出
header(“Content-type:{$info[‘mime’]}”);
KaTeX parse error: Expected '}', got 'EOF' at end of input: func = "image{type}";
f u n c ( func( func(image);
//保存图片
f u n c ( func( func(image,‘newimage.’. t y p e ) ; / ∗ 销 毁 图 片 ∗ / i m a g e d e s t r o y ( type); /*销毁图片*/ imagedestroy( type);/∗销毁图片∗/imagedestroy(image);
生成图片水印
$dst_path = ‘4.jpg’;
$src_path = ‘1.png’;
//创建图片的实例
d s t = i m a g e c r e a t e f r o m s t r i n g ( f i l e g e t c o n t e n t s ( dst = imagecreatefromstring(file_get_contents( dst=imagecreatefromstring(filegetcontents(dst_path));
s r c = i m a g e c r e a t e f r o m s t r i n g ( f i l e g e t c o n t e n t s ( src = imagecreatefromstring(file_get_contents( src=imagecreatefromstring(filegetcontents(src_path));
//获取水印图片的宽高
list($src_w, s r c h ) = g e t i m a g e s i z e ( src_h) = getimagesize( srch)=getimagesize(src_path);
//将水印图片复制到目标图片上,最后个参数80是设置透明度,这里实现半透明效果
imagecopymerge($dst, $src, 10, 10, 0, 0, $src_w, s r c h , 80 ) ; / / 如 果 水 印 图 片 本 身 带 透 明 色 , 则 使 用 i m a g e c o p y 方 法 / / i m a g e c o p y ( src_h, 80); //如果水印图片本身带透明色,则使用imagecopy方法 //imagecopy( srch,80);//如果水印图片本身带透明色,则使用imagecopy方法//imagecopy(dst, $src, 10, 10, 0, 0, $src_w, s r c h ) ; / / 输 出 图 片 l i s t ( src_h); //输出图片 list( srch);//输出图片list(dst_w, $dst_h, d s t t y p e ) = g e t i m a g e s i z e ( dst_type) = getimagesize( dsttype)=getimagesize(dst_path);
switch (KaTeX parse error: Expected '}', got 'EOF' at end of input: … imagegif(dst);
break;
case 2://JPG
header(‘Content-Type: image/jpeg’);
imagejpeg( d s t ) ; b r e a k ; c a s e 3 : / / P N G h e a d e r ( ′ C o n t e n t − T y p e : i m a g e / p n g ′ ) ; i m a g e p n g ( dst); break; case 3://PNG header('Content-Type: image/png'); imagepng( dst);break;case3://PNGheader(′Content−Type:image/png′);imagepng(dst);
break;
default:
break;
}
imagedestroy( d s t ) ; i m a g e d e s t r o y ( dst); imagedestroy( dst);imagedestroy(src);
Qrcode 生成二维码
/*
u r l = url= url=_W[‘siteroot’].“app/index.php?i=2&c=entry&do=index&m=stray_dog&openid=”.KaTeX parse error: Expected 'EOF', got '&' at position 19: …ult['openid']."&̲did=".result[‘dogid’];
//创建一张二维码
require MB_ROOT . ‘/phpqrcode/qrlib.php’;
//QRcode::png(‘PHP QR Code ?’);
$value = $url;
$errorCorrectionLevel = “L”;
$matrixPointSize = “8”;
m a r g i n = " 1 " ; Q R c o d e : : p n g ( margin="1"; QRcode::png( margin="1";QRcode::png(value, MB_ROOT.’/haibao/images/’.$result[‘openid’].’.png’, $errorCorrectionLevel, m a t r i x P o i n t S i z e , matrixPointSize, matrixPointSize,margin);
合成海报代码
public function doMobileH(){
global $_W, $_GPC;
$dogid=$_GPC['did'];
$todog = pdo_get('stray_dog_dogs', array('id' => $dogid));
$userinfo=mc_oauth_userinfo($_W['uniacid']);
//$fansinfo = mc_fansinfo($userinfo['openid'], $_W['acid'], $_W['uniacid']);
$url=$_W['siteroot']."app/index.php?i=2&c=entry&do=index&m=stray_dog&openid=".$userinfo['openid']."&did=".$todog['dogid'];
//创建一张二维码
require MB_ROOT . '/phpqrcode/qrlib.php';
//QRcode::png('PHP QR Code :)');
$value = $url;
$errorCorrectionLevel = "L";
$matrixPointSize = "4.3";
$margin="1";
QRcode::png($value, MB_ROOT.'/haibao/code/'.$userinfo['openid'].'.png', $errorCorrectionLevel, $matrixPointSize,$margin);
//var_dump($fansinfo['avatar']);
//var_dump($tmp[0]);exit();
//$img = file_get_contents($userinfo['headimgurl']);
//file_put_contents(MB_ROOT.'/haibao/user/'.$userinfo['openid'].'.jpg',$img);
$this->put_file_from_url_content($userinfo['headimgurl'], $userinfo['openid'].".jpg", MB_ROOT.'/haibao/user/');
//$avatar = $this->saveImage($userinfo['headimgurl'].".jpg", MB_ROOT.'/haibao/user/'.$userinfo['openid'],".jpg");
$dst_path = $_W['siteroot']."addons/stray_dog/haibao/images/lldog.jpg";
$src_path = $_W['siteroot']."addons/stray_dog/haibao/code/".$userinfo['openid'].".png";
$user_path = MB_ROOT.'/haibao/user/'.$userinfo['openid'].".jpg";
$dogpic=$todog['hosturl'].$todog['cover'];
//创建图片的实例
d s t = i m a g e c r e a t e f r o m s t r i n g ( f i l e g e t c o n t e n t s ( dst = imagecreatefromstring(file_get_contents( dst=imagecreatefromstring(filegetcontents(dst_path));
s r c = i m a g e c r e a t e f r o m s t r i n g ( f i l e g e t c o n t e n t s ( src = imagecreatefromstring(file_get_contents( src=imagecreatefromstring(filegetcontents(src_path));
d o g = i m a g e c r e a t e f r o m s t r i n g ( f i l e g e t c o n t e n t s ( dog = imagecreatefromstring(file_get_contents( dog=imagecreatefromstring(filegetcontents(dogpic));
u s e r = i m a g e c r e a t e f r o m s t r i n g ( f i l e g e t c o n t e n t s ( user = imagecreatefromstring(file_get_contents( user=imagecreatefromstring(filegetcontents(user_path));
//获取背景图片的宽高
list($dst_w, d s t h ) = g e t i m a g e s i z e ( dst_h) = getimagesize( dsth)=getimagesize(dst_path);
//获取水印图片的宽高
list($src_w, s r c h ) = g e t i m a g e s i z e ( src_h) = getimagesize( srch)=getimagesize(src_path);
//获取狗狗图片的宽高
list($dog_w, d o g h ) = g e t i m a g e s i z e ( dog_h) = getimagesize( dogh)=getimagesize(dogpic);
//获取用户头像图片的宽高
list($user_w, u s e r h ) = g e t i m a g e s i z e ( user_h) = getimagesize( userh)=getimagesize(user_path);
//将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
imagecopymerge($dst, $src, 622, 1463, 0, 0, $src_w, $src_h, 100);
//将狗狗图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
imagecopymerge($dst, $dog, 270, 100, 0, 0, $dog_w, $dog_h, 100);
//将用户头像图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
imagecopymerge($dst, $user, 250, 1005, 0, 0, $user_w, $user_h, 100);
unlink(MB_ROOT.’/haibao/user/’.$userinfo[‘openid’].".jpg");
//打上文字
$font = “…/addons/stray_dog/yahei.ttf”;
b l a c k = i m a g e c o l o r a l l o c a t e ( black = imagecolorallocate( black=imagecolorallocate(dst, 0x00, 0x00, 0x00);//字体颜色
//背景中间位置
m i d d l e p = middlep= middlep=dst_w/2;
//用户昵称
imagefttext($dst, 25, 0, 426, 1030, $black, $font, u s e r i n f o [ ′ n i c k n a m e ′ ] ) ; / / 狗 狗 昵 称 i m a g e f t t e x t ( userinfo['nickname']); //狗狗昵称 imagefttext( userinfo[′nickname′]);//狗狗昵称imagefttext(dst, 23, 0, 548, 1078, $black, $font, t o d o g [ ′ n a m e ′ ] ) ; / / 输 出 图 片 l i s t ( todog['name']); //输出图片 list( todog[′name′]);//输出图片list(dst_w, $dst_h, d s t t y p e ) = g e t i m a g e s i z e ( dst_type) = getimagesize( dsttype)=getimagesize(dst_path);
switch (KaTeX parse error: Expected '}', got 'EOF' at end of input: … imagegif(dst);
break;
case 2://JPG
//header(‘Content-Type: image/jpeg’);
imagejpeg( d s t , M B R O O T . ′ / h a i b a o / h a i b a o / ′ . dst,MB_ROOT.'/haibao/haibao/'. dst,MBROOT.′/haibao/haibao/′.userinfo[‘openid’].".jpg");
break;
case 3://PNG
header('Content-Type: image/png');
imagepng($dst);
break;
default:
break;
}
imagedestroy($dst);
}
16 扎金蛋数据表设计(微擎建表规则)
学习目标:
1 微擎模块创建表的规则
Ims_模块目录名_表名
Img_gold_eggs_users
Ims_gold_eggs_confs
2 解释并创建砸金蛋数据表
17 砸金蛋系后台统配置功能开发
目标任务:
分析
目标 显示 图片
附近目录+存在数据表的图片数据
高大上的前端+一个合理或者优秀的业务逻辑代码+数据库
18 砸金蛋后台用户信息功能开发(分页)
目标
1 用户信息获取逻辑
0 用户打开这个页面,会弹出一个授权框,如果允许,我们就可以获取用户信息,如果不允许
u s e r i n f o = m c o a u t h u s e r i n f o ( userinfo=mc_oauth_userinfo( userinfo=mcoauthuserinfo(_W[‘uniacid’]); (必须在微信什么打开)
1 点马上 抽奖 ,判断是否有关注公众号没有就弹出关注的框
2 用户信息后台展示
订单后台
分页
$sql="select * from “.tablename(‘stray_dog_dogs’);
s o u r c e s = p d o f e t c h a l l ( sources=pdo_fetchall( sources=pdofetchall(sql);
//分页开始
t o t a l = c o u n t ( total=count( total=count(sources);
p a g e i n d e x = m a x ( pageindex=max( pageindex=max(_GPC[‘page’],1);
$pagesize=6;
p a g e r = p a g i n a t i o n ( pager=pagination( pager=pagination(total, p a g e i n d e x , pageindex, pageindex,pagesize);
p = ( p=( p=(pageindex-1)*6;
s q l . = " o r d e r b y i d d e s c l i m i t " . sql.=" order by id desc limit ". sql.="orderbyiddesclimit".p.” , ".$pagesize;
d g o l i s t = p d o f e t c h a l l ( dgolist=pdo_fetchall( dgolist=pdofetchall(sql);
19 砸金蛋前台界面配置
学习目标
{$_W[‘siteroot’]}/addons/
jQuery 点击事件
$(“button”).click(function(){
$(“p”).slideToggle();
});
$(“button”).click(function(){
$.getJSON(“demo_ajax_json.js”,function(result){
$.each(result, function(i, field){
$(“div”).append(field + " ");
});
});
});
u s e r i n f o = m c o a u t h u s e r i n f o ( userinfo=mc_oauth_userinfo( userinfo=mcoauthuserinfo(_W[‘uniacid’]);
$account_api = WeAccount::create();
$fans_info = a c c o u n t a p i − > f a n s Q u e r y I n f o ( account_api->fansQueryInfo( accountapi−>fansQueryInfo(userinfo[‘openid’]);
load()->func(‘logging’);
//记录文本日志
logging_run($fans_info);
$data=null;
if(empty($fans_info)){
$data=['message'=>'你还没关注公众号'];
}else{
$data=['message'=>'你关注了'];
}
return json_encode($data);
20 砸金蛋业务逻辑解析和功能实现(上)
目标
1 判断用户是否关注公众号
2 判断手机号码是否正确 (可以接入短信接口)
3 判断该微信号是否参加过活动
4 判断该手机是否参加过活动
流程:
1 判断用户是否关注了公众号(是就继续,否就返回)
2 判断手机号码是否正确(是就继续否就返回)
3 判断用户微信号或者手机号是否参加过活动(否就继续,是就返回)
4 判断金额是否足够一元(是就继续,否就返回)
5 获取用户openid 或者金额 发起发送红包的请求(成功就继续,失败就返回)
(公众号->模板消息)
6 记录订单
$account_api = WeAccount::create();
$token = $account_api->getAccessToken();
u s e r i n f o = m c o a u t h u s e r i n f o ( userinfo=mc_oauth_userinfo( userinfo=mcoauthuserinfo(_W[‘uniacid’]);
KaTeX parse error: Expected '}', got 'EOF' at end of input: …?access_token={token}&openid={$userinfo[‘openid’]}&lang=zh_CN";
r e s p o n s e = i h t t p g e t ( response = ihttp_get( response=ihttpget(url);
j s o n 2 A r r a y = j s o n d e c o d e ( json2Array = json_decode( json2Array=jsondecode(response[‘content’],true);
print_r($json2Array[‘subscribe’]);
u s e r i n f o = m c o a u t h u s e r i n f o ( userinfo=mc_oauth_userinfo( userinfo=mcoauthuserinfo(_W[‘uniacid’]);
$account_api = WeAccount::create();
$fans_info = a c c o u n t a p i − > f a n s Q u e r y I n f o ( account_api->fansQueryInfo( accountapi−>fansQueryInfo(userinfo[‘openid’]);
load()->func(‘logging’);
//记录文本日志
logging_run($fans_info);
21 砸金蛋业务逻辑解析和功能实现(下)
1 判断付款结果
2 记录合理订单
3 发送模板消息
企业付款微信官方文档 https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
21 砸金蛋业务逻辑解析和功能实现(下下)
目标
1 替换一下背景图片
2 修复订单信息
3 修复一下推广网址
21 砸金蛋业务逻辑解析和功能实现(终结版)
1 完善一下 后台
2 修复一下 余额
22 微擎模块数据表配置(安装/卸载)
学习目标
1 了解微擎插件模块表语句配置
用户安装插件 自动创建配置里面的数据表
用户删除插件 ,自动删除配置里面的数据表
2 配置数据表
DROP TABLE IF EXISTS ims_fy_lesson_blacklist
;
23 砸金蛋插件模块发布到官方应用市场
1 模块发布流程
2 发布模块
微擎开发者中心 https://dev.we7.cc/
文字教程:
1,选择上传类型,点击创建应用
2,完善设置点击完成(注意规则格式)。
3,创建之后回到应用首页继续完善应用信息。
4,进入应用详情,新建版本,点击设计新版本,设置好相关配置点击完成。
5,完成之后查看版本号列表,点击编辑,底部有导出模块选项,按照提示说明下载。
6,下载、开发好应用之后,点击去发布,上传应用文件包,上传好之后点击上传审核。
7,上传之后会提示完善幻灯片等应用设置,到商城设置完善信息点击保存,等待官方审核即可。
总结 发布流程
1 首先要有一个微擎认证的开发者账号 (300元)
2 创建应用
3 商城设置
4 提交我们开发好的压缩包去审核
24 微擎开发小程序介绍
1 微擎添加小程序
2 了解微擎跟小程序的关系
A 微擎为小程序提供数据支持和处理
B 微擎封装了一下常用的方法 (路径 / 请求 )
3 体验微擎搭配小程序的操作
A 配置一下 小程序的服务器域名 (https)
B 配置一下 siteinfo.js
http://s.we7.cc/index.php?c=wiki&do=view&id=1
25 微擎官方案例实现文字发布
1学习6个概念(小程序搭配\小程序引用微擎封装文件\小程序服务端方法\小程序发起请求\小程序返回请求结果)
A 微信小程序搭配
We7 这个目录 是微擎为开发者封装了一些类库
We7_wxappsample 这个目录是真正的小程序开发出来的功能 (这个目录名字需要跟小程序插件的目录名字一致)
Siteinfo.js 就是配置跟服务端通讯接口的 信息
B 小程序引用微擎封装文件
App.js
几乎每个开发者自定义开发的功能页面 都需要引入 微擎的封装类库
C 小程序服务端方法
我们小程序请求的 服务端的方法 都写在 wxapp.php 里面.
doPage方法名 例如 doPageMsg()
public function doPageIndex() {
D 小程序发起请求
E
‘url’: ‘entry/wxapp/list’,
Entry 入口
Wxapp => 服务端的 wxapp.PHP
List => wxapp.php doPageList() 方法
E 小程序返回请求结果
2 了解微擎微信通讯流程
小程序 端 通过
发起 一个请求到 服务端
Wxapp.php 里面的方法
处理好事情
通过
返回结果给小程序
3 用微擎官方小程序案例实现发布文字
26 微擎官方案例实现图片发布
事情一:模块发布到应用事情审核问题
事情二:路径方法 (不要完全信任开发文档)
app.util.url(‘entry/wxapp/onepic’, { m: ‘we7_wxappsample’ });
M=> 模块名字
Entry=>入口
Wxapp=>wxapp.PHP
Onepic=>wxapp.PHP=>doPageOnepic()
we7_wxappsample=>wxapp.PHP=>doPageOnepic()
事情三:发布图片流程
1 在小程序端 通过 wx.uploadFile(OBJECT) 提交图片
2 微擎端 file_upload 保存图片
3 通过微擎封装的 返回结果函数
1. t h i s − > r e s u l t ( this->result( this−>result(errno, $message, $data)
4 小程序端根据返回结果 做相应的 业务逻辑
1 小程序提交图片
2 微擎后端保存图片
一个高大上的UI + 合理的前后端业务逻辑
知识点:
var uploadUrl = app.util.url(‘entry/wxapp/onepic’, { m: ‘xcx_cto’ });
27 微擎开发者中心创建小程序模块
学习目标
1 微擎官方创建小程序模块
2 配置小程序前端
3 实现基础的通讯
28 微擎笑话小程序后台信息管理功能实现
目标
1 小猪笑话数据表创建
2 小猪笑话列表展示
3 小猪笑话添加
29 微擎笑话小程序前台功能实现
1 从微擎获取数据
2 展示
32 微擎微信小程序开发总结
1 总结
1 30小结
2 漂亮的皮肤+套用代码
2 致歉
你会这个技能不厉害,厉害的,你能把这个技能教会,教懂学习的人
3 感谢
祝大家,学以致用 ,我们江湖再见.!!!