京东联盟API的使用

By | 2016年10月4日

之前利用京东联盟API制作了一个推广链接查询工具(http://devonios.com/app/jd/),好多童鞋前来询问细节,在此把相关代码附上说明。

首先是要获取Token令牌数据,由于token存在有效期,所以不用每次都去请求获取token。

一、获取token,保存到本地文件中:token.php

<?php
session_start();
//common.php文件包含一些常用function
include("../lib/common.php");
$response_type = "code";
$grant_type = "authorization_code";
$client_id = "修改为自己的";
$client_secret = "修改为自己的";
$redirect_uri = "修改为当前token.php文件的完整http链接";
$state = "jdunion";
$codeurl = 'https://oauth.jd.com/oauth/authorize';
$tokenurl = "https://oauth.jd.com/oauth/token?";

$code = $_GET["code"];

if ($code != "")
{
	$fields = [
	  "grant_type" => urlencode($grant_type),
	  "client_id" => urlencode($client_id),
	  "redirect_uri" => urlencode($redirect_uri),
	  "code" => urlencode($code),
	  "state" => urlencode($state),
	  "client_secret" => urlencode($client_secret)
	];

	$fields_string = "";
	foreach($fields as $key=>$value) {
	 $fields_string .= $key.'='.$value.'&';
	}
	//$fields_string = rtrim($fields_string, '&');

	//send_get是发送get请求的function,在common.php文件中
	$result = send_get($tokenurl.$fields_string);
	
	//这里要把返回结果转换为utf-8,因为结果有用户昵称,如果是中文的就无法解析出token了
	$result = mb_convert_encoding($result,"UTF-8","GBK");
	
	$resuttjson = json_decode($result);

	//3种处理方式:
	
	//     1)直接输出结果
	// echo $resuttjson->{'access_token'};
	// exit();
	
	//     2)保存到session中
	//$_SESSION["jdtoken"] = $resuttjson->{'access_token'};
	//$_SESSION["jduid"] = $resuttjson->{'uid'};
	//$_SESSION["jdusernick"] = $resuttjson->{'user_nick'};
	
	//     3)token值写入本地文件中
	$file = fopen("token.txt", "w");
	fwrite($file, $resuttjson->{'access_token'});
	fclose($file);
	
	header("Location: index.php");
}
else
{
  header("Location: ".$codeurl."?response_type=".$response_type."&client_id=".$client_id."&redirect_uri=".$redirect_uri."&state=".$state);
}

二、有了token值就可以获取推广链接和商品信息了

<?php
error_reporting(E_ALL);
ini_set("display_errors",1);
session_start();
define("APPKEY","修改为自己的");
define("APPSECRET","修改为自己的");
define("UNIONID","修改为自己的");
define("WEBID","修改为自己的");
define("SERVER","https://api.jd.com/routerjson");

//需要引入京东联盟api文件
require "./api/jd-jos/JdSdk.php";
//fucntion文件,见后面
include "common.php";

header("Content/Type: application/json");
$action = $_GET["action"];

//读取本地保存的token文件
$myfile = fopen("token.txt", "r");
$token = fread($myfile,filesize("token.txt"));
fclose($myfile);

$result = [];

//////////////////////////////////////////////查询推广链接
if(strstr($action,"link")){
	$url = $_GET["url"];
	$iswap = $_GET["iswap"];
	//GetLink是common.php文件的一个function
	$link = GetLink($token,$url,$iswap);
	if($link["resultCode"] == "0"){
		$result["link_ok"] = "1";
		$result["url"] = $link["url"];
	}else{
		$result["link_ok"] = "0";
		$result["link_errinfo"] =  $link["resultMessage"];
	}
}

//////////////////////////////////////////////查询商品信息
if(strstr($action,"info")){
	$url = $_GET["url"];
	$pid = "";
	
	if(strstr($url,"item.m.jd.com")){
		//wap链接
		$pid = GetBetween($url,"product/",".html");
	}else{
		//pc链接
		$pid = GetBetween($url,"com/",".html");
	}
	//GetProductInfo是common.php文件中的一个function
	$pinfo = GetProductInfo($token,$pid);
	
	if($pinfo["result"]){
		$result["info_ok"] = "1";
		
		$goodname = $pinfo["result"][0]["goodsName"];
		$unitPrice = $pinfo["result"][0]["unitPrice"];
		$wlunitPrice = $pinfo["result"][0]["wlUnitPrice"];
		$commisionRatioPc = $pinfo["result"][0]["commisionRatioPc"];
		$commisionRatioWl = $pinfo["result"][0]["commisionRatioWl"];
		$skuId = $pinfo["result"][0]["skuId"];
		$shopId = $pinfo["result"][0]["shopId"];
		$materialUrl = $pinfo["result"][0]["materialUrl"];
		$imgurl = $pinfo["result"][0]["imgUrl"];
		
		$result["imgurl"] = $imgurl;
		$result["pname"] = $goodname;
		$result["pid"] = $skuId;
		$result["price"] = $unitPrice;
		$result["wlprice"] = $wlunitPrice;
		
		$result["purl"] = $materialUrl;
		$result["ratePC"] = $commisionRatioPc;
		$result["rateWL"] = $commisionRatioWl;
		$result["shopType"] = ($shopId=="0"?"京东自营":"京东商家");
	}else{
		$result["info_ok"] = "0";
		$result["info_errinfo"] = "没有找到ID为 $pid 的产品信息!";
	}
	
}

echo json_encode($result,JSON_UNESCAPED_UNICODE);
?>

common.php文件的内容如下:

<?php
function GetBetween($content,$start,$end){
    $r = explode($start, $content);
    if (isset($r[1])){
        $r = explode($end, $r[1]);
        return $r[0];
    }
    return '';
}

function client($token){
	$c = new JdClient();
	$c->appKey = APPKEY;
	$c->appSecret = APPSECRET;
	$c->accessToken =$token;
	$c->serverUrl = SERVER;
	return $c;
}

function GetLink($token,$url,$iswap){

	$req = new ServicePromotionGetcodeRequest();
	$req->setPromotionType( 7 );
	$req->setMaterialId($url); 
	$req->setWebId(WEBID); 
	$req->setUnionId(UNIONID); 
	$req->setChannel($iswap==1?"WL":"PC"); 
	

	$client = client($token);
	$resp = $client->execute($req, $client->accessToken);
	$result = $resp->{"queryjs_result"};
	
	return  json_decode($result,true);
}

function GetProductInfo($token,$pid){

	$req = new ServicePromotionGoodsInfoRequest();
	$req->setSkuIds($pid);
	
	$client = client($token);
	$resp = $client->execute($req, $client->accessToken);
	$result = $resp->{"getpromotioninfo_result"};

	return json_decode($result,true);
}

?>

后台程序完成了,最后输出的是json内容,剩下的就是前台的显示了,可以自行查看页面源码。

附上本文用的SDK文件,由于现在改版了,这个旧版文件放在备份,需要的同学可以下载使用~

下载:jd-jos

20 thoughts on “京东联盟API的使用

  1. 罗家辉

    请问怎么获取code的值呢?code每次获取都需要登陆赋权一次
    我看你代码里写的$code = $_GET[“code”];,如果用java实现大概是怎么一个思路哇

    1. 管理员 Post author

      首先需要打开京东的登录页面,登录成功后,京东服务器根据我们设置的回调地址,把code作为该回调地址的url参数传过来的。

  2. 菜菜菜

    最近在搞京东联盟API十分感谢博主的文章!京东联盟API说明文档不清晰,遇到不少坑,还好博主的文章让我少走很多弯路~

    现在有个API还不会调用,想博主指点一下
    jingdong.UnionService.queryCommissionOrders 查询业绩订单
    可能是我这API 的time值有问题, 订单是存在的,可我在API测试工具中怎么输时间也只返回{\”success\”:1,\”hasMore\”:false}”}
    试了很多遍都没有data值 希望博主有空帮帮忙看看

    1. 管理员 Post author

      这个一直都这样,我也试过,查不到数据。

    1. 管理员 Post author

      参考这个哦,http://www.coderecord.cn/jd-jos-api.html

  3. ylz

    能不能说明一下文件该放的地方,网站的根目录是../web吗?

  4. ylz

    Sdk改版了,新版php api文件好多,能不能提供老版的下载地址?谢谢了

      1. 管理员 Post author

        已经在文末添加了下载地址~

  5. 小堂

    这位大牛,那请问京东扫一扫登陆是怎么实现的呢?

  6. 王永康

    大大,看不懂这个京东联盟,有这个教程视频吗

  7. 喜爱

    JdSdk.php 哪里找,下在的sdk里面没有这个文件呀,一大堆

    1. 管理员 Post author

      那就是Sdk改版了,不一定叫jdsdk.php文件了,要按照现在版本的文件结构include 相关文件

      1. 成都看海

        老大能够贡献下你的,jdsdk.php ,新版的2.0一堆文件,一个文本说明都没有,函数命名也不同了!

        1. 管理员 Post author

          已经在文末添加了下载地址~

    1. 管理员 Post author

      第二个文件就是要实际要访问的页面,文件名随意的呢

Comments are closed.