PHP封装cURL方法,同时支持JWT认证、SSL证书认证

本文介绍了一种封装规范的cURL请求方法,该方法适用于多种场景,能有效提升研发效率,确保代码质量和便于后期维护。文章详细展示了如何使用PHP实现SSL认证的POST请求,并提供了两个实例:一是通过accessToken认证的网关接口请求;二是带有SSL证书认证的网关接口请求。

工欲善其事,必先利其器

 

封装一个规范、多用、满足各种场景的cURL请求方法,不仅可以提高研发效率,而且保障项目代码质量、便于维护。

<?php

/**
 * cURL请求方法
 *
 * @param string $url 目标地址
 * @param string $sData post数据
 * @param string $second 最大请求时间
 * @param string $aHeader Header头
 * @param string $aCertfile cert file path
 * @return array 返回网页内容
 */
function curl_post_ssl($url, $sData, $second = 30, $aHeader = [], $aCertfile = [])
{
    $ch = curl_init();
    
    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);
    
    if( isset($aCertfile['cert']) ){                
        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
        curl_setopt($ch, CURLOPT_SSLCERT, $aCertfile['cert']);
    }
    
    if( isset($aCertfile['key']) ){                
        curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
        curl_setopt($ch, CURLOPT_SSLKEY, $aCertfile['key']);
    }
 
    if( count($aHeader) >= 1 ){
        curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
    }
    
    if( $sData ){
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $sData);
    }
 
    $data = curl_exec($ch);
    
    if ($data) {
        curl_close($ch);
        return $data;
    } else {
        $error = curl_errno($ch);
        curl_close($ch);
        return false;
    }
}


//POST 数据
$apiParams = [
    //...
];

//目标地址
$sGateway = "https://openapi.alipay.com/gateway.do";

//您获取的accessToken
$accessToken = "xxxx";

//Example 1:请求accessToken认证的网关接口
$sResponse = curl_post_ssl( $sGateway, http_build_query($apiParams), 30, ["Authorization: bearer {$accessToken}"] );
    
    
    
//目标地址
$sGateway = "https://api.mch.weixin.qq.com/secapi/pay/refund";

$certFile = [
    'cert' => "./wechat/apiclient_cert.pem",
    'key' => "./wechat/apiclient_key.pem"
];

//Example 2:请求带SSL证书认证的网关接口
$sResponse = curl_post_ssl($sGateway, $apiParams, 6, [], $certFile);

 

