爱发电接入网站(PHP)实现
前言:有许多开发者拥有自己的网站和爱发电,可能需要赞助支持运营,而更好的获取到赞助者名单以及将其公示以表感谢是非常有必要的。小编我是因为我在一个我的世界服务器做技术,刚好需要这一类需求,于是摸索总结给需要的人。事例:https://catland.com.cn/afd.php
一、进入爱发电开发者后台
需要您的user_id和api token(注意保密,不要泄露!!!)
二、PHP实现api对接
在您网站的目录下创建一个.php文件,用于获取api内容以及显示内容。
api接口:https://afdian.net/api/open/query-sponsor
api字段: 订单(爱发电官网原文)
total_count 赞助者总数
total_page 页数,默认每页50条,请求时,传 page ,curr_page < total_page则可继续请求
out_trade_no 订单号
custom_order_id 自定义信息
user_id 下单用户ID
plan_id 方案ID,如自选,则为空
title 订单描述
month 赞助月份
total_amount 真实付款金额,如有兑换码,则为0.00
show_amount 显示金额,如有折扣则为折扣前金额
status 2 为交易成功。目前仅会推送此类型
remark 订单留言
redeem_id 兑换码ID
product_type 0表示常规方案 1表示售卖方案
discount 折扣
sku_detail 如果为售卖类型,以数组形式表示具体型号
address_person 收件人
address_phone 收件人电话
address_address 收件人地址
api字段: 赞助者(爱发电官网原文)
total_count 赞助者总数
total_page 页数,默认每页20条,请求时,传 page ,curr_page < total_page则可继续请求
sponsor_plans []数组类型,具体节点为多个赞助方案。
current_plan 当前赞助方案,如果节点仅有 name:"",不包含其它内容时,表示无方案
all_sum_amount 累计赞助金额,此处为折扣前金额。如有兑换码,则此处为虚拟金额,回比实际提现的多
create_time int 秒级时间戳,表示成为赞助者的时间,即首次赞助时间
last_pay_time int 秒级时间戳,最近一次赞助时间
user 节点表示用户属性
user_id 用户唯一ID
name 昵称,非唯一,可重复
avatar 头像
通过阅读爱发电官方的API文档我们可知以下内容(爱发电官网原文)
签名介绍
为了保证数据安全与灵活性,平台做了一个简单的签名逻辑。平台接收的参数如下。
user_id: 上面的 user_id,表明你是谁
params: 具体接口传参的json字符串
ts: 发出请求时秒级时间戳
sign: 针对上面3个数据的签名,防止伪造数据。
sign 的计算规则为:md5(token+请求数据按key排序拼接key和value)
具体到这次场景,参数key为固定值,只有上面四个字段 sign 签名可以简化为
sign = md5({token}params{params}ts{ts}user_id{user_id})
{}包的数据为具体数值
也就是说他需要和他通讯时进行签名验证,如下(爱发电官网原文)
示例
假设当前数据如下
user_id abc
params {"a":333}
ts 1624339905
token 123 注意这个不传递到服务端,仅参与签名计算
sign = md5('123params{"a":333}ts1624339905user_idabc')
sign = a4acc28b81598b7e5d84ebdc3e91710c
注意token直接写具体值,其它参数写kv,没有任何连接字符,直接拼接
JSON请求示例
{"user_id":"abc", "params": "{\"a\":333}", "ts": 1624339905, "sign":"a4acc28b81598b7e5d84ebdc3e91710c"}
这里他会回一个响应码(也就是文档提到的ec),若ec=200,则我们的和API的交接成功,我们连接到了爱发电并获取到了信息,获取到赞助者信息事例如下(事例为爱发电官网原文)
{
"ec": 200,
"em": "",
"data": {
"total_count": 14,
"total_page": 2,
"list": [
{
"sponsor_plans": [],
"current_plan": {
"name": ""
},
"all_sum_amount": "0.00",
"create_time": 1581011280,
"last_pay_time": 1598852327,
"user": {
"user_id": "3524370d11e8ae8852540025c377",
"name": "Hee",
"avatar": "https://pic1.afdiancdn.com/user/27f7sss7/avatar/2d9659585fc4798068efbb652e56c08a.jpg"
}
},
{
"sponsor_plans": [
{
"plan_id": "sdfsf",
"rank": 0,
"user_id": "34343",
"status": 3,
"name": "独立永久方案",
"pic": "",
"desc": "啊1;",
"price": "1.00",
"update_time": 1621084278,
"pay_month": 1,
"show_price": "1.00",
"independent": 1,
"permanent": 1,
"can_buy_hide": 0,
"need_address": 0,
"product_type": 0,
"sale_limit_count": -1,
"need_invite_code": false,
"expire_time": 2114352000,
"sku_processed": [],
"rankType": 21
}
],
"current_plan": {
"plan_id": "sdfsfsf",
"rank": 0,
"user_id": "3453535",
"status": 3,
"name": "独立永久方案",
"pic": "",
"desc": "啊1;",
"price": "1.00",
"update_time": 1621084278,
"pay_month": 1,
"show_price": "1.00",
"independent": 1,
"permanent": 1,
"can_buy_hide": 0,
"need_address": 0,
"product_type": 0,
"sale_limit_count": -1,
"need_invite_code": false,
"expire_time": 2114352000,
"sku_processed": [],
"rankType": 21
},
"all_sum_amount": "13.00",
"first_pay_time": 1576776221,
"last_pay_time": 1581083107,
"user": {
"user_id": "sfff",
"name": "sfsf:十五种幸福(新版)",
"avatar": "https://pic1.afdiancdn.com/user/sdfsfsf/avatar/c13b6125cbd9fbe7810c79256df1f5b2_w4032_h3024_s3215.jpeg"
}
}
]
}
}
ec的字段
ec 字段异常错误码
200 成功
400001 params incomplete
400002 time was expired
400003 params was not valid json string
400004 no valid token found
400005 sign validation failed
目前我们只需要赞助者的名称和id还有累积赞助金额,则我们需要用到[user][user_id]和[user][name]和[all_sum_amount]这些key
简单代码实现如下(用json实现收发):
<?php
// 你的用户ID
$user_id = "你的用户ID";
// 生成的API Token
$token = "你的API Token";
// 获取当前时间戳
$ts = time();
// 构建请求参数
$params = [
"page" => 1 // 查询第一页的赞助者
];
// 按照要求的格式拼接字符串
$kv_string = "params" . json_encode($params) . "ts" . $ts . "user_id" . $user_id;
// 计算签名
$sign = md5($token . $kv_string);
// 构建请求数据
$request_data = [
"user_id" => $user_id,
"params" => json_encode($params),
"ts" => $ts,
"sign" => $sign
];
// 转换为 JSON 格式
$json_data = json_encode($request_data);
// 设置请求的 URL
$url = "https://afdian.net/api/open/query-sponsor";
// 初始化 cURL
$curl = curl_init();
// 设置 cURL 选项
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_data,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Content-Length: ' . strlen($json_data)
],
]);
// 发送请求并获取响应
$response = curl_exec($curl);
// 关闭 cURL 资源
curl_close($curl);
// 处理响应数据
if ($response) {
$data = json_decode($response, true);
if (isset($data['ec']) && $data['ec'] == 200) {
// 查询成功
$sponsors = $data['data']['list'];
// 输出赞助者信息
echo '<h1>赞助者列表</h1>';
foreach ($sponsors as $sponsor) {
echo '<p>用户ID: ' . $sponsor['user']['user_id'] . '</p>';
echo '<p>昵称: ' . $sponsor['user']['name'] . '</p>';
echo '<p>累计赞助金额: ' . $sponsor['all_sum_amount'] . '</p>';
echo '<hr>';
}
} else {
// 查询失败
echo '查询赞助者失败: ' . $data['em'];//这里反馈了ec状态
}
} else {
// 请求失败
echo '请求失败';
}
?>
这里我们获取到了用户的id和昵称和累积赞助金额
如果您觉得不够美观,可以进阶使用CSS来排版,示例代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>赞助者列表</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f4;
color: #333;
}
.container {
max-width: 800px;
margin: 20px auto;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.sponsor {
border-bottom: 1px solid #ccc;
padding: 20px 0;
display: flex;
align-items: center;
}
.avatar {
width: 80px;
height: 80px;
border-radius: 50%;
margin-right: 20px;
}
.info {
flex: 1;
}
</style>
</head>
<body>
<div class="container">
<h1>赞助者列表</h1>
<?php
/*api代码*/
?>
</div>
</body>
</html>