You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
404 lines
14 KiB
404 lines
14 KiB
<?php
|
|
namespace clt;
|
|
/**
|
|
* 功能说明:微信基本功能测试编码,通过此页面可以获取通过开放平台得到的公众号会话(token)以及公众号对应的appid
|
|
* 创建人:李广
|
|
* 创建时间:2016-2-26
|
|
*/
|
|
class WchatOauth
|
|
{
|
|
public $author_appid;
|
|
|
|
public $token;
|
|
/**
|
|
* 构造函数
|
|
*
|
|
* @param unknown $shop_id
|
|
*/
|
|
public function __construct($appid = '')
|
|
{
|
|
$this->author_appid = 'instanceid_0';
|
|
}
|
|
/**
|
|
* ***********************************************************************基础信息*************************************************
|
|
*/
|
|
/**
|
|
* 公众号获取access_token
|
|
*
|
|
* @return unknown
|
|
*/
|
|
private function get_access_token()
|
|
{
|
|
// 公众平台模式获取token
|
|
$token = $this->single_get_access_token();
|
|
return $token;
|
|
}
|
|
|
|
/**
|
|
* 公众平台账户获取token
|
|
*/
|
|
private function single_get_access_token()
|
|
{
|
|
$wchat_config = db('wx_mp')->where([['key','=','SHOPWCHAT'],['instance_id','=',0]])->field('value')->find();
|
|
if (empty($wchat_config['value'])) {
|
|
return array(
|
|
'value' => array(
|
|
'appid' => '',
|
|
'appsecret' => ''
|
|
),
|
|
'is_use' => 1
|
|
);
|
|
} else {
|
|
$wchat_config['value'] = json_decode($wchat_config['value'], true);
|
|
}
|
|
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$wchat_config['value']['appid'].'&secret=' .$wchat_config['value']['appsecret'];
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
$a = curl_exec($ch);
|
|
$strjson = json_decode($a);
|
|
if($strjson == false || empty($strjson)) {
|
|
return '';
|
|
}else{
|
|
$token = $strjson->access_token;
|
|
if (empty($token)) {} else {
|
|
// 注意如果是多用户需要
|
|
cache('token-' . $this->author_appid, $token, 3600);
|
|
}
|
|
return $token;
|
|
}
|
|
}
|
|
//创建菜单
|
|
public function menu_create($jsonmenu)
|
|
{
|
|
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s";
|
|
$result = $this->get_url_return($url, $jsonmenu);
|
|
return $result;
|
|
}
|
|
/**
|
|
* 微信数据获取
|
|
*
|
|
* @param unknown $url
|
|
* @param unknown $data
|
|
* @param string $needToken
|
|
* @return string|unknown
|
|
*/
|
|
private function get_url_return($url, $data = '', $needToken = false)
|
|
{
|
|
// 第一次为空,则从文件中读取
|
|
if (empty($this->token)) {
|
|
$this->token = cache('token-' . $this->author_appid);
|
|
}
|
|
// 为空则重新取值
|
|
if (empty($this->token) or $needToken) {
|
|
|
|
$this->get_access_token();
|
|
$this->token = cache('token-' . $this->author_appid);
|
|
}
|
|
$newurl = sprintf($url, $this->token);
|
|
$curl = curl_init(); // 创建一个新url资源
|
|
curl_setopt($curl, CURLOPT_URL, $newurl);
|
|
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
|
|
if (! empty($data)) {
|
|
curl_setopt($curl, CURLOPT_POST, 1);
|
|
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
|
|
}
|
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
|
$AjaxReturn = curl_exec($curl);
|
|
// curl_close();
|
|
$strjson = json_decode($AjaxReturn);
|
|
if (! empty($strjson->errcode)) {
|
|
switch ($strjson->errcode) {
|
|
case 40001:
|
|
return $this->get_url_return($url, $data, true); // 获取access_token时AppSecret错误,或者access_token无效
|
|
break;
|
|
case 40014:
|
|
return $this->get_url_return($url, $data, true); // 不合法的access_token
|
|
break;
|
|
case 42001:
|
|
return $this->get_url_return($url, $data, true); // access_token超时
|
|
break;
|
|
case 45009:
|
|
return json_encode(array(
|
|
"errcode" => - 45009,
|
|
"errmsg" => "接口调用超过限制:" . $strjson->errmsg
|
|
));
|
|
break;
|
|
case 41001:
|
|
return json_encode(array(
|
|
"errcode" => - 41001,
|
|
"errmsg" => "缺少access_token参数:" . $strjson->errmsg
|
|
));
|
|
break;
|
|
default:
|
|
return json_encode(array(
|
|
"errcode" => $strjson->errcode,
|
|
"errmsg" => $strjson->errmsg
|
|
)); // 其他错误,抛出
|
|
break;
|
|
}
|
|
} else {
|
|
return $AjaxReturn;
|
|
}
|
|
}
|
|
/**
|
|
* ***********************************************************************基础信息*************************************************
|
|
*/
|
|
/**
|
|
* *************************************************微信回复消息部分 开始**************************************
|
|
*/
|
|
/**
|
|
* 返回文本消息组装xml
|
|
*
|
|
* @param unknown $postObj
|
|
* @param unknown $content
|
|
* @param number $funcFlag
|
|
* @return string
|
|
*/
|
|
public function event_key_text($postObj, $content, $funcFlag = 0)
|
|
{
|
|
if (! empty($content)) {
|
|
$xmlTpl = "<xml>
|
|
<ToUserName><![CDATA[%s]]></ToUserName>
|
|
<FromUserName><![CDATA[%s]]></FromUserName>
|
|
<CreateTime>%s</CreateTime>
|
|
<MsgType><![CDATA[text]]></MsgType>
|
|
<Content><![CDATA[%s]]></Content>
|
|
<FuncFlag>%d</FuncFlag>
|
|
</xml>";
|
|
$resultStr = sprintf($xmlTpl, $postObj->FromUserName, $postObj->ToUserName, time(), $content, $funcFlag);
|
|
return $resultStr;
|
|
}else{
|
|
return '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 返回图文消息组装xml
|
|
*
|
|
* @param unknown $postObj
|
|
* @param unknown $arr_item
|
|
* @param number $funcFlag
|
|
* @return void|string
|
|
*/
|
|
public function event_key_news($postObj, $arr_item, $funcFlag = 0)
|
|
{
|
|
// 首条标题28字,其他标题39字
|
|
if (! is_array($arr_item)) {
|
|
return;
|
|
}
|
|
$itemTpl = "<item>
|
|
<Title><![CDATA[%s]]></Title>
|
|
<Description><![CDATA[%s]]></Description>
|
|
<PicUrl><![CDATA[%s]]></PicUrl>
|
|
<Url><![CDATA[%s]]></Url>
|
|
</item>
|
|
";
|
|
$item_str = "";
|
|
foreach ($arr_item as $item) {
|
|
$item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
|
|
}
|
|
$newsTpl = "<xml>
|
|
<ToUserName><![CDATA[%s]]></ToUserName>
|
|
<FromUserName><![CDATA[%s]]></FromUserName>
|
|
<CreateTime>%s</CreateTime>
|
|
<MsgType><![CDATA[news]]></MsgType>
|
|
<Content><![CDATA[]]></Content>
|
|
<ArticleCount>%s</ArticleCount>
|
|
<Articles>$item_str</Articles>
|
|
<FuncFlag>%s</FuncFlag>
|
|
</xml>";
|
|
$resultStr = sprintf($newsTpl, $postObj->FromUserName, $postObj->ToUserName, time(), count($arr_item), $funcFlag);
|
|
return $resultStr;
|
|
}
|
|
|
|
/**
|
|
* *************************************************微信回复消息部分 结束******************************************************************************
|
|
*/
|
|
|
|
/**
|
|
* 功能说明:从微信选择地址 - 创建签名SHA1
|
|
*
|
|
* @param array $Parameters
|
|
* string1加密
|
|
*/
|
|
public function sha1_sign($Parameters)
|
|
{
|
|
$signPars = '';
|
|
ksort($Parameters);
|
|
foreach ($Parameters as $k => $v) {
|
|
if ("" != $v && "sign" != $k) {
|
|
if ($signPars == '')
|
|
$signPars .= $k . "=" . $v;
|
|
else
|
|
$signPars .= "&" . $k . "=" . $v;
|
|
}
|
|
}
|
|
$sign = sha1($signPars);
|
|
return $sign;
|
|
}
|
|
|
|
/**
|
|
* 产生随机字符串,不长于32位
|
|
*
|
|
* @param int $length
|
|
* @return 产生的随机字符串
|
|
*/
|
|
public function get_nonce_str($length = 32)
|
|
{
|
|
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
$str = "";
|
|
for ($i = 0; $i < $length; $i ++) {
|
|
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
|
|
}
|
|
return $str;
|
|
}
|
|
|
|
/**
|
|
* 格式化参数格式化成url参数
|
|
*/
|
|
public function to_url_param()
|
|
{
|
|
$buff = "";
|
|
foreach ($this->values as $k => $v) {
|
|
if ($k != "sign" && $v != "" && ! is_array($v)) {
|
|
$buff .= $k . "=" . $v . "&";
|
|
}
|
|
}
|
|
$buff = trim($buff, "&");
|
|
return $buff;
|
|
}
|
|
|
|
/**
|
|
* *****************获取消息*************************************************
|
|
*/
|
|
/**
|
|
* 获取关注回复
|
|
*
|
|
* @param unknown $instance_id
|
|
* @return unknown|string
|
|
*/
|
|
public function getSubscribeReplay($instance_id)
|
|
{
|
|
$weixin_flow_replay = db('wx_follow_replay');
|
|
$info = $weixin_flow_replay->where('instance_id',$instance_id)->find();
|
|
if (! empty($info)) {
|
|
$media_detail = $this->getWeixinMediaDetail($info['reply_media_id']);
|
|
$content = $this->getMediaWchatStruct($media_detail);
|
|
return $content;
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
public function getWeixinMediaDetail($media_id)
|
|
{
|
|
$weixin_media = db('wx_media');
|
|
$weixin_media_info = $weixin_media->where('media_id',$media_id)->find();
|
|
if (! empty($weixin_media_info)) {
|
|
$weixin_media_item = db('wx_media_item');
|
|
$item_list = $weixin_media_item->where('media_id',$media_id)->select();
|
|
$weixin_media_info['item_list'] = $item_list;
|
|
}
|
|
return $weixin_media_info;
|
|
}
|
|
/**
|
|
* // 构造media数据并返回
|
|
* // media_type 消息素材类型1文本 2单图文 3多图文',(non-PHPdoc)
|
|
*
|
|
* @see \ata\api\IWeixin::getMediaWchatStruct()
|
|
*/
|
|
public function getMediaWchatStruct($media_info){
|
|
switch ($media_info['type']) {
|
|
case "1":
|
|
$contentStr = trim($media_info['title']);
|
|
break;
|
|
case "2":
|
|
$contentStr[] = array(
|
|
"Title" => $media_info['item_list'][0]['title'],
|
|
"Description" => $media_info['item_list'][0]['summary'],
|
|
"PicUrl" => 'http://' . $_SERVER['HTTP_HOST'] . '/public/' . $media_info['item_list'][0]['cover'],
|
|
"Url" => url('templatemessage',['media_id'=>$media_info['item_list'][0]['id']],'',true)
|
|
);
|
|
break;
|
|
case "3":
|
|
$contentStr = array();
|
|
foreach ($media_info['item_list'] as $k => $v) {
|
|
$contentStr[$k] = array(
|
|
"Title" => $v['title'],
|
|
"Description" => $v['summary'],
|
|
"PicUrl" => 'http://' . $_SERVER['HTTP_HOST'] . '/public/' . $v['cover'],
|
|
"Url" => url( 'templatemessage',['media_id'=>$v['id']],'',true)
|
|
);
|
|
}
|
|
break;
|
|
default:
|
|
$contentStr = "";
|
|
break;
|
|
}
|
|
return $contentStr;
|
|
}
|
|
|
|
/**
|
|
* 获取关键字回复
|
|
*
|
|
* @param unknown $key_words
|
|
*/
|
|
public function getWhatReplay($instance_id, $key_words)
|
|
{
|
|
$weixin_key_replay = db('wx_key_replay');
|
|
// 全部匹配
|
|
$condition = [
|
|
['instance_id','=',$instance_id],
|
|
['key','=',$key_words],
|
|
['match_type','=',2]
|
|
];
|
|
$info = $weixin_key_replay->where($condition)->find();
|
|
if (empty($info)) {
|
|
// 模糊匹配
|
|
$condition =
|
|
[
|
|
['instance_id','=',$instance_id],
|
|
['key','LIKE','%' . $key_words . '%'],
|
|
['match_type','=',1]
|
|
];
|
|
$info = $weixin_key_replay->where($condition)->find();
|
|
}
|
|
if (! empty($info)) {
|
|
$media_detail = $this->getWeixinMediaDetail($info['reply_media_id']);
|
|
$content = $this->getMediaWchatStruct($media_detail);
|
|
return $content;
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
/**
|
|
* 默认回复
|
|
* @see getDefaultReplay()
|
|
*/
|
|
public function getDefaultReplay($instance_id){
|
|
$weixin_default_replay = db('wx_default_replay');
|
|
$info = $weixin_default_replay->where('instance_id',$instance_id)->find();
|
|
if (!empty($info)) {
|
|
$media_detail = $this->getWeixinMediaDetail($info['reply_media_id']);
|
|
$content = $this->getMediaWchatStruct($media_detail);
|
|
return $content;
|
|
} else {
|
|
return '';
|
|
}
|
|
}
|
|
/**
|
|
* ************************菜单点击****************************************************************
|
|
*/
|
|
/*
|
|
* 点击
|
|
* @see \ata\api\IWeixin::getWeixinMenuDetail()
|
|
*/
|
|
public function getWeixinMenuDetail($menu_id)
|
|
{
|
|
$weixin_menu = db('wx_menu');
|
|
$data = $weixin_menu->where('menu_id',$menu_id)->find();
|
|
return $data;
|
|
}
|
|
}
|