首頁 後端開發 php教程 使用PHP實現手機端APP支付寶的支付功能

使用PHP實現手機端APP支付寶的支付功能

Jun 19, 2018 pm 04:46 PM
php 支付寶支付

最近应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,感兴趣的朋友一起看看吧

最近应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,实际开发过程是前后端分离,前端调用后端API接口,实现功能返回数据,我所用的跨挤啊为TP5,大致可以分为四步:

       1.在蚂蚁金服开放平台创建应用,签约商户,生成应用公钥和私钥;

       2.配置统一下单支付参数;

       3.整合支付宝demo类文件;

       4.创建Alipay支付类,类内创建两个方法(alipay_app:统一下单方法和alipay_notify:支付成功异步回调方法);

       第一步主要是在蚂蚁金服开放平台登录你的支付宝账号,接入支付功能,个人就选个人,服务商就选服务商,需要填写一些材料,如手机号,邮箱等,完成后就可以创建应用啦,创建应用完成后需要进行签约,只有签约之后你应用里面开放的支付功能才会生效,签约也需要填一堆信息,签约需要审核,成功后你会拿到一个2088开头partner值,这个第三步配置参数的时候需要用到,之后还要为你的应用生成公钥和私钥,这点在开放平台开发文档中有详细描述,下载生成秘钥工具,选择对应的秘钥类型,秘钥和公钥一定要保存好,这里就不多做赘述啦,到此开放平台的准备工作就结束了。

       第二步就是整合支付宝demo文件了,我这里已经整合好了,直接把代码复制到两个文件中就可以了,一个为支付类,一个为通知类:

/*此为支付类*/
class AlipayApp{
 /**
  * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  * @param $para 需要拼接的数组
  * return 拼接完成以后的字符串
  */
 function createLinkstring($para,$showQuotes = false) {
  // $arg = "";
  // while (list ($key, $val) = each ($para)) {
  // $arg.=$key."=".$val."&";
  // }
  ////去掉最后一个&字符
  // $arg = substr($arg,0,count($arg)-2);
  ////如果存在转义字符,那么去掉转义
  // if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
  // return $arg;
  $arg = "";
  $quotes = '';
  if($showQuotes){
   $quotes = '"';
  }
  foreach ($para as $key => $val) {
   if($arg == ''){
    $arg = $key.'='.$quotes.$val.$quotes;
   }else{
    $arg = $arg.'&'.$key.'='.$quotes.$val.$quotes;
   }
  }
  if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
  return $arg;
 }
 /**
  * 对数组排序
  * @param $para 排序前的数组
  * return 排序后的数组
  */
 function argSort($para) {
  ksort($para);
  reset($para);
  return $para;
 }
 /**
  * 除去数组中的空值和签名参数
  * @param $para 签名参数组
  * return 去掉空值与签名参数后的新签名参数组
  */
 function paraFilter($para) {
  $para_filter = array();
  while (list ($key, $val) = each ($para)) {
   if($key == "sign" || $key == "sign_type" || $val == "")continue;
   else$para_filter[$key] = $para[$key];
  }
  return $para_filter;
 }
 function query_timestamp() {
  $url = $this->alipay_gateway_new."service=query_timestamp&partner=".trim(strtolower($this->alipay_config['partner']))."&_input_charset=".trim(strtolower($this->alipay_config['input_charset']));
  $encrypt_key = "";
  $doc = new DOMDocument();
  $doc->load($url);
  $itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );
  $encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
  return $encrypt_key;
 }
 /**
  * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
  * 注意:服务器需要开通fopen配置
  * @param $word 要写入日志里的文本内容 默认值:空值
  */
 function logResult($word='') {
  date_default_timezone_set("PRC");
  $fp = fopen("log.txt","a");
  flock($fp, LOCK_EX) ;
  fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."\n".$word."\n");
  flock($fp, LOCK_UN);
  fclose($fp);
 }
 /**
  * 远程获取数据,POST模式
  * 注意:
  * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
  * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\\cacert.pem'
  * @param $url 指定URL完整路径地址
  * @param $cacert_url 指定当前工作目录绝对路径
  * @param $para 请求的数据
  * @param $input_charset 编码格式。默认值:空值
  * return 远程输出的数据
  */
 function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '') {
  if (trim($input_charset) != '') {
   $url = $url."_input_charset=".$input_charset;
  }
  $curl = curl_init($url);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
  curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
  curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
  curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
  curl_setopt($curl,CURLOPT_POST,true); // post传输数据
  curl_setopt($curl,CURLOPT_POSTFIELDS,$para);// post传输数据
  $responseText = curl_exec($curl);
  //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
  curl_close($curl);
  return $responseText;
 }
 /**
  * 远程获取数据,GET模式
  * 注意:
  * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
  * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\\cacert.pem'
  * @param $url 指定URL完整路径地址
  * @param $cacert_url 指定当前工作目录绝对路径
  * return 远程输出的数据
  */
 function getHttpResponseGET($url,$cacert_url) {
  $curl = curl_init($url);
  curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
  curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
  curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
  $responseText = curl_exec($curl);
  //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
  curl_close($curl);
  return $responseText;
 }
 /**
  * 实现多种字符编码方式
  * @param $input 需要编码的字符串
  * @param $_output_charset 输出的编码格式
  * @param $_input_charset 输入的编码格式
  * return 编码后的字符串
  */
 function charsetEncode($input,$_output_charset ,$_input_charset) {
  $output = "";
  if(!isset($_output_charset) )$_output_charset = $_input_charset;
  if($_input_charset == $_output_charset || $input ==null ) {
   $output = $input;
  } elseif (function_exists("mb_convert_encoding")) {
   $output = mb_convert_encoding($input,$_output_charset,$_input_charset);
  } elseif(function_exists("iconv")) {
   $output = iconv($_input_charset,$_output_charset,$input);
  } else die("sorry, you have no libs support for charset change.");
  return $output;
 }
 /**
  * 实现多种字符解码方式
  * @param $input 需要解码的字符串
  * @param $_output_charset 输出的解码格式
  * @param $_input_charset 输入的解码格式
  * return 解码后的字符串
  */
 function charsetDecode($input,$_input_charset ,$_output_charset) {
  $output = "";
  if(!isset($_input_charset) )$_input_charset = $_input_charset ;
  if($_input_charset == $_output_charset || $input ==null ) {
   $output = $input;
  } elseif (function_exists("mb_convert_encoding")) {
   $output = mb_convert_encoding($input,$_output_charset,$_input_charset);
  } elseif(function_exists("iconv")) {
   $output = iconv($_input_charset,$_output_charset,$input);
  } else die("sorry, you have no libs support for charset changes.");
  return $output;
 }
 /**
  * RSA签名
  * @param $data 待签名数据
  * @param $private_key 商户私钥字符串
  * return 签名结果
  */
 function rsaSign($data, $private_key) {
  //以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。
  $private_key=str_replace("-----BEGIN RSA PRIVATE KEY-----","",$private_key);
  $private_key=str_replace("-----END RSA PRIVATE KEY-----","",$private_key);
  $private_key=str_replace("\n","",$private_key);
  $private_key="-----BEGIN RSA PRIVATE KEY-----".PHP_EOL .wordwrap($private_key, 64, "\n", true). PHP_EOL."-----END RSA PRIVATE KEY-----";
  $res=openssl_get_privatekey($private_key);
  if($res)
  {
   openssl_sign($data, $sign,$res);
  }
  else {
   echo "您的私钥格式不正确!"."<br/>"."The format of your private_key is incorrect!";
   exit();
  }
  openssl_free_key($res);
  //base64编码
  $sign = base64_encode($sign);
  return $sign;
 }
 /**
  * RSA验签
  * @param $data 待签名数据
  * @param $alipay_public_key 支付宝的公钥字符串
  * @param $sign 要校对的的签名结果
  * return 验证结果
  */
 function rsaVerify($data, $alipay_public_key, $sign) {
  //以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。
  $alipay_public_key=str_replace("-----BEGIN PUBLIC KEY-----","",$alipay_public_key);
  $alipay_public_key=str_replace("-----END PUBLIC KEY-----","",$alipay_public_key);
  $alipay_public_key=str_replace("\n","",$alipay_public_key);
  $alipay_public_key=&#39;-----BEGIN PUBLIC KEY-----&#39;.PHP_EOL.wordwrap($alipay_public_key, 64, "\n", true) .PHP_EOL.&#39;-----END PUBLIC KEY-----&#39;;
  $res=openssl_get_publickey($alipay_public_key);
  if($res)
  {
   $result = (bool)openssl_verify($data, base64_decode($sign), $res);
  }
  else {
   echo "您的支付宝公钥格式不正确!"."<br/>"."The format of your alipay_public_key is incorrect!";
   exit();
  }
  openssl_free_key($res);
  return $result;
 }
}
  
/* *
 * 类名:AlipayNotify
 * 功能:支付宝通知处理类
 * 详细:处理支付宝各接口通知返回
 * 版本:1.0
 * 日期:2016-06-06
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考
 *************************注意*************************
 * 调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
 */
