腾讯云服务器年中优惠低至2.3折,一年一次,剩余不多 >>>>

getMemberInfo( )通过openid获取会员信息

文档教程geeson 发表了文章 • 2 个评论 • 843 次浏览 • 2017-10-12 12:28 • 来自相关话题

/**
* @param string $openid
* @return array|false|PDOStatement|string|\think\Model
*/
function getMemberInfo($openid = '', $field = [])
{
if ($openid = getOrSetOpenid($openid)) {
$user = \think\Db::name('mp_friends')->where(['openid' => $openid])->find();
if (!$field) {
return $user;
} else {
$fields = [];
foreach ($field as $key => $val) {
$fields[$val] = $user[$val];
}
return $fields;
}

}
} 查看全部
/**
* @param string $openid
* @return array|false|PDOStatement|string|\think\Model
*/
function getMemberInfo($openid = '', $field = [])
{
if ($openid = getOrSetOpenid($openid)) {
$user = \think\Db::name('mp_friends')->where(['openid' => $openid])->find();
if (!$field) {
return $user;
} else {
$fields = [];
foreach ($field as $key => $val) {
$fields[$val] = $user[$val];
}
return $fields;
}

}
}

getOrSetOpenid( )设置或者获取openid

文档教程geeson 发表了文章 • 0 个评论 • 678 次浏览 • 2017-10-12 12:25 • 来自相关话题

/*
* 设置、获取 openid
*/

function getOrSetOpenid($openid = '')
{
if ($openid != '') {
session('openid', $openid);
return $openid;
} else {
$openid = session('openid');
if ($openid) {
return $openid;
} else {
return null;
}
}

} 查看全部
/*
* 设置、获取 openid
*/

function getOrSetOpenid($openid = '')
{
if ($openid != '') {
session('openid', $openid);
return $openid;
} else {
$openid = session('openid');
if ($openid) {
return $openid;
} else {
return null;
}
}

}

addonUrl( )应用URL生成【常用】

文档教程geeson 发表了文章 • 0 个评论 • 719 次浏览 • 2017-10-12 12:24 • 来自相关话题

/**
* 扩展应用 URL 生成
* @author geeson myrhzq@qq.com
* @param $url string 应用url/应用名称/控制器/方法
* @param $arr array 参数
*/
function addonUrl($url = '', $vars = '', $suffix = true, $domain = false)
{
if (!empty($addonRule = session('addonRule')) || $url != '') {
$addonName = isset($addonRule['addon']) ? $addonRule['addon'] : '';
$addonController = isset($addonRule['col']) ? $addonRule['col'] : '';
$addonAction = isset($addonRule['act']) ? $addonRule['act'] : '';
$node = '';
if ($url == '') {
$node = $addonName . DS . $addonController . DS . $addonAction;
} else {
$nodeArr = array_values(array_filter(explode('/', $url)));
switch (count($nodeArr)) {
case 1:
$node = $addonName . DS . $addonController . DS . $nodeArr[0];
break;
case 2:
$node = $addonName . DS . $nodeArr[0] . DS . $nodeArr[1];
break;
case 3:
$node = $node = $nodeArr[0] . DS . $nodeArr[1] . DS . $nodeArr[2];
break;
}
}
if (!empty($mid = input('mid'))) {
if (is_array($vars)) {
$vars = array_merge($vars, ['mid' => $mid]);
} elseif ($vars != '' && !is_array($vars)) {
$vars = $vars . '&' . 'mid=' . $mid;
} else {
$vars = ['mid' => $mid];
}
}
$url = \think\Url::build(ADDON_ROUTE . $node, $vars, $suffix, $domain);
return $url = str_replace('.' . config('template.view_suffix'), '', $url);

}
} 查看全部
/**
* 扩展应用 URL 生成
* @author geeson myrhzq@qq.com
* @param $url string 应用url/应用名称/控制器/方法
* @param $arr array 参数
*/
function addonUrl($url = '', $vars = '', $suffix = true, $domain = false)
{
if (!empty($addonRule = session('addonRule')) || $url != '') {
$addonName = isset($addonRule['addon']) ? $addonRule['addon'] : '';
$addonController = isset($addonRule['col']) ? $addonRule['col'] : '';
$addonAction = isset($addonRule['act']) ? $addonRule['act'] : '';
$node = '';
if ($url == '') {
$node = $addonName . DS . $addonController . DS . $addonAction;
} else {
$nodeArr = array_values(array_filter(explode('/', $url)));
switch (count($nodeArr)) {
case 1:
$node = $addonName . DS . $addonController . DS . $nodeArr[0];
break;
case 2:
$node = $addonName . DS . $nodeArr[0] . DS . $nodeArr[1];
break;
case 3:
$node = $node = $nodeArr[0] . DS . $nodeArr[1] . DS . $nodeArr[2];
break;
}
}
if (!empty($mid = input('mid'))) {
if (is_array($vars)) {
$vars = array_merge($vars, ['mid' => $mid]);
} elseif ($vars != '' && !is_array($vars)) {
$vars = $vars . '&' . 'mid=' . $mid;
} else {
$vars = ['mid' => $mid];
}
}
$url = \think\Url::build(ADDON_ROUTE . $node, $vars, $suffix, $domain);
return $url = str_replace('.' . config('template.view_suffix'), '', $url);

}
}

getAddonLogo( )获取应用LOGO

文档教程geeson 发表了文章 • 0 个评论 • 583 次浏览 • 2017-10-12 12:22 • 来自相关话题

/**
* @param string $name 应用标识
* @param $logoName
*/

function getAddonLogo($name = '')
{
if ($name == '') {
return false;
}
$model = new \app\common\model\Addons();
$info = $model->getAddonByFile($name);
$loginFile= ROOT_PATH. '/addons/' . $name . '/' . $info['logo'];
if(is_file($loginFile)){
if($fp = fopen($loginFile,"rb", 0))
{
$gambar = fread($fp,filesize($loginFile));
fclose($fp);
$base64 = chunk_split(base64_encode($gambar));
return $encode = 'data:image/jpg/png/gif;base64,' . $base64 ;
}
}
} 查看全部
/**
* @param string $name 应用标识
* @param $logoName
*/

function getAddonLogo($name = '')
{
if ($name == '') {
return false;
}
$model = new \app\common\model\Addons();
$info = $model->getAddonByFile($name);
$loginFile= ROOT_PATH. '/addons/' . $name . '/' . $info['logo'];
if(is_file($loginFile)){
if($fp = fopen($loginFile,"rb", 0))
{
$gambar = fread($fp,filesize($loginFile));
fclose($fp);
$base64 = chunk_split(base64_encode($gambar));
return $encode = 'data:image/jpg/png/gif;base64,' . $base64 ;
}
}
}

getAddonInfo( )获取应用配置信息

文档教程geeson 发表了文章 • 0 个评论 • 595 次浏览 • 2017-10-12 12:21 • 来自相关话题

/**
* 获取应用配置信息
* @author geeson myrhzq@qq.com
* $param $addonName string // 当前应用插件名称
* @param string mid 当前公众号标识ID
* @return array|bool|mixed
*/
function getAddonInfo($addonName = '', $mid = '')
{
if ($addonName == '' || $mid == '') {
$addonName = session('addonName');
$mid = session('mid')?session('mid'):input('mid');
}
if ($addonName == '' || $mid == '') {
exit('参数不完整:应用名称或者公众号标识不存在');
}
$addon = \think\Db::name('addons')->where(['addon' => $addonName])->find();
$addonInfo = \think\Db::name('addon_info')->where(['addon' => $addonName, 'mpid' => input('mid')])->find();
$addon['path'] = ADDON_PATH . $addonName . '/';
$addon['mp_config'] = json_decode($addonInfo['infos'], true);
$addon['common_config'] = json_decode($addon['config'], true);
unset($addon['config']);
return $addon;

}获取当前的应用一般不需要传参 查看全部
/**
* 获取应用配置信息
* @author geeson myrhzq@qq.com
* $param $addonName string // 当前应用插件名称
* @param string mid 当前公众号标识ID
* @return array|bool|mixed
*/
function getAddonInfo($addonName = '', $mid = '')
{
if ($addonName == '' || $mid == '') {
$addonName = session('addonName');
$mid = session('mid')?session('mid'):input('mid');
}
if ($addonName == '' || $mid == '') {
exit('参数不完整:应用名称或者公众号标识不存在');
}
$addon = \think\Db::name('addons')->where(['addon' => $addonName])->find();
$addonInfo = \think\Db::name('addon_info')->where(['addon' => $addonName, 'mpid' => input('mid')])->find();
$addon['path'] = ADDON_PATH . $addonName . '/';
$addon['mp_config'] = json_decode($addonInfo['infos'], true);
$addon['common_config'] = json_decode($addon['config'], true);
unset($addon['config']);
return $addon;

}
获取当前的应用一般不需要传参

