增加wechat控制器
This commit is contained in:
parent
8072e65a69
commit
90cdfa61ad
165
app/index/controller/WechatController.php
Normal file
165
app/index/controller/WechatController.php
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
<?php
|
||||||
|
namespace app\index\controller;
|
||||||
|
|
||||||
|
use think\facade\Request;
|
||||||
|
use think\facade\Log;
|
||||||
|
use think\facade\Cache;
|
||||||
|
|
||||||
|
class WechatController extends BaseController
|
||||||
|
{
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
// 检查请求方法
|
||||||
|
if (Request::method() == 'GET') {
|
||||||
|
// 首次验证服务器地址的有效性
|
||||||
|
$this->checkSignature();
|
||||||
|
} elseif (Request::method() == 'POST') {
|
||||||
|
// 接收消息并回复
|
||||||
|
$response = $this->receiveMessage();
|
||||||
|
// 直接输出回复的XML字符串
|
||||||
|
echo $response;
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 验证签名
|
||||||
|
protected function checkSignature()
|
||||||
|
{
|
||||||
|
$signature = Request::get('signature');
|
||||||
|
$timestamp = Request::get('timestamp');
|
||||||
|
$nonce = Request::get('nonce');
|
||||||
|
$echostr = Request::get('echostr');
|
||||||
|
$token = "token2024";
|
||||||
|
$tmpArr = array($token, $timestamp, $nonce);
|
||||||
|
sort($tmpArr, SORT_STRING);
|
||||||
|
$tmpStr = implode($tmpArr);
|
||||||
|
$tmpStr = sha1($tmpStr);
|
||||||
|
|
||||||
|
if ($tmpStr == $signature) {
|
||||||
|
echo $echostr;
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收消息
|
||||||
|
protected function receiveMessage()
|
||||||
|
{
|
||||||
|
$postStr = file_get_contents("php://input");
|
||||||
|
if (empty($postStr)) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
libxml_disable_entity_loader(true);
|
||||||
|
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
|
||||||
|
Log::write($postObj);
|
||||||
|
// 检查消息类型
|
||||||
|
$msgType = strtolower((string) $postObj->MsgType);
|
||||||
|
if ($msgType == 'text') {
|
||||||
|
// 提取消息内容
|
||||||
|
$fromUsername = (string) $postObj->FromUserName; // 微信用户openid
|
||||||
|
$toUsername = (string) $postObj->ToUserName; // 公众号id
|
||||||
|
$keyword = trim((string) $postObj->Content);
|
||||||
|
|
||||||
|
// 构造自动回复的文本消息
|
||||||
|
$time = time();
|
||||||
|
$textTpl = "<xml>
|
||||||
|
<ToUserName><![CDATA[%s]]></ToUserName>
|
||||||
|
<FromUserName><![CDATA[%s]]></FromUserName>
|
||||||
|
<CreateTime>%s</CreateTime>
|
||||||
|
<MsgType><![CDATA[text]]></MsgType>
|
||||||
|
<Content><![CDATA[%s]]></Content>
|
||||||
|
<FuncFlag>0</FuncFlag>
|
||||||
|
</xml>";
|
||||||
|
|
||||||
|
|
||||||
|
$responseContent = "消息标题";
|
||||||
|
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $responseContent);
|
||||||
|
// 假设已经确定要发送小程序卡片消息
|
||||||
|
$this->sendMiniProgramCard((string) $postObj->FromUserName);
|
||||||
|
|
||||||
|
return $resultStr;
|
||||||
|
}
|
||||||
|
// 如果需要处理其他类型的消息,可以在这里添加相应的逻辑
|
||||||
|
|
||||||
|
// 如果不是文本消息,可以返回一个空字符串或错误消息
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送小程序卡片消息的方法
|
||||||
|
private function sendMiniProgramCard($openid)
|
||||||
|
{
|
||||||
|
|
||||||
|
$accessToken = $this->getGZHAccessToken();
|
||||||
|
if (!$accessToken) {
|
||||||
|
// 处理获取access_token失败的情况
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$postData = json_encode([
|
||||||
|
'touser' => $openid, // 接收者(用户)的openid
|
||||||
|
'msgtype' => 'miniprogrampage',
|
||||||
|
'miniprogrampage' => [
|
||||||
|
'title' => '小程序标题',
|
||||||
|
'appid' => '小程序appid',
|
||||||
|
'pagepath' => '小程序路径',
|
||||||
|
'thumb_media_id' => '你的thumb_media_id'
|
||||||
|
]
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={$accessToken}";
|
||||||
|
$result = json_decode(file_get_contents($url, false, stream_context_create([
|
||||||
|
'http' => [
|
||||||
|
'method' => 'POST',
|
||||||
|
'header' => "Content-type: application/json\r\n",
|
||||||
|
'content' => $postData,
|
||||||
|
'timeout' => 60 // 超时时间(单位:s)
|
||||||
|
]
|
||||||
|
])), true);
|
||||||
|
// 处理返回结果
|
||||||
|
if ($result['errcode'] == 0) {
|
||||||
|
// 发送成功
|
||||||
|
} else {
|
||||||
|
// 发送失败
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取公众号Access token
|
||||||
|
public function getGZHAccessToken()
|
||||||
|
{
|
||||||
|
$access_token = Cache::get('gzh_access_token');
|
||||||
|
if (!$access_token) {
|
||||||
|
$config = [
|
||||||
|
'appid' => 'appid',
|
||||||
|
'secret' => 'secret',
|
||||||
|
'grant_type' => 'client_credential'
|
||||||
|
];
|
||||||
|
$response = $this->curlPost('https://api.weixin.qq.com/cgi-bin/token', $config);
|
||||||
|
$data = json_decode($response, true);
|
||||||
|
$access_token = $data["access_token"];
|
||||||
|
Cache::set('gzh_access_token', $access_token, $data["expires_in"] - 200);
|
||||||
|
}
|
||||||
|
return $access_token;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送请求
|
||||||
|
public function curlPost($url = '', $postData = '', $options = array())
|
||||||
|
{
|
||||||
|
if (is_array($postData)) {
|
||||||
|
$postData = http_build_query($postData);
|
||||||
|
}
|
||||||
|
$ch = curl_init();
|
||||||
|
curl_setopt($ch, CURLOPT_URL, $url);
|
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||||
|
curl_setopt($ch, CURLOPT_POST, 1);
|
||||||
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
|
||||||
|
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
|
||||||
|
if (!empty($options)) {
|
||||||
|
curl_setopt_array($ch, $options);
|
||||||
|
}
|
||||||
|
//https请求 不验证证书和host
|
||||||
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||||
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||||||
|
$data = curl_exec($ch);
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user