微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。(三) 地址对接
由于商品池暂未开通,于是先写地址对接模块,由于在提交订单的时候,京东收到的是一二三四级地址的代码(例如北京代码1),一二三四级分别是省市县街道等, 而我们商城有一套自己的地址省份图,切储存在js -_-||,不在数据库,难度增大一级,总的思路
接下来准备需要的数据
先准备对四级地址进行for循环写入数据库代码如下
控制器层:
/** * 更新1234级地址 * */ public function update(){ global $_W; global $_GPC; $accesstoken=pdo_fetch('select access_token from '.tablename('ewei_shop_jdvop').' where id =1'); $address=new AddressM(); for ($i=1;$i<=4;$i++){ $res=$address->updateAddress($accesstoken['access_token'],4); if ($res['error']==0){ continue; }else{ return $res; } }
model层
public function updateAddress($accesstoken,$type=1){ global $_W; switch ($type){ case 1: $this->url='https://bizapi.jd.com/api/area/getProvince'; $data=[ 'token'=>$accesstoken, ]; $resA=json_decode($this->postApi($this->url,$data),true); if (isset($resA['success'])&&$resA['success']!=true){ $res['error']=40001; $res['errorMsg']='获取一级地址失败'; }else{ $res['result']=$resA['result']; asort($res['result']); $res= $this->update($res['result'],$type); } return $res; break; case 2: $findOne=pdo_fetchall('select address_id from '.tablename('ewei_shop_jdvop_address').' where level=1 and uniacid=:uniacid',array(':uniacid'=>$_W['uniacid'])); if ($findOne){ $this->url='https://bizapi.jd.com/api/area/getCity'; foreach ($findOne as $key=>$value){ $data=[ 'token'=>$accesstoken, 'id'=>$value['address_id'], ]; $resA=json_decode($this->postApi($this->url,$data),true); if (isset($resA['success'])&&$resA['success']!=true){ $res['error']=40002; $res['errorMsg']='获取二级地址失败'; }else{ $res['result']=$resA['result']; asort($res['result']); $res= $this->update($res['result'],$type,$value['address_id']); } } }else{ $res['error']=40002; $res['errorMsg']='查询一级地址失败'; } return $res; break; case 3: $findTwo=pdo_fetchall('select address_id from '.tablename('ewei_shop_jdvop_address').' where level=2 and uniacid=:uniacid',array(':uniacid'=>$_W['uniacid'])); if ($findTwo){ $this->url='https://bizapi.jd.com/api/area/getCounty'; foreach ($findTwo as $key=>$value){ $data=[ 'token'=>$accesstoken, 'id'=>$value['address_id'], ]; $resA=json_decode($this->postApi($this->url,$data),true); if (isset($resA['success'])&&$resA['success']!=true){ $res['error']=40002; $res['errorMsg']='获取三级地址失败'; }else{ $res['result']=$resA['result']; asort($res['result']); $res= $this->update($res['result'],$type,$value['address_id']); } } }else{ $res['error']=40002; $res['errorMsg']='查询二级地址失败'; } return $res; break; case 4: $findTwo=pdo_fetchall('select address_id from '.tablename('ewei_shop_jdvop_address').' where level=3 and uniacid=:uniacid',array(':uniacid'=>$_W['uniacid'])); if ($findTwo){ $this->url='https://bizapi.jd.com/api/area/getTown'; foreach ($findTwo as $key=>$value){ $data=[ 'token'=>$accesstoken, 'id'=>$value['address_id'], ]; $resA=json_decode($this->postApi($this->url,$data),true); if (isset($resA['success'])&&$resA['success']!=true){ continue; }else{ $res['result']=$resA['result']; asort($res['result']); $res= $this->update($res['result'],$type,$value['address_id']); } } }else{ $res['error']=40002; $res['errorMsg']='查询三级地址失败'; } return $res; break; default: $res['error']=4000; $res['errorMsg']='传入地址级别错误,请检查'; return $res; break; }
但是在实际使用中却发现,效率很慢,其中三级和四级导入运行时间很长,即使把数据库相关字段加入索引,依旧很慢,经排查是在往京东发送查询信息的时候,以及返回耗时较长,这个就没办法优化了, 等待四级地址同步完成,
其中一级地址 34个 二级地址:457个 三级地址 5171个 四级地址 :43000 条 正在同步 ,简单观察了两个数据
按照这样的话,两个地址出现名称不一样的情况,后面就很难做到匹配, 于是尝试了一下,京东自动匹配地址,发现匹配准确度挺高,这样的话,就准备把京东自动匹配的地址作为首选项,如下图
接下来准备使用这种自动匹配的地址,然后导入到本地的地址作为备用。