getMpInfo( )获取公众号配置信息

文档教程geeson 发表了文章 • 0 个评论 • 707 次浏览 • 2017-10-12 12:19 • 来自相关话题

/**
* 获取公众号配置信息
* @param $mid number
*/

function getMpInfo($mid = '')
{
$mid ? $mid : $mid = input('mid');
$mpInfo = 'mpInfo_' . $mid;
if ($mid) {
$mp = \think\Db::name('mp')->where(['id' => $mid])->find();
if (!empty($mp)) {
return $mp;
} else {
abort(500, lang('没有找到相应的公众号信息'));
}

} else {
abort(500, lang('没有找到相应的公众号信息'));
}

} 查看全部
/**
* 获取公众号配置信息
* @param $mid number
*/

function getMpInfo($mid = '')
{
$mid ? $mid : $mid = input('mid');
$mpInfo = 'mpInfo_' . $mid;
if ($mid) {
$mp = \think\Db::name('mp')->where(['id' => $mid])->find();
if (!empty($mp)) {
return $mp;
} else {
abort(500, lang('没有找到相应的公众号信息'));
}

} else {
abort(500, lang('没有找到相应的公众号信息'));
}

}

getQrshortUrl( )长链接转短链接接口

文档教程geeson 发表了文章 • 0 个评论 • 575 次浏览 • 2017-10-12 12:17 • 来自相关话题

/**
* 长链接转短链接接口
* @param string $long_url 传入要转换的长url
* @return boolean|string url 成功则返回转换后的短url
*/
function getQrshortUrl($long_url)
{
$weObj = getWechatActiveObj();
return $weObj->getShortUrl($long_url);
} 查看全部
/**
* 长链接转短链接接口
* @param string $long_url 传入要转换的长url
* @return boolean|string url 成功则返回转换后的短url
*/
function getQrshortUrl($long_url)
{
$weObj = getWechatActiveObj();
return $weObj->getShortUrl($long_url);
}

getQrRUL( )获取二维码图片

文档教程geeson 发表了文章 • 0 个评论 • 754 次浏览 • 2017-10-12 12:16 • 来自相关话题

/**
* 获取二维码图片
* @param string $ticket 传入由get_qrcode方法生成的ticket参数
* @return string url 返回http地址
*/

function getQrRUL($ticket)
{
$weObj = getWechatActiveObj();
$result = $weObj->getQRUrl($ticket);
return $result;


} 查看全部
/**
* 获取二维码图片
* @param string $ticket 传入由get_qrcode方法生成的ticket参数
* @return string url 返回http地址
*/

function getQrRUL($ticket)
{
$weObj = getWechatActiveObj();
$result = $weObj->getQRUrl($ticket);
return $result;


}

get_qrcode( )创建二维码ticket

文档教程geeson 发表了文章 • 0 个评论 • 741 次浏览 • 2017-10-12 12:15 • 来自相关话题

/**
* 创建二维码ticket
* @param int|string $scene_id 自定义追踪id,临时二维码只能用数值型
* @param int $type 0:临时二维码;1:永久二维码(此时expire参数无效);2:永久二维码(此时expire参数无效)
* @param int $expire 临时二维码有效期,最大为604800秒

* @return array('ticket'=>'qrcode字串','expire_seconds'=>1800,'url'=>'二维码图片解析后的地址')
*/
function get_qrcode($scene_id, $type = 0, $expire = 1800)
{
$weObj = getWechatActiveObj();
$result = $weObj->getQRCode($scene_id, $type, $expire);
if (!$result) {
$return['errcode'] = 1001;
$return['errmsg'] = $weObj->errMsg;
// abort(500, lang('ErrCode:' . $return['errcode'] . ' ErrMsg: ' . $return['errmsg']));
ajaxMsg(0, 'ErrCode:' . $return['errcode'] . ' ErrMsg: ' . $return['errmsg']);
}
return $result;
} 查看全部
/**
* 创建二维码ticket
* @param int|string $scene_id 自定义追踪id,临时二维码只能用数值型
* @param int $type 0:临时二维码;1:永久二维码(此时expire参数无效);2:永久二维码(此时expire参数无效)
* @param int $expire 临时二维码有效期,最大为604800秒

* @return array('ticket'=>'qrcode字串','expire_seconds'=>1800,'url'=>'二维码图片解析后的地址')
*/
function get_qrcode($scene_id, $type = 0, $expire = 1800)
{
$weObj = getWechatActiveObj();
$result = $weObj->getQRCode($scene_id, $type, $expire);
if (!$result) {
$return['errcode'] = 1001;
$return['errmsg'] = $weObj->errMsg;
// abort(500, lang('ErrCode:' . $return['errcode'] . ' ErrMsg: ' . $return['errmsg']));
ajaxMsg(0, 'ErrCode:' . $return['errcode'] . ' ErrMsg: ' . $return['errmsg']);
}
return $result;
}

sendGroupMassMessage( ) 高级群发消息

文档教程geeson 发表了文章 • 0 个评论 • 655 次浏览 • 2017-10-12 12:14 • 来自相关话题

/**
* 高级群发消息, 根据群组id群发图文消息(认证后的订阅号可用)
* 注意:视频需要在调用uploadMedia()方法后,再使用 uploadMpVideo() 方法生成,
* 然后获得的 mediaid 才能用于群发,且消息类型为 mpvideo 类型。
* @param array $data 消息结构
* {
* "filter"=>array(
* "is_to_all"=>False, //是否群发给所有用户.True不用分组id,False需填写分组id
* "group_id"=>"2" //群发的分组id
* ),
* "msgtype"=>"mpvideo",
* // 在下面5种类型中选择对应的参数内容
* // mpnews | voice | image | mpvideo => array( "media_id"=>"MediaId")
* // text => array ( "content" => "hello")
* }
* @return boolean|array
*/
function sendGroupMassMessage($data)
{
$weObj = getWechatActiveObj();
$result = $weObj->sendGroupMassMessage($data);
if ($result) {
return $result;
} else {
$return['errCode'] = $weObj->errCode;
$return['errMsg'] = $weObj->errMsg;
return $return;
}
} 查看全部
/**
* 高级群发消息, 根据群组id群发图文消息(认证后的订阅号可用)
* 注意:视频需要在调用uploadMedia()方法后,再使用 uploadMpVideo() 方法生成,
* 然后获得的 mediaid 才能用于群发,且消息类型为 mpvideo 类型。
* @param array $data 消息结构
* {
* "filter"=>array(
* "is_to_all"=>False, //是否群发给所有用户.True不用分组id,False需填写分组id
* "group_id"=>"2" //群发的分组id
* ),
* "msgtype"=>"mpvideo",
* // 在下面5种类型中选择对应的参数内容
* // mpnews | voice | image | mpvideo => array( "media_id"=>"MediaId")
* // text => array ( "content" => "hello")
* }
* @return boolean|array
*/
function sendGroupMassMessage($data)
{
$weObj = getWechatActiveObj();
$result = $weObj->sendGroupMassMessage($data);
if ($result) {
return $result;
} else {
$return['errCode'] = $weObj->errCode;
$return['errMsg'] = $weObj->errMsg;
return $return;
}
}

replyNews( )回复图文

文档教程geeson 发表了文章 • 0 个评论 • 851 次浏览 • 2017-10-12 12:12 • 来自相关话题

/**
* 回复图文
* @author geeson myrhzq@qq.com
* @param $news array
数组结构:
array(
"0"=>array(
'Title'=>'msg title',
'Description'=>'Description text',
'PicUrl'=>'http://www.domain.com/1.jpg',
'Url'=>'http://www.domain.com/1.html'
),
"1"=>....
)
*/
function replyNews($new = [])
{
if (is_array($new)) {
$weObj = getWechatObj();
return $weObj->news($new)->reply();
}

} 查看全部
/**
* 回复图文
* @author geeson myrhzq@qq.com
* @param $news array
数组结构:
array(
"0"=>array(
'Title'=>'msg title',
'Description'=>'Description text',
'PicUrl'=>'http://www.domain.com/1.jpg',
'Url'=>'http://www.domain.com/1.html'
),
"1"=>....
)
*/
function replyNews($new = [])
{
if (is_array($new)) {
$weObj = getWechatObj();
return $weObj->news($new)->reply();
}

}

replyVideo( )回复视频消息

文档教程geeson 发表了文章 • 0 个评论 • 519 次浏览 • 2017-10-12 12:09 • 来自相关话题

