一个旅游网站项目,网站需要机票预订接入了天巡机票接口,获取机票信息,不搞不知道,一搞吓一跳比较麻烦。

搜索机票信息需要分2步,首先POST获得一个SESSION,2秒之后,根据这个SESSION,从一个URL GET 数据 ,并且需要多次GET,这里就用AJXA轮询,

直到返回的GET数据状态为 完成,即可停止轮询。

轮询获取数据之后,还需要自己整理才可显示在网页上,

上PHP代码,,THINKPHP框架代码

 <?php
namespace Home\Controller;
use Think\Controller; class FlyController extends \Home\Classes\ConfController {
public function index(){
$title = $this->title[1];
$keyword = $this->keyword[1];
$desc = $this->desc[1];
$title = str_replace('{lei_name}','机票',$title);
$title = str_replace('{site_name}',$this->site_name,$title);
$this->assign('title',$title);
$this->assign('keyword',$keyword);
$this->assign('desc',$desc);
$this->display();
}
public function piao(){
$post_data = I('post.');
// P($post_data);die;
$url = "http://partners.api.skyscanner.net/apiservices/pricing/v1.0";
// $url = "http://business.skyscanner.net/apiservices/pricing/v1.0";
$title = $this->title[1];
$keyword = $this->keyword[1];
$desc = $this->desc[1];
$title = str_replace('{lei_name}','机票',$title);
$title = str_replace('{site_name}',$this->site_name,$title);
$this->assign('title',$title);
$this->assign('keyword',$keyword);
$this->assign('desc',$desc);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
//print_r($output);
$sessions = between($output,'sg1/v1.0/','Content-Length');
//echo $sessions;
$this->assign('sessions',$sessions);
$this->assign('apikey',$post_data['apikey']);
// echo $sessions. '---'.$post_data['apikey'];
$u = U('home/fly/lun',array('b'=>$sessions,'k'=>$post_data['apikey'],'t'=>$post_data['types'],'h'=>$post_data['h']));
exit(json_encode(array('u'=>$u)));
//echo $u;
$this->assign('u',$u);
$this->assign('post_data',$post_data); $this->display('index');
} public function lun(){
$s = trim($_GET['b']);
$a = trim($_GET['k']);
$t = trim($_GET['t']);
$h = trim($_GET['h']);//h=1表示,第2次,搜索回程
$url = "http://partners.api.skyscanner.net/apiservices/pricing/v1.0/$s?apiKey=$a&mj=".time();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
$output = curl_exec($ch);
curl_close($ch);
///print_r($output);
file_put_contents('mp_'.$t.'.txt',$output);
$j_array = json_decode($output,true);
//往返
if ($t == 2)
{
$j = $this->_outhui($j_array) ;
}else{
$j = $this->_out($j_array) ;
} $jie['Status'] = $j_array['Status']; $total_price_ci = $j['total_price_ci']; unset($j['total_price_ci']);
//P($j); die;
if (count($j_array['Itineraries']) < 2)
{
$jie['g'] = 0;
} $this->assign('h',$h);
$this->assign('piao',$j);
$this->assign('total_price_ci',$total_price_ci); //往返
if ($t == 2)
{
$jie['html'] = $this->fetch('ji2');
}else{
$jie['html'] = $this->fetch('ji');
}
//
exit(json_encode($jie));
}
//单程测试
public function jt(){
$json = file_get_contents('mp_3.txt');
$output = json_decode($json,true); $j = $this->_out($output,0) ;
//循环 Legs $total_price_ci = $j['total_price_ci']; unset($j['total_price_ci']); $this->assign('piao',$j);
$this->assign('total_price_ci',$total_price_ci); $this->display();
}
//往返测试
public function jb(){
$json = file_get_contents('mp_1480656765.txt');
$output = json_decode($json,true); $j = $this->_outhui($output,0) ;
//循环 Legs $total_price_ci = $j['total_price_ci']; unset($j['total_price_ci']); $this->assign('piao',$j);
$this->assign('total_price_ci',$total_price_ci); $this->display();
}
public function showa(){
echo 'showa';
}
private function _outhui(&$output,$shu=1){
$j = array();
foreach($output['Itineraries'] as $v){
$tmp['qu']['id'] = $v['OutboundLegId'];
$tmp['hui']['id'] = $v['InboundLegId'];
$tmp['Itineraries'] = $v;
foreach($output['Legs'] as $va){
if ($va['Id'] == $tmp['qu']['id'])
{
$tmp['qu']['legs'] = $va;
}
if ($va['Id'] == $tmp['hui']['id'])
{
$tmp['hui']['legs'] = $va;
}
} foreach($output['Carriers'] as $vb ){
if ($tmp['qu']['legs']['Carriers']['0'] == $vb['Id'])
{
$tmp['qu']['Carriers'] = $vb;
}
if ($tmp['hui']['legs']['Carriers']['0'] == $vb['Id'])
{
$tmp['hui']['Carriers'] = $vb;
}
}
//出发地信息Places
foreach($output['Places'] as $vc){
if ($tmp['qu']['legs']['OriginStation'] == $vc['Id'])
{
$tmp['qu']['palce'] = $vc;
}
if ($tmp['hui']['legs']['OriginStation'] == $vc['Id'])
{
$tmp['hui']['palce'] = $vc;
}
}
//目的地信息Places
foreach($output['Places'] as $vb){
if ($tmp['qu']['legs']['DestinationStation'] == $vb['Id'])
{
$tmp['qu']['palce_b'] = $vb;
}
if ($tmp['hui']['legs']['DestinationStation'] == $vb['Id'])
{
$tmp['hui']['palce_b'] = $vb;
}
} foreach($tmp['Itineraries']['PricingOptions'] as &$vd){
foreach($output['Agents'] as $va){
if ($vd['Agents'][0] == $va['Id'])
{
$vd['lai'] = $va;
}
}
} $j[] = $tmp;
} $total_price_ci = 0;
foreach($j as &$v){
$total_price_ci += count($v['Itineraries']['PricingOptions']);
}
//P($j);
$j['total_price_ci'] = $total_price_ci ;
return $j;
}
private function _out(&$output,$shu=2){
$j = array();
foreach($output['Legs'] as $v){
$tmp['legs'] = $v;
//循环查找 Carriers
foreach($output['Carriers'] as $va){
if ($v['Carriers']['0'] == $va['Id'])
{
$tmp['Carriers'] = $va;
}
} //循环查找 Itineraries
foreach($output['Itineraries'] as $vi){
if ($v['Id'] == $vi['OutboundLegId'])
{
$tmp['Itineraries'] = $vi;
}
} //出发地信息Places
foreach($output['Places'] as $va){
if ($v['OriginStation'] == $va['Id'])
{
$tmp['from'] = $va;
}
}
//目的地信息Places
foreach($output['Places'] as $vb){
if ($v['DestinationStation'] == $vb['Id'])
{
$tmp['to'] = $vb;
}
} if (count($tmp['Itineraries']['PricingOptions']) > $shu)
{
$j[]= $tmp;
} } $total_price_ci = 0;
foreach($j as &$v){
$total_price_ci += count($v['Itineraries']['PricingOptions']);
foreach($v['Itineraries']['PricingOptions'] as &$vb){
foreach($output['Agents'] as $va){
if ($vb['Agents'][0] == $va['Id'])
{
$vb['lai'] = $va;
}
}
}
}
//P($j);
$j['total_price_ci'] = $total_price_ci ;
return $j;
}
}

