PHP Curl 封装类 [ [ Curl.class ] ]

相机标定(六)—— 张正友标定法 相机标定一、相机标定的目的1. 相机的成像过程2. 相机标定的目的3. 畸变与畸变矫正二、张正友标定法简介三、标定相机内外参1. 求解内参和外参的积2. 求解内参矩阵3. 求解外参矩阵四、标定相机的畸变参数五、L-M算法参数优化六、相机标定的步骤七、源代码 一、相机标定的目的 1. 相机的成像过程 2. 相机标定的目的 3. 畸变与畸变矫正 二、张正友标定法简介 三、标定相机内外参 1. 求解内参和外参的积 2. 求解内参矩阵 3. 求解外参矩阵 四、标定相机的畸变参数 五、L-M算法参数优化 六、相机 阅读详情

CURL SSL 认证问题http://www.3mu.me/php%E7%9A%84curl%E9%80%89%E9%A1%B9curlopt_ssl_verifypeer%E8%AF%A6%E8%A7%A3/

https://www.liangzl.com/get-article-detail-14723.html

https://www.cnblogs.com/zwesy/p/9461833.html

https://max.book118.com/html/2017/1215/144290412.shtm

https://blog.csdn.net/wsmt1121/article/details/78022623

参考开源类:Snoopy.class.php (Snoopy-2.0.0 )

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Class Curl
 */
class Curl
{
	/**** Public variables ****/
	/* user definable vars */
	var $url = "https://localhost/api/machines/";
	var $user = ""; // user for http authentication
	var $pass = ""; // password for http authentication
	var $http_auth = CURLAUTH_ANY;
	var $ssl_verify_peer = FALSE;
	var $ssl_verify_host = FALSE;

	var $port = 80; // port we are connecting to
	var $referer = ""; // referer info to pass
	var $raw_headers = array(); // array of raw headers to send
	var $agent = "";
	// $raw_headers["Content-type"]="text/html";

	// http accept types
	var $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
	var $results = ""; // where the content is put
	var $headers = array(); // headers returned from server sent here
	var $timeout = 30; // timeout on read operations, in seconds
	// send Accept-encoding: gzip?
	var $use_gzip = true;

	/**** Private variables ****/
	private $ch = NULL;
	private $host = "";
	private $_httpmethod = "GET"; // default http request method
	private $_httpversion = "HTTP/1.0"; // default http request version
	private $_mime_boundary = ""; // MIME boundary for multipart/form-data submit type

	/**
	 * Curl constructor.
	 */
	public function __construct()
	{
		$this->ch = curl_init();
		if ($this->ch === FALSE)
			if (!extension_loaded('php_curl')) {
				trigger_error('Curl initialization error, make sure php_curl extension is turned on correctly.', E_USER_ERROR);
				exit;
			}
		$this->init();
	}

	/**
	 * Curl destructor.
	 */
	public function __destruct()
	{
		curl_close($this->ch);
	}

	/**
	 * Curl initialization.
	 */
	public function init()
	{
		if (!isset($this->raw_headers["Content-Type"]))
		{
			$this->raw_headers["Content-Type"]  = "Content-type: text/xml;charset=\"utf-8\"";
		}
		if (!isset($this->raw_headers["Cache-Control"]))
		{
			$this->raw_headers["Cache-Control"] = "No-Cache";
		}
		if (!isset($this->raw_headers["Cache-Control"]))
		{
			$this->raw_headers["Accept"] ="application/json";
		}
	}

	/**
	 * Set Post Request.
	 * @return $this
	 */
	public function post()
	{
		$this->_httpmethod = "POST";
		return $this;
	}