/*
* 回复视频消息
* @param $mediaid string
* @param $title string
* @param $description string
*/
function replyVideo($mediaid = '', $title = '', $description = '')
{
$weObj = getWechatObj();
return $weObj->video($mediaid, $title, $description)->reply();
} 查看全部
/*
* 回复视频消息
* @param $mediaid string
* @param $title string
* @param $description string
*/
function replyVideo($mediaid = '', $title = '', $description = '')
{
$weObj = getWechatObj();
return $weObj->video($mediaid, $title, $description)->reply();
}

replyVoice( )回复语音消息

文档教程geeson 发表了文章 • 0 个评论 • 518 次浏览 • 2017-10-12 12:08 • 来自相关话题

/**
* 回复语音消息
* @param string media_id
*
*/
function replyVoice($media_id = '')
{
$weObj = getWechatObj();
return $weObj->voice($media_id)->reply();
} 查看全部
/**
* 回复语音消息
* @param string media_id
*
*/
function replyVoice($media_id = '')
{
$weObj = getWechatObj();
return $weObj->voice($media_id)->reply();
}

replyMusic( )回复音乐

文档教程geeson 发表了文章 • 0 个评论 • 505 次浏览 • 2017-10-12 12:08 • 来自相关话题

/**
* 设置回复音乐
* @param string $title
* @param string $desc
* @param string $musicurl
* @param string $hgmusicurl
* @param string $thumbmediaid 音乐图片缩略图的媒体id,非必须
*/
function replyMusic($title, $desc, $musicurl, $hgmusicurl = '', $thumbmediaid = '')
{
$weObj = getWechatObj();
return $weObj->music($title, $desc, $musicurl, $hgmusicurl = '', $thumbmediaid = '')->reply();

} 查看全部
/**
* 设置回复音乐
* @param string $title
* @param string $desc
* @param string $musicurl
* @param string $hgmusicurl
* @param string $thumbmediaid 音乐图片缩略图的媒体id,非必须
*/
function replyMusic($title, $desc, $musicurl, $hgmusicurl = '', $thumbmediaid = '')
{
$weObj = getWechatObj();
return $weObj->music($title, $desc, $musicurl, $hgmusicurl = '', $thumbmediaid = '')->reply();

}

replyImage( )回复图片

文档教程geeson 发表了文章 • 0 个评论 • 595 次浏览 • 2017-10-12 12:07 • 来自相关话题

/**
* 回复图片
* @param string $media_id
*/

function replyImage($media_id = '')
{

$weObj = getWechatObj();
return $weObj->image($media_id)->reply();
} 查看全部
/**
* 回复图片
* @param string $media_id
*/

function replyImage($media_id = '')
{

$weObj = getWechatObj();
return $weObj->image($media_id)->reply();
}

replyText()回复文本

文档教程geeson 发表了文章 • 0 个评论 • 344 次浏览 • 2017-10-12 12:06 • 来自相关话题

/**
* 回复文本
* @param $text string
*/
function replyText($text = null)
{
if (is_string($text)) {
$weObj = getWechatObj();
return $weObj->text($text)->reply();
}

} 查看全部
/**
* 回复文本
* @param $text string
*/
function replyText($text = null)
{
if (is_string($text)) {
$weObj = getWechatObj();
return $weObj->text($text)->reply();
}

}

uploadForeverMedia( )上传永久素材

文档教程geeson 发表了文章 • 0 个评论 • 625 次浏览 • 2017-10-12 12:04 • 来自相关话题

/**
* 上传永久素材(认证后的订阅号可用)
* 新增的永久素材也可以在公众平台官网素材管理模块中看到
* $param string filePath 注意是物理路径
* @param type 类型:图片:image 语音:voice 视频:video 缩略图:thumb
* @param boolean $is_video 是否为视频文件,默认为否
* @param array $video_info 视频信息数组,非视频素材不需要提供 array('title'=>'视频标题','introduction'=>'描述')
* @return boolean|array
*/
function uploadForeverMedia($filePath = '', $type, $is_video = false, $video_info = array())
{

$weObj = getWechatActiveObj();
$media = $weObj->uploadForeverMedia(['media' => '@' . ROOT_PATH . $filePath], $type, $is_video, $video_info);
if (empty($media)) {
ajaxMsg(0, 'errCode:' . $weObj->errCode . 'errMsg' . $weObj->errMsg);
}
return $media;

} 查看全部
/**
* 上传永久素材(认证后的订阅号可用)
* 新增的永久素材也可以在公众平台官网素材管理模块中看到
* $param string filePath 注意是物理路径
* @param type 类型:图片:image 语音:voice 视频:video 缩略图:thumb
* @param boolean $is_video 是否为视频文件,默认为否
* @param array $video_info 视频信息数组,非视频素材不需要提供 array('title'=>'视频标题','introduction'=>'描述')
* @return boolean|array
*/
function uploadForeverMedia($filePath = '', $type, $is_video = false, $video_info = array())
{

$weObj = getWechatActiveObj();
$media = $weObj->uploadForeverMedia(['media' => '@' . ROOT_PATH . $filePath], $type, $is_video, $video_info);
if (empty($media)) {
ajaxMsg(0, 'errCode:' . $weObj->errCode . 'errMsg' . $weObj->errMsg);
}
return $media;

}

uploadMedia()上传临时素材

文档教程geeson 发表了文章 • 2 个评论 • 668 次浏览 • 2017-10-12 12:03 • 来自相关话题

/**
* 上传临时素材
* 上传临时素材,有效期为3天(认证后的订阅号可用)
* @param string filePath 注意是物理路径
* @param string 类型:图片:image 语音:voice 视频:video 缩略图:thumb
*/
function uploadMedia($filePath = '', $type = '')
{
$weObj = getWechatActiveObj();
$media = $weObj->uploadMedia(['media' => '@' . ROOT_PATH . $filePath], $type);
if (empty($media)) {
ajaxMsg(0, 'errCode:' . $weObj->errCode . 'errMsg' . $weObj->errMsg);
}
return $media;
} 查看全部
/**
* 上传临时素材
* 上传临时素材,有效期为3天(认证后的订阅号可用)
* @param string filePath 注意是物理路径
* @param string 类型:图片:image 语音:voice 视频:video 缩略图:thumb
*/
function uploadMedia($filePath = '', $type = '')
{
$weObj = getWechatActiveObj();
$media = $weObj->uploadMedia(['media' => '@' . ROOT_PATH . $filePath], $type);
if (empty($media)) {
ajaxMsg(0, 'errCode:' . $weObj->errCode . 'errMsg' . $weObj->errMsg);
}
return $media;
}

【第六篇】微信开发应用之Api.php介绍

文档教程geeson 发表了文章 • 5 个评论 • 2728 次浏览 • 2017-10-11 12:42 • 来自相关话题

在微信开发的第一篇有说明了Api.php:http://ask.rhaphp.com/article/7
在这一篇主要介绍与微信如何交互与通信的,这里我创建是一个名称 myDemo的应用作为演示。目录文件如下图:





如果你对目录不了解请回头回文档,创建好之后,然后系统的后台进入此演示应用,在响应中设置关键词,当然也可以在自动回复中增加关键词然后选择演示应用,两者可选。你觉得那个方便使用那个。关键词设为:rhaphp,如下图:





也可以在自动回复中可以设置的,设置完成后可以看到,如下图:





粉丝触发关键词如何回复文本?很简单的代码如下:public function message($msg = [], $param = [])
{
replyText('二狗,你好!你触发了myDemo');
}在公众号输入rhaphp后,效果如下图:





如何看到微信发送的消息?public function message($msg = [], $param = [])
{
replyText(json_encode($msg));
}因为$msg是数据来的,文本方式回复那么我们要把$msg转成json。效果如下图:






当然还可以回复其它,图文消息,图片消息,视频消息等,我在介绍函数文档会说明。 查看全部
在微信开发的第一篇有说明了Api.php:http://ask.rhaphp.com/article/7
在这一篇主要介绍与微信如何交互与通信的,这里我创建是一个名称 myDemo的应用作为演示。目录文件如下图:

1.png

如果你对目录不了解请回头回文档,创建好之后,然后系统的后台进入此演示应用,在响应中设置关键词,当然也可以在自动回复中增加关键词然后选择演示应用,两者可选。你觉得那个方便使用那个。关键词设为:rhaphp,如下图:

1.png

也可以在自动回复中可以设置的,设置完成后可以看到,如下图:

1.png

粉丝触发关键词如何回复文本?很简单的代码如下:
public function message($msg = [], $param = [])
{
replyText('二狗,你好!你触发了myDemo');
}
在公众号输入rhaphp后,效果如下图:

1.png

如何看到微信发送的消息?
public function message($msg = [], $param = [])
{
replyText(json_encode($msg));
}
因为$msg是数据来的,文本方式回复那么我们要把$msg转成json。效果如下图:


