上周脊奋,公司有將京東POP店庫(kù)存和訂單對(duì)接到公司ERP的需求蘸鲸。京東最近搞了個(gè)云鼎艾岂,看介紹是非常的最高最強(qiáng)賽高,于是買云服務(wù)器枢赔,買RDS,一頓操作猛如虎拥知。
直接使用官方SDK踏拜,很快就可以調(diào)通庫(kù)存和訂單API接口的功能。但是訂單的收件人姓名低剔,手機(jī)速梗,詳細(xì)地址等信息是加密的肮塞。
這個(gè)解密操作官方的說明文檔完全就沒講怎么集成SDK。只能自己摸索了姻锁,SDK包依賴的日志模塊Monolog和JsonMapper需要自己下載枕赵。
(PS:可能可以用composer.json直接composer update更精確的引用,但是SDK包使用的lotus框架位隶,根本沒聽過拷窜,我沒辦法單獨(dú) 運(yùn)行起來,汗)
解密功能在獨(dú)立應(yīng)用里涧黄,是跑在鼎內(nèi)云服務(wù)器的篮昧,一開始用的TP3.2,
連續(xù)加班一個(gè)星期笋妥,調(diào)試SDK包源碼懊昨,引依賴文件,各種人不寐春宣,人憔悴酵颁,什么反射try catch,我都耍的有模有樣信认,各種依賴關(guān)系實(shí)在沒法搞材义。
所以我改用TP5.1,
1嫁赏、下載PSR3: https://github.com/php-fig/log? ? log-master.zip解壓后只要Psr文件夾
2其掂、下載monolog: https://github.com/Seldaek/monolog? 解壓后只需要monolog-master\src\下的Monolog文件夾
3、JsonMapper下載鏈接https://github.com/cweiske/jsonmapper
據(jù)說1和2要搭配使用潦蝇,具體解釋看這篇博客款熬,感謝博主https://blog.csdn.net/edu_enth/article/details/53115095
(源碼不動(dòng),應(yīng)該只是外圍的類庫(kù)的依賴問題攘乒。這里就體現(xiàn)了composer這個(gè)工具的大用處了贤牛,優(yōu)雅的搬磚還得靠它。)
終于周末有了成果则酝,可是有時(shí)能解密殉簸,有時(shí)會(huì)報(bào)錯(cuò)。還是很蛋疼啊沽讹,這算個(gè)什么事般卑。
一個(gè)晚上,我突然來了點(diǎn)靈感爽雄。
官方下載的PHP版的SDK目錄如下
打開入口文件蝠检,注釋很清晰
有幾點(diǎn)需要說下
1緩存目錄,自己自定義的目錄一定要給寫入權(quán)限
2關(guān)鍵是這一句挚瘟,這里定義了自動(dòng)加載的路徑叹谁,就是說這個(gè)目錄中的類可以被框架自動(dòng)加載到饲梭,不會(huì)出現(xiàn)找不到類的問題,也不用一直require了焰檩。自動(dòng)加載類據(jù)說是比較新的PHP框架的標(biāo)配憔涉。
從$lotus->init初始化框架這里進(jìn)去可以看到如下圖所示,
這里只有jd文件夾的自動(dòng)加載锅尘,并無security监氢,看來,security并不依賴于這個(gè)lotus框架藤违。
既然Lotus框架的自動(dòng)加載autoloader那么不給力(也許是我不會(huì)改)浪腐,我試過在lotus框架的自動(dòng)加載類路徑數(shù)組里把security加進(jìn)去,并卵顿乒,干脆就用TP5.1的吧议街。
于是我把security文件夾移出來了,和SDK包平級(jí)璧榄。lotus這個(gè)文件夾名字你可以隨便取特漩,只要引入的時(shí)候?qū)?yīng)就可以。原security文件夾我之所以改名ACES是因?yàn)檫@個(gè)是TDEClient類的命名空間骨杂,必須叫這個(gè)名涂身,不然在控制器里無法引用。
這樣之后搓蚪,終于可以順利解鎖了蛤售。從這個(gè)事之后,我決定好好啃一下TP5.1和6的源代碼妒潭。
容我裝個(gè)逼說一句
成功很多時(shí)候真的是無心插柳悴能。跳出系統(tǒng),才能測(cè)量系統(tǒng)雳灾。
下面是我的SDK入口文件漠酿,改了個(gè)緩存路徑,去掉了后面的示例代碼谎亩。
控制器代碼
關(guān)鍵是正確引入SDK入口文件
$extend = Env::get('root_path') . 'extend';
require_once($extend.DIRECTORY_SEPARATOR.'lotus'.DIRECTORY_SEPARATOR.'JdSdk.php');
namespace app\index\controller;
use think\Request;
use think\Facade\Env;
use ACES;
class Jingdong{
? ? /**
? ? * @var \think\Request Request實(shí)例
? ? */
? ? protected $request;
? ? public $c;
? ? public function __construct(Request $request) {
? ? ? ? $this->app_key = " ";? ? ? ? ? ? // 京東app_key
? ? ? ? $this->app_secret = " ";? ? ? ? // 京東app_secret
? ? ? ? $this->app_url = "https://api.jd.com/routerjson";? ? // 基礎(chǔ)地址
? ? ? ? $this->redirect_url = '';? // 應(yīng)用回調(diào)地址
? ? ? ? $this->access_token= '';
? ? ? ? $this->request = $request;
? ? ? ? $extend = Env::get('root_path') . 'extend';
? ? ? ? require_once($extend.DIRECTORY_SEPARATOR.'lotus'.DIRECTORY_SEPARATOR.'JdSdk.php');
? ? ? ? $this->c = $this->initJdClient();
}
? ? public function index() {
? ? ? ? return "靜水流深炒嘲,不動(dòng)如山";
}
? ? // 初始化JdClient類
? ? private function initJdClient() {
? ? ? ? $adc = new \JdClient();
? ? ? ? $adc->appKey = $this->app_key;
? ? ? ? $adc->appSecret = $this->app_secret;
? ? ? ? $adc->accessToken = $this->access_token;
? ? ? ? $adc->serverUrl = $this->app_url;
? ? ? ? return $adc;
}
// 解密方法
public function myDecrypt() {
? ? $pt = "AAT5U8PDOI0CURMWbSo35WHoAhD9zEQiElixYRYbofkRAADK3DFayiQ/g0Nd0DpbGeY="
? ? $tde = ACES\TDEClient::getInstance($this->access_token, $this->app_key, $this->app_secret);
? ? $decrypted = $tde->decrypt($pt);
? ? return $decrypted;
}
// 加密方法
public function myEncrypt() {
? ? $pt = fz0317;
? ? $tde = ACES\TDEClient::getInstance($this->access_token, $this->app_key, $this->app_secret);
? ? $encrypted = $tde->encrypt($pt);
? ? return $encrypted;
}
}