首页
留言
Search
1
在Centos7下搭建Socks5代理服务器
1,036 阅读
2
在windows11通过Zip安装Mysql5.7
574 阅读
3
Mysql5.7开放远程登录
482 阅读
4
数据库
469 阅读
5
mysql5.7基本命令
377 阅读
综合
正则表达式
git
系统
centos7
ubuntu
kali
Debian
网络
socks5
wireguard
运维
docker
hadoop
kubernetes
hive
openstack
ElasticSearch
ansible
前端
三剑客
Python
Python3
selenium
Flask
PHP
PHP基础
ThinkPHP
游戏
我的世界
算法
递归
排序
查找
软件
ide
Xshell
vim
PicGo
Typora
云盘
安全
靶场
reverse
Java
JavaSE
Spring
MyBatis
C++
QT
数据库
mysql
登录
Search
标签搜索
java
centos7
linux
centos
html5
JavaScript
php
css3
mysql
spring
mysql5.7
linux全栈
ubuntu
BeanFactory
SpringBean
python
python3
ApplicationContext
kali
mysql8.0
我亏一点
累计撰写
139
篇文章
累计收到
8
条评论
首页
栏目
综合
正则表达式
git
系统
centos7
ubuntu
kali
Debian
网络
socks5
wireguard
运维
docker
hadoop
kubernetes
hive
openstack
ElasticSearch
ansible
前端
三剑客
Python
Python3
selenium
Flask
PHP
PHP基础
ThinkPHP
游戏
我的世界
算法
递归
排序
查找
软件
ide
Xshell
vim
PicGo
Typora
云盘
安全
靶场
reverse
Java
JavaSE
Spring
MyBatis
C++
QT
数据库
mysql
页面
留言
搜索到
16
篇与
PHP
的结果
2023-02-09
PHP 微信公众号对接学习记录
PHP开发微信公众平台0.微信公众平台官方文档https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.htmlhttps://res.wx.qq.com/op_res/-serEQ6xSDVIjfoOHcX78T1JAYX-pM_fghzfiNYoD8uHVd3fOeC0PC_pvlg4-kmP1.配置与微信服务器的通信1.打开微信公众平台,获取并写入基本信息index.php文件<?php // 微信公众平台基本信息 $token = 'xxxx'; $AppID = 'wx64xxxxxxxxxf014'; $AppSecret = 'd9bxxxxxxxxxxxxxxxxxxxc2'; ?>2.验证消息是否来自微信服务器index.php文件<?php // 微信公众平台基本信息 $token = 'xxxx'; $AppID = 'wx64xxxxxxxxxf014'; $AppSecret = 'd9bxxxxxxxxxxxxxxxxxxxc2'; // 验证消息是否来自微信服务器 // 计算signature微信加密签名,并且与微信请求字段的signature进行值对比,从而证明消息来自微信服务器 if(!empty($_GET['echostr'])){ // 微信通信请求字段 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $echostr = $_GET['echostr']; // 将token,timestamp,nonce三个字段合为一个数组,并且按照字典排序 $arr = array($token, $timestamp, $nonce); sort($arr,SORT_STRING); // 将数组内容拼接为一个字符串 $str = implode($arr); // 将拼接后的字符串内容进行sha1加密 $sign = sha1($str); // 与微信服务器请求的signature字段内容进行对比,则证明是来自微信服务器的消息 if($sign == $signature){ //将echoStr字段的值返回给微信 echo $echostr; }else{ // 内容不一样则退出 return false; } } ?>3.配置微信公众平台1.登入微信公众平台2.点击基本配置3.在“IP白名单” 点击查看,添加服务器IP地址4.在“服务器配置” 点击修改配置URL:网页地址Token:与php文件中的token一样EncodingAESKey:随机生成一个消息加解密方式:兼容模式5.点击提交-确定6.启用2.获取access_tokenaccess_token有效期为两小时,所以1.5小时就重新刷新获取一次access_tokenaccess_token每天请求上线为2000次,每次请求都获取一次access_token,可以将当前access_token缓存在本地文件1.获取access_token架构:本地没有保存access_token的文件,获取access_token,并且保存在文件本地有保存access_token点文件:判断access_token是否过期:过期了,重新获取access_token,保存替换文件没有过期,直接使用2.创建get_access_token.php文件get_access_token.php文件<?php // 文件名 $file = "access_token.dao"; // access_token获取地址,修改appid和secret $get_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx6xxxxxxxxx014&secret=d9bxxxxxxxxxxxxxxxxxx76c2"; // access_token $access_token = ""; function get_access_token(){ // 引用全局变量 global $file,$get_url,$access_token; // 取网页源码 $html = file_get_contents($get_url); // 取access_token的值 $access_token = json_decode($html)->access_token; // 取当前时间戳 $timer = time(); // 打开access_token保存文件 $fp = fopen($file, "w+"); // 写入时间戳 access_token,以空格分割 fwrite($fp,($timer . " " . $access_token)); // 关闭文件 fclose($fp); return false; } // 如果文件不存在,则执行获取access_token函数 if(!file_exists($file)){ get_access_token(); } // 如果文件存在,则获取当前时间戳减去文本中的时间戳,判断access_token是否超时 $access_token_file = fopen($file,'r'); // 取出文本内容并且按照空格将字符串切割为数组 $text = explode(" ",fread($access_token_file,filesize($file))); fclose($access_token_file); // 取当前时间戳,减去文本中转为整数型的时间戳,如果大于5400(1.5小时),则重新获取一次access_token_file if((time() - ((int)$text[0])) >= 5400){ get_access_token(); } $access_token = $text[1]; return false; ?>3.获取用户发送的消息官方文档:消息事件:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html推送事件:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html微信服务器会发送两种消息给开发者服务器get - 验证服务器的有效性post - 微信服务器会将用户发送的数据以post请求都方式发送到服务器,但是不能用post来接收消息调试代码:index.php文件<?php // 执行php文件得到可用access_token include "get_access_token.php"; // 微信公众平台基本信息 $token = 'xxxx'; $AppID = 'wx64xxxxxxxxxf014'; $AppSecret = 'd9bxxxxxxxxxxxxxxxxxxxc2'; // 验证消息是否来自微信服务器 // 计算signature微信加密签名,并且与微信请求字段的signature进行值对比,从而证明消息来自微信服务器 if(!empty($_GET['echostr'])){ // 微信通信请求字段 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $echostr = $_GET['echostr']; // 将token,timestamp,nonce三个字段合为一个数组,并且按照字典排序 $arr = array($token, $timestamp, $nonce); sort($arr,SORT_STRING); // 将数组内容拼接为一个字符串 $str = implode($arr); // 将拼接后的字符串内容进行sha1加密 $sign = sha1($str); // 与微信服务器请求的signature字段内容进行对比,则证明是来自微信服务器的消息 if($sign == $signature){ //将echoStr字段的值返回给微信 echo $echostr; }else{ // 内容不一样则退出 return false; } } // 接收用户对公众号发送的信息 function get_info(){ // 接收xml数据 $GLOBALS['HTTP_RAW_POST_DATA'],如果用不了就使用file_get_contents('php://input') // 或者找到php.ini配置文件,修改配置为always_populate_raw_post_data = On // $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $xml = file_get_contents('php://input'); // 如果$xml有数据才执行 if(!empty($xml)){ // 临时存放字符串数据 $text = $xml; // 防止xml注入,禁止xml实体解析 libxml_disable_entity_loader(true); // 使用simpleXML解析该xml字符串 $xml = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); // 通过元素MsgType来判断该微信服务器转发的消息类型 switch ($xml->MsgType){ // 接收到事件消息 case 'event': // 公众号订阅事件 if ($xml->Event=='subscribe'){ } // 公众号取消订阅事件 if ($xml->Event=='unsubscribe'){ } break; // 接收到文本消息 case 'text': // 调试是否正常接收文本 $fp = fopen("1.txt","w+"); fwrite($fp,$text); fclose($fp); break; // 接收到图片消息 case 'image': break; //接收到语音消息 case 'voice': break; //接收到视频消息 case 'video': break; //接收到短视频消息 case 'shortvideo': break; //接收到位置消息 case 'location': break; //接收到链接消息 case 'link': break; } } } get_info(); ?>给微信公众号发送一条消息,大概内容如下1.txt<xml> <ToUserName><![CDATA[gh_5xxxxxxxxxxxxxxe7]]></ToUserName> <FromUserName><![CDATA[oKMn3wXdxxxxxxxxxxxxxxxbrdx2-tqk]]></FromUserName> <CreateTime>1649653429</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[111]]></Content> <MsgId>2361xxxxxxxx36426</MsgId> <Encrypt><![CDATA[Mlg9c4rQVY86dvfWgMMMgzVYfc9Sxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3v6akekFxR3wuSr+tdUTx7vmGdNZipLwlfDkJASTHS3dp2Dmk=]]></Encrypt> </xml>精简代码:index.php文件<?php // 执行php文件得到可用access_token include "get_access_token.php"; // 微信公众平台基本信息 $token = 'xxxx'; $AppID = 'wx64xxxxxxxxxf014'; $AppSecret = 'd9bxxxxxxxxxxxxxxxxxxxc2'; // 验证消息是否来自微信服务器 // 计算signature微信加密签名,并且与微信请求字段的signature进行值对比,从而证明消息来自微信服务器 if(!empty($_GET['echostr'])){ // 微信通信请求字段 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $echostr = $_GET['echostr']; // 将token,timestamp,nonce三个字段合为一个数组,并且按照字典排序 $arr = array($token, $timestamp, $nonce); sort($arr,SORT_STRING); // 将数组内容拼接为一个字符串 $str = implode($arr); // 将拼接后的字符串内容进行sha1加密 $sign = sha1($str); // 与微信服务器请求的signature字段内容进行对比,则证明是来自微信服务器的消息 if($sign == $signature){ //将echoStr字段的值返回给微信 echo $echostr; }else{ // 内容不一样则退出 return false; } } // 接收用户对公众号发送的信息 function get_info(){ // 接收xml数据 $GLOBALS['HTTP_RAW_POST_DATA'],如果用不了就使用file_get_contents('php://input') // 或者找到php.ini配置文件,修改配置为always_populate_raw_post_data = On // $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $xml = file_get_contents('php://input'); // 如果$xml有数据才执行 if(!empty($xml)){ // 防止xml注入,禁止xml实体解析 libxml_disable_entity_loader(true); // 使用simpleXML解析该xml字符串 $xml = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); // 通过元素MsgType来判断该微信服务器转发的消息类型 switch ($xml->MsgType){ // 接收到事件消息 case 'event': // 公众号订阅事件 if ($xml->Event=='subscribe'){ } // 公众号取消订阅事件 if ($xml->Event=='unsubscribe'){ } break; // 接收到文本消息 case 'text': break; // 接收到图片消息 case 'image': break; //接收到语音消息 case 'voice': break; //接收到视频消息 case 'video': break; //接收到短视频消息 case 'shortvideo': break; //接收到位置消息 case 'location': break; //接收到链接消息 case 'link': break; } } } get_info(); ?>4.根据用户发送的消息进行回复官方文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html定义一个全局发消息模板index.php // 全局变量定义消息发送模板 $send_info_array = array( // %s 代表变量,之后可以使用spritf传值 // 文本消息的发送模板 "text" => "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>" );定义一个发送文本消息的函数,形参$xml接受$xml内容index.php // 定义用户关注公众号函数 function user_subscribe($xml){ // 引用全局变量模板 global $send_info_array; $cont = "此乃缘,妙,不可言"; $res = sprintf($send_info_array['text'],$xml->FromUserName,$xml->ToUserName,time(),$cont); die($res); } // 定义用户取消关注公众号函数 function user_unsubscribe($xml){ // 引用全局变量模板 global $send_info_array; $cont = "天下分久必合,合久必分,无不散之筵席,有缘再相见"; $res = sprintf($send_info_array['text'],$xml->FromUserName,$xml->ToUserName,time(),$cont); die($res); } // 定义一个发送文本消息的函数,形参$xml接受$xml内容 function send_text_info($xml){ // 引用全局变量模板 global $send_info_array; $cont = $xml->Content; $res = sprintf($send_info_array['text'],$xml->FromUserName,$xml->ToUserName,time(),$cont); die($res); }在事件处添加函数index.php // 接收到事件消息 case 'event': // 公众号订阅事件 if ($xml->Event=='subscribe'){ user_subscribe($xml); } // 公众号取消订阅事件 if ($xml->Event=='unsubscribe'){ user_unsubscribe($xml); } break; // 接收到文本消息 case 'text': // 判断为文本消息后,跳转函数 send_text_info($xml); break;完整代码index.php<?php // 执行php文件得到可用access_token include "get_access_token.php"; // 微信公众平台基本信息 $token = 'xxxx'; $AppID = 'wx64xxxxxxxxxf014'; $AppSecret = 'd9bxxxxxxxxxxxxxxxxxxxc2'; // 验证消息是否来自微信服务器 // 计算signature微信加密签名,并且与微信请求字段的signature进行值对比,从而证明消息来自微信服务器 if(!empty($_GET['echostr'])){ // 微信通信请求字段 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $echostr = $_GET['echostr']; // 将token,timestamp,nonce三个字段合为一个数组,并且按照字典排序 $arr = array($token, $timestamp, $nonce); sort($arr,SORT_STRING); // 将数组内容拼接为一个字符串 $str = implode($arr); // 将拼接后的字符串内容进行sha1加密 $sign = sha1($str); // 与微信服务器请求的signature字段内容进行对比,则证明是来自微信服务器的消息 if($sign == $signature){ //将echoStr字段的值返回给微信 echo $echostr; }else{ // 内容不一样则退出 return false; } } // 全局变量定义消息发送模板 $send_info_array = array( // %s 代表变量,之后可以使用spritf传值 // 文本消息的发送模板 "text" => "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>" ); // 定义用户关注公众号函数 function user_subscribe($xml){ // 引用全局变量模板 global $send_info_array; $cont = "此乃缘,妙,不可言"; $res = sprintf($send_info_array['text'],$xml->FromUserName,$xml->ToUserName,time(),$cont); die($res); } // 定义用户取消关注公众号函数 function user_unsubscribe($xml){ // 引用全局变量模板 global $send_info_array; $cont = "天下分久必合,合久必分,无不散之筵席,有缘再相见"; $res = sprintf($send_info_array['text'],$xml->FromUserName,$xml->ToUserName,time(),$cont); die($res); } // 定义一个发送文本消息的函数,形参$xml接受$xml内容 function send_text_info($xml){ // 引用全局变量模板 global $send_info_array; $cont = $xml->Content; $res = sprintf($send_info_array['text'],$xml->FromUserName,$xml->ToUserName,time(),$cont); die($res); } // 接收用户对公众号发送的信息 function get_info(){ // 接收xml数据 $GLOBALS['HTTP_RAW_POST_DATA'],如果用不了就使用file_get_contents('php://input') // 或者找到php.ini配置文件,修改配置为always_populate_raw_post_data = On // $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $xml = file_get_contents('php://input'); // 如果$xml有数据才执行 if(!empty($xml)){ // 防止xml注入,禁止xml实体解析 libxml_disable_entity_loader(true); // 使用simpleXML解析该xml字符串 $xml = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); // 通过元素MsgType来判断该微信服务器转发的消息类型 switch ($xml->MsgType){ // 接收到事件消息 case 'event': // 公众号订阅事件 if ($xml->Event=='subscribe'){ user_subscribe($xml); } // 公众号取消订阅事件 if ($xml->Event=='unsubscribe'){ user_unsubscribe($xml); } break; // 接收到文本消息 case 'text': // 判断为文本消息后,跳转函数 send_text_info($xml); break; // 接收到图片消息 case 'image': break; //接收到语音消息 case 'voice': break; //接收到视频消息 case 'video': break; //接收到短视频消息 case 'shortvideo': break; //接收到位置消息 case 'location': break; //接收到链接消息 case 'link': break; } } } get_info(); ?>在公众号回复内容进行验证,如需其他功能自行看官方文档扩展5.回复带有超链接的文本使用HTML5代码格式"
2023年02月09日
140 阅读
0 评论
0 点赞
2022-05-10
PHP生成随机验证码
PHP生成随机验证码源代码:<?php // $img_w 图片宽 // $img_h 图片高 // $char_len 验证码字符数 // $font 字体大小(内置字体1-5) // $px 随机干扰像素点 // $line 随机线条数 function getCode($img_w=100,$img_h=40,$char_len=5,$font=5,$px=80,$line=10){ //生成码值数组,不需要0,避免与字母o冲突 $char = array_merge(range("A","Z"),range("a","z"),range("1","9")); //随机获取$char_len个码值的键 $rand_keys = array_rand($char,$char_len); //判断当码值长度为1时,将其放入数组中 if($char_len == 1){ $rand_keys = array($rand_keys); } //打乱随机获取的码值键的数组 shuffle($rand_keys); //根据键获取对应的码值,并拼接成字符串 $code=''; foreach($rand_keys as $i){ $code = $code . $char[$i]; } //----1 生成画布 $img = imageCreateTrueColor($img_w,$img_h); //设置背景 $bg_color = imageColorAllocate($img,0xcc,0xcc,0xcc); imageFill($img,0,0,$bg_color); //干扰像素 for($i=0;$i<=$px;$i++){ $color = imageColorAllocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); imageSetPixel($img,mt_rand(0,$img_w),mt_rand(0,$img_h),$color); } for($i=0;$i<=$line;$i++){ $color = imageColorAllocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); imageline($img,mt_rand(0,$img_w),mt_rand(0,$img_h),mt_rand(0,$img_w),mt_rand(0,$img_h),$color); } //矩形边框 $rect_color = imageColorAllocate($img,0x90,0x90,0x90); imageRectangle($img,0,0,$img_w-1,$img_h-1,$rect_color); //----2 操作画布 //设定字符串颜色 $str_color = imageColorAllocate($img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100)); //设定字符串位置 $font_w = imageFontWidth($font); $font_h = imageFontHeight($font); $str_w = $font_w * $char_len; imageString($img,$font,($img_w-$str_w)/2,($img_h-$font_h)/2,$code,$str_color); $resulf = array( "code" => $code, "img" => $img ); return $resulf; } // $res['code'] 验证码 // $res['img'] 图片 $res = getCode(); session_start(); $_SESSION['captcha_code'] = $res['code']; header("Content-Type: image/png"); imagepng($res['img']); imagedestroy($res['img']); ?>
2022年05月10日
193 阅读
0 评论
0 点赞
2022-04-14
PHP使用正则表达式替换换行符问题
PHP使用正则表达式替换换行符问题原语句:$str_info = preg_replace("/[\n]{2,}/","\n",$str_info);代码执行后发现无法转化解决办法:\n换为\s$str_info = preg_replace("/[\s]{2,}/","\n",$str_info);
2022年04月14日
195 阅读
0 评论
1 点赞
2022-04-14
PHP读写文件失败
PHP读写文件失败<?php $fp = fopen("cnbruce.txt","w+"); fwrite($fp,"1111"); ?>问题分析进入所在目录[root@website wwwroot]# ll总用量 36-rwx------. 1 www www 168 4月 14 00:57 access_token.daodrwx------. 2 www www 57 4月 13 14:22 china_weather-rwx------. 1 www www 1599 4月 11 20:55 get_access_token.php-rwx------. 1 www www 25202 4月 13 21:16 index.phpdrwxr-xr-x. 2 root root 23 4月 14 19:43 jijin发现文件权限属组是root,因为是在root下创建的目录问题解决更改属组问题chown www:www jijin打开php网页验证
2022年04月14日
199 阅读
0 评论
0 点赞
2022-03-17
PHP随机生成双色球
PHP随机生成双色球输出效果 双色球抽取 .red_ball{ position: relative; float: left; width: 50px; height: 50px; border-radius: 50%; background-color: red; text-align: center; line-height: 50px; margin: 5px; font-size: 25px; color: white; } .blue_ball{ position: relative; float: left; width: 50px; height: 50px; border-radius: 50%; background-color: blue; text-align: center; line-height: 50px; margin: 5px; font-size: 25px; color: white; } 15132807310307 源代码函数解释range()生成数组array_rand()随机取数组中的几个下标或键名shuffle()打乱数组顺序rand(min,max)生成指定范围随机数<!DOCTYPE html> <html> <meta charset="utf8"/> <head> <title>双色球抽取</title> <style> .red_ball{ position: relative; float: left; width: 50px; height: 50px; border-radius: 50%; background-color: red; text-align: center; line-height: 50px; margin: 5px; font-size: 25px; color: white; } .blue_ball{ position: relative; float: left; width: 50px; height: 50px; border-radius: 50%; background-color: blue; text-align: center; line-height: 50px; margin: 5px; font-size: 25px; color: white; } </style> </head> <body> <?php //创建红球的数组范围 $red_num = range(1,33); //随机在红球范围内取出6个数 //array_rand()取的是数组的下标或者键名 $red = array_rand($red_num,6); //打乱数组顺序 shuffle($red); //输出红球 foreach($red as $i){ $ls = $red_num[$i]; if($ls<10)$ls = '0' . $ls; echo "<div class='red_ball'>$ls</div>"; } //从1-16中随机取出一个数字 $blue = rand(1,16); if($blue<10)$blue = '0' . $blue; echo "<div class='blue_ball'>$blue</div>"; ?> </body> </html>
2022年03月17日
212 阅读
0 评论
0 点赞
1
2
3
4