|
|
<?php
|
|
|
|
|
|
/**
|
|
|
* 首字母排序A-Z(含汉字)
|
|
|
*/
|
|
|
|
|
|
use app\admin\model\User;
|
|
|
use app\api\controller\v1\WxxcxPush;
|
|
|
|
|
|
if (!function_exists('getFirstChar')) {
|
|
|
function getFirstChar($s)
|
|
|
{
|
|
|
$s0 = mb_substr($s, 0, 1); //获取名字的姓
|
|
|
$s = iconv('UTF-8', 'gb2312', $s0); //将UTF-8转换成GB2312编码
|
|
|
//var_dump(ord($s0));
|
|
|
// var_dump(ord($s));
|
|
|
if (ord($s0) > 128) { //汉字开头,汉字没有以U、V开头的
|
|
|
|
|
|
$asc = ord($s{0}) * 256 + ord($s{1}) - 65536;
|
|
|
if ($asc >= -20319 and $asc <= -20284) return "A";
|
|
|
if ($asc >= -20283 and $asc <= -19776) return "B";
|
|
|
if ($asc >= -19775 and $asc <= -19219) return "C";
|
|
|
if ($asc >= -19218 and $asc <= -18711) return "D";
|
|
|
if ($asc >= -18710 and $asc <= -18527) return "E";
|
|
|
if ($asc >= -18526 and $asc <= -18240) return "F";
|
|
|
if ($asc >= -18239 and $asc <= -17760) return "G";
|
|
|
if ($asc >= -17759 and $asc <= -17248) return "H";
|
|
|
if ($asc >= -17247 and $asc <= -17418) return "I";
|
|
|
if ($asc >= -17417 and $asc <= -16475) return "J";
|
|
|
if ($asc >= -16474 and $asc <= -16213) return "K";
|
|
|
if ($asc >= -16212 and $asc <= -15641) return "L";
|
|
|
if ($asc >= -15640 and $asc <= -15166) return "M";
|
|
|
if ($asc >= -15165 and $asc <= -14923) return "N";
|
|
|
if ($asc >= -14922 and $asc <= -14915) return "O";
|
|
|
if ($asc >= -14914 and $asc <= -14631) return "P";
|
|
|
if ($asc >= -14630 and $asc <= -14150) return "Q";
|
|
|
if ($asc >= -14149 and $asc <= -14091) return "R";
|
|
|
if ($asc >= -14090 and $asc <= -13319) return "S";
|
|
|
if ($asc >= -13318 and $asc <= -12839) return "T";
|
|
|
if ($asc >= -12838 and $asc <= -12557) return "W";
|
|
|
if ($asc >= -12556 and $asc <= -11848) return "X";
|
|
|
if ($asc >= -11847 and $asc <= -11056) return "Y";
|
|
|
if ($asc >= -11055 and $asc <= -10247) return "Z";
|
|
|
} else if (ord($s) >= 48 && ord($s) <= 57) {//数字开头
|
|
|
$aa = @iconv_substr($s, 0, 1, 'utf-8');
|
|
|
switch ($aa) {
|
|
|
case 1:
|
|
|
return "Y";
|
|
|
case 2:
|
|
|
return "E";
|
|
|
case 3:
|
|
|
return "S";
|
|
|
case 4:
|
|
|
return "S";
|
|
|
case 5:
|
|
|
return "W";
|
|
|
case 6:
|
|
|
return "L";
|
|
|
case 7:
|
|
|
return "Q";
|
|
|
case 8:
|
|
|
return "B";
|
|
|
case 9:
|
|
|
return "J";
|
|
|
case 0:
|
|
|
return "L";
|
|
|
}
|
|
|
} else if (ord($s) >= 65 && ord($s) <= 90) { //大写英文开头
|
|
|
return substr($s, 0, 1);
|
|
|
} else if (ord($s) >= 97 && ord($s) <= 122) { //小写英文开头
|
|
|
return strtoupper(substr($s, 0, 1));
|
|
|
} else {
|
|
|
return iconv_substr($s0, 0, 1, 'utf-8');
|
|
|
//中英混合的词语,不适合上面的各种情况,因此直接提取首个字符即可
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (!function_exists('http_request')) {
|
|
|
// curl请求
|
|
|
function http_request($url, $timeout = 30, $header = array())
|
|
|
{
|
|
|
if (!function_exists('curl_init')) {
|
|
|
throw new Exception('server not install curl');
|
|
|
}
|
|
|
$ch = curl_init();
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
curl_setopt($ch, CURLOPT_HEADER, true);
|
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
|
|
|
if (!empty($header)) {
|
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
|
|
|
}
|
|
|
$data = curl_exec($ch);
|
|
|
list($header, $data) = explode("\r\n\r\n", $data);
|
|
|
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
|
if ($http_code == 301 || $http_code == 302) {
|
|
|
$matches = array();
|
|
|
preg_match('/Location:(.*?)\n/', $header, $matches);
|
|
|
$url = trim(array_pop($matches));
|
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
|
|
$data = curl_exec($ch);
|
|
|
}
|
|
|
|
|
|
if ($data == false) {
|
|
|
curl_close($ch);
|
|
|
}
|
|
|
@curl_close($ch);
|
|
|
|
|
|
return $data;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!function_exists('insert_openid_info')) {
|
|
|
/**
|
|
|
* 将授权用户信息保存起来
|
|
|
*/
|
|
|
function insert_openid_info($data)
|
|
|
{
|
|
|
$data['upt_time'] = time();
|
|
|
$res = \think\Db::name("openid_info")->where("openid", $data['openid'])->find();
|
|
|
// file_put_contents("ccc.txt", date("Y-m-d H:i:s") . json_encode($data) . PHP_EOL, FILE_APPEND);
|
|
|
if (!empty($res)) {
|
|
|
\think\Db::name("openid_info")->where("openid", $data['openid'])->update($data);
|
|
|
} else {
|
|
|
\think\Db::name("openid_info")->insertGetId($data);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* 生成订单号
|
|
|
* 重复就重新生成
|
|
|
*/
|
|
|
if (!function_exists('getOrderSn')) {
|
|
|
function getOrderSn()
|
|
|
{
|
|
|
$orderid = date("YmdHis") . mt_rand(1000, 999999);
|
|
|
$odcks = \think\Db::name('order')
|
|
|
->where(['order_no' => $orderid])
|
|
|
->find();
|
|
|
while (!empty($odcks)) {
|
|
|
$orderid = date("YmdHis") . mt_rand(1000, 999999);
|
|
|
}
|
|
|
return $orderid;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(!function_exists('beingPushed')){
|
|
|
/**
|
|
|
* 发送模板消息
|
|
|
* @return void
|
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
|
* @throws \think\exception\DbException
|
|
|
*/
|
|
|
function SendMessage($order_id){
|
|
|
$order=\think\Db::name("order")->find($order_id);
|
|
|
$wxxcxpush=new WxxcxPush();
|
|
|
$user=new User();
|
|
|
$user=$user->find($order['user_id']);
|
|
|
$res=$wxxcxpush->Message($user['wx_xcx_openid'],$order_id);
|
|
|
if ($res !== false) {
|
|
|
return $res;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if(!function_exists('OrderSendMessage')){
|
|
|
/**
|
|
|
* 发送模板消息
|
|
|
* @return void
|
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
|
* @throws \think\exception\DbException
|
|
|
*/
|
|
|
function OrderSendMessage($order_id){
|
|
|
$order=\think\Db::name("order")->find($order_id);
|
|
|
$wxxcxpush=new WxxcxPush();
|
|
|
$user=new User();
|
|
|
$user=$user->find($order['user_id']);
|
|
|
$driver=new \app\admin\model\Driver();
|
|
|
$driver=$driver->find($order['driver_id']);
|
|
|
$driver_user=$user->find($driver['user_id']);
|
|
|
$res=$wxxcxpush->Message($driver_user['wx_xcx_openid'],$order_id);
|
|
|
$res=$wxxcxpush->Message($user['wx_xcx_openid'],$order_id);
|
|
|
if ($res !== false) {
|
|
|
return $res;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
if(!function_exists('beingPushed')){
|
|
|
/**
|
|
|
* 发送模板消息
|
|
|
* @return void
|
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
|
* @throws \think\exception\DbException
|
|
|
*/
|
|
|
function refundSendMessage($order_id){
|
|
|
$order=\think\Db::name("order")->find($order_id);
|
|
|
$wxxcxpush=new WxxcxPush();
|
|
|
$user=new User();
|
|
|
$user=$user->find($order['user_id']);
|
|
|
$res=$wxxcxpush->refundMessage($user['wx_xcx_openid'],$order_id);
|
|
|
if ($res !== false) {
|
|
|
return $res;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
if (!function_exists('beingPushed')) {
|
|
|
/**
|
|
|
* 小程序模板推送选择类型
|
|
|
* @param $type @模板类型
|
|
|
* @param $openid @接收人ID
|
|
|
* @param $page @跳转页面
|
|
|
* @param $temp @具体提醒参数
|
|
|
* @throws \think\Exception
|
|
|
* @throws \think\exception\PDOException
|
|
|
*/
|
|
|
function beingPushed($type, $openid, $page, $temp)
|
|
|
{
|
|
|
|
|
|
$data = [];
|
|
|
$data['touser'] = $openid;
|
|
|
$data['page'] = $page;
|
|
|
//模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
|
|
|
switch ($type) {
|
|
|
case 1:
|
|
|
//待审批事项提醒(新版本的长期订阅)
|
|
|
$data['template_id'] = "ws6bz6-WyHHA-upU2oRzc_C5toDUexe9ZicQ-ITtImA";
|
|
|
$data['data'] = [
|
|
|
"thing10" => [
|
|
|
'value' =>$temp['value1'],//审核状态(待处理)
|
|
|
],
|
|
|
"thing12" => [
|
|
|
'value' => $temp['value2'],//申请人(测试黄超)
|
|
|
],
|
|
|
|
|
|
"thing8" => [
|
|
|
'value' => $temp['value3'],//原因(入州报备审核)
|
|
|
]
|
|
|
];
|
|
|
break;
|
|
|
case 2:
|
|
|
//审核结果通知(新版本的长期订阅)
|
|
|
$data['template_id'] = "Qt2xqfH8uQyTm1A0ReNxeybtAydAhfhi4HinnyB5f0s";
|
|
|
$data['data'] = [
|
|
|
"thing1" => [
|
|
|
'value' => $temp['value1'],//提醒内容(已审核)
|
|
|
],
|
|
|
// "name1" => [
|
|
|
// 'value' => $temp['value2'],//审核人
|
|
|
// ],
|
|
|
"thing4" => [
|
|
|
'value' => $temp['value3'],//提示说明
|
|
|
]
|
|
|
];
|
|
|
break;
|
|
|
case 3:
|
|
|
//待审批事项提醒(老版本的一次性订阅)
|
|
|
$data['template_id'] = "vVOonN76AFjxgz77iG-hcWrH6HJ-vPGKyIyAK0VzPIk";
|
|
|
$data['data'] = [
|
|
|
"thing1" => [
|
|
|
'value' => $temp['value1'],//待办事项
|
|
|
],
|
|
|
"thing4" => [
|
|
|
'value' => $temp['value2'],//流程状态
|
|
|
],
|
|
|
"thing2" => [
|
|
|
'value' => $temp['value3'],//申请人
|
|
|
],
|
|
|
"time3" => [
|
|
|
'value' => $temp['value4'],//申请时间
|
|
|
],
|
|
|
"thing5" => [
|
|
|
'value' => $temp['value5'],//备注描述
|
|
|
]
|
|
|
];
|
|
|
break;
|
|
|
case 4:
|
|
|
//审核结果通知(老版本的一次性订阅)
|
|
|
$data['template_id'] = "qR9reAuv_Ulelyg1H2xbN-GoWGWFRhS0t4nhtvnFr5Q";
|
|
|
$data['data'] = [
|
|
|
"character_string1" => [
|
|
|
'value' => $temp['value1'],//审核结果
|
|
|
],
|
|
|
"date3" => [
|
|
|
'value' => $temp['value2'],//审核人
|
|
|
],
|
|
|
"thing5" => [
|
|
|
'value' => $temp['value3'],//审批时间
|
|
|
],
|
|
|
"thing6" => [
|
|
|
'value' => $temp['value4'],//审批时间
|
|
|
],
|
|
|
"thing7" => [
|
|
|
'value' => $temp['value5'],//审批时间
|
|
|
]
|
|
|
];
|
|
|
break;
|
|
|
case 5:
|
|
|
//预约结果通知
|
|
|
$data['template_id'] = "oczyQ_SabASMQRRhDedXRGUEzCAuGh1xBw8sp2HVPvQ";
|
|
|
$data['data'] = [
|
|
|
"thing1" => [
|
|
|
'value' => $temp['value1'],//备注
|
|
|
],
|
|
|
"thing2" => [
|
|
|
'value' =>$temp['value2'],//日期
|
|
|
],
|
|
|
"number3" => [
|
|
|
'value' => $temp['value3'],//就诊人
|
|
|
],
|
|
|
"time4" => [
|
|
|
'value' => $temp['value4'],//就诊人
|
|
|
],
|
|
|
"thing6" => [
|
|
|
'value' => $temp['value5'],//就诊人
|
|
|
]
|
|
|
];
|
|
|
break;
|
|
|
case 6:
|
|
|
//预约结果通知
|
|
|
$data['template_id'] = "Dfvkyn3So2YE5aVJtkUTFWdjgzpo6VvWkNHZBOMb_n4";
|
|
|
$data['data'] = [
|
|
|
"character_string1" => [
|
|
|
'value' => $temp['value1'],//备注
|
|
|
],
|
|
|
"number2" => [
|
|
|
'value' =>$temp['value2'],//日期
|
|
|
],
|
|
|
"name3" => [
|
|
|
'value' => $temp['value3'],//就诊人
|
|
|
],
|
|
|
"date4" => [
|
|
|
'value' => $temp['value4'],//就诊人
|
|
|
],
|
|
|
"thing9" => [
|
|
|
'value' => $temp['value5'],//就诊人
|
|
|
]
|
|
|
];
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
return sendSubscribeMessage($data);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!function_exists('sendSubscribeMessage')) {
|
|
|
/**
|
|
|
* 小程序订阅消息推送
|
|
|
* @param $data
|
|
|
* @throws \think\Exception
|
|
|
* @throws \think\exception\PDOException
|
|
|
*/
|
|
|
function sendSubscribeMessage($data)
|
|
|
{
|
|
|
//access_token
|
|
|
$access_token = getAccessToken();
|
|
|
|
|
|
//请求url
|
|
|
$url = 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=' . $access_token;
|
|
|
|
|
|
//file_put_contents('notify.txt',$data.PHP_EOL,FILE_APPEND);
|
|
|
//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
|
|
|
$data['miniprogram_state'] = 'formal';
|
|
|
|
|
|
return curlPost($url, json_encode($data));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!function_exists('getAccessToken')) {
|
|
|
/**
|
|
|
* 获取access_token
|
|
|
* @return mixed
|
|
|
* @throws \think\Exception
|
|
|
* @throws \think\exception\PDOException
|
|
|
*/
|
|
|
function getAccessToken()
|
|
|
{
|
|
|
$wx_xcx_token = \think\Db::name("wechat_token")->where("type", "wx_xcx")->find();
|
|
|
if (empty($wx_xcx_token) || empty($wx_xcx_token['access_token']) || $wx_xcx_token['over_time'] <= time()) {
|
|
|
//微信小程序失效
|
|
|
//当前时间戳
|
|
|
$now_time = strtotime(date('Y-m-d H:i:s', time()));
|
|
|
|
|
|
//获取新的access_token
|
|
|
$appid = config("site.wxxcx_AppID");
|
|
|
$secret = config("site.wxxcx_AppSecret");
|
|
|
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $secret;
|
|
|
$res = json_decode(file_get_contents($url), true);
|
|
|
|
|
|
$access_token = $res['access_token'];
|
|
|
if (!empty($access_token)) {
|
|
|
$time = time();
|
|
|
$update_data = [
|
|
|
"access_token" => $access_token,
|
|
|
"over_time" => $time + 7200,
|
|
|
"type" => "wx_xcx",
|
|
|
"updatetime" => $time
|
|
|
];
|
|
|
if (!empty($wx_xcx_token)) {
|
|
|
//更新
|
|
|
\think\Db::name("wechat_token")->where("id", $wx_xcx_token['id'])->update($update_data);
|
|
|
} else {
|
|
|
//新增
|
|
|
\think\Db::name("wechat_token")->insertGetId($update_data);
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
$access_token = $wx_xcx_token['access_token'];
|
|
|
}
|
|
|
return $access_token;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!function_exists('curlPost')) {
|
|
|
/**
|
|
|
* 发送post请求
|
|
|
*/
|
|
|
function curlPost($url, $data)
|
|
|
{
|
|
|
$ch = curl_init();
|
|
|
$params[CURLOPT_URL] = $url; //请求url地址
|
|
|
$params[CURLOPT_HEADER] = FALSE; //是否返回响应头信息
|
|
|
$params[CURLOPT_SSL_VERIFYPEER] = false;
|
|
|
$params[CURLOPT_SSL_VERIFYHOST] = false;
|
|
|
$params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
|
|
|
$params[CURLOPT_POST] = true;
|
|
|
$params[CURLOPT_POSTFIELDS] = $data;
|
|
|
curl_setopt_array($ch, $params); //传入curl参数
|
|
|
$content = curl_exec($ch); //执行
|
|
|
// file_put_contents('notify.txt', $content . date('Y-m-d H:i:s', time()) . PHP_EOL, FILE_APPEND);
|
|
|
curl_close($ch); //关闭连接
|
|
|
return $content;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!function_exists('array_callback')) {
|
|
|
/**
|
|
|
* 20190729 kevin
|
|
|
* 规范数据返回函数
|
|
|
* @param unknown $state
|
|
|
* @param unknown $msg
|
|
|
* @param unknown $data
|
|
|
* @return multitype:unknown
|
|
|
*/
|
|
|
function array_callback($state = true, $msg = '', $data = array())
|
|
|
{
|
|
|
return array('state' => $state, 'msg' => $msg, 'data' => $data);
|
|
|
}
|
|
|
} |
|
|
\ No newline at end of file |
...
|
...
|
|