上周,公司有將京東POP店庫存和訂單對接到公司ERP的需求。京東最近搞了個云鼎,看介紹是非常的最高最強(qiáng)賽高,于是買云服務(wù)器,買RDS,一頓操作猛如虎。
直接使用官方SDK,很快就可以調(diào)通庫存和訂單API接口的功能。但是訂單的收件人姓名,手機(jī),詳細(xì)地址等信息是加密的。
這個解密操作官方的說明文檔完全就沒講怎么集成SDK。只能自己摸索了,SDK包依賴的日志模塊Monolog和JsonMapper需要自己下載。
(PS:可能可以用composer.json直接composer update更精確的引用,但是SDK包使用的lotus框架,根本沒聽過,我沒辦法單獨(dú) 運(yùn)行起來,汗)
解密功能在獨(dú)立應(yīng)用里,是跑在鼎內(nèi)云服務(wù)器的,一開始用的TP3.2,
連續(xù)加班一個星期,調(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
(源碼不動,應(yīng)該只是外圍的類庫的依賴問題。這里就體現(xiàn)了composer這個工具的大用處了,優(yōu)雅的搬磚還得靠它。)
終于周末有了成果,可是有時能解密,有時會報錯。還是很蛋疼啊,這算個什么事。
一個晚上,我突然來了點(diǎn)靈感。
官方下載的PHP版的SDK目錄如下
打開入口文件,注釋很清晰
有幾點(diǎn)需要說下
1緩存目錄,自己自定義的目錄一定要給寫入權(quán)限
2關(guān)鍵是這一句,這里定義了自動加載的路徑,就是說這個目錄中的類可以被框架自動加載到,不會出現(xiàn)找不到類的問題,也不用一直require了。自動加載類據(jù)說是比較新的PHP框架的標(biāo)配。
從$lotus->init初始化框架這里進(jìn)去可以看到如下圖所示,
這里只有jd文件夾的自動加載,并無security,看來,security并不依賴于這個lotus框架。
既然Lotus框架的自動加載autoloader那么不給力(也許是我不會改),我試過在lotus框架的自動加載類路徑數(shù)組里把security加進(jìn)去,并卵,干脆就用TP5.1的吧。
于是我把security文件夾移出來了,和SDK包平級。lotus這個文件夾名字你可以隨便取,只要引入的時候?qū)?yīng)就可以。原security文件夾我之所以改名ACES是因?yàn)檫@個是TDEClient類的命名空間,必須叫這個名,不然在控制器里無法引用。
這樣之后,終于可以順利解鎖了。從這個事之后,我決定好好啃一下TP5.1和6的源代碼。
容我裝個逼說一句
成功很多時候真的是無心插柳。跳出系統(tǒng),才能測量系統(tǒng)。
下面是我的SDK入口文件,改了個緩存路徑,去掉了后面的示例代碼。
控制器代碼
關(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 "靜水流深,不動如山";
}
? ? // 初始化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;
}
}