	/**
	 * launch a http request.
	 * @param $method api method
	 * @param array $params
	 * @param string $url
	 * @return $this
	 */
	public function request($method, $params = array(), $url = "")
	{
		$this->url = empty($url) ? $this->url : $url;
		$uri_parts = parse_url($this->url);
		if (!empty($uri_parts["user"]))
			$this->user = $uri_parts["user"];
		if (!empty($uri_parts["pass"]))
			$this->pass = $uri_parts["pass"];
		if (empty($uri_parts["query"]))
			$uri_parts["query"] = '';
		if (empty($uri_parts["path"]))
			$uri_parts["path"] = '';

		switch (strtolower($uri_parts["scheme"])) {
			case "https":
				curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, $this->ssl_verify_peer);
				curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, $this->ssl_verify_host);
				$this->port = 443;
			case "http":
				$this->host = $uri_parts["host"];
				if (!empty($uri_parts["port"]))
					$this->port = $uri_parts["port"];
				$this->_http_request($method, $params, $this->url, $this->_httpmethod);
				return $this;
				break;
			default:
				// not a valid protocol
				trigger_error('Invalid protocol "' . $uri_parts["scheme"] . '"\n', E_USER_ERROR);
				break;
		}
		return $this;
	} // end of func.

	/**
	 * launch a http request actually.
	 * @param $method
	 * @param array $params
	 * @param $url
	 * @param $http_method
	 * @param string $content_type
	 * @param string $body
	 * @return $this
	 */
	private function _http_request($method, $params = array(), $url, $http_method, $content_type = "", $body = "")
	{
		$this->_prepare_http_headers($url, $http_method);
		if (!empty($this->user) || !empty($this->pass))
		{
			curl_setopt($this->ch, CURLOPT_HTTPAUTH, $this->http_auth);
			curl_setopt($this->ch, CURLOPT_USERPWD, "{$this->user}:{$this->pass}");
		}
		// set the read timeout if needed
		if ($this->timeout > 0)
			curl_setopt($this->ch, CURLOPT_TIMEOUT, $this->timeout);

		if (!empty($this->user) || !empty($this->pass))
		{
			$auth = "{$this->user}:{$this->pass}";
			$start = strpos($url, $auth);
			if ($start !== FALSE) $url = substr_replace($url, "", $start, strlen($auth));
		}
		if (strtolower($http_method) == 'post')
		{
			curl_setopt($this->ch, CURLOPT_HEADER, FALSE);
			curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
			curl_setopt($this->ch, CURLOPT_POST, TRUE);
			$params = json_encode($params);
			curl_setopt($this->ch, CURLOPT_POSTFIELDS, $params);
		} elseif (strtolower($http_method) == 'get') {
			$params = http_build_query($params);
			curl_setopt($this->ch, CURLOPT_POSTFIELDS, $params);
		}
		$url_method = substr($url, -1) === '/' ? $url.$method : $url.'/'.$method;
		curl_setopt($this->ch, CURLOPT_URL, $url_method);
		curl_setopt($this->ch, CURLOPT_RETURNTRANSFER,TRUE);
		$response = curl_exec($this->ch);

		if($response === FALSE) {
			$this->results =  array(
				'error'   => TRUE,
				'error_code'    => curl_errno($this->ch),
				'error_message'  => curl_error($this->ch)
			);
		} elseif(empty($response)){
			$this->results  = array(
				'error' => TRUE,
				'error_code' => '9999',
				'error_message' => 'No Response.'
			);
		} else{
			$this->results = json_decode($response,'array');
		}
		return $this;
	}

	/**
	 * prepare http headers.
	 * @param $url
	 * @param $http_method
	 */
	private function _prepare_http_headers($url, $http_method)
	{
		if (empty($url))
		{
			$url = "/";
		}
		$headers = $http_method . " " . $url . " " . $this->_httpversion . "\r\n";
		if (!empty($this->host) && !isset($this->raw_headers['Host']))
		{
			$headers .= "Host: " . $this->host;
			if (!empty($this->port) && $this->port != '80')
			{
				$headers .= ":" . $this->port;
			}
			$headers .= "\r\n";
		}
		if (!empty($this->agent))
			$headers .= "User-Agent: " . $this->agent . "\r\n";
		if (!empty($this->accept))
			$headers .= "Accept: " . $this->accept . "\r\n";
		if ($this->use_gzip) {
			// make sure PHP was built with --with-zlib
			// and we can handle gzipp'ed data
			if (function_exists('gzinflate')) {
				$headers .= "Accept-encoding: gzip\r\n";
			} else {
				trigger_error(
					"use_gzip is on, but PHP was built without zlib support." .
					"  Requesting file(s) without gzip encoding.",
					E_USER_NOTICE);
			}
		}
		if (!empty($this->referer))
			$headers .= "Referer: " . $this->referer . "\r\n";
		if (!empty($this->raw_headers)) {
			if (!is_array($this->raw_headers))
				$this->raw_headers = (array)$this->raw_headers;
			while (list($headerKey, $headerVal) = each($this->raw_headers))
				$headers .= $headerKey . ": " . $headerVal . "\r\n";
		}
		if (!empty($content_type)) {
			$headers .= "Content-type: $content_type";
			if ($content_type == "multipart/form-data")
				$headers .= "; boundary=" . $this->_mime_boundary;
			$headers .= "\r\n";
		}
		if (!empty($body)) $headers .= "Content-length: " . strlen($body) . "\r\n";
		$headers .= "\r\n";
		curl_setopt($this->ch, CURLOPT_HTTPHEADER, array($headers));
	} // end of func.

	/**
	 * get results of response.
	 * @return string
	 */
	public function get_results()
	{
		return $this->results;
	} // end of func.
}
 CodeIgniter调试代码:
$this->load->library(array('curl'));
$this->curl->user = "ubix";
$this->curl->pass = "u6ix1234";
$res = $this->curl->post()->request('get_machines_info',array('model_numbers'=>array('2', '3')), "http://ims.qdcrx.com/api/machines/")->get_results();
 var_dump($res); exit();

拓展阅读推荐:

(1)https://github.com/php-curl-class/php-curl-class
(2)https://github.com/philsturgeon/codeigniter-curl

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Class Curl
 *
 * Author: Carter
 * Email: carterxin@techtrex.com
 * Date: 2020/10/9
 */
class Curl
{
  /**** Public variables ****/
  /* user definable vars */
  var $url = "";
  var $user = ""; // user for http authentication
  var $pass = ""; // password for http authentication
  var $http_auth = CURLAUTH_ANY;
  var $ssl_verify_peer = FALSE;
  var $ssl_verify_host = FALSE;

  var $port = 80; // port we are connecting to
  var $referer = ""; // referer info to pass
  var $raw_headers = array(); // array of raw headers to send
  var $agent = "";
  // $raw_headers["Content-type"]="text/html";

  // http accept types
  var $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
  var $results = ""; // where the content is put
  var $headers = array(); // headers returned from server sent here
  var $timeout = 30; // timeout on read operations, in seconds
  // send Accept-encoding: gzip?
  var $use_gzip = true;

  /**** Private variables ****/
  private $ch = NULL;
  private $host = "";
  private $_http_method = "GET"; // default http request method
  private $_http_version = "HTTP/1.0"; // default http request version
  private $_mime_boundary = ""; // MIME boundary for multipart/form-data submit type

  /**
   * Curl constructor.
   */
  public function __construct($params)
  {
    $this->ch = curl_init();
    if ($this->ch === FALSE){
      if (!extension_loaded('php_curl')) {
        trigger_error('Curl initialization error, make sure php_curl extension is turned on correctly.', E_USER_ERROR);
        exit;
      }
    }
    $this->init();
    $this->url = $params['base_url'] ?? rtrim($this->config->item('base_url'), '/') . '/api/';
  }

  /**
   * Curl destructor.
   */
  public function __destruct()
  {
    curl_close($this->ch);
  }

  /**
   * Curl initialization.
   */
  public function init()
  {
    if (!isset($this->raw_headers["Content-Type"]))
    {
      $this->raw_headers["Content-Type"]  = "Content-type: text/xml;charset=\"utf-8\"";
    }
    if (!isset($this->raw_headers["Cache-Control"]))
    {
      $this->raw_headers["Cache-Control"] = "No-Cache";
    }
    if (!isset($this->raw_headers["Cache-Control"]))
    {
      $this->raw_headers["Accept"] ="application/json";
    }
  }

  /**
   * Set Post Request.
   * @return $this
   */
  public function post()
  {
    $this->_http_method = "POST";
    return $this;
  }

