## 1、先建造一个公共方法、也可以用sdk中的代码
```php
namespace app\api\controller;
class common
{
private $key = '';
/**********下方代码可以放到公共函数中**********/
/*
*
* 产生随机字符串,不长于32位
* @param int $length
* @return 产生的随机字符串
*/
public function getNonceStr($length = 32)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
/*
* 生成签名
* @return 签名
*/
public function makeSign($data)
{
//获取微信支付秘钥
$key = $this->key ;
// 去空
$data = array_filter($data);
//签名步骤一:按字典序排序参数
ksort($data);
$string_a = http_build_query($data);
$string_a = urldecode($string_a);
//签名步骤二:在string后加入KEY
//$config=$this->config;
$string_sign_temp = $string_a . "&key=" . $key;
//签名步骤三:MD5加密
$sign = md5($string_sign_temp);
// 签名步骤四:所有字符转为大写
$result = strtoupper($sign);
return $result;
}
//将一个数组转换为 XML 结构的字符串
public function array2xml($arr, $level = 1)
{
$s = $level == 1 ? "<xml>" : "";
foreach ($arr as $tagname => $value) {
if (is_numeric($tagname)) {
$tagname = $value['TagName'];
unset($value["TagName"]);
}
if (!is_array($value)) {
$s .= "<{$tagname}>" . (!is_numeric($value) ? '<![CDATA[' : "") . $value . (!is_numeric($value) ? ']]>' : "") . "</{$tagname}>";
} else {
$s .= "<{$tagname}>" . $this->array2xml($value, $level + 1) . "</{$tagname}>";
}
}
$s = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $s);
return $level == 1 ? $s . "</xml>" : $s;
}
/*
* 将xml转为array
* @param string $xml xml字符串
* @return array 转换得到的数组
*/
public function xml2array($xml)
{
libxml_disable_entity_loader(true);
$result = json_decode(json_encode(simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA)), true);
return $result;
}
}
```
## 2、建立控制器进行退款
退款的curl需要证书、所以这里我们单独写在了控制器中
```php
namespace app\api\controller;
class Wxrefund
{
private $appid = '';
private $mch_id = '';
private $apiclient_cert = './wx/apiclient_cert.pem';
private $apiclient_key = './wx/apiclient_key.pem';
/*
refund(支付订单号,支付总金额,退款金额)
*/
public function refund($order_sn,$total_fee,$refund_fee)
{
$data = request()->param();
if ($refund_fee){
$out_trade_no = $order_sn;//商户支付单号 自定义而已
$out_refund_no = 'refund'.time();//商户退款单号 自定义而已
$common=new common;//调用公共方法
//统一下单退款参数构造
$unifiedorder = array(
'appid' => $this->appid,//appid
'mch_id' => $this->mch_id,//商户id
'nonce_str' => $common->getNonceStr(),//公共方法的随机字符串
'out_trade_no' => $out_trade_no, //商户订单号
'out_refund_no' => $out_refund_no, //商户退款单号
'total_fee' => $total_fee, //订单金额 需要整数 依分为单位 所以一般*100
'refund_fee' => intval(floatval($refund_fee)), //退款金额 需要整数 依分为单位 所以一般*100
);
//生成签名并加入数组
$unifiedorder['sign'] = $common->makeSign($unifiedorder);
//根据数组转成xml生成请求数据
$xmldata = $common->array2xml($unifiedorder);
$opUrl = "https://api.mch.weixin.qq.com/secapi/pay/refund";
//吊起请求
$res = $this->curl_post_ssl_refund($opUrl, $xmldata);
if (!$res) {
return json_encode(array('status' => $status, 'result' => 'fail', 'errmsg' => "Can't connect the server"));
}
$content = $common->xml2array($res);
if (strval($content['result_code']) == "FAIL" ) {
return json_encode(array("status" => $status, "result" => 'fail', "errmsg" => strval($content["err_code_des"]))) ;
}
if (strval($content['return_code']) == "FAIL") {
return json_encode(array("status" => $status, "result" => "fail", "errmsg" => strval($content['return_msg']))) ;
}
return "退款成功!";
}else{
return "不符合退款订单!";
}
}
//curl
public function curl_post_ssl_refund($url, $vars, $second=30,$aHeader=array())
{
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, "10.206.30.98");
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//TODO 以下两种方式需选择一种
/*------- --第一种方法,cert 与 key 分别属于两个.pem文件--------------------------------*/
//默认格式为PEM,可以注释
//curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $this->apiclient_cert); curl_setopt($ch,CURLOPT_SSLKEY, $this->apiclient_key);
//默认格式为PEM,可以注释
//curl_setopt($ch,CURLOPT_SSLKEYTYPE,"PEM");
//默认格式为PEM,可以注释
//curl_setopt($ch,CURLOPT_SSLKEYTYPE,"PEM");
/**
* 补充 当找不到ca根证书的时候还需要rootca.pem文件
* TODO 注意,微信给出的压缩包中,有提示信息:
* 由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书,
* 2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载
*/
/*----------第二种方式,两个文件合成一个.pem文件----------------------------------------*/
//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
$data = curl_exec($ch);
if($data){
curl_close($ch);
return $data;
}
else {
$error = curl_errno($ch);
//echo "call faild, errorCode:$error\n";
curl_close($ch);
return false;
}
}
}
```
## 3、提现·
[https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1)
```php
<?php
namespace real;
use real\WechatPay\WechatPayCommon;
//real\Wxrefund
/*
支付退款类
*/
class WechatWithdrawal{
private $appid = '';
private $mch_id = '';
private $key = '';
private $apiclient_cert = './wx/apiclient_cert.pem';
private $apiclient_key = './wx/apiclient_key.pem';
public function WechatWithdrawal($openId,$money) {
$pub = ['app_id'=>$this->appid,'mch_id'=>$this->mch_id,'key'=>$this->key];//config('keys.payConfig');
$appid = $pub['app_id'];//商户账号appid
$mch_id = $pub['mch_id'];//商户号
$key = $pub['key'];
$openid = $openId;//授权用户openid
$common=new \WechatPayCommon;//调用公共方法
$arr = array();
$arr['partner_trade_no'] = '123456789' . date("Ymd") . rand(10000, 90000) . rand(10000, 90000);//商户订单号
$arr['openid'] = $openid;
$arr['amount'] = $money * 100;//付款金额,单位为分
$arr['mch_appid'] = $appid;
$arr['mchid'] = $mch_id;
$arr['nonce_str'] = $common->getNonceStr();//公共方法的随机字符串
$arr['desc'] = "零钱提现";//描述信息
$arr['check_name'] = 'NO_CHECK';//是否验证用户真实姓名,这里不验证
// $arr['spbill_create_ip'] = 'xx.xx.xx.xx';//获取服务器的ip
//封装的关于签名的算法
$arr['sign'] = $common->makeSign($arr,$key);//签名
$var = $common->array2xml($arr);
// dump($arr['sign'] );exit;
$xml = $this->curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers',$var,30, array(), 1);
libxml_disable_entity_loader(true);
//echo $xml; die;
$obj1=simplexml_load_string($xml,'SimpleXMLElement');
//var_dump($obj1); die;
$rdata = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
// var_dump('cash_xmldata',$rdata);//eblog('cash_xmldata',$rdata);
// dump($rdata);exit;
$return_code = trim(strtoupper($rdata['return_code']));
$result_code = trim(strtoupper($rdata['result_code']));
if ($return_code == 'SUCCESS' && $result_code == 'SUCCESS') {
$isrr = array(
'status'=>1,
'msg' => '',
);
} else {
// $returnmsg = $rdata['return_msg'];
$err_code_des = $rdata['err_code_des'];
$isrr = array(
'status' => 0,
'msg' => $err_code_des,
);
}
return $isrr;
}
protected function curl_post_ssl($url, $vars, $second = 30, $aHeader = array())
{
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 终止从服务端进行验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//证书类型
// curl_setopt($ch, CURLOPT_SSLCERT, $isdir . 'apiclient_cert.pem');//证书位置
// curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
// curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
curl_setopt($ch,CURLOPT_SSLCERT, $this->apiclient_cert);
curl_setopt($ch,CURLOPT_SSLKEY, $this->apiclient_key);
// curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
// curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
if (count($aHeader) >= 1) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
}
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);//全部数据使用HTTP协议中的"POST"操作来发送
$data = curl_exec($ch);//执行回话
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
echo "call faild, errorCode:$error\n";
curl_close($ch);
return false;
}
}
}
```
## 原提现以舍弃
```php
class Cash{
public function wxcash($openId,$money) {
$pub = ['app_id'=>'######','mch_id'=>'######','key'=>'######'];//config('keys.payConfig');
$appid = $pub['app_id'];//商户账号appid
$mch_id = $pub['mch_id'];//商户号
$key = $pub['key'];
$openid = $openId;//授权用户openid
$arr = array();
$arr['mch_appid'] = $appid;
$arr['mchid'] = $mch_id;
$arr['nonce_str'] = md5(uniqid(microtime(true),true));//随机字符串,不长于32位
$arr['partner_trade_no'] = '123456789' . date("Ymd") . rand(10000, 90000) . rand(10000, 90000);//商户订单号
$arr['openid'] = $openid;
$arr['check_name'] = 'NO_CHECK';//是否验证用户真实姓名,这里不验证
$arr['amount'] = $money * 100;//付款金额,单位为分
$arr['desc'] = "零钱提现";//描述信息
$arr['spbill_create_ip'] = 'xx.xx.xx.xx';//获取服务器的ip
//封装的关于签名的算法
$arr['sign'] = $this->makeSign($arr,$key);//签名
$var = $this->arrayToXml($arr);
// dump($arr['sign'] );exit;
$xml = $this->curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers',$var,30, array(), 1);
libxml_disable_entity_loader(true);
//echo $xml; die;
$obj1=simplexml_load_string($xml,'SimpleXMLElement');
//var_dump($obj1); die;
$rdata = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
var_dump('cash_xmldata',$rdata);//eblog('cash_xmldata',$rdata);
// dump($rdata);exit;
$return_code = trim(strtoupper($rdata['return_code']));
$result_code = trim(strtoupper($rdata['result_code']));
if ($return_code == 'SUCCESS' && $result_code == 'SUCCESS') {
$isrr = array(
'status'=>1,
'msg' => '',
);
} else {
// $returnmsg = $rdata['return_msg'];
$err_code_des = $rdata['err_code_des'];
$isrr = array(
'status' => 0,
'msg' => $err_code_des,
);
}
return $isrr;
}
protected function makesign($data,$key)
{
//获取微信支付秘钥
$data = array_filter($data);
//签名步骤一:按字典序排序参数
ksort($data);
$string_a = http_build_query($data);
$string_a = urldecode($string_a);
//签名步骤二:在string后加入KEY
//$config=$this->config;
$string_sign_temp = $string_a."&key=".$key;
//签名步骤三:MD5加密
$sign = md5($string_sign_temp);
// 签名步骤四:所有字符转为大写
$result = strtoupper($sign);
// $result = strtoupper(hash_hmac("sha256",$string_sign_temp,$key));
return $result;
}
protected function arraytoxml($data){
$str='<xml>';
foreach($data as $k=>$v) {
$str.='<'.$k.'>'.$v.'</'.$k.'>';
}
$str.='</xml>';
return $str;
}
protected function curl_post_ssl($url, $vars, $second = 30, $aHeader = array())
{
$isdir = "cert/";//APP_PATH."/common/library/php_sdk/lib/";//证书位置
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 终止从服务端进行验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//证书类型
curl_setopt($ch, CURLOPT_SSLCERT, $isdir . 'apiclient_cert.pem');//证书位置
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
if (count($aHeader) >= 1) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
}
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);//全部数据使用HTTP协议中的"POST"操作来发送
$data = curl_exec($ch);//执行回话
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
echo "call faild, errorCode:$error\n";
curl_close($ch);
return false;
}
}
}
$cash=new Cash();
$cash->wxcash({openid},0.01);
```
- 服务器购买到搭建宝塔
- 结构规范
- php基础
- php简介
- php是什么
- PHP 能做什么
- PHP 如何运行
- 如何了解弱语言
- 安装环境
- 安装LNMP
- 宝塔
- phpstudy
- PHP基本语法
- PHP 标记
- 从 HTML 中分离
- 指令分隔符
- 注释
- php 数据类型
- 类型检测
- 四种标量类型
- boolean(布尔型)
- Integer 整型
- Float 浮点型
- String 字符串类型
- 两种复合类型
- array(数组)
- object(对象)
- 两种特殊类型
- resource(资源)
- NULL(无类型)
- 类型转换
- 变量
- 变量定义和命名规范
- 传值和引用
- 预定义变量
- php预定义变量
- $_SERVER详解
- 变量范围
- 全局变量
- 静态变量
- 可变变量
- 常量
- 常量简介
- 常量定义
- 相比变量
- 魔术常量
- 运算符
- 运算符简介
- 算术运算符
- 赋值运算符
- 位运算符
- 比较运算符
- 错误控制运算符
- 执行运算符
- 递增(减)运算符
- 逻辑运算符
- 字符串运算符
- 数组运算符
- 新增操作符
- 控制结构
- 控制简介
- if 语句
- while 语句
- for 语句
- foreach 语句
- break 语句
- continue 语句
- switch 语句
- declare 语句
- return 语句
- include 语句
- PHP 函数
- 函数简介
- 用户自定义函数
- 函数的参数
- 返回值
- 可变函数
- 内部函数
- 匿名函数
- PHP 的类和对象
- PHP 的类和对象简介
- 基本概念
- 对象继承
- 属性
- 类常量
- 自动加载对象
- 构造和析构函数
- 访问控制
- 范围解析操作符(::)
- 静态static
- Static 关键字
- 抽象类
- 接口
- 匿名类
- 面向对象其他特性
- const关键字
- final关键字
- abstract用于定义抽象方法和抽象类。
- self、$this、parent::关键字
- 接口(interface)
- trait关键字
- instanceof关键字
- 魔术方法
- 构造函数和析构函数
- 私有属性的设置获取
- __toString()方法
- __clone()方法
- __call()方法
- 类的自动加载
- 会话控制
- cookie
- PHP 操作 cookie
- 项目实战
- SESSION
- Session 的初步介绍与实验准备
- PHP 操作 session
- 项目实战2
- http
- 特点
- 工作过程
- request
- response
- HTTP状态码
- URL
- GET和POST的区别
- HTTPS
- 常用函数
- 常用的字符串函数
- 常用的数组函数
- 常用文件函数
- 常用时间函数
- 常用日历函数
- 常用url函数
- 面试题常见
- 时间戳
- 技术类文档
- 技术开发文档
- 开发环境
- 开发规范
- 注释规范
- 开发目录结构
- 数据库字典
- 路由
- 定时任务
- 获取系统配置
- 系统常用函数
- 后台表单
- 消息队列
- 第三方类库标注
- 需求文档
- 数据库
- MYSQL
- 事务(重点)
- 索引
- 存储过程
- 触发器
- 视图
- 导入导出数据库
- 优化mysql数据库的方法
- MyISAM与InnoDB区别
- 外连接、内连接的区别
- 物理文件结构
- MongoDB
- Redis
- 运用场景和实例
- pgsql
- 服务器
- Nginx
- 正向代理和反向代理
- 负载均衡
- Linux常用命令
- 基本目录和命令
- php开发工具
- phpStorm编辑器
- 安装和汉化
- 链接ftp
- 常用操作
- 常用快捷键
- 自定义快捷键
- 使用快捷键新建目录和文件
- 使用快捷键快速查找文件、类、方法
- 多文件切换
- 快速搜索设置项
- 多点编辑
- 方法重构
- 自定义文件模板和代码片段
- 自定义文件模板
- 自定义代码片段
- Xdebug 调试插件
- 安装Xdebug 调试插件
- 在PHPStorm 中使用 Xdebug 插件调试代码
- Vi Box虚拟机
- Vi Box 虚拟机 Oracle VM VirtualBox
- 虚拟机辅助工具一-Vagrant
- 华硕主板BIOS设置中VT虚拟化技术选项怎么开启 Oracle VM VirtualBox
- 沟通工具
- 文档分享
- 流程图
- 任务分配
- 代码托管
- 缺陷管理
- 设计图
- gitLab
- 安装
- 汉化
- Gitlab 用户和项目管理
- Gitlab 持续集成与自动构建实践
- PHP进阶
- 大流量解决方案
- PSR规范
- RESTFUL规范
- 设计模式
- 单例模式
- 策略模式
- 工厂模式
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 外观模式
- 享元模式
- 代理模式
- 命令模式
- 中介者模式
- 观察者模式
- 状态模式
- 建筑者模式
- 适配器模式
- 桥接模式
- 装饰器模式
- 排序算法
- 冒泡排序算法
- 二分查找算法
- 直接插入排序算法
- 希尔排序算法
- 选择排序算法
- 快速排序算法
- 常见网络攻击类型
- CSRF攻击
- XSS攻击
- SQL注入
- Cookie攻击
- thinkphp
- thinkphp5命令行
- git
- Git 常用命令操作和基础学习
- 傻瓜与白痴的笔记本
- 学习
- 一、Git 与 GitHub 的来历
- 二、在 GitHub 上创建仓库
- 三、安装
- Windows 上安装 Git
- 安装2
- 四、克隆 GitHub 上的仓库到本地
- 五、GIT基本操作哦
- 六、Git 分支操作
- 一、添加SSH关联授权
- 二、为 Git 命令设置别名
- 三、Git 分支管理
- 七、多人协作 GitHub 部分
- 八、多人协作 Git 部分
- 九、Git tag 和 GitHub releases
- composer
- Composer 基础使用
- 安装和使用
- 在项目中集成PHPmailer
- 认识composer.json和composer.lock文件
- composer的其他命令操作
- 本地创建composer包
- 提交自己的依赖包到composer Packagist
- crontab计划任务
- Linux任务计划crontab
- php 的 计划任务——Crontab
- bootstrap前端框架
- 入门
- 实战技巧
- 后台模板样式——admin
- 第三方接口对接
- 微信
- 敏感词过滤
- 微信图片检测
- 短信类型
- 阿里云短信
- 容联云短信
- 飞鸽短信
- 媒体
- 新闻接口测试
- 免费新闻
- 免费视频
- nba赛事,未测试
- 豆瓣电影接口
- 音乐接口
- 网易短视频接口
- 知乎微信接口
- 百度ai
- 百度语音
- 图片识别
- 腾讯
- 腾讯im
- 腾讯云直播
- 腾讯滑动验证
- 物流快递
- 快递鸟、快递100
- 推送
- 极光推送
- 地图&天气
- 获取城市和天气预报
- 地址获取和定位
- 地址转换经纬度
- 图片类型
- 360新闻图片
- 多平台翻译
- 实名认证
- 七牛云
- 云合同
- 多站点收录查询接口
- 打印机
- 第三方登录
- 微信登录
- 支付
- 支付宝app支付
- 微信提现+退款
- 微信app支付
- 微信支付公式
- 类库
- 图片类
- phpqrcode实战:生成二维码
- 图片处理类
- 验证码类
- 消息类
- PHPMailer
- 分词类
- ik
- PHPAnalysis
- 自己封装的方法
- GD库
- 自动获取图片主题颜色
- 图片转素描
- 生成海报
- 图片转字符
- 验证码
- 图片转黑白灰
- GD库实现图片水印与缩略图
- Imagick扩展
- 将一张image图片转化为字符串的形式
- 基本方法
- 图片路径转base64
- 生成文件后缀图片
- url路径判断拼接
- 防篡改入口文件
- php中文姓名判断
- 可控抽奖
- 特殊截取
- 银行卡位(特殊卡号不支持)
- 微信红包计算
- 数组和对象互转
- php批量更新修改数据库
- base64_img上传
- 删库删目录————跑路
- 字符串特殊符号过滤
- 首字母转成默认头像
- 生成随机字符串
- 根据id转 邀请码
- 日志写入
- 字符串截取,超出显示省略号
- 清除html标签+清除html标签,字符串截取
- 计算时间差的函数和演示
- php判断路径是否是绝对路径,如果不是拼接至绝对路径
- sql 参数过滤
- php敏感词过滤
- 省市区分别截取
- 生成csv
- 无限极分类
- api接口返回封装的方法函数
- xml和数组互转
- 获取thinkph5下控制器和方法名
- 过滤
- 获取服务器信息
- php随机颜色
- 创建多级目录
- 推广码
- 跨域检测
- 二维码
- 文档类
- word
- PHPWord
- tcPdf
- MPDF
- dompdf
- FPDF、Fpdi类库
- excel
- PhpSpreadsheet导入
- phpExcel
- 时间
- PHP-农历+节气+节日等类库
- 时间类库
- 最好用的是人性化时间差
- 文件管理类
- 文件操作类
- 文件夹操作
- php操作ftp的类库
- curl
- 数据库操作类
- Db扩展函数
- 数据库备份
- 仿tp5的Db库
- 不常用mysql
- 自动生成数据库字典
- 字符串
- 字符串操作helper/Str
- 随机生成姓名
- 随机生成类
- php字符串类
- 中文转拼音的类库
- 分类
- 缓存
- 数据验证
- 身份证相关操作
- 安全类
- 表单生成类
- 自动生成表单,未完待续中