记一次 php curl 访问 https站点遇到的问题

2023-05-16

问题描述

今天大壮的PHP项目上,在后端要去从微信那边取用户手机端上传的图片文件

微信提供的获取文件资源地址是:https://api.weixin.qq.com/cgi-bin/media/get?access_token=accessToken&media_id=media_id ,这是一个https的站点

(我记得以前的微信获取文件资源地址是http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=accessToken&media_id=media_id)

大壮只改了curl的地址,其他没变,原http请求的代码

$targetName = "D:/001.jpg";
$ch = curl_init("http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={$accessToken}&media_id={$media_id}");
$fp = fopen($targetName, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);

修改后https请求的代码

$targetName = "D:/001.jpg";
$ch = curl_init("https://api.weixin.qq.com/cgi-bin/media/get?access_token={$accessToken}&media_id={$media_id}");
$fp = fopen($targetName, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);

更新到生产环境使用,发现图片下载失败,生成的图片文件是 0 kb

问题解决

大壮找到我,让我帮他看下;

首先我看下代码与之前的一个项目比较下,因为之前的那个项目中有相同的需求功能,并且上线应用是没有问题的;

经过比较发现,代码没什么区别,有点懵,为什么这个项目不行,而之前的可以;

修改下代码,将错误信息打出:

$targetName = "D:/001.jpg";
$ch = curl_init("https://api.weixin.qq.com/cgi-bin/media/get?access_token={$accessToken}&media_id={$media_id}");
$fp = fopen($targetName, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);

if (curl_errno($ch))
{
    echo curl_error($ch);
}
curl_close($ch);

错误信息:

SSL certificate problem: unable to get local issuer certificate[]

从输出的错误信息知道了,访问被拒绝了,需要ssl证书;

百度一下吧,php curl https 请求 ,百度说添加两个curl配置项就可以了:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

试一下吧:

