You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

739 lines
33 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
defined('BASEPATH') or exit('No direct script access allowed');
class Wechat_mp extends CI_Controller
{
// 服务号主体 'trippest'
private $wechat_host;
// 服务号的配置信息
private $wechat_config;
// 服务号账户
private $wechat_operator;
public function __construct()
{
parent::__construct();
$this->load->helper('url_helper');
$this->load->helper('device_helper');
$this->config->load("wechat", true);
$this->load->library('Wechat_lib');
$this->load->library('Bokun_lib');
$this->load->model('Order_model');
$this->load->model('Wechat_service_model');
header('Access-Control-Allow-Origin:*');
}
public function notice($wechat_host)
{
error_reporting(0);
$this->wechat_config = $this->config->item($wechat_host, 'wechat');
$this->wechat_host = $wechat_host;
$get_input = $this->input->get();
$raw_post_data = file_get_contents('php://input');
// empty POST data
if (empty($raw_post_data)) {
return $this->wechat_lib->auth_signature($get_input, $this->wechat_config['token']);
}
$raw_arr = $this->wechat_lib->from_xml($raw_post_data);
$this->wechat_operator = $raw_arr['ToUserName'];
$user_info = $this->Wechat_service_model->get_user(null, $this->wechat_config['app_id'], $raw_arr['FromUserName']);
$insert_db = array(
"wn_hostappid" => $this->wechat_config['app_id'], "wn_useropenid" => $raw_arr['FromUserName'], "wn_wu_id" => $user_info['wu_id'], "wn_msgtype" => $raw_arr['MsgType'], "wn_eventtype" => isset($raw_arr['Event']) ? $raw_arr['Event'] : null, "wn_msgid" => isset($raw_arr['MsgId']) ? $raw_arr['MsgId'] : null, "wn_eventkey" => isset($raw_arr['EventKey']) ? (is_array($raw_arr['EventKey']) ? json_encode($raw_arr['EventKey']) : $raw_arr['EventKey']) : null, "wn_createtime" => date("Y-m-d H:i:s", $raw_arr['CreateTime']), "wn_rawcontent" => json_encode($raw_arr, JSON_UNESCAPED_UNICODE)
);
$this->Wechat_service_model->insert_wechat_notify($insert_db);
// Handle MsgType
switch (strtolower($raw_arr['MsgType'])) {
case 'text':
$this->text_handle($raw_arr);
break;
case 'event':
$this->event_handles($raw_arr);
break;
default:
break;
}
// 确保返回空字符串
return $this->wechat_lib->response_text(null, $raw_arr['FromUserName'], $this->wechat_operator);
}
/**
* 生成带参数的公众号二维码
* @deprecated Move to Wechat_order.php
* @param str 订单主表key
* @param str 公众号的名字, 默认是Trippest.
* @return str 二维码图片地址
*/
public function order_qrcode($coli_sn, $wechat_host)
{
$this->wechat_config = $this->config->item($wechat_host, 'wechat');
$this->wechat_host = $wechat_host;
$url = "/cgi-bin/qrcode/create";
$qrcode_request_info = array(
"action_name" => "QR_STR_SCENE",
"expire_seconds" => 604800,
"action_info" => array("scene" => array("scene_str" => strval($coli_sn)))
);
$qrcode_response_info = json_decode($this->wechat_lib->call_wechat($wechat_host, $url, [], json_encode($qrcode_request_info, JSON_UNESCAPED_UNICODE)), true);
$qrcode_src_url = $this->config->item('qrcode_src_prefix', 'wechat') . urlencode($qrcode_response_info['ticket']);
return $this->output->set_output($qrcode_src_url);
}
/**
* @deprecated 0.1 通过带参数二维码关注的直接绑定,不再需要验证码绑定
* 发送验证码
*/
public function captcha_send()
{
$captcha = rand(100000, 999999);
$mobile = $this->input->get_post('mobile');
$nation = $this->input->get_post('nation');
$openid = $this->input->get_post('openid');
$user_id = $this->input->get_post('userid');
$captcha_column = array(
"wcc_value" => $captcha, "wcc_verifytype" => 'mobile', "wcc_wu_id" => $user_id, "wcc_mobileno" => $mobile, "wcc_nation" => $nation, "wcc_email" => null, "wcc_status" => 0, "wcc_expireseconds" => 300
);
$ret = array("captcha_value" => $captcha);
$this->Wechat_service_model->insert_captcha($captcha_column);
return $this->output->set_content_type('application/json')->set_output(json_encode($ret));
}
/**
* @deprecated 0.1 通过带参数二维码关注的直接绑定,不再需要验证码绑定
* 验证码校验
* @param mixed captcha
* @param mixed $userid
*/
public function captcha_verify()
{
$ret = array(
"verify" => "failed", "failed_reason" => ""
);
$captcha = $this->input->get_post('captcha');
$user_id = $this->input->get_post('userid');
// $order_id = $this->input->get_post('order_id');
// $order_type = $this->input->get_post('order_type');
// verify captcha
$captcha_data = $this->Wechat_service_model->get_verify($user_id, $captcha);
if (empty($captcha_data)) {
$ret['failed_reason'] = "Wrong captcha.";
}
if ($captcha_data['expire_time'] < date("Y-m-d H:i:s")) {
$ret['failed_reason'] = "Captcha expired.";
}
if (strval($captcha_data['wcc_status']) !== '0') {
$ret['failed_reason'] = "Captcha has been used.";
}
if ($ret['failed_reason'] !== '') {
return $this->output->set_content_type('application/json')->set_output(json_encode($ret));
}
// set verify status
$this->Wechat_service_model->set_captcha_pass($captcha_data['wcc_id']);
// new wechat customer
$user_info = $this->Wechat_service_model->get_user($user_id);
$customer_column = array(
"wc_wu_id" => $user_id, "wc_coli_sn" => $user_info['wu_coli_sn'], "wc_htordertype" => $user_info['wu_htordertype']
);
$this->Wechat_service_model->insert_wechat_customer($customer_column);
$ret['verify'] = "success";
unset($ret['failed_reason']);
return $this->output->set_content_type('application/json')->set_output(json_encode($ret));
}
/**
* 页面需要用户授权
* 入口: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
* 如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE
* * redirect_uri: 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
* * scope: 应用授权作用域snsapi_base 不弹出授权页面直接跳转只能获取用户openidsnsapi_userinfo 弹出授权页面可通过openid拿到昵称、性别、所在地。并且 即使在未关注的情况下,只要用户授权,也能获取其信息
* * state: 重定向后会带上state参数开发者可以填写a-zA-Z0-9的参数值最多128字节
*/
/**
* 页面授权, 获取用户openid, userid
* @param mixed code code作为换取access_token的票据每次用户授权带上的code将不一样code只能使用一次5分钟未被使用自动过期。
* 获取access token的返回值:
* * {
* * "access_token":"ACCESS_TOKEN",
* * "expires_in":7200,
* * "refresh_token":"REFRESH_TOKEN", // 用于刷新access_token
* * "openid":"OPENID",
* * "scope":"SCOPE"
* * }
* 刷新access token: https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
*/
/**
* 进入页面后静默登录
* @link `/tours/{city}`
*/
public function page_login($wechat_host)
{
$login_info = $this->get_page_access_token($wechat_host);
return $this->output->set_content_type('application/json')->set_output(json_encode($login_info));
}
/**
* 公众号菜单入口, 直接登录跳转
* @link `My Itinerary`
* 跳转顺序:
* 1. 公众号菜单设置的地址: 页面授权入口[跳转页面参数=page_login | login_now, login_now?state参数区分不同的目标页面]
* 2. 到达login_now, 通过state参数跳转到目标页面
* * * state: [orders:My Itinerary; ]
* ?user_id={id}
* * https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx7e605820faf98a05&redirect_uri=http%3A%2F%2Ftrippest.mycht.cn%2Fapi%2Findex.php%2Fwechat-mp%2Flogin-now%2Ftrippest&response_type=code&scope=snsapi_base&state=Beijing#wechat_redirect
*/
public function login_now($wechat_host)
{
// $login_info = array (
// 'access_token' => '33_0XjLimrEnWdSb-cUVowwnQo7vxo-yB4-KWo1qOWLPx5ukXMUA-Bw5WZEzfXuayCEDWfQxQlJTzIMqZ79CTAeOg',
// 'expires_in' => 7200,
// 'refresh_token' => '33_mONKlYbwDcF7ixg0-P31NAcKAYwWNEhjLewwyn09NHOjcFUq-Bu-xHbYEvaRjnaAE4ZGkgYLJe7mgILbsjskNw',
// 'openid' => 'oe2BW1C9G-gmtDyOqwIvOMg8L_FA',
// 'scope' => 'snsapi_userinfo',
// 'user_id' => NULL,
// 'order_id' => NULL,
// 'order_type' => NULL,
// 'head_img' => 'http://thirdwx.qlogo.cn/mmopen/lXEiaQibaXvee79ia4mg0eP0ia0YHLtxNRs1JKpKnkxib7WPvFZtqQbHn7icmVoB90Up0x7A3qiaomovwKOf4lBcPbOmAsGBAOTPeyS/132',
// 'nickname' => 'Lei、OT',
// 'tourdata_v' => '201909111900'); // test:
$login_info = $this->get_page_access_token($wechat_host);
$state_target = $this->input->get_post('state');
switch (strtolower($state_target)) {
case 'orders':
redirect(HOST . "account?userid=" . $login_info['user_id']);
break;
case 'detail':
$path = $this->input->get_post('l'); // l=/order/{coli_sn}/{coli_id}
redirect(HOST . substr($path, 1) . "?userid=" . $login_info['user_id']);
break;
case 'guest':
$path = $this->input->get_post('l');
unset($login_info['access_token']);
unset($login_info['refresh_token']);
// remove first '/'
$redirect_url = HOST . substr($path, 1) . "?userid=" . $login_info['user_id'];
redirect($redirect_url);
break;
default: // cityname=pathname
redirect(HOST . "tours/" . $state_target . "?userid=" . $login_info['user_id']);
break;
}
return;
}
private function get_page_access_token($wechat_host)
{
$this->wechat_config = $this->config->item($wechat_host, 'wechat');
$this->wechat_host = $wechat_host;
$page_access = array("openid" => null);
$userid = $this->input->get_post('userid');
if ($userid === false || $userid === null) {
$userid = null;
$code = $this->input->get_post('code');
$page_access_url = "/sns/oauth2/access_token";
$query = array(
"appid" => $this->wechat_config['app_id'],
"secret" => $this->wechat_config['app_secret'],
"code" => $code,
"grant_type" => 'authorization_code',
);
// $page_access = array (
// 'access_token' => '33_0XjLimrEnWdSb-cUVowwnQo7vxo-yB4-KWo1qOWLPx5ukXMUA-Bw5WZEzfXuayCEDWfQxQlJTzIMqZ79CTAeOg',
// 'expires_in' => 7200,
// 'refresh_token' => '33_mONKlYbwDcF7ixg0-P31NAcKAYwWNEhjLewwyn09NHOjcFUq-Bu-xHbYEvaRjnaAE4ZGkgYLJe7mgILbsjskNw',
// 'openid' => 'oe2BW1C9G-gmtDyOqwIvOMg8L_FA',
// 'scope' => 'snsapi_userinfo');
// test:
$page_access = json_decode($this->wechat_lib->call_wechat($wechat_host, $page_access_url, $query), true);
}
$user_info = $this->Wechat_service_model->get_user($userid, $this->wechat_config['app_id'], $page_access['openid']);
if (empty($user_info) && strval($userid) !== '0') {
$user_info = $this->subscribe_handle(array('FromUserName' => $page_access['openid']), false);
}
$page_access['openid'] = $user_info['wu_useropenid'];
$page_access['user_id'] = $user_info['wu_id'] === null ? 0 : $user_info['wu_id'];
$page_access['order_id'] = $user_info['wu_coli_sn'];
$page_access['order_type'] = $user_info['wu_htordertype'];
$page_access['head_img'] = $user_info['wu_headimg'];
$page_access['nickname'] = $user_info['wu_nickname'];
return $page_access;
}
private function get_user_info($openid)
{
// $access_token = $this->get_access_token();
$url = "/cgi-bin/user/info";
$query = array(
'openid' => $openid,
'lang' => 'en'
);
$user_info_response = json_decode($this->wechat_lib->call_wechat($this->wechat_host, $url, $query), true);
return $user_info_response;
}
private function get_access_token()
{
$url = $this->config->item('url_domain', 'wechat') . "/cgi-bin/token?grant_type=client_credential&appid=" . $this->wechat_config['app_id'] . "&secret=" . $this->wechat_config['app_secret'];
$access_token_arr = json_decode($this->wechat_lib->call_wechat($url), true);
return $access_token_arr['access_token'];
}
private function event_handles($input)
{
switch (strtolower($input['Event'])) {
case 'scan':
$this->scan_handle($input);
break;
case 'subscribe':
$this->subscribe_handle($input);
break;
case 'click':
$this->click_handle($input);
break;
default:
# code...
break;
}
return;
}
private function click_handle($input)
{
$event_key = $input['EventKey'];
$click_memu = $this->wechat_config['auto_reply']['menu'];
if (isset($click_memu[$event_key])) {
$reply_content = $click_memu[$event_key];
return $this->wechat_lib->response_text($reply_content, $input['FromUserName'], $this->wechat_operator);
}
return $this->wechat_lib->response_text();
}
private function subscribe_handle($input, $response = true)
{
if ($response === true) {
$reply_content = $this->wechat_config['auto_reply']['reply_follow'];
$this->wechat_lib->response_text($reply_content, $input['FromUserName'], $this->wechat_operator);
}
$user_info = $this->get_user_info($input['FromUserName']);
$from_order = explode("_", $user_info['qr_scene_str']); // ordersn_ordertype:435021757_27002
$coli_sn = $from_order[0] ? $from_order[0] : null;
$order_type = isset($from_order[1]) ? $from_order[1] : 27002;
$mobile = null;
$email = null;
$nation = null;
/**
* 已绑定过的二维码不能再次绑定其他用户
*/
if ($coli_sn !== null && false === $this->Wechat_service_model->if_order_bound($coli_sn, $order_type)) {
$this->load->model('Order_model');
$contact = $this->Order_model->get_order_contact($coli_sn, strval($order_type));
!empty($contact) ? $mobile = $contact['phone_no'] : null;
!empty($contact) ? $email = $contact['email'] : null;
!empty($contact) ? $nation = $contact['nation'] : null;
} else {
$coli_sn = null;
$order_type = null;
}
$user_column = array(
"wu_mobileno" => $mobile,
"wu_email" => $email,
"wu_nation" => $nation,
"wu_coli_sn" => $coli_sn,
"wu_htordertype" => $order_type,
"wu_hostappid" => $this->wechat_config['app_id'],
"wu_useropenid" => $user_info['openid'],
"wu_subcribetime" => date("Y-m-d H:i:s", $user_info['subscribe_time']),
"wu_subscribescene" => $user_info['subscribe_scene'],
"wu_nickname" => $user_info['nickname'],
"wu_sex" => $user_info['sex'],
"wu_language" => $user_info['language'],
"wu_country" => $user_info['country'],
"wu_province" => $user_info['province'],
"wu_city" => $user_info['city'],
"wu_headimg" => $user_info['headimgurl'],
"wu_unionid" => ($user_info['unionid'] ? $user_info['unionid'] : null)
);
$user_id = $this->Wechat_service_model->insert_wechat_user($user_column);
$user_column['wu_id'] = $user_id;
// new wechat customer
/**
* * 扫描带参数二维码关注的直接绑定
* * 给微信用户添加标签
*/
if ($coli_sn !== null) {
$customer_column = array(
"wc_wu_id" => $user_id, "wc_coli_sn" => $coli_sn, "wc_htordertype" => $order_type
);
$wc_id = $this->Wechat_service_model->insert_wechat_customer($customer_column);
// $access_token = $this->get_access_token(); // oe2BW1C9G-gmtDyOqwIvOMg8L_FA
$url = "/cgi-bin/tags/members/batchtagging";
$tag = array(
"openid_list" => array($user_info['openid']),
"tagid" => 101
);
$this->wechat_lib->call_wechat($this->wechat_host, $url, [], json_encode($tag, JSON_UNESCAPED_UNICODE));
// 推送已下单未支付
$pay_detail = $this->Order_model->order_info_to_pay($coli_sn);
$order = $this->Order_model->order_detail($coli_sn);
$order['wechat'] = array("wc_id" => $wc_id, "wu_id" => $user_id);
$this->wechat_lib->push_book_ok('trippest', $pay_detail['openid'], $order);
}
return $user_column;
}
private function scan_handle($input)
{
// 记录已关注扫描事件, 未绑定的增加绑定
$parse_source = explode('_', $input['EventKey']);
if (is_numeric($parse_source[0]) === true) {
$user_info = $this->Wechat_service_model->get_user(null, $this->wechat_config['app_id'], $input['FromUserName']);
$customer_column = array(
"wc_wu_id" => $user_info['wu_id'],
"wc_coli_sn" => $parse_source[0],
"wc_htordertype" => isset($parse_source[1]) ? $parse_source[1] : 27002
);
$wc_id = $this->Wechat_service_model->insert_wechat_customer($customer_column);
// 推送已下单未支付
$pay_detail = $this->Order_model->order_info_to_pay($parse_source[0]);
$order = $this->Order_model->order_detail($parse_source[0]);
if ( ! empty($order['orderTour'])) {
$order['wechat'] = array("wc_id" => $wc_id, "wu_id" => $user_info['wu_id']);
$this->wechat_lib->push_book_ok('trippest', $pay_detail['openid'], $order);
}
}
$this->wechat_lib->response_text();
return true;
}
private function text_handle($input)
{
$reply_content = $this->wechat_config['auto_reply']['reply_text'];
$this->wechat_lib->response_customer_service($reply_content, $input['FromUserName'], $this->wechat_operator);
$this->wechat_lib->send_text_customer($this->wechat_host, $input['FromUserName'], $reply_content);
// to customer service
$operator_mailbody = "<p> Dear : </p>" .
"<p>收到客人微信问询:<br /></p>" .
"<p>" . $input['Content'] ."</p>" .
"<p>发送时间:" . date("Y-m-d H:i:s", $input['CreateTime']) ."</p>";
$operator_mailbody .= "<p> 此邮件由系统自动发送, 请勿回复.</p>";
$this->Order_model->SendMail(
"chinahighlights",
"webform@chinahighlights.net",
"Niko",
"niko@trippest.com",
'#微信客人问询# TP公众号来客人啦快去看看哦 ' ,
$operator_mailbody);
return true;
}
public function convert_json_to_php()
{
$folder = FCPATH . 'bokun-product';
if (!is_dir($folder)) {
log_message('error', 'not found data dir');
echo "not found.";
return;
}
$files = array_values(array_diff(scandir($folder), array('.', '..')));
if (empty($files)) {
echo "none.";
return;
}
foreach ($files as $key => $json_file) {
$extension = strstr($json_file, ".");
if (strtolower($extension) !== ".json") {
continue;
}
$json = json_decode(file_get_contents($folder . "\\" . $json_file), true);
$this_file = fopen($folder . "\\" . strstr($json_file, ".", true) . ".php", "w+");
fwrite($this_file, "<?php\r\n" . '$data=' . var_export_min($json, 1) . ";");
fclose($this_file);
$json = null;
}
echo ("success");
return;
}
public function tour_data($city_name)
{
$data = null;
if ($city_name==='city-list') {
return $this->city_list();
}
include FCPATH . 'bokun-product' . "\\" . $city_name . ".php";
if (isset($data['items'])) {
array_walk($data['items'], function (&$item) {
$item['pricesByDateRange'] = $this->get_bokun_price($item['activity']['id']);
});
}
return $this->output->set_content_type('application/json')->set_output(json_encode($data));;
}
private function city_list()
{
$data = null;
include FCPATH . 'bokun-product\summary.php';
foreach ($data['top_list'] as $key => &$top) {
foreach ($top as $kt => &$vt) {
if ( ! empty($vt['sublist'])) {
foreach ($vt['sublist'] as $ks => &$vs) {
if (isset($data[$vs['id'] . '_code'])) {
$vs['items'] = $data[$vs['id'] . '_code'];
}
}
}
}
}
$ret = $data['top_list'];
// $ret['version'] = $data['version'];
return $this->output->set_content_type('application/json')->set_output(json_encode($ret));
}
public function get_bokun_price($bokun_activity_id = null)
{
$ret = null;
$today = time();
$folder = FCPATH . 'bokun-product\price';
$bokun_activity_id = $bokun_activity_id ? $bokun_activity_id : $this->input->get_post('activityId');
if (file_exists($folder . "\\" . $bokun_activity_id . ".php")) {
$data = null;
include FCPATH . 'bokun-product\price' . "\\" . $bokun_activity_id . ".php";
usort($data['pricesByDateRange'], function ($a, $b) {
return strtotime($a['from']) - strtotime($b['from']);
});
foreach ($data['pricesByDateRange'] as $key => $price_date) {
if (!isset($price_date['to'])) {
$price_date['to'] = strtotime("+10 days");
}
if ($today >= strtotime($price_date['from']) && $today <= strtotime($price_date['to'])) {
$ret = $price_date;
break;
}
}
}
if ($ret !== null) {
return $ret;
}
log_message('error', 'not found price data file. ' . $bokun_activity_id);
$price_list_arr = $this->get_product_price($bokun_activity_id);
foreach ($price_list_arr['pricesByDateRange'] as $key => $price_date) {
if (!isset($price_date['to'])) {
$price_date['to'] = strtotime("+10 days");
}
if ($today >= strtotime($price_date['from']) && $today <= strtotime($price_date['to'])) {
$ret = $price_date;
break;
}
}
return $ret;
}
/*!
* @Author: LYT: lyt@hainatravel.com
* @Date: 2019-11-07 14:11:52
* @Desc: 接收Bokun的推送
* * 推送请求示例:
* * GET
array (
'trigger' => 'PRODUCT_AVAILABILITY_UPDATE', // PRODUCT_INFO_UPDATE
'productCategory' => 'ACTIVITIES',
'productId' => '75348',
)
array (
'trigger' => 'PRODUCT_LIST_UPDATE',
'productListId' => '9880',
)
*/
public function bokun_notify()
{
$folder = FCPATH . 'bokun-product';
$input = $this->input->post() ? $this->input->post() : $this->input->get();
log_message('debug', 'bokun_notify' . PHP_EOL . var_export($input, 1));
$data = array();
include $folder . "\\" . "summary.php";
$data_summary = $data;
switch ($input['trigger']) {
case 'PRODUCT_LIST_UPDATE':
$list_id = $input['productListId'];
$data_summary = $data;
// 所有 product list 本身的信息, logo,cover等
$product_list = $this->bokun_lib->get_all_product_list();
$product_list_arr = json_decode($product_list, true);
$pick_flags = array_unique_fb(array_column($product_list_arr, 'flags'));
$list_flags = [];
foreach ($pick_flags as $key => $flag_arr) {
$list_flags = array_merge($list_flags, array_values($flag_arr));
}
$list_flags = array_filter(array_unique($list_flags));
$city_list_file = fopen($folder . "\\" . "city-list.php", "w+");
fwrite($city_list_file, "<?php\r\n" . '$data=' . var_export_min($product_list_arr, 1) . ";");
fclose($city_list_file);
// 生成摘要信息, 方便后续查询用
$list_id_title = array();
$data_summary['top_list'] = array();
$data_summary['version'] = date('YmdHi');
foreach ($list_flags as $key => $flag) {
foreach ($product_list_arr as $key => $list) {
$list_id_title[$list['id']] = mb_ereg_replace('[^a-zA-Z]', '', strtolower($list['title']));
if (in_array($flag,$list['flags']) ||
($flag==='Popular China Destinations' && empty($list['flags']))
) {
$temp = [];
foreach ($list['children'] as $kc => $vs) {
$temp[] = [ 'id' => $vs['id'], 'title' => $vs['title'], 'size'=>$vs['size'] ];
// sublist
$list_id_title[$vs['id']] = $vs['title'];
}
usort($temp, "Wechat_mp::sublists_order");
$data_summary['top_list'][$flag][] = [ 'id' => $list['id'], 'title' => $list_id_title[$list['id']], 'sublist' => $temp ];
}
}
}
$data_summary['list'] = $list_id_title;
// product list 包含的 product
$product_detail_arr = $this->save_product_list($list_id, $data_summary['list'][$list_id]);
// 生成摘要信息, 方便后续查询用
$this_list_items_id = array_map(function ($ele) {
return $ele['activity']['id'];
}, $product_detail_arr['items']);
$this_list_items_code = array_map(function ($ele) {
return $ele['activity']['externalId'];
}, $product_detail_arr['items']);
$data_summary[$list_id] = $this_list_items_id;
$data_summary[$list_id.'_code'] = $this_list_items_code;
$summary_file = fopen($folder . "\\" . "summary.php", "w+");
fwrite($summary_file, "<?php\r\n" . '$data=' . var_export_min($data_summary, 1) . ";");
fclose($summary_file);
break;
case 'PRODUCT_INFO_UPDATE':
$product_id = $input['productId'];
$product_list_id = null;
foreach ($data_summary as $ks => $vs) {
if ($ks === 'list') {
continue;
}
if (in_array($product_id, $vs)) {
$product_list_id = $ks;
break;
}
}
if ($product_list_id) {
$this->save_product_list($product_list_id, $data_summary['list'][$product_list_id]);
} else {
log_message('debug', 'no_found_product_list' . PHP_EOL . var_export($product_id, 1));
}
break;
case 'PRODUCT_AVAILABILITY_UPDATE':
$product_id = $input['productId'];
$this->get_product_price($product_id);
break;
default:
break;
}
return $this->output->set_content_type('application/json')->set_output(json_encode("OK"));
}
/**
* 自定义的排序sublists
*/
private function sublists_order($a, $b)
{
$orders = array(
'Day Trips',
'Day Tours',
'Great Wall Experience',
'Interesting Activities',
'Walking & Hiking Tours',
'Airport Transfer',
'Railway Station Transfer',
'Cruise Port Transfer',
'Shore Excursion',
'Shore Excursions',
'Multi Day Tours'
);
$a_index = array_search($a['title'], $orders);
$b_index = array_search($b['title'], $orders);
if ($a_index === $b_index) {
return 0;
}
return ($a_index < $b_index) ? -1 : 1;
}
private function save_product_list($list_id, $list_title)
{
if (!$this->bokun_lib) {
$this->load->library('Bokun_lib');
}
$folder = FCPATH . 'bokun-product';
$product_detail = $this->bokun_lib->get_product_list_detail($list_id);
$product_detail_arr = json_decode($product_detail, true);
$list_detail_file = fopen($folder . "\\" . $list_title . ".php", "w+");
fwrite($list_detail_file, "<?php\r\n" . '$data=' . var_export_min($product_detail_arr, 1) . ";");
fclose($list_detail_file);
return $product_detail_arr;
}
private function get_product_price($product_id)
{
$folder = FCPATH . 'bokun-product\price';
$price_list = $this->bokun_lib->get_activity_price($product_id);
$price_list_arr = json_decode($price_list, true);
if ($price_list_arr===null) {
$price_list_arr['pricesByDateRange'] = array();
return $price_list_arr;
}
usort($price_list_arr['pricesByDateRange'], function ($a, $b) {
return strtotime($a['from']) - strtotime($b['from']);
});
// if (isset($price_list_arr['pricesByDateRange'][0]['rates'][0]['passengers'][0]['tieredPrices'])) {
// array_walk_recursive($price_list_arr['pricesByDateRange'], function ()
// {
// });
// }
$this_file = fopen($folder . "\\" . $product_id . ".php", "w+");
fwrite($this_file, "<?php\r\n" . '$data=' . var_export_min($price_list_arr, 1) . ";");
fclose($this_file);
return $price_list_arr;
}
public function search_activity()
{
$text = $this->input->get_post('search');
$ret = $this->bokun_lib->search_by_text($text);
$data = array();
include FCPATH . 'bokun-product\summary.php';
array_walk($ret, 'Wechat_mp::get_tour_list_name', $data);
$ret = array_values(array_filter($ret, function ($ele)
{
return $ele->list_name !== '';
}));
return $this->output->set_content_type('application/json')->set_output(json_encode($ret));
}
private function get_tour_list_name(&$activity, $k, $data)
{
$list_ids = 0;
$activity->list_name = '';
foreach ($data as $key => $list) {
if ( ! is_array($list)) {
continue;
}
$search_id = array_search($activity->id, $list);
if ($search_id !== false) {
$list_ids = $key;
break;
}
}
if ($list_ids!==0) {
$activity->list_name = $data['list'][$list_ids];
}
}
}
/* End of file Wechat_mp.php */