ThinkPHP5.1对接京东官方SDK,解密订单敏感信息

上周,公司有将京东POP店库存和订单对接到公司ERP的需求。京东最近搞了个云鼎,看介绍是非常的最高最强赛高,于是买云服务器,买RDS,一顿操作猛如虎。

直接使用官方SDK,很快就可以调通库存和订单API接口的功能。但是订单的收件人姓名,手机,详细地址等信息是加密的。

这个解密操作官方的说明文档完全就没讲怎么集成SDK。只能自己摸索了,SDK包依赖的日志模块Monolog和JsonMapper需要自己下载。

(PS:可能可以用composer.json直接composer update更精确的引用,但是SDK包使用的lotus框架,根本没听过,我没办法单独 运行起来,汗)

解密功能在独立应用里,是跑在鼎内云服务器的,一开始用的TP3.2,

连续加班一个星期,调试SDK包源码,引依赖文件,各种人不寐,人憔悴,什么反射try catch,我都耍的有模有样,各种依赖关系实在没法搞。

所以我改用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

据说1和2要搭配使用,具体解释看这篇博客,感谢博主https://blog.csdn.net/edu_enth/article/details/53115095

(源码不动,应该只是外围的类库的依赖问题。这里就体现了composer这个工具的大用处了,优雅的搬砖还得靠它。)

终于周末有了成果,可是有时能解密,有时会报错。还是很蛋疼啊,这算个什么事。

一个晚上,我突然来了点灵感。

官方下载的PHP版的SDK目录如下



打开入口文件,注释很清晰

有几点需要说下

1缓存目录,自己自定义的目录一定要给写入权限


缓存目录


2关键是这一句,这里定义了自动加载的路径,就是说这个目录中的类可以被框架自动加载到,不会出现找不到类的问题,也不用一直require了。自动加载类据说是比较新的PHP框架的标配。

从$lotus->init初始化框架这里进去可以看到如下图所示,

这里只有jd文件夹的自动加载,并无security,看来,security并不依赖于这个lotus框架。

既然Lotus框架的自动加载autoloader那么不给力(也许是我不会改),我试过在lotus框架的自动加载类路径数组里把security加进去,并卵,干脆就用TP5.1的吧。

于是我把security文件夹移出来了,和SDK包平级。lotus这个文件夹名字你可以随便取,只要引入的时候对应就可以。原security文件夹我之所以改名ACES是因为这个是TDEClient类的命名空间,必须叫这个名,不然在控制器里无法引用。


这样之后,终于可以顺利解锁了。从这个事之后,我决定好好啃一下TP5.1和6的源代码。

容我装个逼说一句

成功很多时候真的是无心插柳。跳出系统,才能测量系统。

下面是我的SDK入口文件,改了个缓存路径,去掉了后面的示例代码。


控制器代码

关键是正确引入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实例

    */

    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";    // 基础地址

        $this->redirect_url = '';  // 应用回调地址

        $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;

}

}

你可能感兴趣的:(ThinkPHP5.1对接京东官方SDK,解密订单敏感信息)