862 lines
30 KiB
PHP
862 lines
30 KiB
PHP
<?php
|
||
|
||
|
||
const MODEL = 'mala';
|
||
const PAYMODEL = 'tyatjyzxmala';
|
||
const PAY_MARK = 'tyatjyzxmala';
|
||
const COUNTRY = '马来西亚';
|
||
const COUNTRY_EN = 'Mala ';
|
||
const BAIDUACCESSTOKENDIR = '/www/wwwroot/temcache/';
|
||
const GET_WEB_CONFIG_URL = 'https://uniuser.jzvisa.com/home/Company/index/model/';
|
||
|
||
const BUCKET = 'hzmala';
|
||
const SOURCE = 'evisa.hkpgsow.cn';
|
||
const OSS_URL = 'https://files.jzvisa.com/' . BUCKET . '/';
|
||
const PAY_TYPE = ['1' => 'wechatpay', '2' => 'alipay'];
|
||
|
||
|
||
const CONFIG_JSON_NATION_EN = './json/nation_en.json';
|
||
const CONFIG_JSON_PHONE_PREFIX_EN = './json/phone_prefix_en.json';
|
||
const CONFIG_JSON_TRAVEL_COUNTRY_EN = './json/travel_country_en.json';
|
||
|
||
|
||
const CONFIG_JSON_NATION = './json/nation.json';
|
||
const CONFIG_JSON_PHONE_PREFIX = './json/phone_prefix.json';
|
||
const CONFIG_JSON_TRAVEL_COUNTRY = './json/travel_country.json';
|
||
const CONFIG_JSON_STATE = './json/state.json';
|
||
const CONTACT_MODEL = 'contact';
|
||
const CONFIG_JSON_VISA_NATIONALITY = './json/visa_nationality.json';
|
||
const CONFIG_JSON_NATIONALITY_MAP = './json/visa_nationality_map.json';
|
||
const ARRIVE_DATE_COUNT = '2';
|
||
const BASE_PATH = '/mys'; // 可后端模板注入
|
||
const CONTACT_REASON = [
|
||
'我需要解决付款问题',
|
||
'我需要协助填写申请表格',
|
||
'我需要关于旅行证件的信息',
|
||
'我需要更正我的旅行证件或已提交申请的信息',
|
||
'我想检查已提交的申请的状态',
|
||
'我想申请退款',
|
||
'我有其他未列明的原因'
|
||
];
|
||
const CONTACT_REASON_EN = [
|
||
'I need to resolve a payment issue',
|
||
'I need assistance with filling out the application form',
|
||
'I need information about travel documents',
|
||
'I need to correct information on my travel document or submitted application',
|
||
'I want to check the status of my submitted application',
|
||
'I want to request a refund',
|
||
'I have other reasons not listed'
|
||
];
|
||
// 公共函数
|
||
function build_ocr_signature(string $appId, string $secret, ?int $timestamp = null): array
|
||
{
|
||
$timestamp = $timestamp ?? time();
|
||
$signString = $appId . "\n" . (string)$timestamp;
|
||
$signature = hash_hmac('sha256', $signString, $secret);
|
||
|
||
return [
|
||
'app_id' => $appId,
|
||
'timestamp' => (string)$timestamp,
|
||
'signature' => $signature,
|
||
'base_url' => config('app.OCR_BASE_URL'),
|
||
];
|
||
}
|
||
function isDateTodayTomorrowOrDayAfter($dateString, $country = '') {
|
||
// 将输入日期转换为 DateTime 对象
|
||
$inputDate = new DateTime($dateString);
|
||
$inputDate->setTime(0, 0, 0); // 忽略时间部分,只比较日期
|
||
|
||
// 获取今天的日期(午夜时间)
|
||
$today = new DateTime('today');
|
||
|
||
if ($inputDate < $today) {
|
||
return true;
|
||
}
|
||
// 获取明天和后天的日期
|
||
$tomorrow = new DateTime('tomorrow');
|
||
if ($country == 'thailand') {
|
||
$dayAfterTomorrow = new DateTime('tomorrow +1 day');
|
||
$dayAfterTomorrow1 = new DateTime('tomorrow +2 day');
|
||
return $inputDate == $today || $inputDate == $tomorrow || $inputDate == $dayAfterTomorrow || $inputDate == $dayAfterTomorrow1;
|
||
} else if ($country == 'indonesia') {
|
||
$yeasterday = new DateTime('yesterday');
|
||
$dayAfterTomorrow = new DateTime('tomorrow +1 day');
|
||
return $inputDate == $yeasterday || $inputDate == $today || $inputDate == $tomorrow || $inputDate == $dayAfterTomorrow;
|
||
} else {
|
||
$dayAfterTomorrow = new DateTime('tomorrow +1 day');
|
||
return $inputDate == $today || $inputDate == $tomorrow || $inputDate == $dayAfterTomorrow;
|
||
}
|
||
}
|
||
function find_json($json_name, $field, $field_value)
|
||
{
|
||
$data = file_get_contents($json_name);
|
||
$data_arr = json_decode($data, true);
|
||
$found = array_filter($data_arr, function ($item) use ($field, $field_value) {
|
||
return $item[$field] === $field_value;
|
||
});
|
||
// 输出结果
|
||
if ($found) {
|
||
$found = array_values($found); // 获取过滤后的第一个元素
|
||
return $found;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
function getNameById($json_name, $id)
|
||
{
|
||
$data = file_get_contents($json_name);
|
||
$data_arr = json_decode($data, true);
|
||
foreach ($data_arr as $item) {
|
||
if (array_key_exists('data', $item['data'])) {
|
||
foreach ($item['data']['data'] as $dataItem) {
|
||
if ($dataItem['id'] === $id) {
|
||
return $dataItem['name'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
function getIdByName($json_name, $id)
|
||
{
|
||
$data = file_get_contents($json_name);
|
||
$data_arr = json_decode($data, true);
|
||
foreach ($data_arr as $item) {
|
||
if (array_key_exists('data', $item['data'])) {
|
||
foreach ($item['data']['data'] as $dataItem) {
|
||
if ($dataItem['name'] === $id) {
|
||
return $dataItem['id'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
function isMobile()
|
||
{
|
||
$_SERVER['ALL_HTTP'] = isset($_SERVER['ALL_HTTP']) ? $_SERVER['ALL_HTTP'] : '';
|
||
|
||
if (preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|iphone|ipad|ipod|android|xoom)/i',
|
||
strtolower($_SERVER['HTTP_USER_AGENT']))) {
|
||
return true;
|
||
}
|
||
if ((isset($_SERVER['HTTP_ACCEPT'])) and (strpos(strtolower($_SERVER['HTTP_ACCEPT']),
|
||
'application/vnd.wap.xhtml+xml') !== false)) {
|
||
return true;
|
||
}
|
||
if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
|
||
return true;
|
||
}
|
||
if (isset($_SERVER['HTTP_PROFILE'])) {
|
||
return true;
|
||
}
|
||
$mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'], 0, 4));
|
||
$mobile_agents = array(
|
||
'w3c ',
|
||
'acs-',
|
||
'alav',
|
||
'alca',
|
||
'amoi',
|
||
'audi',
|
||
'avan',
|
||
'benq',
|
||
'bird',
|
||
'blac',
|
||
'blaz',
|
||
'brew',
|
||
'cell',
|
||
'cldc',
|
||
'cmd-',
|
||
'dang',
|
||
'doco',
|
||
'eric',
|
||
'hipt',
|
||
'inno',
|
||
'ipaq',
|
||
'java',
|
||
'jigs',
|
||
'kddi',
|
||
'keji',
|
||
'leno',
|
||
'lg-c',
|
||
'lg-d',
|
||
'lg-g',
|
||
'lge-',
|
||
'maui',
|
||
'maxo',
|
||
'midp',
|
||
'mits',
|
||
'mmef',
|
||
'mobi',
|
||
'mot-',
|
||
'moto',
|
||
'mwbp',
|
||
'nec-',
|
||
'newt',
|
||
'noki',
|
||
'oper',
|
||
'palm',
|
||
'pana',
|
||
'pant',
|
||
'phil',
|
||
'play',
|
||
'port',
|
||
'prox',
|
||
'qwap',
|
||
'sage',
|
||
'sams',
|
||
'sany',
|
||
'sch-',
|
||
'sec-',
|
||
'send',
|
||
'seri',
|
||
'sgh-',
|
||
'shar',
|
||
'sie-',
|
||
'siem',
|
||
'smal',
|
||
'smar',
|
||
'sony',
|
||
'sph-',
|
||
'symb',
|
||
't-mo',
|
||
'teli',
|
||
'tim-',
|
||
'tosh',
|
||
'tsm-',
|
||
'upg1',
|
||
'upsi',
|
||
'vk-v',
|
||
'voda',
|
||
'wap-',
|
||
'wapa',
|
||
'wapi',
|
||
'wapp',
|
||
'wapr',
|
||
'webc',
|
||
'winw',
|
||
'winw',
|
||
'xda',
|
||
'xda-'
|
||
);
|
||
if (in_array($mobile_ua, $mobile_agents)) {
|
||
return true;
|
||
}
|
||
if (strpos(strtolower($_SERVER['ALL_HTTP']), 'operamini') !== false) {
|
||
return true;
|
||
}
|
||
// Pre-final check to reset everything if the user is on Windows
|
||
if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows') !== false) {
|
||
return false;
|
||
}
|
||
// But WP7 is also Windows, with a slightly different characteristic
|
||
if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows phone') !== false) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
function getOrderNumber()
|
||
{
|
||
return '1003' . date('YmdHis') . mt_rand(10, 99);
|
||
}
|
||
|
||
function cmf_get_current_user_id()
|
||
{
|
||
$sessionUserId = session('user.id');
|
||
if (empty($sessionUserId)) {
|
||
return 0;
|
||
}
|
||
return $sessionUserId;
|
||
|
||
}
|
||
|
||
/**
|
||
* 身份证信息
|
||
* @param array $data
|
||
* @return void
|
||
*/
|
||
function parseIdentification(array $data)
|
||
{
|
||
$res = [
|
||
'national_identification_number' => '',
|
||
'provice' => '',
|
||
'city' => '',
|
||
'address' => ''
|
||
];
|
||
if (!is_array($data) || empty($data)) {
|
||
return $res;
|
||
}
|
||
$res['national_identification_number'] = $data['words_result']['公民身份号码']['words'] ?? '';
|
||
$address = paresAddress($data['words_result']['住址']['words'] ?? '');
|
||
$res['provice'] = $address['provice'];
|
||
$res['city'] = $address['city'];
|
||
$res['address'] = $address['address'];
|
||
return $res;
|
||
|
||
}
|
||
function getprovince($city)
|
||
{
|
||
if (empty($city)){
|
||
return '';
|
||
}
|
||
// 构建市与省份的对应关系数组
|
||
$cityProvinceMap = [
|
||
// 华北地区
|
||
"北京市" => "北京市",
|
||
"天津市" => "天津市",
|
||
"石家庄市" => "河北省",
|
||
"唐山市" => "河北省",
|
||
"秦皇岛市" => "河北省",
|
||
"邯郸市" => "河北省",
|
||
"邢台市" => "河北省",
|
||
"保定市" => "河北省",
|
||
"张家口市" => "河北省",
|
||
"承德市" => "河北省",
|
||
"沧州市" => "河北省",
|
||
"廊坊市" => "河北省",
|
||
"衡水市" => "河北省",
|
||
"太原市" => "山西省",
|
||
"大同市" => "山西省",
|
||
"阳泉市" => "山西省",
|
||
"长治市" => "山西省",
|
||
"晋城市" => "山西省",
|
||
"朔州市" => "山西省",
|
||
"晋中市" => "山西省",
|
||
"运城市" => "山西省",
|
||
"忻州市" => "山西省",
|
||
"临汾市" => "山西省",
|
||
"吕梁市" => "山西省",
|
||
"呼和浩特市" => "内蒙古自治区",
|
||
"包头市" => "内蒙古自治区",
|
||
"乌海市" => "内蒙古自治区",
|
||
"赤峰市" => "内蒙古自治区",
|
||
"通辽市" => "内蒙古自治区",
|
||
"鄂尔多斯市" => "内蒙古自治区",
|
||
"呼伦贝尔市" => "内蒙古自治区",
|
||
"巴彦淖尔市" => "内蒙古自治区",
|
||
"乌兰察布市" => "内蒙古自治区",
|
||
// 东北地区
|
||
"沈阳市" => "辽宁省",
|
||
"大连市" => "辽宁省",
|
||
"鞍山市" => "辽宁省",
|
||
"抚顺市" => "辽宁省",
|
||
"本溪市" => "辽宁省",
|
||
"丹东市" => "辽宁省",
|
||
"锦州市" => "辽宁省",
|
||
"营口市" => "辽宁省",
|
||
"阜新市" => "辽宁省",
|
||
"辽阳市" => "辽宁省",
|
||
"盘锦市" => "辽宁省",
|
||
"铁岭市" => "辽宁省",
|
||
"朝阳市" => "辽宁省",
|
||
"葫芦岛市" => "辽宁省",
|
||
"长春市" => "吉林省",
|
||
"吉林市" => "吉林省",
|
||
"四平市" => "吉林省",
|
||
"辽源市" => "吉林省",
|
||
"通化市" => "吉林省",
|
||
"白山市" => "吉林省",
|
||
"松原市" => "吉林省",
|
||
"白城市" => "吉林省",
|
||
"延边朝鲜族自治州" => "吉林省",
|
||
"哈尔滨市" => "黑龙江省",
|
||
"齐齐哈尔市" => "黑龙江省",
|
||
"鸡西市" => "黑龙江省",
|
||
"鹤岗市" => "黑龙江省",
|
||
"双鸭山市" => "黑龙江省",
|
||
"大庆市" => "黑龙江省",
|
||
"伊春市" => "黑龙江省",
|
||
"佳木斯市" => "黑龙江省",
|
||
"七台河市" => "黑龙江省",
|
||
"牡丹江市" => "黑龙江省",
|
||
"黑河市" => "黑龙江省",
|
||
"绥化市" => "黑龙江省",
|
||
"大兴安岭地区" => "黑龙江省",
|
||
// 华东地区
|
||
"上海市" => "上海市",
|
||
"南京市" => "江苏省",
|
||
"无锡市" => "江苏省",
|
||
"徐州市" => "江苏省",
|
||
"常州市" => "江苏省",
|
||
"苏州市" => "江苏省",
|
||
"南通市" => "江苏省",
|
||
"连云港市" => "江苏省",
|
||
"淮安市" => "江苏省",
|
||
"盐城市" => "江苏省",
|
||
"扬州市" => "江苏省",
|
||
"镇江市" => "江苏省",
|
||
"泰州市" => "江苏省",
|
||
"宿迁市" => "江苏省",
|
||
"杭州市" => "浙江省",
|
||
"宁波市" => "浙江省",
|
||
"温州市" => "浙江省",
|
||
"嘉兴市" => "浙江省",
|
||
"湖州市" => "浙江省",
|
||
"绍兴市" => "浙江省",
|
||
"金华市" => "浙江省",
|
||
"衢州市" => "浙江省",
|
||
"舟山市" => "浙江省",
|
||
"台州市" => "浙江省",
|
||
"丽水市" => "浙江省",
|
||
"合肥市" => "安徽省",
|
||
"芜湖市" => "安徽省",
|
||
"蚌埠市" => "安徽省",
|
||
"淮南市" => "安徽省",
|
||
"马鞍山市" => "安徽省",
|
||
"淮北市" => "安徽省",
|
||
"铜陵市" => "安徽省",
|
||
"安庆市" => "安徽省",
|
||
"黄山市" => "安徽省",
|
||
"滁州市" => "安徽省",
|
||
"阜阳市" => "安徽省",
|
||
"宿州市" => "安徽省",
|
||
"六安市" => "安徽省",
|
||
"亳州市" => "安徽省",
|
||
"池州市" => "安徽省",
|
||
"宣城市" => "安徽省",
|
||
"福州市" => "福建省",
|
||
"厦门市" => "福建省",
|
||
"莆田市" => "福建省",
|
||
"三明市" => "福建省",
|
||
"泉州市" => "福建省",
|
||
"漳州市" => "福建省",
|
||
"南平市" => "福建省",
|
||
"龙岩市" => "福建省",
|
||
"宁德市" => "福建省",
|
||
"南昌市" => "江西省",
|
||
"景德镇市" => "江西省",
|
||
"萍乡市" => "江西省",
|
||
"九江市" => "江西省",
|
||
"新余市" => "江西省",
|
||
"鹰潭市" => "江西省",
|
||
"赣州市" => "江西省",
|
||
"吉安市" => "江西省",
|
||
"宜春市" => "江西省",
|
||
"抚州市" => "江西省",
|
||
"上饶市" => "江西省",
|
||
"济南市" => "山东省",
|
||
"青岛市" => "山东省",
|
||
"淄博市" => "山东省",
|
||
"枣庄市" => "山东省",
|
||
"东营市" => "山东省",
|
||
"烟台市" => "山东省",
|
||
"潍坊市" => "山东省",
|
||
"济宁市" => "山东省",
|
||
"泰安市" => "山东省",
|
||
"威海市" => "山东省",
|
||
"日照市" => "山东省",
|
||
"临沂市" => "山东省",
|
||
"德州市" => "山东省",
|
||
"聊城市" => "山东省",
|
||
"滨州市" => "山东省",
|
||
"菏泽市" => "山东省",
|
||
// 中南地区
|
||
"郑州市" => "河南省",
|
||
"开封市" => "河南省",
|
||
"洛阳市" => "河南省",
|
||
"平顶山市" => "河南省",
|
||
"安阳市" => "河南省",
|
||
"鹤壁市" => "河南省",
|
||
"新乡市" => "河南省",
|
||
"焦作市" => "河南省",
|
||
"濮阳市" => "河南省",
|
||
"许昌市" => "河南省",
|
||
"漯河市" => "河南省",
|
||
"三门峡市" => "河南省",
|
||
"南阳市" => "河南省",
|
||
"商丘市" => "河南省",
|
||
"信阳市" => "河南省",
|
||
"周口市" => "河南省",
|
||
"驻马店市" => "河南省",
|
||
"武汉市" => "湖北省",
|
||
"黄石市" => "湖北省",
|
||
"十堰市" => "湖北省",
|
||
"宜昌市" => "湖北省",
|
||
"襄阳市" => "湖北省",
|
||
"鄂州市" => "湖北省",
|
||
"荆门市" => "湖北省",
|
||
"孝感市" => "湖北省",
|
||
"荆州市" => "湖北省",
|
||
"黄冈市" => "湖北省",
|
||
"咸宁市" => "湖北省",
|
||
"随州市" => "湖北省",
|
||
"恩施土家族苗族自治州" => "湖北省",
|
||
"长沙市" => "湖南省",
|
||
"株洲市" => "湖南省",
|
||
"湘潭市" => "湖南省",
|
||
"衡阳市" => "湖南省",
|
||
"邵阳市" => "湖南省",
|
||
"岳阳市" => "湖南省",
|
||
"常德市" => "湖南省",
|
||
"张家界市" => "湖南省",
|
||
"益阳市" => "湖南省",
|
||
"郴州市" => "湖南省",
|
||
"永州市" => "湖南省",
|
||
"怀化市" => "湖南省",
|
||
"娄底市" => "湖南省",
|
||
"湘西土家族苗族自治州" => "湖南省",
|
||
"广州市" => "广东省",
|
||
"韶关市" => "广东省",
|
||
"深圳市" => "广东省",
|
||
"珠海市" => "广东省",
|
||
"汕头市" => "广东省",
|
||
"佛山市" => "广东省",
|
||
"江门市" => "广东省",
|
||
"湛江市" => "广东省",
|
||
"茂名市" => "广东省",
|
||
"肇庆市" => "广东省",
|
||
"惠州市" => "广东省",
|
||
"梅州市" => "广东省",
|
||
"汕尾市" => "广东省",
|
||
"河源市" => "广东省",
|
||
"阳江市" => "广东省",
|
||
"清远市" => "广东省",
|
||
"东莞市" => "广东省",
|
||
"中山市" => "广东省",
|
||
"潮州市" => "广东省",
|
||
"揭阳市" => "广东省",
|
||
"云浮市" => "广东省",
|
||
"南宁市" => "广西壮族自治区",
|
||
"柳州市" => "广西壮族自治区",
|
||
"桂林市" => "广西壮族自治区",
|
||
"梧州市" => "广西壮族自治区",
|
||
"北海市" => "广西壮族自治区",
|
||
"防城港市" => "广西壮族自治区",
|
||
"钦州市" => "广西壮族自治区",
|
||
"贵港市" => "广西壮族自治区",
|
||
"玉林市" => "广西壮族自治区",
|
||
"百色市" => "广西壮族自治区",
|
||
"贺州市" => "广西壮族自治区",
|
||
"河池市" => "广西壮族自治区",
|
||
"来宾市" => "广西壮族自治区",
|
||
"崇左市" => "广西壮族自治区",
|
||
"海口市" => "海南省",
|
||
"三亚市" => "海南省",
|
||
"三沙市" => "海南省",
|
||
"儋州市" => "海南省",
|
||
// 西南地区
|
||
"重庆市" => "重庆市",
|
||
"成都市" => "四川省",
|
||
"自贡市" => "四川省",
|
||
"攀枝花市" => "四川省",
|
||
"泸州市" => "四川省",
|
||
"德阳市" => "四川省",
|
||
"绵阳市" => "四川省",
|
||
"广元市" => "四川省",
|
||
"遂宁市" => "四川省",
|
||
"内江市" => "四川省",
|
||
"乐山市" => "四川省",
|
||
"南充市" => "四川省",
|
||
"眉山市" => "四川省",
|
||
"宜宾市" => "四川省",
|
||
"广安市" => "四川省",
|
||
"达州市" => "四川省",
|
||
"雅安市" => "四川省",
|
||
"巴中市" => "四川省",
|
||
"资阳市" => "四川省",
|
||
"阿坝藏族羌族自治州" => "四川省",
|
||
"甘孜藏族自治州" => "四川省",
|
||
"凉山彝族自治州" => "四川省",
|
||
"贵阳市" => "贵州省",
|
||
"六盘水市" => "贵州省",
|
||
"遵义市" => "贵州省",
|
||
"安顺市" => "贵州省",
|
||
"毕节市" => "贵州省",
|
||
"铜仁市" => "贵州省",
|
||
"黔西南布依族苗族自治州" => "贵州省",
|
||
"黔东南苗族侗族自治州" => "贵州省",
|
||
"黔南布依族苗族自治州" => "贵州省",
|
||
"昆明市" => "云南省",
|
||
"曲靖市" => "云南省",
|
||
"玉溪市" => "云南省",
|
||
"保山市" => "云南省",
|
||
"昭通市" => "云南省",
|
||
"丽江市" => "云南省",
|
||
"普洱市" => "云南省",
|
||
"临沧市" => "云南省",
|
||
"楚雄彝族自治州" => "云南省",
|
||
"红河哈尼族彝族自治州" => "云南省",
|
||
"文山壮族苗族自治州" => "云南省",
|
||
"西双版纳傣族自治州" => "云南省",
|
||
"大理白族自治州" => "云南省",
|
||
"德宏傣族景颇族自治州" => "云南省",
|
||
"怒江傈僳族自治州" => "云南省",
|
||
"迪庆藏族自治州" => "云南省",
|
||
"拉萨市" => "西藏自治区",
|
||
"日喀则市" => "西藏自治区",
|
||
"昌都市" => "西藏自治区",
|
||
"林芝市" => "西藏自治区",
|
||
"山南市" => "西藏自治区",
|
||
"那曲市" => "西藏自治区",
|
||
"阿里地区" => "西藏自治区",
|
||
// 西北地区
|
||
"西安市" => "陕西省",
|
||
"铜川市" => "陕西省",
|
||
"宝鸡市" => "陕西省",
|
||
"咸阳市" => "陕西省",
|
||
"渭南市" => "陕西省",
|
||
"延安市" => "陕西省",
|
||
"汉中市" => "陕西省",
|
||
"榆林市" => "陕西省",
|
||
"安康市" => "陕西省",
|
||
"商洛市" => "陕西省",
|
||
"兰州市" => "甘肃省",
|
||
"嘉峪关市" => "甘肃省",
|
||
"金昌市" => "甘肃省",
|
||
"白银市" => "甘肃省",
|
||
"天水市" => "甘肃省",
|
||
"武威市" => "甘肃省",
|
||
"张掖市" => "甘肃省",
|
||
"平凉市" => "甘肃省",
|
||
"酒泉市" => "甘肃省",
|
||
"庆阳市" => "甘肃省",
|
||
"定西市" => "甘肃省",
|
||
"陇南市" => "甘肃省",
|
||
"临夏回族自治州" => "甘肃省",
|
||
"甘南藏族自治州" => "甘肃省",
|
||
"西宁市" => "青海省",
|
||
"海东市" => "青海省",
|
||
"海北藏族自治州" => "青海省",
|
||
"黄南藏族自治州" => "青海省",
|
||
"海南藏族自治州" => "青海省",
|
||
"果洛藏族自治州" => "青海省",
|
||
"玉树藏族自治州" => "青海省",
|
||
"海西蒙古族藏族自治州" => "青海省",
|
||
"银川市" => "宁夏回族自治区",
|
||
"石嘴山市" => "宁夏回族自治区",
|
||
"吴忠市" => "宁夏回族自治区",
|
||
"固原市" => "宁夏回族自治区",
|
||
"中卫市" => "宁夏回族自治区",
|
||
"乌鲁木齐市" => "新疆维吾尔自治区",
|
||
"克拉玛依市" => "新疆维吾尔自治区",
|
||
"吐鲁番市" => "新疆维吾尔自治区",
|
||
"哈密市" => "新疆维吾尔自治区",
|
||
"昌吉回族自治州" => "新疆维吾尔自治区",
|
||
"博尔塔拉蒙古自治州" => "新疆维吾尔自治区",
|
||
"巴音郭楞蒙古自治州" => "新疆维吾尔自治区",
|
||
"阿克苏地区" => "新疆维吾尔自治区",
|
||
"克孜勒苏柯尔克孜自治州" => "新疆维吾尔自治区",
|
||
"喀什地区" => "新疆维吾尔自治区",
|
||
"和田地区" => "新疆维吾尔自治区",
|
||
"伊犁哈萨克自治州" => "新疆维吾尔自治区",
|
||
"塔城地区" => "新疆维吾尔自治区",
|
||
"阿勒泰地区" => "新疆维吾尔自治区",
|
||
// 港澳台地区
|
||
"台北市" => "台湾省",
|
||
"新北市" => "台湾省",
|
||
"桃园市" => "台湾省",
|
||
"台中市" => "台湾省",
|
||
"台南市" => "台湾省",
|
||
"高雄市" => "台湾省",
|
||
"基隆市" => "台湾省",
|
||
"新竹市" => "台湾省",
|
||
"嘉义市" => "台湾省"
|
||
];
|
||
|
||
|
||
// 检查市名是否存在于数组中
|
||
if (array_key_exists($city, $cityProvinceMap)) {
|
||
return $cityProvinceMap[$city];
|
||
} else {
|
||
return '';
|
||
}
|
||
|
||
}
|
||
function paresAddress($address){
|
||
preg_match('/(.*?(省|自治区|北京|天津|上海|重庆))/', $address, $matches);
|
||
if (count($matches) > 1) {
|
||
$province = $matches[count($matches) - 2];
|
||
$address = preg_replace('/(.*?(省|自治区|北京|天津|上海|重庆))/','', $address, 1);
|
||
}
|
||
preg_match('/(.*?(市|自治州|地区|区划|县))/', $address, $matches);
|
||
if (count($matches) > 1) {
|
||
$city = $matches[count($matches) - 2];
|
||
$address = str_replace($city, '', $address);
|
||
}
|
||
preg_match('/(.*?(区|县|镇|乡|街道))/', $address, $matches);
|
||
if (count($matches) > 1) {
|
||
$area = $matches[count($matches) - 2];
|
||
$address = str_replace($area, '', $address);
|
||
}
|
||
$city = isset($city) ? $city : '';
|
||
if (empty($province)){
|
||
$province = getprovince($city);
|
||
}
|
||
$area = isset($area) ? $area : '';
|
||
return [
|
||
|
||
'provice' => isset($province) ? $province : '',
|
||
'city' => $city,
|
||
"address" => $area.$address
|
||
];
|
||
}
|
||
|
||
|
||
/**
|
||
* 护照信息
|
||
* @param array $data
|
||
* @return string[]
|
||
*/
|
||
function parsePassport(array $data)
|
||
{
|
||
$res = [
|
||
'last_name' => '',
|
||
'first_name' => '',
|
||
'last_zh_name' => '',
|
||
'first_zh_name' => '',
|
||
'city_birth' => '',
|
||
'birth_date_day' => '',
|
||
'birth_date_month' => '',
|
||
'birth_date_year' => '',
|
||
'birth_date' => '',
|
||
'gender' => '',
|
||
'passport_number' => '',
|
||
'passport_expedition_date_day' => '',
|
||
'passport_expedition_date_month' => '',
|
||
'passport_expedition_date_year' => '',
|
||
'passport_expedition_date' => '',
|
||
'passport_expiration_date_day' => '',
|
||
'passport_expiration_date_month' => '',
|
||
'passport_expiration_date_year' => '',
|
||
'passport_expiration_date' => '',
|
||
'country_code'=>'',
|
||
'place_issue' => '',
|
||
'nationality' =>''
|
||
];
|
||
if (!is_array($data) || empty($data)) {
|
||
return $res;
|
||
}
|
||
if (!empty($data['words_result']['姓名拼音']['words'])) {
|
||
$names = explode(',', $data['words_result']['姓名拼音']['words']);
|
||
$res['last_name'] = $names[0] ?? '';
|
||
$res['first_name'] = $names[1] ?? '';
|
||
}
|
||
if (!empty($data['words_result']['姓名']['words'])) {
|
||
$zhnames = parseChineseName($data['words_result']['姓名']['words']);
|
||
|
||
$res['last_zh_name'] = $zhnames['surname'] ?? '';
|
||
$res['first_zh_name'] = $zhnames['givenName'] ?? '';
|
||
}
|
||
if (!empty($data['words_result']['国家码']['words'])) {
|
||
$res['country_code'] = $data['words_result']['国家码']['words'];
|
||
}
|
||
if (!empty($data['words_result']['护照签发地点']['words'])) {
|
||
$citys = explode('/', $data['words_result']['护照签发地点']['words']);
|
||
$res['place_issue'] = $citys[1] ?? '';
|
||
}
|
||
if (!empty($data['words_result']['国籍']['words'])) {
|
||
$citys = explode('/', $data['words_result']['国籍']['words']);
|
||
$res['nationality'] = $citys[1] ?? '';
|
||
}
|
||
if (!empty($data['words_result']['出生地点']['words'])) {
|
||
$citys = explode('/', $data['words_result']['出生地点']['words']);
|
||
$res['city_birth'] = $citys[1] ?? '';
|
||
}
|
||
if (!empty($data['words_result']['护照号码']['words'])) {
|
||
$res['passport_number'] = $data['words_result']['护照号码']['words'];
|
||
}
|
||
if (!empty($data['words_result']['签发日期']['words'])) {
|
||
$res['passport_expedition_date_year'] = substr($data['words_result']['签发日期']['words'], 0, 4);
|
||
$res['passport_expedition_date_month'] = intval(substr($data['words_result']['签发日期']['words'], 4, 2));
|
||
$res['passport_expedition_date_day'] = intval(substr($data['words_result']['签发日期']['words'], -2));
|
||
$res['passport_expedition_date'] = $res['passport_expedition_date_year'] . '-' . $res['passport_expedition_date_month'] . '-' . $res['passport_expedition_date_day'];
|
||
|
||
}
|
||
if (!empty($data['words_result']['有效期至']['words'])) {
|
||
$res['passport_expiration_date_year'] = substr($data['words_result']['有效期至']['words'], 0, 4);
|
||
$res['passport_expiration_date_month'] = intval(substr($data['words_result']['有效期至']['words'], 4, 2));
|
||
$res['passport_expiration_date_day'] = intval(substr($data['words_result']['有效期至']['words'], -2));
|
||
$res['passport_expiration_date'] = $res['passport_expiration_date_year'] . '-' . $res['passport_expiration_date_month'] . '-' . $res['passport_expiration_date_day'];
|
||
|
||
}
|
||
if (!empty($data['words_result']['生日']['words'])) {
|
||
$res['birth_date_year'] = substr($data['words_result']['生日']['words'], 0, 4);
|
||
$res['birth_date_month'] = intval(substr($data['words_result']['生日']['words'], 4, 2));
|
||
$res['birth_date_day'] = intval(substr($data['words_result']['生日']['words'], -2));
|
||
$res['birth_date'] = $res['birth_date_year'] . '-' . $res['birth_date_month'] . '-' . $res['birth_date_day'];
|
||
}
|
||
if (!empty($data['words_result']['性别']['words'])) {
|
||
$names = explode('/', $data['words_result']['性别']['words']);
|
||
$res['gender'] = ($names[0] == '男') ? 'male' : 'female';
|
||
|
||
}
|
||
return $res;
|
||
|
||
}
|
||
/**
|
||
* 解析中文姓名为姓和名
|
||
*
|
||
* @param string $name 中文姓名
|
||
* @return array 包含姓和名的数组 ['surname' => '姓', 'givenName' => '名']
|
||
*/
|
||
function parseChineseName($name) {
|
||
// 移除姓名前后的空格
|
||
$name = trim($name);
|
||
|
||
// 如果姓名长度小于2,无法合理分割,返回原姓名作为姓氏
|
||
if (mb_strlen($name, 'UTF-8') < 2) {
|
||
return ['surname' => $name, 'givenName' => ''];
|
||
}
|
||
|
||
// 常见复姓列表(可根据需要扩展)
|
||
$compoundSurnames = [
|
||
'欧阳', '太史', '端木', '上官', '司马', '东方', '独孤', '南宫', '万俟',
|
||
'闻人', '夏侯', '诸葛', '尉迟', '公羊', '赫连', '澹台', '皇甫', '宗政',
|
||
'濮阳', '公冶', '太叔', '申屠', '公孙', '慕容', '仲孙', '钟离', '长孙',
|
||
'宇文', '司徒', '鲜于', '司空', '闾丘', '子车', '亓官', '司寇', '巫马',
|
||
'公西', '颛孙', '壤驷', '公良', '漆雕', '乐正', '宰父', '谷梁', '拓跋',
|
||
'夹谷', '轩辕', '令狐', '段干', '百里', '呼延', '东郭', '南门', '羊舌',
|
||
'微生', '公户', '公玉', '公仪', '梁丘', '公仲', '公上', '公门', '公山',
|
||
'公坚', '左丘', '公伯', '西门', '公祖', '第五', '公乘', '贯丘', '公皙',
|
||
'南荣', '东里', '东宫', '仲长', '子书', '子桑', '即墨', '达奚', '褚师'
|
||
];
|
||
|
||
// 检查是否是复姓
|
||
$firstTwoChars = mb_substr($name, 0, 2, 'UTF-8');
|
||
if (in_array($firstTwoChars, $compoundSurnames)) {
|
||
return [
|
||
'surname' => $firstTwoChars,
|
||
'givenName' => mb_substr($name, 2, null, 'UTF-8')
|
||
];
|
||
}
|
||
// 默认情况:第一个字符为姓,其余为名
|
||
return [
|
||
'surname' => mb_substr($name, 0, 1, 'UTF-8'),
|
||
'givenName' => mb_substr($name, 1, null, 'UTF-8')
|
||
];
|
||
}
|
||
/**
|
||
* 签证信息
|
||
* @param array $data
|
||
* @return string[]
|
||
*/
|
||
function parseVisa(array $data)
|
||
{
|
||
$res = [
|
||
'visa_foil_number' => '',
|
||
'passport_number' => '',
|
||
];
|
||
if (!is_array($data) || empty($data)) {
|
||
return $res;
|
||
}
|
||
foreach ($data['words_result'] as $arr) {
|
||
|
||
$str = preg_replace('/\s/i', '', $arr['words']);
|
||
if (preg_match('/^[G|E|P]([a-zA-Z0-9]{8})$/i', $str)) {
|
||
$res['passport_number'] = $str;
|
||
} elseif (preg_match('/^(P|H|J|K|L|M|N)\d{7}$/i', $str)) {
|
||
$res['visa_foil_number'] = $str;
|
||
}
|
||
|
||
}
|
||
|
||
return $res;
|
||
|
||
}
|
||
|
||
// 这是系统自动生成的公共文件
|