ThinkPHP5.1對接京東官方SDK,解密訂單敏感信息

上周,公司有將京東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;

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容