  /**
   * launch a http request.
   * @param $method api method
   * @param array $params
   * @param string $path_url
   * @return $this
   */
  public function request($method, $params = array(), $path_url = "")
  {
    $this->url = $this->url . $path_url;
    $uri_parts = parse_url($this->url);
    if (!empty($uri_parts["user"]))
      $this->user = $uri_parts["user"];
    if (!empty($uri_parts["pass"]))
      $this->pass = $uri_parts["pass"];
    if (empty($uri_parts["query"]))
      $uri_parts["query"] = '';
    if (empty($uri_parts["path"]))
      $uri_parts["path"] = '';

    switch (strtolower($uri_parts["scheme"])) {
      case "https":
        curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, $this->ssl_verify_peer);
        curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, $this->ssl_verify_host);
        $this->port = 443;
      case "http":
        $this->host = $uri_parts["host"];
        if (!empty($uri_parts["port"]))
          $this->port = $uri_parts["port"];
        $this->_http_request($method, $params, $this->url, $this->_http_method);
        return $this;
        break;
      default:
        // not a valid protocol
        trigger_error('Invalid protocol "' . $uri_parts["scheme"] . '"\n', E_USER_ERROR);
        break;
    }
    return $this;
  } // end of func.

  /**
   * launch a http request actually.
   * @param $method
   * @param array $params
   * @param $url
   * @param $http_method
   * @param string $content_type
   * @param string $body
   * @return $this
   */
  private function _http_request($method, $params = array(), $url, $http_method, $content_type = "", $body = "")
  {
    $this->_prepare_http_headers($url, $http_method);
    if (!empty($this->user) || !empty($this->pass))
    {
      curl_setopt($this->ch, CURLOPT_HTTPAUTH, $this->http_auth);
      curl_setopt($this->ch, CURLOPT_USERPWD, "{$this->user}:{$this->pass}");
    }
    // set the read timeout if needed
    if ($this->timeout > 0)
      curl_setopt($this->ch, CURLOPT_TIMEOUT, $this->timeout);

    if (!empty($this->user) || !empty($this->pass))
    {
      $auth = "{$this->user}:{$this->pass}";
      $start = strpos($url, $auth);
      if ($start !== FALSE) $url = substr_replace($url, "", $start, strlen($auth));
    }
    if (strtolower($http_method) == 'post')
    {
      curl_setopt($this->ch, CURLOPT_HEADER, FALSE);
      curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
      curl_setopt($this->ch, CURLOPT_POST, TRUE);
      $params = json_encode($params);
      curl_setopt($this->ch, CURLOPT_POSTFIELDS, $params);
    } elseif (strtolower($http_method) == 'get') {
      $params = http_build_query($params);
      curl_setopt($this->ch, CURLOPT_POSTFIELDS, $params);
    }
    $url_method = substr($url, -1) === '/' ? $url.$method : $url.'/'.$method;
    curl_setopt($this->ch, CURLOPT_URL, $url_method);
    curl_setopt($this->ch, CURLOPT_RETURNTRANSFER,TRUE);
    $response = curl_exec($this->ch);

    if($response === FALSE) {
      $this->results =  array(
        'error'   => TRUE,
        'error_code'    => curl_errno($this->ch),
        'error_message'  => curl_error($this->ch)
      );
    } elseif(empty($response)){
      $this->results  = array(
        'error' => TRUE,
        'error_code' => '9999',
        'error_message' => 'No Response.'
      );
    } else{
      $this->results = json_decode($response,'array');
    }
    return $this;
  }

  /**
   * prepare http headers.
   * @param $url
   * @param $http_method
   */
  private function _prepare_http_headers($url, $http_method)
  {
    if (empty($url))
    {
      $url = "/";
    }
    $headers = $http_method . " " . $url . " " . $this->_http_version . "\r\n";
    if (!empty($this->host) && !isset($this->raw_headers['Host']))
    {
      $headers .= "Host: " . $this->host;
      if (!empty($this->port) && $this->port != '80')
      {
        $headers .= ":" . $this->port;
      }
      $headers .= "\r\n";
    }
    if (!empty($this->agent))
      $headers .= "User-Agent: " . $this->agent . "\r\n";
    if (!empty($this->accept))
      $headers .= "Accept: " . $this->accept . "\r\n";
    if ($this->use_gzip) {
      // make sure PHP was built with --with-zlib
      // and we can handle gzipp'ed data
      if (function_exists('gzinflate')) {
        $headers .= "Accept-encoding: gzip\r\n";
      } else {
        trigger_error(
          "use_gzip is on, but PHP was built without zlib support." .
          "  Requesting file(s) without gzip encoding.",
          E_USER_NOTICE);
      }
    }
    if (!empty($this->referer))
      $headers .= "Referer: " . $this->referer . "\r\n";
    if (!empty($this->raw_headers)) {
      if (!is_array($this->raw_headers))
        $this->raw_headers = (array)$this->raw_headers;
      while (list($headerKey, $headerVal) = each($this->raw_headers))
        $headers .= $headerKey . ": " . $headerVal . "\r\n";
    }
    if (!empty($content_type)) {
      $headers .= "Content-type: $content_type";
      if ($content_type == "multipart/form-data")
        $headers .= "; boundary=" . $this->_mime_boundary;
      $headers .= "\r\n";
    }
    if (!empty($body)) $headers .= "Content-length: " . strlen($body) . "\r\n";
    $headers .= "\r\n";
    curl_setopt($this->ch, CURLOPT_HTTPHEADER, array($headers));
  } // end of func.

  /**
   * get results of response.
   * @return string
   */
  public function get_results()
  {
    return $this->results;
  } // end of func.
}

 

