1. 程式人生 > >對接介面(同步資料,上傳資料)

對接介面(同步資料,上傳資料)

目的:一個按鈕,點選按鈕,將該條資料的相關資訊組裝好後,去請求另一個系統的介面,以達到新增資料(同步資料)到另一個系統上去,簡單的說,也就是將一個系統的資料同步到另一個系統上面的操作

步驟一:上傳資料的方法編寫,查詢資料,組裝必須資料,資料驗證,放入介面方法,驗證返回的資訊,判斷並輸出到瀏覽器中

程式碼如下:

 public function uploadActHowjia(){

        $dataApiService = new DataApiService();
        // 組裝門店必要的資料
        $id     = trim( input('id','','intval') );
        $act_id = trim( input('act_id','','intval') );
        //檢查是否通過稽核
        //$check_status   = Db::name('activity_shop')->where('id',$id)->value('status');
        $check_status   = shopModel::getActivityShopStatusValue($id);
        if( $check_status == 5){
            $this->error('已上傳!不能再上傳');
        }
        if( $check_status != 3){
            $this->error('相關資訊尚未通過稽核!');
        }
        $m_id   = shopModel::getValueByIdAndActId($id,$act_id);
        $shop   = shopModel::getInfoByIdAndActId($id,$act_id);
        if(!$shop){
            $this->error('活動門店不存在!');
        }
        //查詢該活動門店的活動產品上傳到好家網
        $good = shopModel::getInfosByMidAndActId($m_id,$act_id);
        if(!$good){
            $this->error('活動產品不存在!');
        }
        //查詢該門店活動的活動優惠券
        $coupon = ActivityCoupon::getInfosByActIdAndMid($m_id,$act_id);
        if(!$coupon){
            $this->error('活動優惠券不存在!');
        }

        //上傳活動門店
        $data_shop=array();
        $data_shop['act_id']   = trim( $shop['act_id'] ) ;                  //活動ID(必須)
        $data_shop['cat_id']   = trim( $shop['cat_id'] ) ;                  //門店分類ID(必須)
        $data_shop['shop_id']  = 0 ;                                        //對應集店網ID(必須)(暫定先為0)
        $data_shop['shop_name']    = trim( $shop['shop_name'] );            //商家名稱(必須)
        $data_shop['shop_logo']    = trim( $shop['shop_logo'] );            //門店LOGO(必須)
        $data_shop['description']  = trim( $shop['description'] );
        $data_shop['keywords']     = trim( $shop['keywords'] );
        $data_shop['content']      = trim( $shop['content'] );
        $shopValidate  = Loader::validate('ActivityShop');
        if(!$shopValidate->scene('add')->check($data_shop)){
            $this->error('活動門店新增資料有誤,'.$shopValidate->getError());
        }
            $s_data = $dataApiService->addActShop($data_shop);
            if($s_data['code'] != 200){
                $this->error($s_data['msg']);
            }
            //上傳活動產品
            foreach( $good as $k=>$v ){
                $data_product = array();
                $data_product['act_id']     = trim( $good[$k]['act_id'] );         //活動id(必須)
                $data_product['pro_title']  = trim( $good[$k]['pro_title'] );      //產品標題(必須)
                $data_product['cat_id']     = trim( $good[$k]['cat_id'] );         //產品分類id(必須)
                $data_product['pro_attr'][] = trim( $good[$k]['pro_attr'] );       //產品標籤(必須)
                $data_product['shopid']     = $id;                                 //好家網活動商家id(必須)
                $data_product['pro_pic']    = trim( $good[$k]['pro_pic'] );        //產品圖片地址(必須)
                $data_product['market_price']      = trim( $good[$k]['market_price'] );
                $data_product['advance_amount']    = trim( $good[$k]['price'] );
                $data_product['pro_dec']    = trim( $good[$k]['pro_dec']);
                $data_product['content']    = trim( $good[$k]['content'] );
                //驗證資料
                $productValidate = Loader::validate('ActivityProduct');
                if(!$productValidate->scene('add')->check($data_product)){
                    $this->error('活動產品新增資料有誤,'.$productValidate->getError());
                }
                $p_data=$dataApiService->addActProduct($data_product);

                if($p_data['code'] != 200){
                    $this->error($p_data['msg']);
                }
            }
            //上傳優惠券
            foreach( $coupon as $k=>$v ){
                $data_coupon=array();
                $data_coupon['act_id']       = trim( $coupon[$k]['act_id'] );
                $data_coupon['shop_id']      = $id;
                $data_coupon['co_name']      = trim( $coupon[$k]['co_name']);
                $data_coupon['co_description'] = trim( $coupon[$k]['co_description']);
                $data_coupon['co_content']   = trim( $coupon[$k]['co_content'] );
                $data_coupon['co_price']     = trim( $coupon[$k]['co_price'] );
                $data_coupon['co_sms_content'] = trim( $coupon[$k]['co_sms_content'] );
                $data_coupon['co_amount']    = trim( $coupon[$k]['co_amount'] );
                $data_coupon['co_starttime'] = $coupon[$k]['start_time'];
                $data_coupon['co_endtime']   = $coupon[$k]['end_time'];
                $data_coupon['starttime']    = $coupon[$k]['start_time'];
                $data_coupon['endtime']      = $coupon[$k]['end_time'];

                //驗證資料
                $couponValidate = Loader::validate('ActivityCoupon');
                if(!$couponValidate->scene('add')->check($data_coupon)){
                    $this->error('優惠券新增資料有誤,'.$couponValidate->getError());
                }
                $c_data=$dataApiService->addActCoupon($data_coupon);
                if($c_data['code'] != 200){
                    $this->error($c_data['msg']);
                }
            }
        $data['status'] = 5;
        $res            = shopModel::updateOneActivityShopById($id,$data);
        if($res){
            $this->success('上傳成功!');
        }else{
            $this->error('上傳失敗!');
        }
    }

