微擎 人人商城 对接京东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 条 正在同步 ,简单观察了两个数据

 

 

 

 

 

 

按照这样的话,两个地址出现名称不一样的情况,后面就很难做到匹配, 于是尝试了一下,京东自动匹配地址,发现匹配准确度挺高,这样的话,就准备把京东自动匹配的地址作为首选项,如下图

   接下来准备使用这种自动匹配的地址,然后导入到本地的地址作为备用。

   

posted @ 2019-09-06 09:24  飘柔2019  阅读(2142)  评论(0编辑  收藏  举报