Modbus RTU 详解 + FreeMODBUS移植(附项目源码) 本文全面解析Modbus RTU通信协议,详细介绍其报文格式、功能码定义及典型应用场景,并手把手指导如何将FreeMODBUS协议栈移植到嵌入式平台。内容涵盖从底层硬件驱动配置、协议栈移植到主机/从机通信测试的全流程,重点讲解移植过程中的常见问题及解决方案。文章最后提供经过实测的完整项目源码,帮助开发者快速实现稳定的Modbus RTU通信功能。 阅读详情

相关推荐

php实现的Curl封装类

php实现的Curl封装类的用法,以完整实例形式较为详细的分析了Curl封装类的定义及相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下。

PHP curl方法封装

PHP中,可以使用CURL库来进行HTTP请求,并且可以设置请求的头信息和发送JSON数据。以下是一个简单的示例,展示如何封装一个支持发送JSON数据和设置请求头的CURL方法:

快乐的搬砖的博客 1080

PHP封装CURL扩展类

主要介绍了PHP封装CURL扩展类,实例分析了基于curl发送post、get请求及操作cookie等相关技巧 编码规范 * @class 类名首字母大写,类名为多个单词, 每个大字首字母大写 eg: class Curl , class CurlPage * @variable 变量名小写, 变量名为多个单词, 每个单词小写,使用下划线_分割 eg: $curl_result * @function 函数名与类名规则相同 eg: function SendRequest * @params 函数形参规则与变量名相同 * @class-variable 成员变量,以下划线结尾,多个单词使用下划线分隔.

PHP封装一个强大且通用的cURL方法

【代码】用PHP封装一个强大且通用的cURL方法。

weixin_42100387的博客 452

PHP封装一个强大且通用的CURL方法

PHP封装一个通用的CURL方法 支持:get、post、put、delete、patch、options。

A-南的博客 1097

PHP CURL请求封装

PHP CURL请求封装

weixin_44534057的博客 421

PHP封装CURL类 请求第三方地址

PHP封装CURL

工作遇到问题的归纳总结 635

curlclass.php,php实现的Curl封装类Curl.class.php用法实例分析_PHP

