-
Notifications
You must be signed in to change notification settings - Fork 2
/
eleme.clj
71 lines (63 loc) · 2.95 KB
/
eleme.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
(ns waimai.eleme
(:require [org.httpkit.client :as httpc]
[clojure.data.json :as json]
digest)
(:import [clojure.lang IPersistentMap]))
;(set! *warn-on-reflection* true)
(defn- ^{:tag IPersistentMap :static true} make-base-params
[^String appkey ^String action ^String token]
{:nop "1.0.0",
:id (clojure.string/lower-case (java.util.UUID/randomUUID))
:metas {:app_key appkey
:timestamp (quot (System/currentTimeMillis) 1000)}
:action action
:token token})
(defn- ^{:tag String :static true} make-sign
[^String secret ^IPersistentMap payload]
(let [joinstr (str (:action payload)
(:token payload)
(clojure.string/join ""
(sort (map (fn [[k v]] (str (name k) "=" (json/write-str
v
:escape-unicode false
:escape-slash false)))
(apply merge (vals (select-keys payload [:metas :params]))))))
secret)]
(-> joinstr (.getBytes "UTF-8") digest/md5 clojure.string/upper-case )))
(defn- ^{:tag IPersistentMap :static true} wrap-sign
[^IPersistentMap payload ^String secret]
(assoc payload :signature (make-sign secret payload)))
(defn ^{:static true} request
"饿了么的api接口"
[^String action params & {:keys [token app_key secret url]
:or {token (System/getProperty "waimai.eleme.token")
app_key (System/getProperty "waimai.eleme.app_key")
secret (System/getProperty "waimai.eleme.secret")
url (or (System/getProperty "waimai.eleme.api_url")
"https://open-api.shop.ele.me/api/v1/") }
:as opts}]
(let [payload (-> (make-base-params app_key action token)
(assoc :params (or params {}))
(wrap-sign secret))]
(httpc/request
(merge
{:method :post
:url url
:headers {"content-type" "application/json; charset=utf-8"}
:body (json/write-str payload) }
(dissoc opts :token :app_key :secret)))))
(defn ^{:static true} token
"获取token 刷新token"
[params & {:keys [app_key secret url]
:or {app_key (System/getProperty "waimai.eleme.app_key")
secret (System/getProperty "waimai.eleme.secret")
url (or (System/getProperty "waimai.eleme.token_url") "https://open-api.shop.ele.me/token")}
:as opts}]
(httpc/request
(merge
{:method :post
:url url
:headers {"content-type" "application/x-www-form-urlencoded"}
:basic-auth [app_key secret]
:form-params params}
(dissoc opts :app_key :secret))))