對接介面(同步資料,上傳資料)
阿新 • • 發佈:2019-01-28
目的:一個按鈕,點選按鈕,將該條資料的相關資訊組裝好後,去請求另一個系統的介面,以達到新增資料(同步資料)到另一個系統上去,簡單的說,也就是將一個系統的資料同步到另一個系統上面的操作
步驟一:上傳資料的方法編寫,查詢資料,組裝必須資料,資料驗證,放入介面方法,驗證返回的資訊,判斷並輸出到瀏覽器中
程式碼如下:
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;
}
步驟五:洗洗睡。。。