演示网址:

http://lv.226660.pw/index.php/fly/index.html

PHP 天巡机票接口的更多相关文章

  1. 51book机票接口对接,吐血整理(含PHP封装代码)

    前言 最近在对接51book的机票接口,遇到了挺多坑,所以整理一份作为记录 机票有两个不同的接口,一个是机票,另一个是保险 一.申请 要接51book的机票,首先是要申请账号,这时候应该是有客户经理跟 ...

  2. C#开发微信门户及应用(31)--微信语义理解接口的实现和处理

    微信语义理解接口提供从用户自然语言输入到结构化解析的技术实现,使用先进的自然语言处理技术给开发者提供一站式的语义解析方案.该平台覆盖多个垂直领域的语义场景,部分领域还可以支持取得最终的展示结果.开发者 ...

  3. 关于一个每天请求50W次接口的设计实现过程

    从大学开始关注博客园,到工作之后注册了博客园账号,直至今日终于能够静下心来将自己个人的所学,所得,所悟能够分享出来与大家分享,好开心~ 言归正传,需求背景是博主所在的公司为一个在线OTA公司,客户端上 ...

  4. 火车车次查询-余票查询--Api接口

    1.来自12306的火车车次数据 使用12306网站的接口,查询余票.此接口采集自 这里. 全国火车站代号字典,下载 . 火车票余票查询 http://dynamic.12306.cn/otsquer ...

  5. 一个用js写的接口http调试程序

    公司有非常多手机app的项目.手机app又要常常訪问后台提交与查询数据. 所曾经端app与后台的开发与測试过程中接口调试是一个常常要做的工作. 而每当出现一个BUG,前端appproject师与后台p ...

  6. IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...

  7. 巡风源码阅读与分析---view.py

    巡风xunfeng----巡风源码阅读与分析 巡风是一款适用于企业内网的漏洞快速应急.巡航扫描系统,通过搜索功能可清晰的了解内部网络资产分布情况,并且可指定漏洞插件对搜索结果进行快速漏洞检测并输出结果 ...

  8. 接口性能测试(Jmeter)操作总结

    以前常用SoapUI来做接口的性能测试,这次用的Jmeter,对需由客户端根据时间戳等登录参数生成随机token值和印签值来发请求的系统,非它莫属了.下面就这次测试的难点和操作注意问题展开总结. ** ...

  9. c#之字符串,列表,接口,队列,栈,多态

    1.字符串的用法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