1.png

当然还可以回复其它,图文消息,图片消息,视频消息等,我在介绍函数文档会说明。

【第五篇】 RhaPHP微信应用开发之视图view

文档教程geeson 发表了文章 • 0 个评论 • 2327 次浏览 • 2017-10-10 13:08 • 来自相关话题

应用的视图是支持模板的继承,从官方提供的投票的应用中有使用到,如下图:




因为开发使用得最多的就是模板继承,在使用上也是比较简单与好用的。如果有同学从来都没有没有接触过,建议你去看一下 THINKPHP5文档中模板继承。如果你想按着老套路的当然也是可以的,但是我建议你要跟上流行的节奏。

如何引入应用下的 static里面的资源?如我要引入 static/css/style.css 代码如下:{CSS href="__ADDONSTATIC__/css/style.css" /}__ADDONSTATIC__也是自动的识别当前应用的路径。

如何使用微信的JSSDK?代码如下: {:hook('Jssdk')}当你使用此行为后,并需要你再去配置 JSSDK 任何的东西,系统已经本身已经配置好了,只要你使用了{:hook('Jssdk')}系统已经为你做好了一切。如果报错的话,(签名错误呀,URL不合Fa呀)请不要尝试在系统找原因,只要填写相应的参数是正确的,公众号配置是正确的,那么系统99%是正常的。

投票应用中的代码,如下图:





若配置成功,那么你就可以在 wx.ready中使用你需要的接口了。

使用上传组件:{:hook('Upload',['type'=>'image','name'=>'cover'])}如果你需要传入值:{:hook('Upload',['type'=>'image','name'=>'input name的名称','value'=>'路径'])}多图上传:{:hook('Upload',['type'=>'images','name'=>$v.name,'value'=>$v.value])}需要使用媒体库的话:{:hook('Upload',['type'=>'images','name'=>$v.name,'material'=>true,'value'=>$v.value])}上传文件:{:hook('Upload',['type'=>'file','name'=>$v.name,'bt_title'=>'选择文件','value'=>$v.value])}如何对应用生成 URL?使用:addonUrl()
// 与THINKPHP5 中的 URL()使用方法也是一样的,投票应用使用到
$.post("{:addonUrl('toVote')}",{'bm_id':id},function (res) {
layer.close(index);
layer.msg(res.msg);
})
完整的传入:应用名称/控制器/方法
如果在相同的控制器里跳转,可以只传方法名就可以了。更多可以参考 thinkphp中的 URL函数 查看全部
应用的视图是支持模板的继承,从官方提供的投票的应用中有使用到,如下图:
1.png

因为开发使用得最多的就是模板继承,在使用上也是比较简单与好用的。如果有同学从来都没有没有接触过,建议你去看一下 THINKPHP5文档中模板继承。如果你想按着老套路的当然也是可以的,但是我建议你要跟上流行的节奏。

如何引入应用下的 static里面的资源?如我要引入 static/css/style.css 代码如下:
{CSS href="__ADDONSTATIC__/css/style.css" /}
__ADDONSTATIC__也是自动的识别当前应用的路径。

如何使用微信的JSSDK?代码如下:
 {:hook('Jssdk')}
当你使用此行为后,并需要你再去配置 JSSDK 任何的东西,系统已经本身已经配置好了,只要你使用了{:hook('Jssdk')}系统已经为你做好了一切。如果报错的话,(签名错误呀,URL不合Fa呀)请不要尝试在系统找原因,只要填写相应的参数是正确的,公众号配置是正确的,那么系统99%是正常的。

投票应用中的代码,如下图

1.png

若配置成功,那么你就可以在 wx.ready中使用你需要的接口了。

使用上传组件:
{:hook('Upload',['type'=>'image','name'=>'cover'])}
如果你需要传入值:
{:hook('Upload',['type'=>'image','name'=>'input name的名称','value'=>'路径'])}
多图上传:
{:hook('Upload',['type'=>'images','name'=>$v.name,'value'=>$v.value])}
需要使用媒体库的话:
{:hook('Upload',['type'=>'images','name'=>$v.name,'material'=>true,'value'=>$v.value])}
上传文件:
{:hook('Upload',['type'=>'file','name'=>$v.name,'bt_title'=>'选择文件','value'=>$v.value])}
如何对应用生成 URL?使用:
addonUrl()
// 与THINKPHP5 中的 URL()使用方法也是一样的,投票应用使用到
$.post("{:addonUrl('toVote')}",{'bm_id':id},function (res) {
layer.close(index);
layer.msg(res.msg);
})

完整的传入:应用名称/控制器/方法
如果在相同的控制器里跳转,可以只传方法名就可以了。更多可以参考 thinkphp中的 URL函数

【第四篇】开发微信应用之继承Addon类介绍

文档教程geeson 发表了文章 • 10 个评论 • 2055 次浏览 • 2017-10-09 14:02 • 来自相关话题

Api.php是与微信交互响应控制器,因此该控制器并不需要继承Addon,其它在 controller目录下的控制器,如果没有特别的情况,我们建议你都继承 Addon,因为它能够在开发帮你处理很多东西,快速开发。
如何显示模板与模板赋值?<?php
namespace addons\myDemo\controller;
use app\common\controller\Addon;

