上周,公司有将京东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;
}
}