將第三方API接入自己的網站是獲取實時數據、擴展功能的重要手段(如展示商品、同步訂單、用戶登錄等)。以下是完整的接入流程與關鍵實踐,以微店API為例,適用于多數開放平臺。
一、準備工作:注冊與權限申請
- 注冊開發者賬號
? 訪問微店開放平臺,完成企業實名認證,創建應用。
? 獲取關鍵憑證:App Key
(應用ID)和App Secret
(應用密鑰)。 - 申請API權限
? 根據業務需求勾選接口權限(如“讀取商品信息”“管理訂單”)。
? 注意:部分高危接口需提交《數據使用承諾書》人工審核。
二、認證機制:確保安全調用
API調用需身份驗證,常見兩種方式:
- OAuth 2.0授權(用戶級數據)
? 適用場景:獲取用戶私有數據(如用戶訂單、購物車)。
? 授權流程:
用戶點擊授權 → 跳轉微店授權頁 → 返回授權碼(code) → 用code換access_token → 調用API
? 前端跳轉代碼示例:
// 前端跳轉到授權頁面
const authUrl = `https://auth.weidian.com/oauth2?
client_id=YOUR_APP_KEY&
redirect_uri=YOUR_CALLBACK_URL&
response_type=code`;
window.location.href = authUrl;
- AppKey簽名認證(服務端數據)
? 適用場景:訪問公共數據或企業自身數據(如商品列表)。
? 簽名生成規則:
? 將請求參數按字母排序,拼接成??key1=val1&key2=val2?
? ? 使用HMAC-SHA256
算法,用App Secret加密生成簽名。
三、調用API:前后端協作實踐
場景1:在前端展示商品列表
// 前端調用(需代理避免暴露App Secret)
async function fetchProducts(categoryId) {
try {
const response = await axios.get('/api/weidian/products', {
params: {
category_id: categoryId,
page_size: 20
}
});
return response.data.items;
} catch (error) {
console.error('API請求失敗:', error);
}
}
// 后端API路由(Node.js Express示例)
app.get('/api/weidian/products', async (req, res) => {
const params = {
method: 'item.list',
app_key: process.env.WEIDIAN_APP_KEY,
timestamp: Date.now(),
...req.query
};
// 生成簽名
const sign = generateSignature(params, process.env.WEIDIAN_APP_SECRET);
const result = await axios.get('https://api.weidian.com/router', {
params: { ...params, sign }
});
res.json(result.data);
});
場景2:同步訂單數據到數據庫
# Python后端異步同步訂單
# 封裝好的1688所有商品詳情供應商demo url=o0b.cn/ibrad,復制鏈接獲取測試。
import requests
from django.core.cache import cache
def sync_orders():
access_token = cache.get('weidian_access_token')
url = "https://api.weidian.com/trade/list"
params = {
"status": "TRADE_SUCCESS",
"start_time": "2024-01-01 00:00:00"
}
headers = {"Authorization": f"Bearer {access_token}"}
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200:
orders = response.json()['trades']
for order in orders:
save_to_database(order) # 自定義存儲邏輯
else:
send_alert(f"訂單同步失敗: {response.text}")
四、數據處理與錯誤應對
- 數據解析與存儲
? 統一格式化:轉換API返回的字段名(如微店的??num_iid?
?轉為自己系統的??product_id?
?)。
? 分頁處理:循環調用直到??has_next=false?
?,避免數據遺漏。 - 錯誤碼處理
? 重試機制:對網絡超時、限流錯誤(錯誤碼??60001?
?)加入指數退避重試。
import time
def safe_api_call(retries=3):
for i in range(retries):
try:
return call_api()
except (Timeout, RateLimitError):
time.sleep(2 ** i)
raise Exception("API調用超限")
- 敏感數據脫敏
? 在前端隱藏用戶手機號、地址等隱私字段:
function desensitizePhone(phone) {
return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
}
五、安全與性能優化
- 防止API密鑰泄露
? 禁止在前端代碼硬編碼??App Secret?
?,務必通過后端代理調用。
? 使用環境變量存儲密鑰(如AWS Parameter Store、Vercel Environment Variables)。 - 限流與緩存
? 根據API配額限制設置Redis令牌桶:
from redis import Redis
from limiter import TokenBucketLimiter
limiter = TokenBucketLimiter(
store=Redis(),
key="weidian_api_limit",
rate=500 # 每秒500次
)
if limiter.consume():
call_api()
else:
return "請求過于頻繁,請稍后再試"
- HTTPS與CORS
? 確保網站啟用HTTPS,防止中間人攻擊。
? 配置精確的CORS策略,僅允許自己的域名訪問API路由:
location /api/ {
add_header 'Access-Control-Allow-Origin' 'https://yourdomain.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST';
}
六、實戰:構建一個商品比價頁面
需求:在自己的網站展示微店商品,并對比其他平臺價格。
- 架構設計
前端頁面 → 后端API網關 → 微店商品API → 數據清洗 → 存入MySQL
↗
第三方比價服務API
- 核心代碼片段
// 前端渲染商品卡片
function renderProduct(product) {
return `<div class="product">
<h3>${product.title}</h3>
<img src="${product.image_url}" />
<p>價格:¥${product.price}(全網最低${product.lowest_price})</p>
</div>`;
}
// 后端聚合數據
app.get('/api/products/compare', async (req, res) => {
const [weidian, taobao] = await Promise.all([
fetchWeidianProducts(),
fetchTaobaoProducts()
]);
const merged = mergePrices(weidian, taobao);
res.json(merged);
});
七、常見問題排查
? Q:跨域請求被瀏覽器攔截?
A:確保后端配置了正確的CORS頭,或使用Nginx反向代理。
? Q:返回“簽名無效”錯誤?
A:檢查參數排序、時間戳格式、編碼是否與文檔一致,用?在線簽名工具對比。
? Q:API響應慢?
A:啟用緩存(Redis)、減少非必要字段請求、使用CDN加速靜態資源。
八、關鍵資源
通過以上步驟,開發者可高效接入API,快速實現數據整合。重點注意安全防護與性能優化,避免生產環境事故。