随机推荐

  1. Two Sum Leetcode Java

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  2. 【转载总结】jQuery和HTML5全屏焦点图

    选项设置与说明 Slider Revolution提供了很多参数选项设置: delay: 滑动内容停留时间.默认9000毫秒 startheight: 滑动内容高度,默认490像素. startwid ...

  3. python3 黑板客爬虫闯关游戏(二)

    第二关猜登录密码,需要用到urllib.request和urllib.parse 也很简单,给代码 import urllib.request as ur import urllib.parse as ...

  4. nginx配置文件或目录404和403

    对于Nginx web目录下的文件,如果不想用户访问那么可以配置返回404或者403状态,默认情况下对于目录来说,如果目录下没有默认文档,那么默认返回是403,也就是不允许查看目录列表,但是如果知道静 ...

  5. 在测试框架中使用Log4J 2

    之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecr ...

  6. Angular2 模板语法

    1. 说明 Angular2的模板用来显示组件外观,作为视图所用,用法和html语法基本一致,最简单的Angular2的模板就是一段html代码.Angular模板语法主要包括以下几个部分: l 直接 ...

  7. .NET LINQ 生成操作

    生成操作      生成是指创建新的值序列. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 DefaultIfEmpty 将空集合替换为具有默认值的单一 ...

  8. spring+IOC+DI+AOP优点分析(一)

    Spring是什么: Spring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于sprin ...

  9. Modbus总线CRC16效验算法C语言

    unsigned short CRC16_Modbus ( unsigned char *pdata, int len){ unsigned short crc=0xFFFF; int i, j; f ...

  10. Android -- 案例学习积累

    Theme ActionBar / ToolBar android.support.design.widget.CollapsingToolbarLayout android.support.desi ...