将第三方API接入自己的网站是获取实时数据、扩展功能的重要手段(如展示商品、同步订单、用户登录等)。以下是完整的接入流程与关键实践,以 微店API为例,适用于多数开放平台。
App Key(应用ID)和
App Secret(应用密钥)。API调用需身份验证,常见两种方式:
用户点击授权 → 跳转微店授权页 → 返回授权码(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;
key1=val1&key2=val2◦ 使用
HMAC-SHA256算法,用App Secret加密生成签名。// 前端调用(需代理避免暴露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);
});# Python后端异步同步订单
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}")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');
}App Secret,务必通过后端代理调用。
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 "请求过于频繁,请稍后再试"
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调试工具• Postman公共测试集合 • OAuth 2.0详解
通过以上步骤,开发者可高效接入API,快速实现数据整合。重点注意安全防护与性能优化,避免生产环境事故。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70026910/viewspace-3075576/ ,如需转载,请注明出处,否则将追究法律责任。