2017年1月5日 星期四

用資料用JSON編碼搭配POST方式的交換機制~備忘

與異質平台整合(如金流)碰上資料交遞上的方法,有時資料封裝得做JSON編碼不是直接參數名送出,因此寫個MEMO幫助記憶...

傳送時...

1. 首先是資料傳遞的FUNC ,$Url是目的地、$post就是交換的資料,若要改成GET則調整CURLOPT_CUSTOMREQUEST設定即可。timeout時間故意調長,因為碰上timeout錯誤時很殘念的。

function PostData($Url, $post){
 $ch = curl_init($Url);
 $headers = array(
   'Content-Length:'.strlen($post),
   'Content-type: application/json'
 );
 //print_r($headers);
 $options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => 1,
CURLOPT_CUSTOMREQUEST=>"POST", 
CURLOPT_POSTFIELDS=> $post,
CURLOPT_HTTPHEADER=> $headers,
CURLOPT_TIMEOUT=>500,
CURLOPT_CONNECTTIMEOUT=>5
 );
 curl_setopt_array($ch, $options);
 $result = curl_exec($ch);
 if(curl_errno($ch)!=0){
  trigger_error(curl_error($ch));
 }
 curl_close($ch);
 return $result;
}

2. 傳遞參數封裝,做成陣列即可...弄複雜些給個陣列包陣列的sample

$params_data = array( 
 'order_no' =>  $order_no,
 'amt' =>  $amt,
 'result_url' =>  $result_url
);

$order_data = array (
 'sender' => "rest",
 'ver' => "1.0.0",
 'tx_type' => 1,
 'params' => $params_data 
);

3. 開始傳遞
PostData($URL, json_encode($order_data));

接收時....

1. 首先...因為不知道傳回來的是啥變數名,只知道是個JSON串,所以通通一起收php://input是蠻方便的方式。
$post_data = file_get_contents("php://input");

2. 拆解JSON取得資料,原則上卡關較久的是array裡面的array資料讀取。
$j_result = json_decode($post_data);
$data = array(
   'order_no'=> $j_result->params->order_no,
   'sender'=> $j_result->sender,
 );