class index extends Addon
{
public function index(){
$this->assign('name','RhaPHP');
$this->fetch();
}

}经常使用到的有:public function demo()
{
dump($this->mid);//获取公众号有标识 ID
dump($this->mpInfo);//获取公众号信息
dump($this->getAaddonConfigByMp);//获取当前公众的当前应用配置信息
dump($this->addonInfoByFile);//获取当前公众的当前应用Config.php文件中的config配置项
dump($this->addonInfoByDb);//获取当前公众的当前应用安装后的数据库中的配置Config.php文件中的config配置项

}因为要更加灵活,所以控制不分前台或者后台,如果你当前控制器需要管理员才能操作的怎么办?其实也是很简单的:代码如下:class index extends Addon
{
public $adminLogin=true;//需要管理员登录才可操作本控制器
public function index()
{

$this->assign('name', 'RhaPHP');
$this->fetch();
} public $adminLogin=true;设为 true 系统认为该控制器是管理员才可以操作的。拥有业务菜单的控制器都需要此项。

如果你想把页面只限于微信里面打开:class index extends Addon
{

public $onlyWexinOpen=true;//限制需要在微信里面打开
public function index()
{
$this->assign('name', 'RhaPHP');
$this->fetch();
}


如果此应用需要微信授权登录?class index extends Addon
{
public $isWexinLogin=true;//需要微信授权登录
public function index()
{

$this->assign('name', 'RhaPHP');
$this->fetch();
}这里需要你注意一下,这里考虑到了一些没有授权登录权限的公众号。所以使用微信登录首先要到公众号-》【授权&注册】先配置好。如下图:





有网页授权登录权限的请选择系统自动注册,没有授权登录的请选择回复注册|登录。回复注册|登录是使用响应机制的。你可以设置关键词,或者自定菜单触发关键词,然后系统会以图文形式回复为登录入口。其中的跳转地址就是用户点击进入完成登录后,需要跳到的页面地址,一般是你的应用地址。这里的目录就是获取到粉丝的 openid.这里出发点是考虑到没有授权的公众号要做会员中心,用户组,优惠率,等等。

重点重点重点的来了!!!!!
这里可能有同学要骂我了?如果我很多应用都需要获取 openid啊,你这里跳转地址只有一个哇。其实我已经帮你想到这个问题的啦。按照国际惯例,没有页面授权登录的公众号的微信应用都使用了回复关键词或者自定菜单触发关键词,回复图文,然后进入该应用后系统自动的把 openid 传参到该应用的 URL中了 使用 get,或者 input()获取 openid。后台配置如下图:






还有很多比较有意思的设计逻辑。大家在使用过程自然会发现的。有任何改进或者问题欢迎大家反馈。谢谢大家
  查看全部
Api.php是与微信交互响应控制器,因此该控制器并不需要继承Addon,其它在 controller目录下的控制器,如果没有特别的情况,我们建议你都继承 Addon,因为它能够在开发帮你处理很多东西,快速开发。
如何显示模板与模板赋值?
<?php
namespace addons\myDemo\controller;
use app\common\controller\Addon;

class index extends Addon
{
public function index(){
$this->assign('name','RhaPHP');
$this->fetch();
}

}
经常使用到的有:
public function demo()
{
dump($this->mid);//获取公众号有标识 ID
dump($this->mpInfo);//获取公众号信息
dump($this->getAaddonConfigByMp);//获取当前公众的当前应用配置信息
dump($this->addonInfoByFile);//获取当前公众的当前应用Config.php文件中的config配置项
dump($this->addonInfoByDb);//获取当前公众的当前应用安装后的数据库中的配置Config.php文件中的config配置项

}
因为要更加灵活,所以控制不分前台或者后台,如果你当前控制器需要管理员才能操作的怎么办?其实也是很简单的:代码如下:
class index extends Addon
{
public $adminLogin=true;//需要管理员登录才可操作本控制器
public function index()
{

$this->assign('name', 'RhaPHP');
$this->fetch();
}
 public $adminLogin=true;设为 true 系统认为该控制器是管理员才可以操作的。拥有业务菜单的控制器都需要此项。

如果你想把页面只限于微信里面打开:
class index extends Addon
{

public $onlyWexinOpen=true;//限制需要在微信里面打开
public function index()
{
$this->assign('name', 'RhaPHP');
$this->fetch();
}


如果此应用需要微信授权登录?
class index extends Addon
{
public $isWexinLogin=true;//需要微信授权登录
public function index()
{

$this->assign('name', 'RhaPHP');
$this->fetch();
}
这里需要你注意一下,这里考虑到了一些没有授权登录权限的公众号。所以使用微信登录首先要到公众号-》【授权&注册】先配置好。如下图:

1.png

有网页授权登录权限的请选择系统自动注册,没有授权登录的请选择回复注册|登录。回复注册|登录是使用响应机制的。你可以设置关键词,或者自定菜单触发关键词,然后系统会以图文形式回复为登录入口。其中的跳转地址就是用户点击进入完成登录后,需要跳到的页面地址,一般是你的应用地址。这里的目录就是获取到粉丝的 openid.这里出发点是考虑到没有授权的公众号要做会员中心,用户组,优惠率,等等。

重点重点重点的来了!!!!!
这里可能有同学要骂我了?如果我很多应用都需要获取 openid啊,你这里跳转地址只有一个哇。其实我已经帮你想到这个问题的啦。按照国际惯例,没有页面授权登录的公众号的微信应用都使用了回复关键词或者自定菜单触发关键词,回复图文,然后进入该应用后系统自动的把 openid 传参到该应用的 URL中了 使用 get,或者 input()获取 openid。后台配置如下图:

1.png


还有很多比较有意思的设计逻辑。大家在使用过程自然会发现的。有任何改进或者问题欢迎大家反馈。谢谢大家
 

【第三篇】如何建立自己的业务逻辑处理控制层

文档教程geeson 发表了文章 • 0 个评论 • 2376 次浏览 • 2017-10-08 13:32 • 来自相关话题

可能有同学会问,比喻开发一个商城哇,我有很多业务菜单哇,有商城设置,栏目管理,产品管理,订单管理。等等。。。如何弄哇?看了第二篇文档的同学都相信都已经知道了,在 Config.php里面有一个menu数组配置项的:代码如下:'menu' => [
[
'name' => '红包记录',
'url' => 'redPack/Index/index',
'icon' => ''
],
],我这里只有一个菜单,如果你多个,就增在后台增加就可以了。如果你不了解请看第二篇:http://ask.rhaphp.com/article/8
然后在 在redPack的 controller目录下建立 Index.php控制器,然后写一个 index的方法。如下图:






蓝色框部分需要继承的,我们建议你继承!我们建议你继承!我们建议你继承!为什么?将会在第四篇讲解。
如何给模板赋值?$this->assign('值名',值);如果显示出模板? $this->fetch();//也可以自定如: $this->fetch('index')模板路径在当前应用下的 view目录中。这里是、view/inex/index。这里我还是说明一下吧。视频目录都是使用小写。不需要与控制器前面第一个字母是大写的。以 redPack为例如下图:







在这里我想说明一下:为什么我们不与其它的系统那样?表单这些都封装起来,现在咱们的应用插件中的 config那样那样??
第一点:我想减少你对系统研究时间,表单的控制你爱怎么样设计就怎么设计。
第二点:我还是想自由灵活一些吧。
不过你丫的我就是想这样啊,也行,目前只针对表单有做了处理:使用方法如下:$data= array(
[
'name' => 'keyword',
'title' => '关键词',
'type' => 'text',
'value' => '',
'placeholder' => '请输入关键词',
'tip' => '关键词哦',
],
[
'name' => 'password',
'title' => '密码',
'type' => 'password',
'value' => '',
'placeholder' => '请输入密码',
'tip' => '',
],
[
'name' => 'likes',
'title' => '喜欢谁?',
'type' => 'checkbox',
'value' => [
0 => [
'name'=>'ldh',
'title' => '刘德华',
'value' => '0',
'checked' => '0'
],
1 => [
'name'=>'fbb',
'title' => '冰冰',
'value' => '1',
'checked' => '1'
],
2 => [
'name'=>'fj',
'title' => '凤姐',
'value' => '1',
'checked' => '1'
]
],
'placeholder' => '',
'tip' => '',
],
[
'name' => 'time',
'title' => '时间',
'type' => 'date',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'sex',
'title' => '性别',
'type' => 'radio',
'value' => [
0 => [
'title' => '男',
'value' => '0',
'checked' => '0'
],
1 => [
'title' => '女',
'value' => '1',
'checked' => '1'
]
],
'placeholder' => '',
'tip' => '如果你男与女都不是,系统认为你是条汉子。',
],
[
'name' => 'content',
'title' => '描述',
'type' => 'textarea',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myFile',
'title' => '上传文件',
'type' => 'file',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myImage',
'title' => '上传图片',
'type' => 'image',
'value' => '',
'placeholder' => '',
'tip' => '',
],

);

$this->assign('menu_list',$data);
$this->fetch('default');
  查看全部
可能有同学会问,比喻开发一个商城哇,我有很多业务菜单哇,有商城设置,栏目管理,产品管理,订单管理。等等。。。如何弄哇?看了第二篇文档的同学都相信都已经知道了,在 Config.php里面有一个menu数组配置项的:代码如下:
'menu' => [
[
'name' => '红包记录',
'url' => 'redPack/Index/index',
'icon' => ''
],
],
我这里只有一个菜单,如果你多个,就增在后台增加就可以了。如果你不了解请看第二篇:http://ask.rhaphp.com/article/8
然后在 在redPack的 controller目录下建立 Index.php控制器,然后写一个 index的方法。如下图:

1.png


蓝色框部分需要继承的,我们建议你继承!我们建议你继承!我们建议你继承!为什么?将会在第四篇讲解。
如何给模板赋值?
$this->assign('值名',值);
如果显示出模板?
 $this->fetch();//也可以自定如: $this->fetch('index')
模板路径在当前应用下的 view目录中。这里是、view/inex/index。这里我还是说明一下吧。视频目录都是使用小写。不需要与控制器前面第一个字母是大写的。以 redPack为例如下图:

1.png



在这里我想说明一下:为什么我们不与其它的系统那样?表单这些都封装起来,现在咱们的应用插件中的 config那样那样??
第一点:我想减少你对系统研究时间,表单的控制你爱怎么样设计就怎么设计。
第二点:我还是想自由灵活一些吧。
不过你丫的我就是想这样啊,也行,目前只针对表单有做了处理:使用方法如下:
$data= array(
[
'name' => 'keyword',
'title' => '关键词',
'type' => 'text',
'value' => '',
'placeholder' => '请输入关键词',
'tip' => '关键词哦',
],
[
'name' => 'password',
'title' => '密码',
'type' => 'password',
'value' => '',
'placeholder' => '请输入密码',
'tip' => '',
],
[
'name' => 'likes',
'title' => '喜欢谁?',
'type' => 'checkbox',
'value' => [
0 => [
'name'=>'ldh',
'title' => '刘德华',
'value' => '0',
'checked' => '0'
],
1 => [
'name'=>'fbb',
'title' => '冰冰',
'value' => '1',
'checked' => '1'
],
2 => [
'name'=>'fj',
'title' => '凤姐',
'value' => '1',
'checked' => '1'
]
],
'placeholder' => '',
'tip' => '',
],
[
'name' => 'time',
'title' => '时间',
'type' => 'date',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'sex',
'title' => '性别',
'type' => 'radio',
'value' => [
0 => [
'title' => '男',
'value' => '0',
'checked' => '0'
],
1 => [
'title' => '女',
'value' => '1',
'checked' => '1'
]
],
'placeholder' => '',
'tip' => '如果你男与女都不是,系统认为你是条汉子。',
],
[
'name' => 'content',
'title' => '描述',
'type' => 'textarea',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myFile',
'title' => '上传文件',
'type' => 'file',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myImage',
'title' => '上传图片',
'type' => 'image',
'value' => '',
'placeholder' => '',
'tip' => '',
],

);

$this->assign('menu_list',$data);
$this->fetch('default');

 

【第二篇】使用RhaPHP开发微信应用之Config.php说明

文档教程geeson 发表了文章 • 0 个评论 • 3796 次浏览 • 2017-10-07 15:22 • 来自相关话题

第一篇已经说明参数作用说明,这一篇menu与config使用方法。使用上也是非常简单的,能够快速对应用插件配置建立表单。那么先看看一个完整Config.php代码:return array(
'name' => '',
'addon' => '',
'desc' => '',
'version' => '1.0',
'author' => 'Geeson',
'logo' => 'logo.jpg',
'menu_show' => '1',
'entry_url' => '',
'admin_url' => '',
'install_sql' => '',
'upgrade_sql' => '',
'menu' => [//后台菜单列表
[
'name' => '菜单1',
'url' => '应用名称/控制器/方法',
'icon' => ''
],

[ 'name' => '菜单2',
'url' => '应用名称/控制器/方法',
'icon' => ''
],


],
'config' => array(
[
'name' => 'name',
'title' => '名称',
'type' => 'text',
'value' => '',
'placeholder' => '请输入关名称',
'tip' => '这里是提示,比喻:名称请填写真实性名',
],
[
'name' => 'select',
'title' => '四大城市',
'type' => 'select',
'value' => [
0 => [
'title' => '北京',
'value' => '1',
'selected' => '1'
],
1 => [
'title' => '上海',
'value' => '2',
'selected' => '0'
],
2 => [
'title' => '广州',
'value' => '3',
'selected' => '0'
]
,
3 => [
'title' => '深圳',
'value' => '4',
'selected' => '0'
]
],
'placeholder' => '',
'tip' => '你的城市',
],
[
'name' => 'likes',
'title' => '喜欢谁?',
'type' => 'checkbox',
'value' => [
0 => [
'name'=>'ldh',
'title' => '刘德华',
'value' => '0',
'checked' => '0'
],
1 => [
'name'=>'fbb',
'title' => '冰冰',
'value' => '1',
'checked' => '1'
],
2 => [
'name'=>'fj',
'title' => '凤姐',
'value' => '1',
'checked' => '1'
]
],
'placeholder' => '',
'tip' => '',
],
[
'name' => 'time',
'title' => '时间',
'type' => 'date',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'sex',
'title' => '性别',
'type' => 'radio',
'value' => [
0 => [
'title' => '男',
'value' => '0',
'checked' => '0'
],
1 => [
'title' => '女',
'value' => '1',
'checked' => '1'
]
],
'placeholder' => '',
'tip' => '如果你男与女都不是,系统认为你是条汉子。',
],
[
'name' => 'content',
'title' => '描述',
'type' => 'textarea',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myFile',
'title' => '上传文件',
'type' => 'file',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myImage',
'title' => '上传图片',
'type' => 'image',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myImages',
'title' => '多图上传',
'type' => 'images',
'value' => '',
'placeholder' => '',
'tip' => '',
],

)
);我们平时开发常用的,RhaPHP都已经集合好了。后台菜单相信大家一看就能懂,看看redPack中的menu 'menu' => [
[
'name' => '红包记录',
'url' => 'redPack/Index/index',
'icon' => ''
],
],进入红包应用后台,在后台的左侧就能看到这个菜单了,当然也是支持多个的。如下图:





那么再看Config表单配置项:redPack为例:'config' => array(
[
'name' => 'amount',//input 中的name值
'title' => '红包总额', //该input的名称
'type' => 'text',//input 类型
'value' => '0',// input 默认值
'placeholder' => '',
'tip' => '单位/元',
],
[
'name' => 'money',
'title' => '红包金额',
'type' => 'text',
'value' => '1',
'placeholder' => '',
'tip' => '领取红包份额,注意红包金额微信不能低于1蚊鸡(1元钱)。',
],
[
'name' => 'nick_name',
'title' => '提供方名',
'type' => 'text',
'value' => '',
'placeholder' => '',
'tip' => '列如:绮梦科技、 RhaPHP、冰冰工作室等等。',
],
[
'name' => 'send_name',
'title' => '红包发送者名',
'type' => 'text',
'value' => '',
'placeholder' => '',
'tip' => '例如:冰冰、努力就有希望、有钱的二狗子等等,字数尽量不要太多。',
],
[
'name' => 'wishing',
'title' => '红包祝福语',
'type' => 'text',
'value' => '',
'placeholder' => '',
'tip' => '例如:恭喜发财、早生贵子、早日分手、你想对领取红包的人说的话。',
],
[
'name' => 'reply_msg',
'title' => '成功回复',
'type' => 'text',
'value' => '红包发放成功,请你继续关注活动,后面福利多多!',
'placeholder' => '',
'tip' => '红包发送成功,回复的消息内容。',
],
[
'name' => 'act_name',
'title' => '活动名称',
'type' => 'text',
'value' => '',
'placeholder' => '',
'tip' => '例如:五一假日活动、三周年庆、等等。',
],
[
'name' => 'start_time',
'title' => '开始时间',
'type' => 'date',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'end_time',
'title' => '结束时间',
'type' => 'date',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'number_of_times',
'title' => '领取次数',
'type' => 'text',
'value' => '1',
'placeholder' => '',
'tip' => '每人领取红包次数,默认1次',
],
),那么进入应用后,在后台左侧看到,如下图:







提交表单,系统自动保存参数配置表单的值。不需要开发者写增删改查代码的。

重要的话要来了!重要的话要来了!重要的话要来了!
如果此应用已经安装后,你修改Config.php,请卸载应用重新安装才会生效。因为每一个应用可以对应多个公众号的。所有配置项需入库。
如何在应用中获取配置参数?以redPack为例:





对就是它,getAddonInfo()函数。一般不需要传参数系统自动处理获取到当前公众号的应用的配置参数。
可以dump下可以看到参数。
如何传参?请看代码:/**
* 获取应用配置信息
* @author geeson myrhzq@qq.com
* $param $addonName string //当前应用名称
* @param string $mid //公众号标识 ID
* @return array|bool|mixed
*/
function getAddonInfo($addonName = '', $mid = '')
{
if ($addonName == '' || $mid == '') {
$addonName = session('addonName');
$mid = session('mid')?session('mid'):input('mid');
}
if ($addonName == '' || $mid == '') {
exit('参数不完整:应用名称或者公众号标识不存在');
}
$addon = \think\Db::name('addons')->where(['addon' => $addonName])->find();
$addonInfo = \think\Db::name('addon_info')->where(['addon' => $addonName, 'mpid' => input('mid')])->find();
$addon['path'] = ADDON_PATH . $addonName . '/';
$addon['mp_config'] = json_decode($addonInfo['infos'], true);
$addon['common_config'] = json_decode($addon['config'], true);
unset($addon['config']);
return $addon;

}

  查看全部
第一篇已经说明参数作用说明,这一篇menu与config使用方法。使用上也是非常简单的,能够快速对应用插件配置建立表单。那么先看看一个完整Config.php代码:
return array(
'name' => '',
'addon' => '',
'desc' => '',
'version' => '1.0',
'author' => 'Geeson',
'logo' => 'logo.jpg',
'menu_show' => '1',
'entry_url' => '',
'admin_url' => '',
'install_sql' => '',
'upgrade_sql' => '',
'menu' => [//后台菜单列表
[
'name' => '菜单1',
'url' => '应用名称/控制器/方法',
'icon' => ''
],

[ 'name' => '菜单2',
'url' => '应用名称/控制器/方法',
'icon' => ''
],


],
'config' => array(
[
'name' => 'name',
'title' => '名称',
'type' => 'text',
'value' => '',
'placeholder' => '请输入关名称',
'tip' => '这里是提示,比喻:名称请填写真实性名',
],
[
'name' => 'select',
'title' => '四大城市',
'type' => 'select',
'value' => [
0 => [
'title' => '北京',
'value' => '1',
'selected' => '1'
],
1 => [
'title' => '上海',
'value' => '2',
'selected' => '0'
],
2 => [
'title' => '广州',
'value' => '3',
'selected' => '0'
]
,
3 => [
'title' => '深圳',
'value' => '4',
'selected' => '0'
]
],
'placeholder' => '',
'tip' => '你的城市',
],
[
'name' => 'likes',
'title' => '喜欢谁?',
'type' => 'checkbox',
'value' => [
0 => [
'name'=>'ldh',
'title' => '刘德华',
'value' => '0',
'checked' => '0'
],
1 => [
'name'=>'fbb',
'title' => '冰冰',
'value' => '1',
'checked' => '1'
],
2 => [
'name'=>'fj',
'title' => '凤姐',
'value' => '1',
'checked' => '1'
]
],
'placeholder' => '',
'tip' => '',
],
[
'name' => 'time',
'title' => '时间',
'type' => 'date',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'sex',
'title' => '性别',
'type' => 'radio',
'value' => [
0 => [
'title' => '男',
'value' => '0',
'checked' => '0'
],
1 => [
'title' => '女',
'value' => '1',
'checked' => '1'
]
],
'placeholder' => '',
'tip' => '如果你男与女都不是,系统认为你是条汉子。',
],
[
'name' => 'content',
'title' => '描述',
'type' => 'textarea',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myFile',
'title' => '上传文件',
'type' => 'file',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myImage',
'title' => '上传图片',
'type' => 'image',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'myImages',
'title' => '多图上传',
'type' => 'images',
'value' => '',
'placeholder' => '',
'tip' => '',
],

)
);
我们平时开发常用的,RhaPHP都已经集合好了。后台菜单相信大家一看就能懂,看看redPack中的menu
 'menu' => [
[
'name' => '红包记录',
'url' => 'redPack/Index/index',
'icon' => ''
],
],
进入红包应用后台,在后台的左侧就能看到这个菜单了,当然也是支持多个的。如下图:

QQ图片20171007145555.png

那么再看Config表单配置项:redPack为例:
'config' => array(
[
'name' => 'amount',//input 中的name值
'title' => '红包总额', //该input的名称
'type' => 'text',//input 类型
'value' => '0',// input 默认值
'placeholder' => '',
'tip' => '单位/元',
],
[
'name' => 'money',
'title' => '红包金额',
'type' => 'text',
'value' => '1',
'placeholder' => '',
'tip' => '领取红包份额,注意红包金额微信不能低于1蚊鸡(1元钱)。',
],
[
'name' => 'nick_name',
'title' => '提供方名',
'type' => 'text',
'value' => '',
'placeholder' => '',
'tip' => '列如:绮梦科技、 RhaPHP、冰冰工作室等等。',
],
[
'name' => 'send_name',
'title' => '红包发送者名',
'type' => 'text',
'value' => '',
'placeholder' => '',
'tip' => '例如:冰冰、努力就有希望、有钱的二狗子等等,字数尽量不要太多。',
],
[
'name' => 'wishing',
'title' => '红包祝福语',
'type' => 'text',
'value' => '',
'placeholder' => '',
'tip' => '例如:恭喜发财、早生贵子、早日分手、你想对领取红包的人说的话。',
],
[
'name' => 'reply_msg',
'title' => '成功回复',
'type' => 'text',
'value' => '红包发放成功,请你继续关注活动,后面福利多多!',
'placeholder' => '',
'tip' => '红包发送成功,回复的消息内容。',
],
[
'name' => 'act_name',
'title' => '活动名称',
'type' => 'text',
'value' => '',
'placeholder' => '',
'tip' => '例如:五一假日活动、三周年庆、等等。',
],
[
'name' => 'start_time',
'title' => '开始时间',
'type' => 'date',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'end_time',
'title' => '结束时间',
'type' => 'date',
'value' => '',
'placeholder' => '',
'tip' => '',
],
[
'name' => 'number_of_times',
'title' => '领取次数',
'type' => 'text',
'value' => '1',
'placeholder' => '',
'tip' => '每人领取红包次数,默认1次',
],
),
那么进入应用后,在后台左侧看到,如下图:

5B10F604-CF2C-403E-BC22-ADCDD0154E15.png



提交表单,系统自动保存参数配置表单的值。不需要开发者写增删改查代码的。

重要的话要来了!重要的话要来了!重要的话要来了!
如果此应用已经安装后,你修改Config.php,请卸载应用重新安装才会生效。因为每一个应用可以对应多个公众号的。所有配置项需入库。
如何在应用中获取配置参数?以redPack为例:

QQ图片20171007151443.png

对就是它,getAddonInfo()函数。一般不需要传参数系统自动处理获取到当前公众号的应用的配置参数。
可以dump下可以看到参数。
如何传参?请看代码:
/**
* 获取应用配置信息
* @author geeson myrhzq@qq.com
* $param $addonName string //当前应用名称
* @param string $mid //公众号标识 ID
* @return array|bool|mixed
*/
function getAddonInfo($addonName = '', $mid = '')
{
if ($addonName == '' || $mid == '') {
$addonName = session('addonName');
$mid = session('mid')?session('mid'):input('mid');
}
if ($addonName == '' || $mid == '') {
exit('参数不完整:应用名称或者公众号标识不存在');
}
$addon = \think\Db::name('addons')->where(['addon' => $addonName])->find();
$addonInfo = \think\Db::name('addon_info')->where(['addon' => $addonName, 'mpid' => input('mid')])->find();
$addon['path'] = ADDON_PATH . $addonName . '/';
$addon['mp_config'] = json_decode($addonInfo['infos'], true);
$addon['common_config'] = json_decode($addon['config'], true);
unset($addon['config']);
return $addon;

}


 

【第一篇】使用RhaPHP开发第一个微信应用,新手必看

文档教程geeson 发表了文章 • 1 个评论 • 5753 次浏览 • 2017-10-03 15:07 • 来自相关话题

       虽然使用RhaPHP,开发微信应用简单灵活的,但是我还是建议你看一看。应用执行与THINKPHP的执行也是一样的。应用插件一样有自己的 MVC,总的来说你会使用 任何的一款MVC的框架就会快速上手。如果你TP都666的话。你不用看了。直接看RhaPHP官方提供的DEMO就能上手了。
        这里以发红包的应用为例,在 addon目录下建立你的应用目录。由于我比较喜欢中国式英文,红包就叫 redPack.建议使用驼峰式命名法。列如:myApp、redPack、wexinShop等。
       
        建立好 redPack 目录后。然后再建议控制层目录 controller,model(如果需要),static(如果需要)view(如果需要),Common.php(如果需要),Config.php,install.sql(如果需要),logo.jpg  也就是说controller,Config.php,logo.jpg 这三个是必须的。如下图我建立好的目录:




如果你对目录结构不了解,请看:http://ask.rhaphp.com/article/6

因为发红包是要与微信通信和请求微信的接口的,那么在 controller目录下建立 Api.php,如下图:






命名空间:namespace addons\redPack\controller;public function message($msg = , $param = )
{
// 处理微信发来的消息内容
}message()方法是必须的,$msg微信发来的消息内容,$param是当前应用插件参数,目前参数有 mid(当前公众号标识),addon(当前插件的名称)。
这里需要注意的是,Api.php可以理解为通过回复关键词或者是事件触发的,然后微信发来消息了 Api.php才会执行。如果没有特别的情况,Api.php不用继承其它的类。那么我想看下看微信发来的消息内容是什么样的怎么办?我直接告诉你易过借火啊。(客官,对不起,想了想这个还是后面再说,我先把前面的说完。请你耐心看下去)。

        这里的common.php我需要说说。玩过框架的同学都知道,这个就是当前应用插件的独立函数库。那么这时有同学可能会想, application目录common.php里面的函数我能不能在应用插件里面使用?我拍着我的良心跟你说,当然可以使用,不用做任何的引入,而且THINKPHP的核心的东西包括vendor都可以使用,而且与 application目录下的模块用法都是一样的。有极少的不同,后面我会说到。

         下面,将重点介绍 Config.php,这文件担任着非常重要的角色。没有 Config.php等于这个应用没有生命。<?php
return array(
'name' => '红包营销',// 应用名称
'addon' => 'redPack',// 应用标识与你创建的目录必须一致的
'desc' => '有钱就任性,活动营销-红包爱怎么发就怎么发',//应用介绍
'version' => '1.0',// 版本
'author' => 'Geeson',//作者
'logo' => 'logo.jpg',//logo 与应用目录的 logo 一样的名称
'menu_show' => '1',// 系统发展今后可能用到,忽略
'entry_url' => '',// 如果这应用需要入口的,比较微信商城,那么填写入口,写法 应用名称/ 控制器/方法
// 'install_sql' => 'install.sql',// 数据库安装文件
'upgrade_sql' => 'upgrade.sql',//升级的数据库文件,如果目录存在这个文件,后台自动出现升级
'menu' => [//后台管理菜单
[
'name' => '红包记录',// 菜单名称
'url' => 'redPack/Index/index',// 菜单地址
'icon' => ''
],
],
'config' => array(// 应用配置参数
[//关于配置我会单独写一篇文章介绍的
'name' => 'amount',
'title' => '红包总额',
'type' => 'text',
'value' => '0',
'placeholder' => '',
'tip' => '单位/元',
],
[
'name' => 'money',
'title' => '红包金额',
'type' => 'text',
'value' => '1',
'placeholder' => '',
'tip' => '领取红包份额,注意红包金额微信不能低于1蚊鸡(1元钱)。',
],如果你写好参数,那么进入后台。就可以看到安装啦。如下图:






创建一个应用基本就是这样过程。如果觉得没啥惊喜,继续看第二篇。 查看全部
       虽然使用RhaPHP,开发微信应用简单灵活的,但是我还是建议你看一看。应用执行与THINKPHP的执行也是一样的。应用插件一样有自己的 MVC,总的来说你会使用 任何的一款MVC的框架就会快速上手。如果你TP都666的话。你不用看了。直接看RhaPHP官方提供的DEMO就能上手了。
        这里以发红包的应用为例,在 addon目录下建立你的应用目录。由于我比较喜欢中国式英文,红包就叫 redPack.建议使用驼峰式命名法。列如:myApp、redPack、wexinShop等。
       
        建立好 redPack 目录后。然后再建议控制层目录 controller,model(如果需要),static(如果需要)view(如果需要),Common.php(如果需要),Config.php,install.sql(如果需要),logo.jpg  也就是说controller,Config.php,logo.jpg 这三个是必须的。如下图我建立好的目录:
B3363891-AE49-4CBC-A2D3-64CBEEAACEB2.png

如果你对目录结构不了解,请看:http://ask.rhaphp.com/article/6

因为发红包是要与微信通信和请求微信的接口的,那么在 controller目录下建立 Api.php,如下图:

3B11EB35-2FF0-45CD-A8B2-5EED02AABBBC.png


命名空间:namespace addons\redPack\controller;
public function message($msg = , $param = )
{
// 处理微信发来的消息内容
}
message()方法是必须的,$msg微信发来的消息内容,$param是当前应用插件参数,目前参数有 mid(当前公众号标识),addon(当前插件的名称)。
这里需要注意的是,Api.php可以理解为通过回复关键词或者是事件触发的,然后微信发来消息了 Api.php才会执行。如果没有特别的情况,Api.php不用继承其它的类。那么我想看下看微信发来的消息内容是什么样的怎么办?我直接告诉你易过借火啊。(客官,对不起,想了想这个还是后面再说,我先把前面的说完。请你耐心看下去)。

        这里的common.php我需要说说。玩过框架的同学都知道,这个就是当前应用插件的独立函数库。那么这时有同学可能会想, application目录common.php里面的函数我能不能在应用插件里面使用?我拍着我的良心跟你说,当然可以使用,不用做任何的引入,而且THINKPHP的核心的东西包括vendor都可以使用,而且与 application目录下的模块用法都是一样的。有极少的不同,后面我会说到。

         下面,将重点介绍 Config.php,这文件担任着非常重要的角色。没有 Config.php等于这个应用没有生命。
<?php
return array(
'name' => '红包营销',// 应用名称
'addon' => 'redPack',// 应用标识与你创建的目录必须一致的
'desc' => '有钱就任性,活动营销-红包爱怎么发就怎么发',//应用介绍
'version' => '1.0',// 版本
'author' => 'Geeson',//作者
'logo' => 'logo.jpg',//logo 与应用目录的 logo 一样的名称
'menu_show' => '1',// 系统发展今后可能用到,忽略
'entry_url' => '',// 如果这应用需要入口的,比较微信商城,那么填写入口,写法 应用名称/ 控制器/方法
// 'install_sql' => 'install.sql',// 数据库安装文件
'upgrade_sql' => 'upgrade.sql',//升级的数据库文件,如果目录存在这个文件,后台自动出现升级
'menu' => [//后台管理菜单
[
'name' => '红包记录',// 菜单名称
'url' => 'redPack/Index/index',// 菜单地址
'icon' => ''
],
],
'config' => array(// 应用配置参数
[//关于配置我会单独写一篇文章介绍的
'name' => 'amount',
'title' => '红包总额',
'type' => 'text',
'value' => '0',
'placeholder' => '',
'tip' => '单位/元',
],
[
'name' => 'money',
'title' => '红包金额',
'type' => 'text',
'value' => '1',
'placeholder' => '',
'tip' => '领取红包份额,注意红包金额微信不能低于1蚊鸡(1元钱)。',
],
如果你写好参数,那么进入后台。就可以看到安装啦。如下图:

7802082F-4641-4572-9ED6-B3032D03B7E9.png


创建一个应用基本就是这样过程。如果觉得没啥惊喜,继续看第二篇。

应用插件基本的目录结构

文档教程geeson 发表了文章 • 0 个评论 • 1791 次浏览 • 2017-10-03 13:04 • 来自相关话题

www
├─addons                应用插件目录
│  ├─myApp              应用名称
│     ├─controller      此控制器目录
│     ├─model           此模型目录
│     ├─view            视图目录
│     ├─static          此应用的静态目录JS,CSS,IMAGE
│     ├─common.php      此应用的函数文件
│     ├─config.php      此应用的配置文件
│     ├─install.sql     此应用的数据库安装文件
│     └─logo.jpg        此应用的LOGO
├─application           应用目录
│  ├─admin              后台模块
│  ├─behavior           行为目录
│  ├─common             公共模块
│  ├─install            系统安装模块
│  ├─mp                 操作管理微信公众号模块
│  ├─command.php        命令行工具配置文件
│  ├─common.php         公共函数文件
│  └─tags.php           应用行为扩展定义文件

├─public                静态目录JS,CSS,IMAGE
├─data                  存放数据
├─config                应用配置目录
│  ├─module_name        模块配置目录
│  │  ├─database.php    数据库配置
│  │  ├─cache           缓存配置
│  │  └─ ...            
│  │
│  ├─app.php            应用配置
│  ├─cache.php          缓存配置
│  ├─cookie.php         Cookie配置
│  ├─database.php       数据库配置
│  ├─log.php            日志配置
│  ├─session.php        Session配置
│  ├─template.php       模板引擎配置
│  └─trace.php          Trace配置
├─route                 路由定义目录
│  ├─route.php          路由定义
│  └─...                更多
├─runtime               应用的运行时目录
├─thinkphp              框架系统目录
│  ├─lang               语言文件目录
│  ├─library            框架类库目录
│  │  ├─think           Think类库包目录
│  │  └─traits          系统Trait目录
│  │
│  ├─tpl                系统模板目录
│  ├─base.php           基础定义文件
│  ├─convention.php     框架惯例配置文件
│  ├─helper.php         助手函数文件
│  └─logo.png           框架LOGO文件

├─extend                扩展类库目录
├─vendor                第三方类库目录(Composer依赖库)
├─build.php             自动生成定义文件(参考)
├─安装协议.txt
├─README.md             README 文件
├─index.php             系统入口文件
├─composer.json         composer 定义文件
├─think                 命令行入口文件 查看全部
www
├─addons                应用插件目录
│  ├─myApp              应用名称
│     ├─controller      此控制器目录
│     ├─model           此模型目录
│     ├─view            视图目录
│     ├─static          此应用的静态目录JS,CSS,IMAGE
│     ├─common.php      此应用的函数文件
│     ├─config.php      此应用的配置文件
│     ├─install.sql     此应用的数据库安装文件
│     └─logo.jpg        此应用的LOGO
├─application           应用目录
│  ├─admin              后台模块
│  ├─behavior           行为目录
│  ├─common             公共模块
│  ├─install            系统安装模块
│  ├─mp                 操作管理微信公众号模块
│  ├─command.php        命令行工具配置文件
│  ├─common.php         公共函数文件
│  └─tags.php           应用行为扩展定义文件

├─public                静态目录JS,CSS,IMAGE
├─data                  存放数据
├─config                应用配置目录
│  ├─module_name        模块配置目录
│  │  ├─database.php    数据库配置
│  │  ├─cache           缓存配置
│  │  └─ ...            
│  │
│  ├─app.php            应用配置
│  ├─cache.php          缓存配置
│  ├─cookie.php         Cookie配置
│  ├─database.php       数据库配置
│  ├─log.php            日志配置
│  ├─session.php        Session配置
│  ├─template.php       模板引擎配置
│  └─trace.php          Trace配置
├─route                 路由定义目录
│  ├─route.php          路由定义
│  └─...                更多
├─runtime               应用的运行时目录
├─thinkphp              框架系统目录
│  ├─lang               语言文件目录
│  ├─library            框架类库目录
│  │  ├─think           Think类库包目录
│  │  └─traits          系统Trait目录
│  │
│  ├─tpl                系统模板目录
│  ├─base.php           基础定义文件
│  ├─convention.php     框架惯例配置文件
│  ├─helper.php         助手函数文件
│  └─logo.png           框架LOGO文件

├─extend                扩展类库目录
├─vendor                第三方类库目录(Composer依赖库)
├─build.php             自动生成定义文件(参考)
├─安装协议.txt
├─README.md             README 文件
├─index.php             系统入口文件
├─composer.json         composer 定义文件
├─think                 命令行入口文件