PHP 實(shí)現(xiàn)手機(jī)端APP支付寶支付功能
最近應(yīng)業(yè)務(wù)需求,做了支付寶支付和微信支付,今天分享一下手機(jī)端app支付寶支付對(duì)接流程,實(shí)際開(kāi)發(fā)過(guò)程是前后端分離,前端調(diào)用后端API接口,實(shí)現(xiàn)功能返回?cái)?shù)據(jù),我所用的跨擠啊為T(mén)P5,大致可以分為四步:
1.在螞蟻金服開(kāi)放平臺(tái)創(chuàng)建應(yīng)用,簽約商戶(hù),生成應(yīng)用公鑰和私鑰;
2.配置統(tǒng)一下單支付參數(shù);
3.整合支付寶demo類(lèi)文件;
4.創(chuàng)建Alipay支付類(lèi),類(lèi)內(nèi)創(chuàng)建兩個(gè)方法(alipay_app:統(tǒng)一下單方法和alipay_notify:支付成功異步回調(diào)方法);
第一步主要是在螞蟻金服開(kāi)放平臺(tái)登錄你的支付寶賬號(hào),接入支付功能,個(gè)人就選個(gè)人,服務(wù)商就選服務(wù)商,需要填寫(xiě)一些材料,如手機(jī)號(hào),郵箱等,完成后就可以創(chuàng)建應(yīng)用啦,創(chuàng)建應(yīng)用完成后需要進(jìn)行簽約,只有簽約之后你應(yīng)用里面開(kāi)放的支付功能才會(huì)生效,簽約也需要填一堆信息,簽約需要審核,成功后你會(huì)拿到一個(gè)2088開(kāi)頭partner值,這個(gè)第三步配置參數(shù)的時(shí)候需要用到,之后還要為你的應(yīng)用生成公鑰和私鑰,這點(diǎn)在開(kāi)放平臺(tái)開(kāi)發(fā)文檔中有詳細(xì)描述,下載生成秘鑰工具,選擇對(duì)應(yīng)的秘鑰類(lèi)型,秘鑰和公鑰一定要保存好,這里就不多做贅述啦,到此開(kāi)放平臺(tái)的準(zhǔn)備工作就結(jié)束了。
第二步就是整合支付寶demo文件了,我這里已經(jīng)整合好了,直接把代碼復(fù)制到兩個(gè)文件中就可以了,一個(gè)為支付類(lèi),一個(gè)為通知類(lèi):
/*此為支付類(lèi)*/ class AlipayApp{ /** * 把數(shù)組所有元素,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串 * @param $para 需要拼接的數(shù)組 * return 拼接完成以后的字符串 */ function createLinkstring($para,$showQuotes = false) { // $arg = ""; // while (list ($key, $val) = each ($para)) { // $arg.=$key."=".$val."&"; // } ////去掉最后一個(gè)&字符 // $arg = substr($arg,0,count($arg)-2); ////如果存在轉(zhuǎn)義字符,那么去掉轉(zhuǎn)義 // 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; } /** * 對(duì)數(shù)組排序 * @param $para 排序前的數(shù)組 * return 排序后的數(shù)組 */ function argSort($para) { ksort($para); reset($para); return $para; } /** * 除去數(shù)組中的空值和簽名參數(shù) * @param $para 簽名參數(shù)組 * return 去掉空值與簽名參數(shù)后的新簽名參數(shù)組 */ 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; } /** * 寫(xiě)日志,方便測(cè)試(看網(wǎng)站需求,也可以改成把記錄存入數(shù)據(jù)庫(kù)) * 注意:服務(wù)器需要開(kāi)通fopen配置 * @param $word 要寫(xiě)入日志里的文本內(nèi)容 默認(rèn)值:空值 */ function logResult($word='') { date_default_timezone_set("PRC"); $fp = fopen("log.txt","a"); flock($fp, LOCK_EX) ; fwrite($fp,"執(zhí)行日期:".strftime("%Y%m%d%H%M%S",time())."\n".$word."\n"); flock($fp, LOCK_UN); fclose($fp); } /** * 遠(yuǎn)程獲取數(shù)據(jù),POST模式 * 注意: * 1.使用Crul需要修改服務(wù)器中php.ini文件的設(shè)置,找到php_curl.dll去掉前面的";"就行了 * 2.文件夾中cacert.pem是SSL證書(shū)請(qǐng)保證其路徑有效,目前默認(rèn)路徑是:getcwd().'\\cacert.pem' * @param $url 指定URL完整路徑地址 * @param $cacert_url 指定當(dāng)前工作目錄絕對(duì)路徑 * @param $para 請(qǐng)求的數(shù)據(jù) * @param $input_charset 編碼格式。默認(rèn)值:空值 * return 遠(yuǎn)程輸出的數(shù)據(jù) */ 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證書(shū)認(rèn)證 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//嚴(yán)格認(rèn)證 curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//證書(shū)地址 curl_setopt($curl, CURLOPT_HEADER, 0 ); // 過(guò)濾HTTP頭 curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 顯示輸出結(jié)果 curl_setopt($curl,CURLOPT_POST,true); // post傳輸數(shù)據(jù) curl_setopt($curl,CURLOPT_POSTFIELDS,$para);// post傳輸數(shù)據(jù) $responseText = curl_exec($curl); //var_dump( curl_error($curl) );//如果執(zhí)行curl過(guò)程中出現(xiàn)異常,可打開(kāi)此開(kāi)關(guān),以便查看異常內(nèi)容 curl_close($curl); return $responseText; } /** * 遠(yuǎn)程獲取數(shù)據(jù),GET模式 * 注意: * 1.使用Crul需要修改服務(wù)器中php.ini文件的設(shè)置,找到php_curl.dll去掉前面的";"就行了 * 2.文件夾中cacert.pem是SSL證書(shū)請(qǐng)保證其路徑有效,目前默認(rèn)路徑是:getcwd().'\\cacert.pem' * @param $url 指定URL完整路徑地址 * @param $cacert_url 指定當(dāng)前工作目錄絕對(duì)路徑 * return 遠(yuǎn)程輸出的數(shù)據(jù) */ function getHttpResponseGET($url,$cacert_url) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_HEADER, 0 ); // 過(guò)濾HTTP頭 curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 顯示輸出結(jié)果 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL證書(shū)認(rèn)證 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//嚴(yán)格認(rèn)證 curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//證書(shū)地址 $responseText = curl_exec($curl); //var_dump( curl_error($curl) );//如果執(zhí)行curl過(guò)程中出現(xiàn)異常,可打開(kāi)此開(kāi)關(guān),以便查看異常內(nèi)容 curl_close($curl); return $responseText; } /** * 實(shí)現(xiàn)多種字符編碼方式 * @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; } /** * 實(shí)現(xiàn)多種字符解碼方式 * @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 待簽名數(shù)據(jù) * @param $private_key 商戶(hù)私鑰字符串 * return 簽名結(jié)果 */ function rsaSign($data, $private_key) { //以下為了初始化私鑰,保證在您填寫(xiě)私鑰時(shí)不管是帶格式還是不帶格式都可以通過(guò)驗(yàn)證。 $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驗(yàn)簽 * @param $data 待簽名數(shù)據(jù) * @param $alipay_public_key 支付寶的公鑰字符串 * @param $sign 要校對(duì)的的簽名結(jié)果 * return 驗(yàn)證結(jié)果 */ function rsaVerify($data, $alipay_public_key, $sign) { //以下為了初始化私鑰,保證在您填寫(xiě)私鑰時(shí)不管是帶格式還是不帶格式都可以通過(guò)驗(yàn)證。 $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='-----BEGIN PUBLIC KEY-----'.PHP_EOL.wordwrap($alipay_public_key, 64, "\n", true) .PHP_EOL.'-----END PUBLIC KEY-----'; $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; } } /* * * 類(lèi)名:AlipayNotify * 功能:支付寶通知處理類(lèi) * 詳細(xì):處理支付寶各接口通知返回 * 版本:1.0 * 日期:2016-06-06 * 說(shuō)明: * 以下代碼只是為了方便商戶(hù)測(cè)試而提供的樣例代碼,商戶(hù)可以根據(jù)自己網(wǎng)站的需要,按照技術(shù)文檔編寫(xiě),并非一定要使用該代碼。 * 該代碼僅供學(xué)習(xí)和研究支付寶接口使用,只是提供一個(gè)參考 *************************注意************************* * 調(diào)試通知返回時(shí),可查看或改寫(xiě)log日志的寫(xiě)入TXT里的數(shù)據(jù),來(lái)檢查通知返回是否正常 */ class AlipayNotify { /** * HTTPS形式消息驗(yàn)證地址 */ var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&'; /** * HTTP形式消息驗(yàn)證地址 */ var $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?'; var $alipay_config; function __construct($alipay_config){ $this->alipay_config = $alipay_config; } function AlipayNotify($alipay_config) { $this->__construct($alipay_config); } /** * 獲取返回時(shí)的簽名驗(yàn)證結(jié)果 * @param $para_temp 通知返回來(lái)的參數(shù)數(shù)組 * @param $sign 返回的簽名結(jié)果 * @return 簽名驗(yàn)證結(jié)果 */ function getSignVeryfy($para_temp, $sign) { $alipayapp = new \Alipayapp(); //除去待簽名參數(shù)數(shù)組中的空值和簽名參數(shù) $para_filter = $alipayapp->paraFilter($para_temp); //對(duì)待簽名參數(shù)數(shù)組排序 $para_sort = $alipayapp->argSort($para_filter); //把數(shù)組所有元素,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串 $prestr = $alipayapp->createLinkstring($para_sort); $isSgin = false; switch (strtoupper(trim($this->alipay_config['sign_type']))) { case "RSA" : $isSgin = $alipayapp->rsaVerify($prestr, trim($this->alipay_config['alipay_public_key']), $sign); break; default : $isSgin = false; } return $isSgin; } /** * 獲取遠(yuǎn)程服務(wù)器ATN結(jié)果,驗(yàn)證返回URL * @param $notify_id 通知校驗(yàn)ID * @return 服務(wù)器ATN結(jié)果 * 驗(yàn)證結(jié)果集: * invalid命令參數(shù)不對(duì) 出現(xiàn)這個(gè)錯(cuò)誤,請(qǐng)檢測(cè)返回處理中partner和key是否為空 * true 返回正確信息 * false 請(qǐng)檢查防火墻或者是服務(wù)器阻止端口問(wèn)題以及驗(yàn)證時(shí)間是否超過(guò)一分鐘 */ function getResponse($notify_id) { $alipayapp = new \Alipayapp(); $transport = strtolower(trim($this->alipay_config['transport'])); $partner = trim($this->alipay_config['partner']); $veryfy_url = ''; if($transport == 'https') { $veryfy_url = $this->https_verify_url; } else { $veryfy_url = $this->http_verify_url; } $veryfy_url = $veryfy_url."partner=" . $partner . "¬ify_id=" . $notify_id; $responseTxt = $alipayapp->getHttpResponseGET($veryfy_url, $this->alipay_config['cacert']); return $responseTxt; } }
第三步配置參數(shù):
//配置參數(shù) public $alipay_config = array( //2088開(kāi)頭 'partner' => '', //商戶(hù)的私鑰,此處填寫(xiě)原始私鑰去頭去尾,RSA公私鑰生成:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1 'private_key' => '', //支付寶的公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm?keyType=partner 'alipay_public_key' => '', //異步通知接口 'service'=> 'mobile.securitypay.pay', //字符編碼格式 目前支持 gbk 或 utf-8 'input_charset' => 'utf-8', //簽名方式 不需修改 'sign_type' => 'RSA', //ca證書(shū)路徑地址,用于curl中ssl校驗(yàn) //請(qǐng)保證cacert.pem文件在當(dāng)前文件夾目錄中 'cacert' => '/cacert.pem', //訪(fǎng)問(wèn)模式,根據(jù)自己的服務(wù)器是否支持ssl訪(fǎng)問(wèn),若支持請(qǐng)選擇https;若不支持請(qǐng)選擇http 'transport' => 'http', );
創(chuàng)建$alipa_config屬性,可以放到你的配置文件中方便引入,也可以直接放到Alipay類(lèi)中,里面只要前三項(xiàng)需要自己填寫(xiě),其余不變就好啦。
第四步就是創(chuàng)建Alipay類(lèi),類(lèi)內(nèi)定義兩個(gè)方法,一個(gè)是alipay_app(統(tǒng)一下單),alipay_app中的一些參數(shù)需要自己補(bǔ)全,參數(shù)介紹點(diǎn)我,另一個(gè)是alipay_notify(支付成功后的異步回調(diào))并引入第二步創(chuàng)建的兩個(gè)類(lèi)文件,本人開(kāi)發(fā)用的是TP5框架,支付類(lèi)放在第三方類(lèi)庫(kù)vendor目錄下面,可以直接在控制器中用vendor()函數(shù)引入文件,例:vendor('Alipayapp.lib.alipay_notify');
//調(diào)用統(tǒng)一下單接口生成預(yù)支付訂單并把數(shù)據(jù)返回給APP public function alipay_app(Request $request) { vendor('Alipayapp.lib.AlipayApp'); $param = $request->param(); $tade_no = $param['orderCode'];//訂單號(hào) 調(diào)用統(tǒng)一下單接口需要提供一個(gè)訂單號(hào) $order = new Order(); //實(shí)例化訂單 $ret = $order->getOrderN2($tade_no); //查詢(xún)訂單信息 此處為我自己的查詢(xún)訂單信息方法,可以替換為你自己的 $strOrg['partner']=$this->alipay_config['partner']; // 配置的partner $strOrg['seller_id']=$this->alipay_config['partner']; // 此處和partner值一樣即可 $strOrg['out_trade_no']=$tade_no; // 訂單號(hào) $strOrg['subject']=""; // 商品的標(biāo)題 $strOrg['body']="";//商品名 $strOrg['total_fee']=$ret['money'];// 金額 $strOrg['notify_url']="";//回調(diào)地址,填寫(xiě)回調(diào)方法的絕對(duì)路徑 $strOrg['service']=$this->alipay_config['service']; $strOrg['payment_type']="1"; $strOrg['_input_charset']="utf-8"; $strOrg['it_b_pay']="30m"; $alipay = new \Alipayapp(); //將post接收到的數(shù)組所有元素,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串。 $data=$alipay->createLinkstring($strOrg,true);//,true //將待簽名字符串使用私鑰簽名,且做urlencode. 注意:請(qǐng)求到支付寶只需要做一次urlencode. $rsa_sign=urlencode($alipay->rsaSign($data, $this->alipay_config['private_key'])); //把簽名得到的sign和簽名類(lèi)型sign_type拼接在待簽名字符串后面。 $data = $data.'&sign='.'"'.$rsa_sign.'"'.'&sign_type='.'"'.$this->alipay_config['sign_type'].'"'; //返回給客戶(hù)端,建議在客戶(hù)端使用私鑰對(duì)應(yīng)的公鑰做一次驗(yàn)簽,保證不是他人傳輸。 $datajson['mdata']=$data; echo json_encode($datajson); } //支付成功后的回調(diào)方法 public function alipay_notify() { vendor('Alipayapp.lib.alipay_notify');//引入支付通知類(lèi)文件 $alipayNotify = new \AlipayNotify($this->alipay_config); $order = new Order(); //實(shí)例化訂單 if($alipayNotify->getResponse($_POST['notify_id'])) //判斷成功之后使用getResponse方法判斷是否是支付寶發(fā)來(lái)的異步通知。 { if($alipayNotify->getSignVeryfy($_POST, $_POST['sign'])) {//使用支付寶公鑰驗(yàn)簽 //獲取支付寶的通知返回參數(shù),可參考技術(shù)文檔中服務(wù)器異步通知參數(shù)列表 //商戶(hù)訂單號(hào) $out_trade_no = $_POST['out_trade_no']; $ret = $order->getOrderN2($out_trade_no); //查詢(xún)訂單信息 $total_amount=$ret['money']; //訂單金額 $total_fee = $_POST['total_fee']; //支付寶返回金額 if($_POST['trade_status'] == 'TRADE_FINISHED') { //判斷該筆訂單是否在商戶(hù)網(wǎng)站中已經(jīng)做過(guò)處理 //如果沒(méi)有做過(guò)處理,根據(jù)訂單號(hào)(out_trade_no)在商戶(hù)網(wǎng)站的訂單系統(tǒng)中查到該筆訂單的詳細(xì),并執(zhí)行商戶(hù)的業(yè)務(wù)程序 //如果有做過(guò)處理,不執(zhí)行商戶(hù)的業(yè)務(wù)程序 //注意: //退款日期超過(guò)可退款期限后(如三個(gè)月可退款),支付寶系統(tǒng)發(fā)送該交易狀態(tài)通知 //請(qǐng)務(wù)必判斷請(qǐng)求時(shí)的out_trade_no、total_fee、seller_id與通知時(shí)獲取的out_trade_no、total_fee、seller_id為一致的 if($total_amount==$total_fee){ //這里進(jìn)行數(shù)據(jù)庫(kù)操作,比如修改訂單狀態(tài)等 } }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { //判斷該筆訂單是否在商戶(hù)網(wǎng)站中已經(jīng)做過(guò)處理,如果沒(méi)有做過(guò)處理,根據(jù)訂單號(hào)(out_trade_no)在商戶(hù)網(wǎng)站的訂單系統(tǒng)中查到該筆訂單的詳細(xì),并執(zhí)行商戶(hù)的業(yè)務(wù)程 //如果有做過(guò)處理,不執(zhí)行商戶(hù)的業(yè)務(wù)程序 //注意: //付款完成后,支付寶系統(tǒng)發(fā)送該交易狀態(tài)通知 //請(qǐng)務(wù)必判斷請(qǐng)求時(shí)的out_trade_no、total_fee、seller_id與通知時(shí)獲取的out_trade_no、total_fee、seller_id為一致的 if($total_amount==$total_fee){ //這里進(jìn)行數(shù)據(jù)庫(kù)操作,比如修改訂單狀態(tài)等 } } echo "success"; //請(qǐng)不要修改或刪除 }else{ //驗(yàn)證簽名失敗 echo "sign fail"; } }else{ //驗(yàn)證是否來(lái)自支付寶的通知失敗 echo "response fail"; } }
上述getOrderN2方法是我查詢(xún)訂單信息用的,需要替換成你自己的查詢(xún)訂單方法,以上四步完成正常的話(huà)支付寶支付功能就可以實(shí)現(xiàn)了,需要注意的是支付功能簡(jiǎn)單的在本地測(cè)試是不可以的,需要在服務(wù)器上測(cè)試,也有說(shuō)用花生殼什么的...這個(gè)我沒(méi)有研究,如果沒(méi)有成功查看報(bào)錯(cuò)提示,在對(duì)接支付時(shí)有很多坑,遇到報(bào)錯(cuò)不要急,逐步解決一定可以實(shí)現(xiàn)支付功能的,如果自己實(shí)在解決不了的可以找支付寶技術(shù)人員,如果你想查看支付寶異步通知時(shí)的返回值,可以用 file_put_contents() 函數(shù)打印返回的參數(shù),會(huì)在你指定的路徑生成一個(gè)文件,里面就是返回的值啦。
總結(jié)
以上所述是小編給大家介紹的PHP 實(shí)現(xiàn)手機(jī)端APP支付寶支付功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- thinkPHP框架對(duì)接支付寶即時(shí)到賬接口回調(diào)操作示例
- php支付寶在線(xiàn)支付接口開(kāi)發(fā)教程
- PHP 接入支付寶即時(shí)到賬功能
- 支付寶服務(wù)窗API接口開(kāi)發(fā)php版本
- 純PHP代碼實(shí)現(xiàn)支付寶批量付款
- php支付寶手機(jī)網(wǎng)頁(yè)支付類(lèi)實(shí)例
- php支付寶接口用法分析
- php進(jìn)行支付寶開(kāi)發(fā)中return_url和notify_url的區(qū)別分析
- ThinkPHP實(shí)現(xiàn)支付寶接口功能實(shí)例
- 支付寶 接口開(kāi)發(fā)幫助(asp,php,asp.net,jsp)
相關(guān)文章
php語(yǔ)言中使用json的技巧及json的實(shí)現(xiàn)代碼詳解
json是一種比較流行的數(shù)據(jù)交換格式之一,各大API網(wǎng)站均支持json。通過(guò)本篇文章給大家介紹php語(yǔ)言中使用json技巧以及php語(yǔ)言中json的實(shí)現(xiàn),對(duì)php語(yǔ)言中使用json技巧及json的實(shí)現(xiàn)代碼詳解感興趣的朋友一起來(lái)本文學(xué)習(xí)學(xué)習(xí)吧2015-10-10Codeigniter操作數(shù)據(jù)庫(kù)表的優(yōu)化寫(xiě)法總結(jié)
用codeigniter也有一段時(shí)間了,一直沒(méi)有做什么總結(jié)?,F(xiàn)在總結(jié)一些Codeigniter操作數(shù)據(jù)庫(kù)表的優(yōu)化寫(xiě)法,需要的朋友可以參考下2014-06-06PHP開(kāi)發(fā)之用微信遠(yuǎn)程遙控服務(wù)器
微信公眾好的開(kāi)發(fā)很火,小程序更火。小編給大家分享一個(gè)PHP開(kāi)發(fā)之用微信遠(yuǎn)程遙控服務(wù)器的實(shí)例代碼,需要的朋友參考下2018-01-01WordPress過(guò)濾垃圾評(píng)論的幾種主要方法小結(jié)
不僅是中文的,WordPress用戶(hù)經(jīng)常還會(huì)受到英文日文等各種國(guó)外垃圾評(píng)論的騷擾,這里我們就來(lái)看一下WordPress過(guò)濾垃圾評(píng)論的幾種主要方法小結(jié):2016-07-07Laravel框架實(shí)現(xiàn)的rbac權(quán)限管理操作示例
這篇文章主要介紹了Laravel框架實(shí)現(xiàn)的rbac權(quán)限管理操作,結(jié)合實(shí)例形式分析了Laravel框架權(quán)限控制rbac相關(guān)數(shù)據(jù)庫(kù)創(chuàng)建、讀寫(xiě)及權(quán)限判斷等操作技巧,需要的朋友可以參考下2019-01-01