本文实例讲述了php实现的Curl封装类Curl.class.php用法。分享给大家供大家参考。具体如下:$val){$sets[] = $key . '=' . urlencode($val);}$fields = implode('&',$sets);}curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);}else if('put' == $me...

weixin_39884872的博客 152

php 封装的类怎么调用方法吗,Curl封装类Curl.class.php及调用方法

php curl封装类的代码。复制代码 代码示例://curlclass Curl{function Curl(){return true;}function execute($method, $url, $fields='', $userAgent='', $httpHeaders='', $username='', $password=''){$ch = Curl::create();if(...

weixin_42527665的博客 283

curlclass.php,php实现的Curl封装类Curl.class.php用法实例分析

本文实例讲述了php实现的Curl封装类Curl.class.php用法。分享给大家供大家参考。具体如下://curlclass Curl{function Curl(){return true;}function execute($method, $url, $fields='', $userAgent='', $httpHeaders='', $username='', $password=...

weixin_42116847的博客 134

curlclass.php,Curl封装类Curl.class.php及调用方法

//curlclass Curl{function Curl(){return true;}function execute($method, $url, $fields='', $userAgent='', $httpHeaders='', $username='', $password=''){$ch = Curl::create();if(false === $ch){return fal...

weixin_30388485的博客 142

curlclass.php,phpcurl封装类用法实例

本文实例讲述了两个php curl封装类的用法实例,这两个函数可以让我们非常的方便的使用php curl相关函数。分享给大家供大家参考。具体如下:使用函数之前我们要需要把php curl模块打开(libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll)开启php curl函数库的步骤1).去掉windows/php.ini 文件里;extensio...

weixin_29451671的博客 188

curlfile扩展 php_PHP封装CURL扩展类实例

/*** @description: 封装CURL扩展* @date: 2014-07-28 16:04*//*** @编码规范* @class 类名首字母大写,类名为多个单词, 每个大字首字母大写 eg: class Curl , class CurlPage* @variable 变量名小写, 变量名为多个单词, 每个单词小写,使用下划线_分割 eg: $curl_result* @funct...

weixin_40001245的博客 207

PHP-cURL 项目常见问题解决方案

PHP-cURL 项目常见问题解决方案 一、项目基础介绍 PHP-cURL 是一个简单的 PHP curl 封装类,提供了对 PHP curl 函数的面向对象封装。这个项目旨在提供一个轻量级的、易于使用的库,用于发送 HTTP 请求。它不是作为一个高级抽象存在,因此用户需要对 PHPcurl 函数以及 HTTP 基础有足够的了解。该项目主要使用 PHP 编程语言。 二、新手常见问题及解决步骤...

gitblog_00901的博客 299

PHP CURL POST请求实战:从基础配置到企业级应用

HTTP协议作为现代Web开发的基石,其POST方法在数据传输中扮演着关键角色。通过CURL库实现POST请求,开发者可以完成表单提交、API调用等核心功能。深入理解CURLOPT_POSTFIELDS参数配置和Content-Type匹配原理,能够有效解决80%的接口通信问题。在电商支付、物流系统对接等实际场景中,规范的CURL配置方案可显著提升系统稳定性。本文结合PHP开发实践,详解如何通过CURLOPT_HTTPHEADER设置请求头、处理multipart/form-data文件上传,以及实现PSR

weixin_33853794的博客 449

php封装curl请求

php封装curl请求并处理json响应数据

CP1024的博客 694

PHP Curl请求封装

php语言封装curl请求类库代码

非专业程序员小田 739

PHP 常用函数总结 1 (curl封装)

PHP 常用函数总结 1 (curl封装)

anyhowanywhere的博客 581

php curl 请求的封装get、post的示例

PHPcURL库是一个功能强大的工具,用于发送HTTP请求。

headmaster_shan的博客 1320

《百度大数据竞赛2018 “充电桩故障分类与检测”》 f1-score 1.0000 .zip

全国大学生电子设计竞赛(National Undergraduate Electronics Design Contest),试题,解决方案及源码。计划或参加电赛的同学可以用来学习提升和参考。程序均是实战案例,经过测试可直接运行。全国大学生电子设计竞赛(National Undergraduate Electronics Design Contest),试题,解决方案及源码。计划或参加电赛的同学可以用来学习提升和参考。程序均是实战案例,经过测试可直接运行。

上一篇: PHP 开源代码库
下一篇: YII2 框架总结
ppxin
博客等级 码龄19年 3703粉丝 66原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值