Ⅰ php中的API介面怎麼寫
api介面是具有的特定功能的程序代碼塊,作用是產生或者處理傳輸數據;
其存在的意義在於,不同語言之間的正常交流,包括iOS,java,PHP,C等,但是所有的程序語言都支持Json和Xml數據類型,所以介面產生數據基本都是json或者xml文件。
怎麼寫?
其實就是正常的功能類和方法,調用時產生需求功能對應的數據,僅此而已,在沒有什麼復雜的邏輯。
Ⅱ 開放平台API介面安全性設計——微信支付為例
API介面,類似 http://mypay.com/refund/order_id=123&mch_id=123 ,這個請求我以商戶mch_id=123的身份給訂單號為order_id=123退款,如果伺服器不辯別請求發起者的身份直接做相應的操作,那是及其危險的。
一般的,在PC端,我們是通過加密的cookie來做會員的辨識和維持會話的;但是cookie是屬於瀏覽器的本地存儲功能。APP端不能用,所以我們得通過token參數來辨識會員;而這個token該如何處理呢?
延伸開來,介面的安全性主要圍繞Token、Timestamp和Sign三個機制展開設計,保證介面的數據不會被篡改和重復調用。
一般來說,在前端對數據做加密或者前面,是不現實的。前後端使用HTTP協議進行交互的時候,由於HTTP報文為明文,所以通常情況下對於比較敏感的信息可以通過在前端加密,然後在後端解密實現"混淆"的效果,避免在傳輸過程中敏感信息的泄露(如,密碼,證件信息等)。不過前端加密只能保證傳輸過程中信息是『混淆』過的,對於高手來說,打個debugger,照樣可以獲取到數據,並不安全,所謂的前端加密只是稍微增加了攻擊者的成本,並不能保證真正的安全。即使你說在前端做了RSA公鑰加密,也很有可能被高手獲取到公鑰,並使用該公鑰加密數據後發給服務端,所以務必認為前端的數據是不可靠的,服務端要加以辯別。敏感信息建議上https。
所以一般建議上https,敏感信息md5混淆,前端不傳輸金額欄位,而是傳遞商品id,後端取商品id對應的金額,將金額等參數加簽名發送到支付系統。金額可以是明文的。
token授權機制 :用戶使用用戶名密碼登錄後,後台給客戶端返回一個token(通常是UUID),並將Token-UserId鍵值對存儲在redis中,以後客戶端每次請求帶上token,服務端獲取到對應的UserId進行操作。如果Token不存在,說明請求無效。
弊端 :token可以被抓包獲取,無法預防MITM中間人攻擊
用戶每次請求都帶上當前時間的時間戳timestamp,伺服器收到請求後對比時間差,超過一定時長(如5分鍾),則認為請求失效。時間戳超時機制是防禦DOS攻擊的有效手段。
將token,timestamp等其他參數以字典序排序,再加上一個客戶端私密的唯一id(這種一般做在服務端,前端無法安全保存這個id)或使用私鑰簽名,將前面的字元串做MD5等加密,作為sign參數傳遞給服務端。
地球上最重要的加密演算法:非對稱加密的RSA演算法。公鑰加密的數據,可以用私鑰解密;私鑰簽名(加密)的數據,可以用公鑰驗簽。
RSA原理是對極大整數做因數分解,以下摘自維基網路。
暫時比較忙沒時間,將於7月29日晚更新。
來更新啦。
微信支付安全規范,可以查看官方文檔 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
第1點中,其簽名演算法最重要的一步,是在最後拼接了商戶私密的API密鑰,然後通過md5生成簽名,這時即使金額是明文也是安全的,如果有人獲取並修改了金額,但是簽名欄位他是無法偽造的,因為他無法知道商戶的API密鑰。當然,除了微信支付的拼接API生成簽名的方法,我們也可以通過java自帶的security包進行私鑰簽名。其中nonce隨機字元串,微信支付應該做了校驗,可以防止重放攻擊,保證一次請求有效,如果nonce在微信支付那邊已經存在,說明該請求已執行過,拒絕執行該請求。
阮一峰老師的博客-RSA演算法原理: http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
維基網路: https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95
Ⅲ API介面入門(一):讀懂API介面文檔
本文目錄:
API介面是什麼?
為什麼我們需要API介面?
API介面的核心
一、API介面是什麼?
我們來以一個常見的數學公式理解API,比如y=x+2,當x=2的時候,y=4,對么?
那此時,我們把y=x+2稱為介面,x=2稱為參數,y=4稱為返回結果,那這個介面的功能就是能把我們輸入的數加上2(注意:這里你可以發現介面自身是帶有邏輯的)。
類比地,我們來理解一個常見的場景,比如現在有一個可以把經緯度轉化為城市的介面,那當我輸入經度是55°,緯度是88°的時候,介面通過自己的邏輯運算,返回結果告訴我:杭州市。
這樣你就可以清晰地了解網路的官方解釋了,介面就是預先定義的函數邏輯,他是供其他系統請求,然後返回結果的一個東西。
二、為什麼我們需要API介面?
背景:我們的業務系統涉及多方多面,如果要一個公司或者一個系統把所有業務都做完,那未免工作量太大了吧?並且如果其他系統或公司有更好的運算邏輯,那我們在設計功能的時候可以考慮利用介面進行開發。
核心需求:利用現有介面可以降低開發成本,縮短開發成本。
舉個例子:比如我是打車的APP,現在我需要在我的頁面上展現地圖的功能,對於我司而言,新做地圖功能未免成本過高,那我們可以在高德開放平台或者網路地圖的開放平台,找到地圖API,這樣的話我們只需要購買高德的服務,部署調用高德地圖API,這樣就可以快速在我們頁面上線地圖功能了。
三、API介面的核心
對於小白而言,初看API文檔可能是一頭霧水的——從哪裡看,怎麼看,看什麼是擺在面前的問題。
其實對於產品經理而言,我們應該更關注這個公司可以提供什麼樣的API介面服務,比如我知道高德可以提供地圖API,規劃路線的API,這樣的話在我們設計功能和工作中就可以想到調用他們的服務或者參考。
所以產品小白們看不懂也不用過於擔心,未來工作中你也會更深入了解清楚,因為看懂並不復雜,以下是API介面的核心點,所有的說明文檔離不開這5個核心點。
以下說明均以微信開放平台為例說明,文末有各開放平台的地址,大家有空可以去學習。好了,事不宜遲,現在我們來建立一個場景。
我們現在有一個APP,需要用戶在購買的時候調起微信支付的API,完成購買。請各位自動進入這個場景,把自己當作一位產品經理。
1. 介面地址
現在Now,用戶點擊付款,我們需要告訴微信,我們要調起你們的收銀台啦!但,去哪裡告訴呢?這就需要介面地址了,也就相當於向微信的這條鏈接傳輸指定的數據。
一個鏈接地址不是我們理解的一個頁面,你可以理解是一個電話號碼,小凱敬白們要改變這個觀念。
此時我們可以看到介面文檔告訴我們鏈接是如下這條,那我們現在已經撥通微信的電話了。
2. 請求參數(報文逗明)
我們現在需要告訴微信,你想調用收銀台對吧。那我們需要寫下來,此時生成的叫做報文,也就是你想告訴這個介面的內容是什麼?相當於前文函數的輸入x=2。
一般來說,報文的格式和內容都是按介面文檔規定的。如下文就是微信開放平台對調起收銀台的報文要求。
我們先來看前2個參數,你現在跟微信在對話,是不是應該先告訴微信,你是誰?這里微信的文檔告訴你應該要用應用ID+商戶號來確定你的身份,什麼意思呢?
比如你是A商戶,下面有a,b,c三個APP,所以微信要知道你是哪個商家,下面的哪個APP要用收銀台。這是非常重要的,微信後面要把收到的錢打到對應的賬戶以及統計數據等。
那我們就在報文裡面寫下這兩句話:
<appid>wx2421b1c4370ec43b</appid>(我的應用ID是wx2421…….)
<mch_id>10000100</mch_id>(我的商戶號是10000…….)
好了,現在微信知道你是誰了,那你山孫告要告訴微信,你需要微信支付幫你收多少錢對吧?這里定義了貨幣類型和總金額,也就是收什麼貨幣,收多少錢。
這里你看,貨幣類型的必填寫了否,也就是說你也可以不告訴微信支付貨幣類型是什麼,因為他在後面備注了默認是人民幣。
好的,那我們寫下兩段報文
<free_type>CNY</ free_type >(我要收人民幣)
<total_fee>1</total_fee>(我要收1元)
好了,現在微信知道你是誰,也知道要收多少錢了,那接下來微信支付要把收錢結果告訴你呀,因為你得知道用戶是成功支付了才能繼續發貨,服務啊等等的。所以這里我們用到通知地址,就是告訴微信,等下完事了他去哪裡告訴你支付結果。那我們把地址寫好:
<notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
3. 返回結果
剛剛微信支付已經去收款了,現在他要在我們留下的通知地址中,告訴我們結果了。結果無非是兩種:成功收款?收款不成功?
(1)成功
很順利,現在用戶成功付錢了,並且微信也把成功的消息告訴我們了,並且他還把用戶支付的一些信息也告訴我們。
那這里就是微信支付成功收款後告訴我們的信息。
應用APPID,商戶號:告訴你我成功扣款的是哪家商戶的哪個APPID的交易。
業務結果:成功或失敗
(2)失敗
在產品設計的時候,我們往往很關註失敗的情況,當收款失敗的時候,微信同時會告訴你失敗的原因,如下圖很好理解,失敗的原因有很多很多種,我們在設計的時候往往要分析每種失敗的原因,為每個失敗的原因設計頁面和用戶提示,以確保用戶能理解。
以上就是API介面基本運作模式的理解,下面我將繼續更新API介面的一些更為深入和細節的關鍵元素,如請求方式/簽名/加解密等等。
可供參考的開放平台網站
微信支付:https://pay.weixin.qq.com/wiki/doc/api/index.html
高德平台開放平台:https://lbs.amap.com/
Ⅳ 什麼是API介面,PHP開發API介面的例子
就是php只處理數據,而不直接輸出html
把視圖層都交給js去完成。
比如:
//獲取數據
$id=$_GET['id'];
if($id){
//支資料庫取數據
$sql="select*fromtablewhereid='".$id."'";
$re=.....;
echojson_encode($re);//返回json格式數據給前端處理
}
//修改數據
if($id&&$_GET['edit']){
////資料庫操作
echo"修改成功";
}
Ⅳ php如何開發API介面
比如一個自定義函數:function test(){echo 『hello world』;}就可以叫做 api。api 既可以是單個的函數,也可以是封裝在類里的方法,當然它們也是程序代碼。開發一個 api 的流程可以很簡單,也可以很復雜,視具體的編程任務而決定,並沒有特定的規則。比如,你需要為自己建立一個常用的函數庫,命名為 my.lib.php然後把你自己編寫的自定義函數,全部寫在這個文件裡面,那麼,你就擁有了自己的api。開發的時候,只需要引入 my.lib.php,你就可以調用自己的 api 了。這是一個比較簡單的例子。稍微復雜一點的,你可以把函數封裝在類裡面,方便繼承和重用,還可以根據函數名稱做一些程序設計,這個一句話說不清楚,給一個簡單的例子吧:class mylib{function showmy(){echo 『這是我的一個類方法』;}}調用的時候,先要實例化類,然後再調用方法。再復雜一點的就是使用類介面,區別就是介面裡面定義的只是方法原型,而你需要通過具體的類來實現介面中的函數,具體請參考 php 手冊
Ⅵ 簡單獲取新浪短網址API介面的方法(附PHP請求示例)
新浪短網址api是新浪官方對外公開的短網址生成介面,可以將冗長的鏈接地址縮短生成 t.cn 格式的短鏈接,下面分享一個獲取新浪短網址API介面的方法以及介面請求方法。
1、在線使用
將API地址中 "http://www..com" 的部分換成自己的長網址,然後復制前往瀏覽器中粘貼打開就能生成了。
2、請求介面
如果嫌在線生成的流程很麻煩,可以將API介面對接到程序中請求生成,請求示例如下。
PHP請求示例:
Java請求示例:
Python請求示例:
1、調用API介面時,只需將 「http://www..com」換成需要縮短的長鏈接即可。
2、介面支持鏈接中帶參數,但要注意的是當鏈接中出現 & 符號時,請用 %26 代替(或者使用url編碼),否則參數可能會丟失。
3、更換鏈接時,必須要以http(s)://開頭,否則可能會導致短網址生成失敗或者生成的短網址無法跳轉訪問原網站。
4、上文提到的新浪短網址API介面,經測試都是比較穩定的,覺得好用記得收藏一下,以免丟失。
1、長鏈接轉換後,為什麼結尾的參數丟失了?
答:因為長鏈接中含有特殊字元,需要將url編碼後再使用介面生成。
2、介面沒有返回結果,是什麼情況?
答:有些時候介面返回數據會有延遲,超時未返回即生成失敗,也就不會返回結果;或者是因為原鏈接被封了。
3、生成的短鏈接有效期是多久?有沒有訪問次數限制?
答:生成的t.cn短鏈接是永久有效的,沒有點擊次數限制,可以放心使用。
Ⅶ 如何使用MixPHP來開發API介面
下面做一個開發 API 介面的簡單實例:
從articles表,通過id獲取一篇文章。
訪問該介面的 URL:
1
http://www.e.com/articles/details?id=1
資料庫表結構如下:
1
2
3
4
5
6
7
CREATE TABLE `articles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` varchar(255) NOT NULL,
`dateline` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
第一步
修改資料庫配置文件,MixPHP 的應用配置文件中,關於資料庫的信息都引用了 common/config/database.php 文件。
框架默認的 404/500 響應是網頁,而 API 服務需要響應 JSON 數據,通常其他傳統 MVC 框架需要修改很多地方才可完成這個需求,MixPHP 本身就提供該種配置,只需修改一下配置即可。
MixPHP 的默認 Web 應用中有兩個配置文件,分別為:
main.php : 部署在 mix-httpd 時使用。
main_compatible.php :部署在 Apache/PHP-FPM 時使用。
開發 API 時我們推薦在 Apache/PHP-FPM 下開發,上線再部署至 mix-httpd 即可,反正是無縫切換的。
現在我們修改 response 鍵名下的 defaultFormat 鍵為 mixhttpError::FORMAT_JSON,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 響應
'response' => [
// 類路徑
'class' => 'mixhttpcompatibleResponse',
// 默認輸出格式
'defaultFormat' => mixhttpResponse::FORMAT_JSON,
// json
'json' => [
// 類路徑
'class' => 'mixhttpJson',
],
// jsonp
'jsonp' => [
// 類路徑
'class' => 'mixhttpJsonp',
// callback鍵名
'name' => 'callback',
],
// xml
'xml' => [
// 類路徑
'class' => 'mixhttpXml',
],
],
然後修改 main_compatible.php 文件中 error 鍵名下的 format 鍵為 mixhttpError::FORMAT_JSON,如下:
1
2
3
4
5
6
7
// 錯誤
'error' => [
// 類路徑
'class' => 'mixhttpError',
// 輸出格式
'format' => mixhttpError::FORMAT_JSON,
],
第三步
創建控制器:
1
apps/index/controllers/ArticlesController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
namespace appsindexcontrollers;
use mixfacadesRequest;
use mixhttpController;
use appsindexmessagesErrorCode;
use appsindexmodelsArticlesForm;
class ArticlesController extends Controller
{
public function actionDetails()
{
// 使用模型
$model = new ArticlesForm();
$model->attributes = Request::get();
$model->setScenario('actionDetails');
if (!$model->validate()) {
return ['code' => ErrorCode::INVALID_PARAM];
}
// 獲取數據
$data = $model->getDetails();
if (!$data) {
return ['code' => ErrorCode::ERROR_ID_UNFOUND];
}
// 響應
return ['code' => ErrorCode::SUCCESS, 'data' => $data];
}
}
創建錯誤碼類:
1
apps/index/messages/ErrorCode.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php
namespace appsindexmessages;
class ErrorCode
{
const SUCCESS = 0;
const INVALID_PARAM = 100001;
const ERROR_ID_UNFOUND = 200001;
}
創建表單驗證模型:
1
apps/index/models/ArticlesForm.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
namespace appsindexmodels;
use mixvalidatorsValidator;
use appscommonmodelsArticlesModel;
class ArticlesForm extends Validator
{
public $id;
// 規則
public function rules()
{
return [
'id' => ['integer', 'unsigned' => true, 'maxLength' => 10],
];
}
// 場景
public function scenarios()
{
return [
'actionDetails' => ['required' => ['id']],
];
}
// 獲取詳情
public function getDetails()
{
return (new ArticlesModel())->getRowById($this->id);
}
}
創建數據表模型:
1
apps/common/models/ArticlesModel.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
namespace appscommonmodels;
use mixfacadesRDB;
class ArticlesModel
{
const TABLE = 'articles';
// 獲取一行數據通過id
public function getRowById($id)
{
$sql = "SELECT * FROM `" . self::TABLE . "` WHERE id = :id";
$row = RDB::createCommand($sql)->bindParams([
'id' => $id,
])->queryOne();
return $row;
}
}
以上就是全部代碼的編寫。
Ⅷ php哪個框架適合做api
在所有輕量級框架中,我推薦 CodeIgniter。 美中不足就是,框架入門極其簡單。但是,如果實現 完全的、優雅的 restful,門檻就有點兒高了。CodeIgniter 實現 restful 時,和底層的 HTTP 協議有些脫節,這些可以通過擴展框架來實現,而且有時候需要結合伺服器去配置。
Ⅸ 如何用PHP開發API介面
他會提供相應介面給你的,具體調用方法就相當於講求某個鏈接。act=get_user_list&type=json在這里operate.php相當於一個介面,其中get_user_list 是一個API(獲取用戶列表),講求返回的數據類型為JSON格式。
act=get_user_list&type=json';$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);curl_setopt($ch,CURLOPT_POST,1);//啟用POST提交$file_contents=curl_exec($ch);curl_close($ch);