1、cURL库
cURL库是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,在微信开发中,我们使用它来发送HTTP请求。它给我们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。
要使用cURL库那么你的php版本里面必须包含该库的扩展(就如你使用gd库一样)
请求原理(权威PHP指南):
2、cURL四步走
第一步:创建curl,使用curl_init()函数
第二步:设置curl,使用curl_setopt()函数
第三步:执行curl,使用curl_exec()函数
第四步:关闭curl,使用curl_close()函数
-
cURL最重要的几个选项
#安全上传(主要是为了兼容php5.6在微信中的应用)
CURLOPT_SAFE_UPLOAD
#需要获取的 URL 地址
CURLOPT_URL
#SSL证书中是否存在一个公用名,证书和主机名(认证的域名)
CURLOPT_SSL_VERIFYHOST
#服务器端校检SSL证书
CURLOPT_SSL_VERIFYPEER
#是否以字符串形式进行返回
CURLOPT_RETURNTRANSFER
#是否使用post方式进行请求
CURLOPT_POST
#POST请求时需要post的数据包
CURLOPT_POSTFIELDS
-
使用cURL库请求百度的例子
在学习curl的时候,必须要确定环境当中就有curl库的php扩展
如果没有curl扩展就需要补充这个扩展的安装,执行以下命令
yum -y install --enablerepo=remi --enablerepo=remi-php56 php-curl
如果成功安装过curl,那么在phpinfo当中就会返回curl的扩展
第1个例子:使用curl请求百度,然后把百度返回(使用http方式进行请求)
参考代码:php/http_baidu.php,上传到/var/www/html下进行测试
执行结果如下:
由于curl它可以把页面返回,所以有些不法分子利用其做钓鱼网站.
第2个例子:使用curl请求百度,然后把百度返回(使用https方式进行请求)
首先我们把代码修改成以下形式:
参考代码:php/https_baidu.php,上传到/var/www/html下进行测试
执行测试的结果,返回如下:
如果你有提交过百度的安全认证那么才可以正常的访问,但是难道如果我们对网站发出https请求我们就需要每一个网站都提交一次安全认证吗?如果不想每一次通过https访问一个网站,你都提交一次安全认证那么我们就需要在curl端禁止百度访问ssl安全认证证书
由于https请求有一个安全套件存在,所以必须要使用ssl证书(安全认证)进行提交访问过程。
问题来了:
curl初始化的浏览器是一个存在与编译器当中的虚拟浏览器,那么何来ssl证书呢?
答:如果需要解决这个问题,我们就需要禁止请求的服务器对浏览器的ssl证书进行验证。
我们需要使用以下两个重要的参数进行设置:
#SSL证书中是否存在一个公用名,证书和主机名
CURLOPT_SSL_VERIFYHOST
#服务器端校检SSL证书
CURLOPT_SSL_VERIFYPEER
因此我们需要把curl的代码修改为如下结果:
再次测试就可以得到正常的结果:
-
Post请求snk147.duapp.com测试接口
接口地址:http://snk147.duapp.com/postApi.php
参数:data
不设置任何选项的情况下,直接就请求了地址,会返回以下结果:
由于curl在默认的情况下是get请求,而接口要求是post的请求,并且要附带post的相关请求参数data过去才能请求成功,因此我们需要把curl代码修改为post的,修改代码如下:
重新测试,效果如下:
这时就代表请求成功,虽然你Post了3个参数,然后api接口只关心data这个字段,因此其他它忽略了。至此其实curl库对于微信开发来说我们就完成了,然而有一个这样的问题产生,需要我们注意的,它也是你在面试微信开发职位的时候需要的一个经验值:
在微信开发诞生的时候,微信的开发者其实对微信的安全机制设置都不够,因此在上传的时候就会被黑客注入木马,后来微信发展成熟了,那么微信就开启了木马安全机制,因此curl上传的数据就会被严格的认证,除了ssl证书以为,还有微信内部的token认证,关键的还有微信要求你上传的时候要设置安全认证上传才能够调用微信的媒体上传接口,否则你就会失败,然而微信开发者的文档很坑爹,它是在以前会告诉你这小细节,但微信每天更新文档是看心情的,所以这个小细节它就已经去除了,那么只有你遇到媒体上传接口才能验证这一点,如果没有经验的人会很郁闷,因此我们就需要在学习之处就了解这点:
参考代码:php/wx.php
就算你开启了安全认证的上传机制对post请求是不会产生影响的,但对于微信来说就算完美对接形式: