利用京東聯盟API獲取自定義推廣鏈接
本文創建於3年前,內容已經老舊,京東頁面也已經改版,請加群了解更多。
歡迎加入京東聯盟技術討論群(379480469):
接口沒有權限?請看本文《京東聯盟接口調用時的權限問題》
最新:利用聯盟API做的一個chrome擴展,京東商品佣金查看,可以直接在商品詳情頁查看佣金信息。
【有困難的童鞋可以參考最新的文章http://www.coderecord.cn/jd-jos-api.html,把目前的http://devonios.com/app/jd/index.php這個demo的后台代碼都貼上了】
本文將簡單介紹下京東聯盟、京東宙斯兩個平台,以及如何利用京東宙斯平台的京東聯盟API來快速獲取自定義推廣鏈接。
關於京東聯盟
京東聯盟(去官網看看)是一個CPS模式的營銷平台,我們可以使用自己的網站放置聯盟的推廣鏈接為京東推銷產品,當用戶在我們的網站上點擊了某個推廣鏈接,並促成了真實的訂單,那么我們將獲得一定的佣金。
申請京東聯盟的條件是必須有一個在國內的備案網站,這個是重點哦。使用京東帳號登錄后,填寫網站信息,等待審核即可。
強烈推薦先看下聯盟的介紹和規則:http://media.jd.com/statc/help/hc.htm
關於京東宙斯
京東宙斯(去官網看看)是一個京東提供的API接口平台(基於oauth2驗證),通過使用API,我們可以自己創建各種網站、無線應用來讀取京東商品信息、活動信息等。商家可以通過API將自己的信息系統嵌入京東的各種服務系統。
本文將介紹如何使用京東宙斯中的京東聯盟API來獲取京東聯盟自定義推廣鏈接。
京東聯盟自定義推廣鏈接
自定義推廣鏈接,可以使用京東上各種商品,各種活動頁面的鏈接,其范圍非常的廣泛和實用。
在聯盟管理界面中,我們可以看到生成自定義推廣鏈接的操作非常簡單:
自定義推廣鏈接支持的鏈接有:京東首頁、商品detail頁、活動頁面、店鋪頁面。
點擊獲取代碼按鈕后,會生成一個union開頭的鏈接,我們把這個鏈接放置在網站上即可(這個鏈接只能在注冊的網站上使用,通過其他方式打開的無效)。
我們自己可以點擊這個鏈接,當我們自己在京東上購買商品時,也能獲得佣金哦!(詳細信息請看聯盟幫助)
在京東宙斯平台注冊為京東開發者
我們可以在京東聯盟管理界面獲取推廣鏈接,但是每次都要登錄,非常的繁瑣!幸好,京東開放了京東聯盟API,我們可以使用代碼來自動獲取!
首先,先用您的京東帳號登錄京東宙斯平台(打開官網),然后填寫開發者基本信息,即可完成注冊開發者(不需要認證開發者),接着授權服務頁面申請京東宙斯服務。
完成后會顯示您已獲得授權的服務:
創建一個應用
當我們成為注冊開發者,授權京東宙斯服務后,我們需要創建一個應用,因為使用API是需要授權(access_token)的,而這個token是由我們創建的應用的APP key和App Secret生成,我們對API的請求記錄都會記錄在這個應用下面。
在創建應用界面,我們選擇【買家】【無線應用】:
完成后,我們還需要完善下應用信息,填寫下回調地址,回調地址的作用是在獲取訪問API的授權碼(accecc_token)時的一個中間地址:
下一步,然后提交審核,應用的狀態就變成上線運行中了,這時我們就可以正式開始使用應用證書中的APP key來獲取Token了!
使用APPkey和APPSecrect獲取Token
首先,奉上官網的文檔:http://jos.jd.com/doc/channel.htm?id=152,有能力的你可以自行研究下~
這里,我使用的是第一種:Authorization Code來獲取Token,好處是Token有效期能保持1年時間,每天30萬次請求!我們現在只需要獲取一次即可!
由於是基於Oauth2.0,所以流程很簡單,先使用APPKey獲取一個Code,然后結合Code再獲取Token!
Code的獲取是使用京東的登錄頁面,輸入您的京東帳號信息后,得到授權之后會回到我們的回調地址上,此時回調地址上會帶有一個code參數,這個參數就是我們需要的!
獲取Code的請求(GET請求)鏈接:
https://oauth.jd.com/oauth/authorize
有幾個參數需要帶上:
參數名稱 | 參數選項 | 描述 |
---|---|---|
response_type | 必須 | 此流程下,該值固定為code |
client_id | 必須 | 即創建應用時的Appkey(從JOS控制台->管理應用中獲取) |
redirect_uri | 必須 | 即應用的回調地址,必須與創建應用時所填回調頁面url一致 |
state | 可選 | 狀態參數,由ISV自定義,頒發授權后會原封不動返回 |
scope | 可選 | 權限參數,API組名串。多個組名時,用”,”分隔,目前支持參數值:read |
view | 可選 | 移動端授權,該值固定為wap;非移動端授權,無需傳值 |
整理后完整的請求鏈接為:
https://oauth.jd.com/oauth/authorize?response_type=code&client_id=YOUR_CLIENT_ID& redirect_uri=YOUR_REGISTERED_REDIRECT_URI
只需要修改下client_id(即APP Key)和redirect_uri(回調地址,必須和創建應用時寫的一樣)即可。
使用瀏覽器訪問這個鏈接,會定向到登錄頁面:
登錄成功后,會跳轉到我們寫的回調地址上,此時我們可以獲得code參數值!
現在我們可以使用Code值來獲得token了。
獲取token的請求鏈接:
https://oauth.jd.com/oauth/token
參數有:
參數名稱 | 參數選項 | 描述 |
---|---|---|
grant_type | 必須 | 授權類型,此流程下,該值固定為authorization_code |
code | 必須 | 授權請求返回的授權碼 |
redirect_uri | 必須 | 應用的回調地址,必須與創建應用時所填回調頁面url一致 |
client_id | 必須 | 即創建應用時的Appkey(從JOS控制台->管理應用中獲取) |
client_secret | 必須 | 即創建應用時的Appsecret(從JOS控制台->管理應用中獲取) |
state | 可選 | 狀態參數,由ISV自定義,頒發授權后會原封不動返回 |
整理后完整的請求鏈接為:
https://oauth.jd.com/oauth/token?grant_type=authorization_code&client_id=YOUR_CLIENT_ID& redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=GET_CODE&client_secret= YOUR_APP_SECRET
使用瀏覽器訪問這個鏈接,返回的是標准的json格式:
{ "access_token": "您的Token值", "code": 0, "expires_in": 31622400, "refresh_token": "4a07031d-5122-4100-a60d-4ab982a55307", "time": "1435499129281", "token_type": "bearer", "uid": "您的京東帳號ID", "user_nick": "您的京東帳號昵稱" }
自此一個理論流程完成了!現在我們用php自動下,即獲取code后自動發送獲取token的請求,然后顯示token內容。
PHP實現自動獲取token的簡單Demo
直接看代碼把,非常簡單哦,一個php文件:
<?php $response_type = "code"; $grant_type = "authorization_code"; $client_id = "這里改為您的APP Key"; $client_secret = "這里改為您的APP Secret"; $redirect_uri = "這里改為你的回調地址"; $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.'&'; } rtrim($fields_string, '&'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $tokenurl.$fields_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); echo "Response:<br />".mb_convert_encoding($result,"UTF-8","GBK"); } else { header("Location: ".$codeurl."?response_type=".$response_type."&client_id=".$client_id."&redirect_uri=".$redirect_uri."&state=".$state); }
您只需要將開頭的幾個值修改為自己的,然后訪問這個php文件。
使用京東聯盟API獲取自定義推廣鏈接
得到token后,妥善保管,現在開始的每個API請求都需要帶上這個token值。
首先,我們要知道的是,訪問API有個BaseUrl,這是整個宙斯(JOS)平台所有API的主鏈接,只是不同API的參數不同:
https://api.jd.com/routerjson
JOS API里面有兩種參數大類,一個是系統參數,即APP Key、Token這些驗證信息,這是所有API都通用的,另一個是應用參數,即不同API它有自己的參數列表。
系統參數有下面這些:
名稱 |
類型 |
必須 |
描述 |
method |
String |
是 |
API接口名稱 |
access_token |
String |
是 |
采用OAuth授權方式為必填參數 |
app_key |
String |
是 |
應用的app_key |
sign |
String |
是 |
簽名 |
timestamp |
String |
是 |
時間戳,格式為yyyy-MM-ddHH:mm:ss,例如:2011-06-16 13:23:30。京東API服務端允許客戶端請求時間誤差為6分鍾 |
v |
String |
是 |
API協議版本,可選值:2.0. |
其中的method參數為API接口的名稱,京東聯盟API接口的名稱是:
jingdong.service.promotion.getcode
sign參數是對完整的請求鏈接md5加密后的字符串,加密規則如下:
- 所有參數名稱按字母先后排序
- 將參數名與參數值拼起來,去掉&和=兩個字符
- 在第2步中得到的字符串兩端拼上App Secret值
- 對第3步中得到的字符串計算md5
- 把計算得到的MD5值轉為大寫形式
- 最后這個大寫的MD5值即為我們要使用的sign參數的值
京東聯盟API接口的應用參數有下面這些:
名稱 | 類型 | 必須 | 示例值 | 描述 |
promotionType | Number | 是 | 7 | 推廣類型 1:商品推廣,2:店鋪推廣,3:專櫃推廣,4:頻道推廣,7:自定義推廣 系統目前暫時只支持自定義推廣。 |
materialId | String | 是 | http://www.jd.com | 物料ID 1、推廣類型是商品推廣,推廣物料ID對應着”skuid” 2、推廣類型為店鋪推廣,推廣物料ID對應着”shopID” 3、推廣類型為頻道頁推廣,推廣物料ID對應着”頻道頁類目ID” 4、推廣類型為自定義推廣時,則該物料ID對應着”着陸頁URL” 5、推廣類型為專櫃推廣時,則該物料ID對應着“類目ID_類目ID_類目ID…” |
unionId | Number | 是 | 聯盟ID(京東客ID) | |
subUnionId | String | 否 | 子聯盟Id(不能超過16個字符) | |
siteSize | String | 否 | 推廣位尺寸,具體尺寸見FQA | |
siteId | String | 否 | 推廣位ID | |
channel | String | 是 | 推廣渠道 PC:pc推廣,WL:無線推廣 | |
webId | String | 是 | 網站ID | |
extendId | String | 否 | 擴展ID | |
ext1 | String | 否 | 擴展字段1 |
promotionType參數這里目前只支持自定義推廣,值為7。
materiaId參數為我們需要轉換的京東網站鏈接(推廣類型4,自定義推廣),比如京東首頁。
unionID參數為您的京東聯盟帳號的ID,這個可以登錄京東聯盟網站后查看到。
webId參數為您在京東聯盟網站注冊的網站編號,也可以在聯盟網站上找到。
知道這些參數后,我們需要開始構建請求的鏈接了。
首先應用參數在使用時需要構建成json格式拼接在BaseUrl上,使用的參數名叫:
360buy_param_json
php實例:
$_360buy_param_json = '{"channel":"'.$channel.'","materialId":"'.$sourceurl.'","promotionType":'.$type.',"unionId":"'.$unionId.'", "webId":"'.$webId.'"}';
現在根據以上系統和應用參數信息,拼接成完整的請求鏈接,使用瀏覽器請求即可,返回的格式是json。
下面是我寫好的php代碼:
<?php $sourceurl = $_GET["u"]; if($sourceurl == ""){ echo "error:請輸入url參數"; exit(); } $method = "jingdong.service.promotion.getcode"; $channel = "PC"; $type = 7; $unionId = "您的京東聯盟ID"; $webId = "您在京東聯盟注冊的網站的ID"; $token = "您的Token"; $appkey = "您的APPKey"; $appSecret = "您的APPSecret"; $v = "2.0"; $time = date('Y-m-d H:i:s',time()); $baseurl = "https://api.jd.com/routerjson?"; //應用參數,json格式 $_360buy_param_json = '{"channel":"'.$channel.'","materialId":"'.$sourceurl.'","promotionType":'.$type.',"unionId":"'.$unionId.'", "webId":"'.$webId.'"}'; //系統參數 $fields = [ "360buy_param_json" => urlencode($_360buy_param_json), "access_token" => urlencode($token), "app_key" => urlencode($appkey), "method" => urlencode($method), "timestamp" => urlencode($time), "v" => urlencode($v) ]; $fields_string = ""; //用來計算md5,以appSecret開頭 $_tempString = $appSecret; foreach($fields as $key=>$value) { //直接將參數和值拼在一起 $_tempString .= $key.$value; //作為url參數的字符串 $fields_string .= $key.'='.$value.'&'; } //最后再拼上appSecret $_tempString .= $appSecret; //計算md5,然后轉為大寫,sign參數作為url中的最后一個參數 $sign = strtoupper(md5($_tempString)); //加到最后 $fields_string .= ("sign=".$sign); //最終請求的url $link = $baseurl.$fields_string; //發送get請求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $link); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); //轉換為json $jsonArray = json_decode($result,true); $queryjs_result= $jsonArray["jingdong_service_promotion_getcode_responce"]["queryjs_result"]; $url = json_decode($queryjs_result,true); echo urldecode($url["url"]); ?>
修改文件中的幾個參數值,然后訪問這個php文件,帶上參數:u=京東鏈接(比如u=http://www.jd.com)。
最后頁面將直接輸出union打頭的推廣鏈接。
結束
到目前為止,我們已經有了一個php文件,通過參數u=京東鏈接形式,即可快速的得到推廣鏈接。
注意,得到推廣鏈接,直接訪問它是沒有任何效果的,需要將鏈接添加在京東聯盟注冊的網站中去,從這個網站點擊跳轉才能生效。