$targetName = "D:/001.jpg";
$ch = curl_init("https://api.weixin.qq.com/cgi-bin/media/get?access_token={$accessToken}&media_id={$media_id}");
$fp = fopen($targetName, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_exec($ch);

if (curl_errno($ch))
{
    echo curl_error($ch);
}
curl_close($ch);

可以了,查了下这两个配置项的意思,大概是关闭ssl证书安全验证;

虽然解决了,但是还是有个疑问,为什么之前的那个项目里没加这两个配置,也能正常下载图片呢?

第二天早上

昨天的那个疑问我还是无法释怀,决定再排查下

因为昨天的修改及测试都是在大壮的机器上,而之前的那个项目是在客户的服务器上;

早上,我在我机器上又重新测试一遍,我机器上也不需要加那两个配置项就可以下载了,思考下,应该是环境问题 ;

PHP版本吗?大壮机器上是7.3 ,我的是7.2 ,区别不大,可能性不大;

PHP配置?我看了下我的PHP配置文件,查找curl,看是否有默认的配置;

看到下面的配置代码,眼睛一亮,大概应该就是这个配置问题导致的了

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = "C:/Users/local/ssl/cacert.pem"

[openssl]
; The location of a Certificate Authority (CA) file on the local filesystem
; to use when verifying the identity of SSL/TLS peers. Most users should
; not specify a value for this directive as PHP will attempt to use the
; OS-managed cert stores in its absence. If specified, this value may still
; be overridden on a per-stream basis via the "cafile" SSL stream context
; option.
openssl.cafile = "C:/Users/local/ssl/cacert.pem"

确认一下,我先看下大壮的php配置文件里,是否有这段配置,发现 curl.cainfo 的配置没启用 , openssl.cafile 也没开启。所以应该就是这个配置的问题导致的区别了。

再确认一下,我将我的php配置里 curl.cainfo,openssl.cafile 注释掉,再重新测试https下载看看报不报错;

测试代码:

$fp = fopen("D:/001.png", 'wb');
$ch = curl_init("https://cdn.segmentfault.com/r-f1c63def/static/portal-bg.50701011.png");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_exec($ch);
if (curl_errno($ch))
{
    echo curl_error($ch);
}
curl_close($ch);

叮咚…报错了

SSL certificate problem: unable to get local issuer certificate[]

然后,将curl的那两个配置加上

$fp = fopen("D:/001.png", 'wb');
$ch = curl_init("https://cdn.segmentfault.com/r-f1c63def/static/portal-bg.50701011.png");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_exec($ch);
if (curl_errno($ch))
{
    echo curl_error($ch);
}
curl_close($ch);

下载成功,好了,问题终于弄清楚了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次 php curl 访问 https站点遇到的问题 的相关文章

  • 开源工具:实现用FFmpeg接收RTSP/RTMP/HLS流和录制文件

    上一篇文章介绍了QuickGBLink开发的一个RTSP客户端 开源C 43 43 RTSP客户端 xff0c 实现了通过TCP接收RTP流的功能 xff0c 但是在局域网监控中 xff0c 很多时候RTSP服务器和客户端都是用UDP模式来
  • 国标PS流打包和RTP发送代码

    这个国标PS流打包 封包的代码来自于互联网 xff0c QuickGBLink在原先代码基础上做了一些改进 因为代码来自于别人的成果 xff0c 基于互联网知识分享的精神 xff0c 我们打算将其开源 xff0c 希望能对更多学习和开发国标
  • 国标PS流解包(解封装)代码

    该代码最初的版本来自于互联网 xff0c 首先感谢前辈无私分享的精神 xff0c 这个PS流解析代码小巧和可读性好 xff0c 是学习PS格式的一个很好的参考例子 但原来的代码有不少Bug xff0c QuickGBLink在原先代码基础上
  • 错误./hello: error while loading shared libraries: libQtGui.so.4: cannot open shared object file:

    之前一直想在ARM 上跑qt xff0c 但都出现错误 xff1a hello error while loading shared libraries libQtGui so 4 cannot open shared object fil
  • linux eth0设置

    命令行设定IP地址 ifconfig eth0 192 168 1 12 将eth0IP设置为192 168 1 12 ifconfig eth0 up 使eth0使能 如果开发板与路由器连接 xff0c 并且路由器能够自动分配IP地址 x
  • printk打印不能显示到终端的解决方法

    printk与printf有个不同的地方 xff0c 就是printk有打印级别 使用printk时 xff0c Linux内核根据日志级别 xff0c 可能把消息打印到当前控制台上 xff0c 这个控制台是一个字符设备 这些消息从终端输出
  • qt socket通信中接收client发送是十六进制数据包

    在QT的服务端接收客户端发送的十六进制收据包 xff0c 经转换后显示在LineEdit上 xff0c 并把接收到的数据包转化为char 类型 xff0c 为后期数据处理做准备 recbuf在头文件类中一定义 xff1a QByteArra
  • 两个双口ram之间数据的传递

    1 如果两个双口ram数据位宽相同 xff0c 则采用时钟快的ram等待时钟慢的ram来完成从一个ram中读取数据并存储到另一个ram中 xff1b 例如从ram A中读取数据到ram xff22 中 xff0c xff52 xff41 x
  • + - 与>> <<运算优先级

    43 运算符的优先级高于 lt lt gt gt 位移运算符 span class hljs keyword int span mian span class hljs keyword int span a 61 span class hl
  • linux col 过滤控制字符

    参考http blog 51cto com jim123 1833502 使用过Unix系统的人肯定会知道man帮助的功能强大 xff0c 是官方的帮助文档 xff0c 我们平时可以通过它来查询不知道如何使用的命令或者查询linux的系统C
  • gcc 参数

    gcc gcc与 g 43 43 分别是GNU的C与 C 43 43 的编译器 xff0c 在编译工作中分4步 xff1a 1 预处理 xff0c 生成 i文件 2 编译器 xff0c 编译后停下来 xff0c 生成 o的目标文件 3 汇编
  • gdb 调试

    原文http linuxtools rst readthedocs io zh CN latest tool gdb html span class hljs variable span span class hljs number 1 s
  • Linux-C语言 网络TCP单次通信、多次通信、多线程通信逐步实现

    一 TCP通信 xff0c 只发送一次就结束程序 功能描述 xff1a 1 服务端一次只能连接一个客户端 2 客户端只能向服务端发送一次消息 xff0c 消息返回后客户端和服务器程序结束 3 客户端向服务端发送一个字符串 xff0c 服务端
  • 奇偶校验通俗易懂

    简介 xff1a 奇偶校验是奇校验和偶校验的统称 xff0c 就是在最低位或最高位添加一个校验位 xff0c 应用于主存储器信息的校验及字节传输的出错校验 原理 xff1a 奇校验 连同校验位使得所有位上的1相加为奇数 偶校验 xff1a
  • Ubuntu系统rosdep update报错的解决办法(2022.10.3亲测有效)

    目录 一 问题 xff1a Ubuntu22 04系统下面 xff0c rosdep update总是报错 二 方法一一道来 1 直接访问raw githubusercontent com是不行的 按照网上的解决办法先把ip地址找到 xff
  • Socket通信实验总结

    在实验设计的过程中遇到了不少困难 xff0c 先是服务器监听时怎么保持已有的socket 连接 xff0c 又能接受新的连接 在此用了 C 的 Dictionary lt string Socket gt socketDic 61 new
  • [Excel]Excel函数和用法(4)——查找字符串,SEARCH和FIND函数

    区别 xff1a SEARCH大小写不敏感 xff0c FIND大小写敏感 作用 xff1a 都是从左到右返回搜索到的字符串的起始位置 SEARCH语法 xff1a SEARCH find text within text start nu
  • Error: L6200E: Symbol B_DisCnctRelayTime multiply defined (by cdma_gps_hc.o and main.o).

    现象 xff1a 最近调试MDK的程序 xff0c 老是报这样的错误 L6200E Symbol B DisCnctRelayTime multiply defined by cdma gps o and main o 记录下来 xff1a
  • STM32 ADC用到的 抗脉冲滤波算法

    先介绍一下算法的基本思想 xff1a 在一组采样值中 xff0c 去掉 abandonMaxNum 个最大数据 xff0c 去掉 abandonMinNum 个最小数据 xff0c 余下的数据求平均值 函数功能 xff1a 抗脉冲滤波法 输
  • STM32使用内部振荡器及其和外部晶体振荡器的区别

    转自 xff1a http blog csdn net meic51 article details 8778518 在STM32上如果不使用外部晶振 xff0c OSC IN和OSC OUT的接法 如果使用内部RC振荡器而不使用外部晶振

随机推荐

  • Android的Audio系统

    转自 xff1a http blog csdn net gowyz article details 6019314 Android的Audio 系统 第一部分 Audio 系统综述 第二部分 Audio 系统和上层接口 第三部分 Audio
  • Android Audio代码分析 - Audio Strategy

    frameworks base services AudioFlinger cpp status t AudioFlinger PlaybackThread Track start status t status 61 NO ERROR L
  • mtk android 4.4 audio framework 代码分析(未完成)

    mtk android 4 4 audio framework 代码分析 未完成 xff0c 有需要的朋友可以参考下 mtk android 4 4 audio framework 代码分析 未完成 2 28 2015 3 01 24 PM
  • 关于codewarrior调试出现illegal BP的问题解决过程(转载)

    昨天两位工程师调试同时出现这个问题 xff0c 网上对于illegal BP的解决方法讲解的很模糊 xff0c 没有一个具体的指导方针 我试着阐述我们问题的解决过程 xff0c 希望对大家解决类似情况可以起到抛砖引玉的作用 两位工程师同时出
  • WGS84坐标系-地心地固坐标系-东北天坐标系

    目录 1 前言 2 转换过程 3 代码示例 4 参考资料 1 前言 工作中遇见个问题 xff0c 就是ue4中 xff0c 使用的坐标描述是使用东北天坐标系 xff0c 因为如果经纬度只能表达到小数点后6位 xff0c 这就造成有时间物体摆
  • jmp指令用法总结

    jmp指令用法总结 xff1a 1 直接用法 只能在Debug下使用的汇编指令 jmp 段地址 xff1a 偏移地址 功能 xff1a 修改CS IP的内容 例子 xff1a jmp 55BA 8 执行后 xff1a CS 61 55EAH
  • Robomaster云台,底盘,陀螺仪校准

    文章目录 前言一 云台校准二 底盘校准三 陀螺仪校准 前言 本文主要介绍了Robomaster云台 xff0c 底盘 xff0c 陀螺仪怎么校准 一 云台校准 1 将开关 S2 和开关 S1 都拨到最下面 2 将两侧拨杆打成内八字 xff0
  • 详解RTK、RTD、SBAS、WAAS、PPP、PPK广域差分等技术之间的关系与区别。

    RTK与RTD的区别 xff0c 一个是载波相位差分 一个是码差分 xff0c 并且RTK的定位精度要高一些 RTK与PPK的区别 xff0c 一个是实时提供数据信息 xff0c 一个是事后处理 WAAS是SBAS系统一个具体的实例 xff
  • 如何使用潘多拉连接千寻开发板开发高精度应用

    所需设备 xff1a 潘多拉开发板 xff08 淘宝链接 xff09 注意 xff1a 购买时请注意屏幕背面上方的版本号 xff0c 我购买的是V2 61版本 xff0c 其他版本的串口布局不一样 xff0c 在代码编写时需要注意 xff0
  • 树莓派3B+如何连接千寻开发板开发高精度应用

    所需设备 xff1a 树莓派3B 43 xff08 官网 xff09 千寻魔方120M开发板 xff1a xff08 官方链接 xff09 连接树莓派和千寻魔方开发板 xff0c 开发板接上天线 xff0c 并将串口线与树莓派进行连接 xf
  • 如何用手机实现高精度定位导航

    编者按 如果手机能够实现高精度定位 xff0c 导航再也不出错 位置共享更精确 xff0c 就连AR游戏都会变得更带感 xff01 在攻城狮们的不懈努力下 xff0c 这样的日子就快来了 3月2日 xff0c 武汉大学测绘学院博士陶贤露 x
  • 基于北斗高精度定位的运河航道安全导航解决方案

    编者按 你听说过 船联网 吗 xff1f 在我国 xff0c 以船舶为主体的内河航运 xff0c 每年完成运量大约40亿吨 xff0c 占全国货运总量的10 每天都有大量船舶 xff0c 在狭窄的内流河面上行驶 xff0c 因此用于实现航运
  • RTK与网络RTK技术的工作原理和区别对比

    一 RTK RTK是一种利用GPS载波相位观测值进行实时动态相对定位的技术 进行RTK测量时 xff0c 至少需配备2台GPS接收机 xff0c 一台安装在基准站上 xff0c 另一台在基准站附近进行实时相对定位 xff0c 进而根据基准站
  • 【GNSS高精度定位应用】

    GNSS定位技术具有全天候 高精度 覆盖全球 自动化程度高 实时服务能力强等优点 xff0c 已经广泛应用于交通 军事 农业等领域 xff0c 例如车辆自主导航 自然灾害监测 紧急事故安全救援 精确制导武器 精准农业 建筑物结构安全监测等
  • 高精度定位成就智能物联|高精度定位的“智能化”进化史

    智能化发展日益成熟 xff0c AI当道 xff0c 互联网基建2 0时代 AIoT时代来临 AIoT是AI IoT 空间三个要素的结合 AI是大脑 xff0c 是不断进阶的算法能力 xff0c IoT是躯壳和骨干 xff0c 是更多智能化
  • svn 分支(branch)和标签(tag)管理

    版本控制的一大功能是可以隔离变化在某个开发线上 xff0c 这个开发线就是分支 xff08 branch xff09 分支通常用于开发新功能 xff0c 而不会影响主干的开发 也就是说分支上的代码的编译错误 bug不会对主干 xff08 t
  • 【HTTP协议】---HTTP协议详解

    HTTP协议详解 一 HTTP简介 1 HTTP协议 xff0c 即超文本传输协议 Hypertext transfer protocol 是一种详细规定了浏览器和万维网 WWW 61 World Wide Web 服务器 之间互相通信的规
  • 智驾发展的前世今生|自动驾驶完好性解决方案,只在千寻FindAUTO

    7月6日消息称 xff0c 深圳经济特区智能网联汽车管理条例 将于8月1日起实施 这部国内首部关于智能网联汽车管理的法规 xff0c 对智能网联汽车自动驾驶的定义 市场准入规则 路权 权责认定等多方面进行了具体规定 该条例意味着深圳或成为国
  • 智驾发展的前世今生|为高阶自动驾驶而生的千寻FindAUTO NSSR解决方案

    众所周知 xff0c 定位技术作为智能驾驶的关键核心 xff0c 解决了 我在哪 的问题 xff0c 与感知 决策 执行一起 xff0c 构成了智能驾驶四大主体功能 在L3自动驾驶发展落地如火如荼之际 xff0c 对于定位服务的需求愈发细致
  • 记一次 php curl 访问 https站点遇到的问题

    问题描述 今天大壮的PHP项目上 xff0c 在后端要去从微信那边取用户手机端上传的图片文件 微信提供的获取文件资源地址是 xff1a https api weixin qq com cgi bin media get access tok