媒体接入概览
Linkbest API提供了一系列功能,使媒体伙伴能够有效地实现流量变现和优化广告策略。通过与该API进行集成,媒体伙伴可以:
- 访问广告活动:获取有关可用广告活动的详细信息,包括活动描述、佣金比例和推广材料。
- 生成联盟链接:为特定产品或活动生成唯一的联盟链接,使媒体伙伴能够跟踪推荐并为成功销售获得佣金。
- 跟踪转化:监控和跟踪通过联盟链接生成的转化,使媒体伙伴能够衡量其推广工作的有效性并优化其营销策略。
- 获取收益和统计数据:实时获取收益和绩效统计数据,如点击次数、转化和佣金,以了解广告活动的表现和收入情况。
集成步骤
1. 获取App Key
注册并登录Linkbest后,进入“我的工具-开放平台“,点击“添加”,创建你的 App Key。查看 API 接入文档
2.请求接口的要求
-
编码要求:发送的数据必须使用UTF-8编码。
-
请求方式:POST
-
HTTP Content-Type要求:您需要确保在对请求体进行表单编码时设置HTTP Content-Type头为application/json。如果您要上传文件作为请求的一部分,您需要指定multipart/form-data。
-
Linkbest的接口地址为
https://api.linkbest.com/{APP_KEY}/{SERVICE_NAME}
-
请求参数格式要求:
参数类型 格式要求 string 255 UTF-8 characters decimal 8 digits, 2 decimal places datetime ISO-8601 (e.g. 2022-12-11T11:10:01-07:00) currency ISO-4217 (e.g. USD) integer 16 digits
3.签名鉴权
下面以获取推广转链(linkbest.service.links.post)
接口做调用过程示例
参数示例
// Url 参数
/AppKey/linkbest.service.links.post
// body 按照字段序排序
{"Timestamp":"1692696195","Url":"https://www.example.com","WebsiteId":"1026"}
1、将请求的公共参数按字典序排序后 json_encode
{"Timestamp":"1692696195","Url":"https://www.example.com","WebsiteId":"1026"}
2、路由尾部拼接 post 请求 json 参数
/AppKey/linkbest.service.links.post{"Timestamp":"1692696195","Url":"https://www.example.com","WebsiteId":"1026"}
3、两边拼接 AppSecret
AppSecret/AppKey/linkbest.service.links.post{"Timestamp":"1692696195","Url":"https://www.example.com","WebsiteId":"1026"}AppSecret
4、对签名字符串 MD5 后转大写得到 sign 签名参数
11bf6f13de0d6e95d74b9b2210d95acb
5、将公共参数作为 Body 参数
{"Timestamp":"1692696195","Url":"https://www.example.com","WebsiteId":"1026","Sign":"11bf6f13de0d6e95d74b9b2210d95acb"}
4. 请求示例
curl 示例
# 示例 curl 命令
curl -X POST https://api.linkbest.com/{APP_KEY}/{SERVICE_NAME} \
-H 'Content-Type: application/json' \
-d '{"Timestamp":"1692696195","Url":"https://www.example.com","WebsiteId":"1026","Sign":"11bf6f13de0d6e95d74b9b2210d95acb"}'
php 请求示例
// 示例 PHP 代码
$AppKey = "your key";
$AppSecret = "your secret";
$header = [
"Content-Type" => "application/json"
];
$Url = "/{$AppKey}/linkbest.service.links.post";
$Body = [
"Timestamp" => time(),
"Url"=> "https://www.example.com",
"WebsiteId" => "your website id"
];
ksort($Body);
$SignStr = json_encode($Body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_HEX_AMP);
$Body["Sign"] = strtoupper(md5($AppSecret . $Url . $SignStr . $AppSecret));
try {
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', sprintf("%s%s", 'https://api.linkbest.com', $Url), [
"verify" => false,
"headers" => $header,
"body" => json_encode($Body, JSON_UNESCAPED_UNICODE)
]);
} catch (ClientException $e) {
$response = $e->getResponse();
}
echo $response->getStatusCode();
echo $response->getHeaderLine('content-type');
echo $response->getBody()->getContents();
golang 请求示例
package main
import (
"crypto/md5"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"sort"
"strings"
"time"
)
func main() {
AppKey := "your key"
AppSecret := "your secret"
Url := fmt.Sprintf("/%s/linkbest.open-service.orders.query.get", AppKey)
Body := map[string]interface{}{
"Timestamp": time.Now().Unix(),
"Stime": time.Now().Unix(),
"Etime": time.Now().Unix(),
}
// sort keys
BodyKeys := make([]string, 0, len(Body))
for k := range Body {
BodyKeys = append(BodyKeys, k)
}
sort.Strings(BodyKeys)
sortedMap := make(map[string]interface{})
for _, k := range BodyKeys {
sortedMap[k] = Body[k]
}
bodyStr, _ := json.Marshal(sortedMap)
fmt.Println(string(bodyStr))
Sign := fmt.Sprintf("%X", md5.Sum([]byte(AppSecret+Url+string(bodyStr)+AppSecret)))
Body["Sign"] = Sign
client := &http.Client{}
bodyStr, _ = json.Marshal(Body)
req, err := http.NewRequest("POST", fmt.Sprintf("%s%s", "https://api.linkbest.com", Url), strings.NewReader(string(bodyStr)))
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println("Status Code:", resp.StatusCode)
fmt.Println("Content-Type:", resp.Header.Get("Content-Type"))
fmt.Println("Response:", string(body))
}
java 请求示例
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class Main {
public static void main(String[] args) throws JsonProcessingException {
String appKey = "your key";
String appSecret = "your secret";
String url = "/" + appKey + "/linkbest.open-service.orders.query.get";
Map<String, Object> body = new TreeMap<>();
body.put("Timestamp", new Date().getTime() / 1000);
body.put("Stime", new Date().getTime() / 1000);
body.put("Etime", new Date().getTime() / 1000);
ObjectMapper objectMapper = new ObjectMapper();
String signStr = objectMapper.writeValueAsString(body);
String sign = md5(appSecret + url + signStr + appSecret);
body.put("Sign", sign);
System.out.println(signStr);
System.out.println(sign);
try {
URI uri = new URI("https://api.linkbest.com" + url);
HttpRequest request =
HttpRequest.newBuilder()
.uri(uri)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(objectMapper.writeValueAsString(body)))
.build();
String result =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()).body();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
private static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
hexString.append(String.format("%02X", b));
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}
5. 错误处理
由于多种原因,请求接口时可能会有失败的情况,当请求返回错误时,系统会提供一条消息以指示有关失败的更多详细信息,请依据这些信息进行相关调整后重试,或联系我们的对接工程师进行处理。具体请参见错误码