# 粘贴上面的内容 #!/bin/bash # ===================================================== # 🧪 全面检查脚本:https://yfw.szrengjing.com/ # 功能:检查网站、Nginx、PHP、MySQL、WebSocket、插件等 # 用法:chmod +x check-yfw.sh && ./check-yfw.sh # ===================================================== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color log() { echo -e "${BLUE}[$(date +'%H:%M:%S')]${NC} $1" } success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" } separator() { echo "────────────────────────────────────────────" } # 开始检查 log "🚀 开始全面检查 yfw.szrengjing.com 业务系统" separator # 1. 检查域名解析和网络连通性 log "🔍 1. 正在检查域名解析与网络连通性" if ping -c 1 yfw.szrengjing.com &> /dev/null; then success "域名解析正常" else error "无法解析或网络不通" exit 1 fi # 2. 检查 HTTPS 响应 log "🌐 2. 正在检查 HTTPS 访问" HTTP_CODE=$(curl -k -o /dev/null -s -w "%{http_code}" https://yfw.szrengjing.com/) if [[ "$HTTP_CODE" == "200" || "$HTTP_CODE" == "301" || "$HTTP_CODE" == "302" ]]; then success "HTTPS 访问正常 (HTTP $HTTP_CODE)" else error "HTTPS 访问异常: HTTP $HTTP_CODE" fi # 3. 检查 SSL 证书有效期 log "🔐 3. 正在检查 SSL 证书有效期" CERT_DAYS=$(echo | openssl s_client -connect yfw.szrengjing.com:443 -servername yfw.szrengjing.com 2>/dev/null | openssl x509 -noout -days -in /dev/stdin) if [[ $? -eq 0 ]]; then if [[ $CERT_DAYS -lt 7 ]]; then warn "SSL 证书将在 $CERT_DAYS 天内过期!" else success "SSL 证书有效,剩余 $CERT_DAYS 天" fi else error "无法获取 SSL 证书信息" fi # 4. 检查 Nginx 配置语法 log "⚙️ 4. 正在检查 Nginx 配置语法" if nginx -t &> /dev/null; then success "Nginx 配置语法正确" else error "Nginx 配置有误!" nginx -t exit 1 fi # 5. 检查 Nginx 是否启用 /im-ws 反向代理 log "🔄 5. 检查 /im-ws 反向代理配置" if grep -r "location /im-ws" /www/server/panel/vhost/nginx/yfw.szrengjing.com.conf &> /dev/null; then if grep -r "proxy_pass.*127.0.0.1:8283" /www/server/panel/vhost/nginx/yfw.szrengjing.com.conf &> /dev/null; then success "/im-ws 反向代理配置正确" else error "/im-ws 缺少 proxy_pass 到 127.0.0.1:8283" fi else error "未找到 /im-ws location 配置" fi # 6. 检查本地 8283 端口(Workerman) log "🔌 6. 检查本地 WSS 服务端口 8283" if lsof -i :8283 &> /dev/null; then success "Workerman WebSocket 服务正在运行 (端口 8283)" else error "未检测到服务监听 8283 端口,请启动 php cli-server.php start -d" fi # 7. 检查 PHP-FPM 是否运行 log "🐘 7. 检查 PHP-FPM 运行状态" if pgrep php-fpm &> /dev/null; then success "PHP-FPM 正在运行" else error "PHP-FPM 未运行" fi # 8. 检查 WordPress 根目录是否存在 WP_DIR="/www/wwwroot/yfw_szrengjing_com" if [[ -d "$WP_DIR" ]]; then success "WordPress 目录存在: $WP_DIR" else error "WordPress 目录不存在: $WP_DIR" exit 1 fi # 9. 检查 wp-im-plugin 插件文件 PLUGIN_DIR="$WP_DIR/wp-content/plugins/wp-im-plugin" FILES=( "$PLUGIN_DIR/api.php" "$PLUGIN_DIR/cli-server.php" "$PLUGIN_DIR/.secret.key" "$PLUGIN_DIR/vendor/autoload.php" ) missing_files=() for file in "${FILES[@]}"; do if [[ ! -f "$file" ]]; then missing_files+=("$(basename $file)") fi done if [[ ${#missing_files[@]} -eq 0 ]]; then success "✅ 所有关键插件文件存在" else error "缺失文件: ${missing_files[*]}" fi # 10. 测试 api.php 获取 Token(模拟已登录用户) log "🔑 10. 测试 JWT Token 接口 (需已登录 Cookie 或使用 curl -b 模拟)" TOKEN_URL="https://yfw.szrengjing.com/wp-content/plugins/wp-im-plugin/api.php?action=get_token" TOKEN_RESPONSE=$(curl -k -s --cookie "wordpress_logged_in_$(md5sum <<< 'your_salt_here' | head -c 16)=abc123" "$TOKEN_URL") if echo "$TOKEN_RESPONSE" | grep -q '"success":true'; then success "JWT 接口返回成功: $(echo $TOKEN_RESPONSE | grep -o '"username":"[^"]*')" elif echo "$TOKEN_RESPONSE" | grep -q '"message.*未登录"'; then warn "JWT 接口提示未登录(可能是正常情况)" else error "JWT 接口异常响应: $TOKEN_RESPONSE" fi # 11. 检查数据库连接 log "🗄️ 11. 检查 WordPress 数据库连接" DB_CONFIG="$WP_DIR/wp-config.php" if [[ -f "$DB_CONFIG" ]] && grep -q "DB_NAME" "$DB_CONFIG"; then DB_NAME=$(grep "define('DB_NAME'" "$DB_CONFIG" | cut -d "'" -f 4) DB_USER=$(grep "define('DB_USER'" "$DB_CONFIG" | cut -d "'" -f 4) DB_PASS=$(grep "define('DB_PASSWORD'" "$DB_CONFIG" | cut -d "'" -f 4) DB_HOST=$(grep "define('DB_HOST'" "$DB_CONFIG" | cut -d "'" -f 4) if mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1 FROM $DB_NAME.wp_options LIMIT 1;" &> /dev/null; then success "✅ 数据库连接正常" else error "❌ 数据库连接失败,请检查账号密码" fi else error "❌ 无法读取 wp-config.php 或缺少数据库配置" fi # 最终总结 separator log "✅ 全面检查完成!请根据上述结果修复问题。" echo "" echo "📌 建议操作:" echo " - 若 8283 未监听 → 启动:cd $PLUGIN_DIR && php cli-server.php start -d" echo " - 若 Nginx 配置缺失 → 添加 /im-ws 反向代理" echo " - 若 .secret.key 丢失 → 重新生成:openssl rand -base64 32 > .secret.key" echo " - 定期运行此脚本做健康检查,可加入 crontab" exit 0
11-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值