步驟二:步驟一就是基本的流程,裡面的addActProduct(),addActProduct,addActCoupon()方法主要是介面的一些必要資料處理,主要是組裝好介面的地址和需要新增的資料

/**
	 * 上傳活動門店
	 * @param $post_data
	 * @return array
	 */
	public function addActShop($post_data){
		$_url=config('post_act_url');
		$_url.='Activityshop/addshop';//新增門店的
        return $this->requestData($_url,$post_data);
	}

	/**
	 * 上傳產品
	 * @param $post_data
	 * @return array
	 */
	public function addActProduct($post_data){
		$_url=config('post_act_url');
		$_url.='Activityproduct/addProduct';//新增產品的
		return $this->requestData($_url,$post_data);
	}

	/**
	 * 上傳優惠券
	 * @param $post_data
	 * @return array
	 */
	public function addActCoupon($post_data){
		$_url=config('post_act_url');
		$_url.='ActivityCoupon/addcoupon';//新增優惠券的
		return $this->requestData($_url,$post_data);
	}

步驟三:統一的requestData()方法主要是處理介面返回的值的一些邏輯處理

	/**
	 * 組裝統一請求 TODO 可以用統一的,但是方便區分函式就用這樣的方式
	 * @param $_url
	 * @param $post_data
	 * @return array
	 */
	private function requestData($_url,$post_data){
		//生成簽名
		$r=self::makeSign();

		if (!isset($r['sign'])){
			$this->return_data['msg']='生成簽名失敗';
			return $this->return_data;
		}
		$_url.=("?sign=".$r['sign']."&t=".$r['timestamp']);
		$r_data = self::httpPost($_url,$post_data);
        $jsondata=json_decode($r_data);

        if ($jsondata->code==200){
			$this->return_data['data']=$jsondata->data;
			$this->return_data['code']=200;
			$this->return_data['msg']='ok';
		}else {
			$this->return_data['data']=$jsondata->data;
			$this->return_data['code']=$jsondata->code;
			$this->return_data['msg']=$jsondata->message;
		}

		return $this->return_data;
	}
/**
	 * 生成簽名示例方法,建議自定義生成規則 (嚴格一點可以把每個請求連線 加入生成規則)
	 * @param $timestamp
	 * @param $api_key
	 * @return string
	 */
	private function makeSign(){
		$timestamp=time();
		$secert=config('myconfig.auth_api_key');
		$sign= md5($timestamp.$secert);
		$r['timestamp']=$timestamp;
		$r['sign']=$sign;
		return $r;
		
	}

步驟四:請求處理

/**
	 * 請求
	 * @param unknown $url
	 * @return mixed
	 */
	private function httpGet($url) {
	
		$ch = curl_init();
		
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
		//curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$temp = curl_exec($ch);
		return $temp;
	}


	/**
	 * 用post請求
	 * @param $url
	 * @param $post_data
	 * @return mixed
	 */
	private  function httpPost($url,$post_data){
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$temp = curl_exec($ch);
		return $temp;
	}

步驟五:洗洗睡。。。