媒体伙伴接入
新手指南

媒体接入概览

Linkbest API提供了一系列功能,使媒体伙伴能够有效地实现流量变现和优化广告策略。通过与该API进行集成,媒体伙伴可以:

  • 访问广告活动:获取有关可用广告活动的详细信息,包括活动描述、佣金比例和推广材料。
  • 生成联盟链接:为特定产品或活动生成唯一的联盟链接,使媒体伙伴能够跟踪推荐并为成功销售获得佣金。
  • 跟踪转化:监控和跟踪通过联盟链接生成的转化,使媒体伙伴能够衡量其推广工作的有效性并优化其营销策略。
  • 获取收益和统计数据:实时获取收益和绩效统计数据,如点击次数、转化和佣金,以了解广告活动的表现和收入情况。

集成步骤

1. 获取App Key

注册并登录Linkbest后,进入“我的工具-开放平台“,点击“添加”,创建你的 App Key。查看 API 接入文档

getting-started

2.请求接口的要求

  • 编码要求:发送的数据必须使用UTF-8编码。

  • 请求方式:POST

  • HTTP Content-Type要求:您需要确保在对请求体进行表单编码时设置HTTP Content-Type头为application/json。如果您要上传文件作为请求的一部分,您需要指定multipart/form-data。

  • Linkbest的接口地址为

      https://api.linkbest.com/{APP_KEY}/{SERVICE_NAME}
  • 请求参数格式要求:

    参数类型格式要求
    string255 UTF-8 characters
    decimal8 digits, 2 decimal places
    datetimeISO-8601 (e.g. 2022-12-11T11:10:01-07:00)
    currencyISO-4217 (e.g. USD)
    integer16 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. 错误处理

由于多种原因,请求接口时可能会有失败的情况,当请求返回错误时,系统会提供一条消息以指示有关失败的更多详细信息,请依据这些信息进行相关调整后重试,或联系我们的对接工程师进行处理。具体请参见错误码