class AlipayNotify {
 /**
  * HTTPS形式消息验证地址
  */
 var $https_verify_url = &#39;https://mapi.alipay.com/gateway.do?service=notify_verify&&#39;;
 /**
  * HTTP形式消息验证地址
  */
 var $http_verify_url = &#39;http://notify.alipay.com/trade/notify_query.do?&#39;;
 var $alipay_config;
 function __construct($alipay_config){
  $this->alipay_config = $alipay_config;
 }
 function AlipayNotify($alipay_config) {
  $this->__construct($alipay_config);
 }
 /**
  * 获取返回时的签名验证结果
  * @param $para_temp 通知返回来的参数数组
  * @param $sign 返回的签名结果
  * @return 签名验证结果
  */
 function getSignVeryfy($para_temp, $sign) {
  $alipayapp = new \Alipayapp();
  //除去待签名参数数组中的空值和签名参数
  $para_filter = $alipayapp->paraFilter($para_temp);
  //对待签名参数数组排序
  $para_sort = $alipayapp->argSort($para_filter);
  //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  $prestr = $alipayapp->createLinkstring($para_sort);
  $isSgin = false;
  switch (strtoupper(trim($this->alipay_config[&#39;sign_type&#39;]))) {
   case "RSA" :
    $isSgin = $alipayapp->rsaVerify($prestr, trim($this->alipay_config[&#39;alipay_public_key&#39;]), $sign);
    break;
   default :
    $isSgin = false;
  }
  return $isSgin;
 }
 /**
  * 获取远程服务器ATN结果,验证返回URL
  * @param $notify_id 通知校验ID
  * @return 服务器ATN结果
  * 验证结果集:
  * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
  * true 返回正确信息
  * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
  */
 function getResponse($notify_id) {
  $alipayapp = new \Alipayapp();
  $transport = strtolower(trim($this->alipay_config[&#39;transport&#39;]));
  $partner = trim($this->alipay_config[&#39;partner&#39;]);
  $veryfy_url = &#39;&#39;;
  if($transport == &#39;https&#39;) {
   $veryfy_url = $this->https_verify_url;
  }
  else {
   $veryfy_url = $this->http_verify_url;
  }
  $veryfy_url = $veryfy_url."partner=" . $partner . "&notify_id=" . $notify_id;
  $responseTxt = $alipayapp->getHttpResponseGET($veryfy_url, $this->alipay_config[&#39;cacert&#39;]);
  return $responseTxt;
 }
}
登入後複製

第三步配置参数:

//配置参数
public $alipay_config = array(
 //2088开头
 &#39;partner&#39; => &#39;&#39;,
 //商户的私钥,此处填写原始私钥去头去尾,RSA公私钥生成:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1
 &#39;private_key&#39; => &#39;&#39;,
 //支付宝的公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm?keyType=partner
 &#39;alipay_public_key&#39; => &#39;&#39;,
 //异步通知接口
 &#39;service&#39;=> &#39;mobile.securitypay.pay&#39;,
 //字符编码格式 目前支持 gbk 或 utf-8
 &#39;input_charset&#39; => &#39;utf-8&#39;,
 //签名方式 不需修改
 &#39;sign_type&#39; => &#39;RSA&#39;,
 //ca证书路径地址,用于curl中ssl校验
 //请保证cacert.pem文件在当前文件夹目录中
 &#39;cacert&#39; => &#39;/cacert.pem&#39;,
 //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
 &#39;transport&#39; => &#39;http&#39;,
);
登入後複製

创建$alipa_config属性,可以放到你的配置文件中方便引入,也可以直接放到Alipay类中,里面只要前三项需要自己填写,其余不变就好啦。

第四步就是创建Alipay类,类内定义两个方法,一个是alipay_app(统一下单),alipay_app中的一些参数需要自己补全,参数介绍点我,另一个是alipay_notify(支付成功后的异步回调)并引入第二步创建的两个类文件,本人开发用的是TP5框架,支付类放在第三方类库vendor目录下面,可以直接在控制器中用vendor()函数引入文件,例:vendor('Alipayapp.lib.alipay_notify');

//调用统一下单接口生成预支付订单并把数据返回给APP
public function alipay_app(Request $request)
{
 vendor(&#39;Alipayapp.lib.AlipayApp&#39;);
 $param = $request->param();
 $tade_no = $param[&#39;orderCode&#39;];//订单号 调用统一下单接口需要提供一个订单号
 $order = new Order(); //实例化订单
 $ret = $order->getOrderN2($tade_no); //查询订单信息 此处为我自己的查询订单信息方法,可以替换为你自己的
 $strOrg[&#39;partner&#39;]=$this->alipay_config[&#39;partner&#39;]; // 配置的partner
 $strOrg[&#39;seller_id&#39;]=$this->alipay_config[&#39;partner&#39;]; // 此处和partner值一样即可
 $strOrg[&#39;out_trade_no&#39;]=$tade_no; // 订单号
 $strOrg[&#39;subject&#39;]=""; // 商品的标题
 $strOrg[&#39;body&#39;]="";//商品名
 $strOrg[&#39;total_fee&#39;]=$ret[&#39;money&#39;];// 金额
 $strOrg[&#39;notify_url&#39;]="";//回调地址,填写回调方法的绝对路径
 $strOrg[&#39;service&#39;]=$this->alipay_config[&#39;service&#39;];
 $strOrg[&#39;payment_type&#39;]="1";
 $strOrg[&#39;_input_charset&#39;]="utf-8";
 $strOrg[&#39;it_b_pay&#39;]="30m";
 $alipay = new \Alipayapp();
 //将post接收到的数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串。
 $data=$alipay->createLinkstring($strOrg,true);//,true
 //将待签名字符串使用私钥签名,且做urlencode. 注意:请求到支付宝只需要做一次urlencode.
 $rsa_sign=urlencode($alipay->rsaSign($data, $this->alipay_config[&#39;private_key&#39;]));
 //把签名得到的sign和签名类型sign_type拼接在待签名字符串后面。
 $data = $data.&#39;&sign=&#39;.&#39;"&#39;.$rsa_sign.&#39;"&#39;.&#39;&sign_type=&#39;.&#39;"&#39;.$this->alipay_config[&#39;sign_type&#39;].&#39;"&#39;;
 //返回给客户端,建议在客户端使用私钥对应的公钥做一次验签,保证不是他人传输。
 $datajson[&#39;mdata&#39;]=$data;
 echo json_encode($datajson);
}

//支付成功后的回调方法
public function alipay_notify()
{
 vendor(&#39;Alipayapp.lib.alipay_notify&#39;);//引入支付通知类文件
 $alipayNotify = new \AlipayNotify($this->alipay_config);
 $order = new Order(); //实例化订单
 if($alipayNotify->getResponse($_POST[&#39;notify_id&#39;])) //判断成功之后使用getResponse方法判断是否是支付宝发来的异步通知。
 {
  if($alipayNotify->getSignVeryfy($_POST, $_POST[&#39;sign&#39;])) {//使用支付宝公钥验签
   //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
   //商户订单号
   $out_trade_no = $_POST[&#39;out_trade_no&#39;];
   $ret = $order->getOrderN2($out_trade_no); //查询订单信息
   $total_amount=$ret[&#39;money&#39;]; //订单金额
   $total_fee = $_POST[&#39;total_fee&#39;]; //支付宝返回金额
   if($_POST[&#39;trade_status&#39;] == &#39;TRADE_FINISHED&#39;) {
    //判断该笔订单是否在商户网站中已经做过处理
    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
    //如果有做过处理,不执行商户的业务程序
    //注意:
    //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
    //请务必判断请求时的out_trade_no、total_fee、seller_id与通知时获取的out_trade_no、total_fee、seller_id为一致的
    if($total_amount==$total_fee){
     //这里进行数据库操作,比如修改订单状态等
    }
   }else if ($_POST[&#39;trade_status&#39;] == &#39;TRADE_SUCCESS&#39;) {
    //判断该笔订单是否在商户网站中已经做过处理,如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程
    //如果有做过处理,不执行商户的业务程序
    //注意:
    //付款完成后,支付宝系统发送该交易状态通知
    //请务必判断请求时的out_trade_no、total_fee、seller_id与通知时获取的out_trade_no、total_fee、seller_id为一致的
    if($total_amount==$total_fee){
     //这里进行数据库操作,比如修改订单状态等
    }
   }
   echo "success"; //请不要修改或删除
  }else{ //验证签名失败
   echo "sign fail";
  }
 }else{ //验证是否来自支付宝的通知失败
  echo "response fail";
 }
}
登入後複製

       上述getOrderN2方法是我查询订单信息用的,需要替换成你自己的查询订单方法,以上四步完成正常的话支付宝支付功能就可以实现了,需要注意的是支付功能简单的在本地测试是不可以的,需要在服务器上测试,也有说用花生壳什么的...这个我没有研究,如果没有成功查看报错提示,在对接支付时有很多坑,遇到报错不要急,逐步解决一定可以实现支付功能的,如果自己实在解决不了的可以找支付宝技术人员,如果你想查看支付宝异步通知时的返回值,可以用 file_put_contents() 函数打印返回的参数,会在你指定的路径生成一个文件,里面就是返回的值啦。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于PHP实现微信红包金额拆分的算法

如何使用php实现快钱支付的功能

以上是使用PHP實現手機端APP支付寶的支付功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

See all articles