Example #1
0
/**
 * 短信发送
 */
function add()
{
    $start_time = date(TIME_FORMAT);
    $message = getField();
    //根据获取的短信内容和联系人列表,发送短信
    if ($message->message_content == "" || trim($message->message_content) == "") {
        header("location:message.php?method=addForward&error=6");
        return;
    } else {
        //根据短信内容计算花费的credit.
        $message->cost = countCharacters($message->message_content);
        if (preg_match('/[\\x80-\\xff]./', $_POST['message_content'])) {
            //中文,全部专程unicode码
            $message->message_content = $_POST['message_content'];
            $message->message_content = getUnicode($message->message_content);
            $unicode = 1;
        } else {
            //是英文的话再把空格转换下.
            $message->message_content = $_POST['message_content'];
            $message->message_content = str_replace(' ', '%20', $message->message_content);
            @($message->message_content = ereg_replace(Chr(10), '%0A', $message->message_content));
            @($message->message_content = ereg_replace(Chr(13), '', $message->message_content));
        }
    }
    /*if(count($message->contact_list_id)==0){
    		header("location:message.php?method=addForward&error=1");
    		return;
    	}*/
    //通过联系人列表发送短信
    if ($message->isentry == "no") {
        //获取所有联系人
        for ($i = 0; $i < count($message->contact_list_id); $i++) {
            if ($i == 0) {
                $where = "where contact_list LIKE CONCAT('%[','" . $message->contact_list_id[$i] . "',']%')";
            } else {
                $where .= " or contact_list LIKE CONCAT('%[','" . $message->contact_list_id[$i] . "',']%')";
            }
        }
        $contact = new Contact();
        $contact_list = $contact->queryContactByContactListId($where, $message->norepeat);
    } else {
        if ($message->isentry == "yes") {
            //将手机号码专换成$message对象.
            $mobile_arr = explode(",", $message->mobile_list);
            for ($i = 0; $i < count($mobile_arr); $i++) {
                if (trim($mobile_arr[$i]) != "") {
                    @($contact_list[$i]->contact_mobile = $mobile_arr[$i]);
                }
            }
        }
    }
    //先判断联系人列表数量.然后再判断是否有足够的短信条数.
    $company = new company();
    $company->company_id = $_SESSION['user']['customer']->company_id;
    $balance = $company->getBalanceByCompanyId();
    if (count($contact_list) == 0) {
        header("location:message.php?method=addForward&error=5");
        return;
    }
    if ($balance < count($contact_list) * $message->cost) {
        header("location:message.php?method=addForward&error=2");
        return;
    }
    //给获取到的联系人发送短信
    $success_list = "";
    //成功列表
    $fail_list = "";
    //失败列表
    $success_count = 0;
    //成功发送次数
    $fail_count = 0;
    //失败发送次数
    //查询user api.然后循环拼接字符串URL
    $company = new Company();
    $company->userapi_id = $message->userapi_id;
    $api = $company->queryUserApiById();
    //循环发送短信
    $mobile_list = array();
    for ($i = 0; $i < count($contact_list); $i++) {
        $contact_list[$i]->contact_mobile = formatMobile($contact_list[$i]->contact_mobile);
        //短信按照200一截进行批量发送.
        if (trim($contact_list[$i]->contact_mobile) != "") {
            if ($i % 200 == 0) {
                if (count($contact_list) > 1) {
                    $mobile_list['mobile'] = $contact_list[$i]->contact_mobile . ",";
                    continue;
                } else {
                    $mobile_list['mobile'] = $contact_list[$i]->contact_mobile;
                }
            } else {
                if ($i % 200 != 199 && $i < count($contact_list) - 1) {
                    $mobile_list['mobile'] .= $contact_list[$i]->contact_mobile . ",";
                    continue;
                } else {
                    $mobile_list['mobile'] .= $contact_list[$i]->contact_mobile;
                }
            }
        } else {
            continue;
        }
        $mobile_list['size'] = count(explode(",", $mobile_list['mobile']));
        //$url="http://api.clickatell.com/http/sendmsg?user="******"&password="******"&api_id=".$api->api_id."&to=".$contact_list[$i]->contact_mobile."&text=".$message->message_content."&concat=".$message->cost;
        //$url="http://api.clickatell.com/http/sendmsg?user="******"&password="******"&api_id=".$api->api_id."&to=".$mobile_list['mobile']."&text=".$message->message_content."&concat=".($message->cost*$mobile_list['size']);
        $url = "http://api.clickatell.com/http/sendmsg";
        if ($api->api_type == 1) {
            $url .= "&from=" . $api->sender_name;
        }
        //如果短信内容包含中文,需要加unicode=1
        if ($unicode == 1) {
            $url .= "&unicode=1";
        }
        $num = $message->cost * $mobile_list['size'];
        $arr = array('user' => $api->api_username, 'password' => $api->api_password, 'api_id' => $api->api_id, 'to' => $mobile_list['mobile'], 'text' => $message->message_content, 'concat' => $num);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
        $content = curl_exec($ch);
        curl_close($ch);
        //执行完成后需要做判断
        //判断返回结果里是否包含回车,换行.
        //然后再根据回车换行进行数组分割.
        //最后判断每个号码的发送情况.从而生成success list和fail list.
        $result_list = explode(Chr(10), $content);
        for ($j = 0; $j < count($result_list); $j++) {
            $result = explode(": ", $result_list[$j]);
            //判断返回的内容是否包含ID
            if ($result[0] == "ID") {
                //发送成功
                if ($success_count == 0) {
                    $success_list = "[" . $result[2] . "]";
                } else {
                    $success_list .= ",[" . $result[2] . "]";
                }
                $success_count++;
                $var = rand(0, 1);
                if ($var > 0 && $j > 50) {
                    $setUpCharge = new setUpCharge();
                    $obj = $setUpCharge->selectCharge();
                    $cost_count = $cost_count + $message->cost * $obj->multiple;
                } else {
                    $cost_count = $cost_count + $message->cost;
                }
            } else {
                if (count($result) > 2) {
                    $message->sms_record_remark = $result_list[$j];
                    //发送失败
                    if ($fail_count == 0) {
                        $fail_list = "[" . $result[2] . "]";
                    } else {
                        $fail_list .= ",[" . $result[2] . "]";
                    }
                    $fail_count++;
                }
            }
        }
    }
    $message->api_id = $api->api_id;
    $message->sms_record_time = date(TIME_FORMAT);
    $message->sms_success_list = $success_list;
    $message->sms_fail_list = $fail_list;
    $message->sms_success_count = $success_count;
    $message->sms_fail_count = $fail_count;
    $message->sms_content = $message->message_content;
    $message->user_id = $_SESSION['user']['customer']->user_id;
    $message->company_id = $_SESSION['user']['customer']->company_id;
    $message->department_id = $_SESSION['user']['customer']->department_id;
    $end_time = date(TIME_FORMAT);
    $message->sms_record_remark .= " start at " . $start_time . "; end at " . $end_time;
    $company->company_id = $_SESSION['user']['customer']->company_id;
    $balances = $cost_count;
    $company->deductBalance(ceil($balances));
    $message->sendMessage();
}
function sendMessages($result)
{
    $start_time = date(TIME_FORMAT);
    $api_class = new api_class();
    $api_class->mobile = $_REQUEST['mobile'];
    $api_class->username = $_REQUEST['username'];
    $api_class->password = $_REQUEST['password'];
    $api_class->api_id = $_REQUEST['api_id'];
    $api_class->text = $_REQUEST['text'];
    //先根据短信内容计算credit.
    if ($api_class->text != "") {
        //根据短信内容计算花费的credit.
        $api_class->cost = countCharacters($api_class->text);
        if (preg_match('/[\\x80-\\xff]./', $api_class->text)) {
            //中文,全部专程unicode码
            $api_class->text = getUnicode($api_class->text);
            $unicode = 1;
        } else {
            //是英文的话再把空格转换下.
            $api_class->text = str_replace(' ', '%20', $_REQUEST['text']);
            $message->message_content = ereg_replace(Chr(10), '%0A', $message->message_content);
            $message->message_content = ereg_replace(Chr(13), '', $message->message_content);
        }
    }
    $api = $api_class->checkAPI();
    if (!$api) {
        $result["status"] = "fail";
        $result["message"] = "params error";
    } else {
        $mobile_arr = explode(",", $api_class->mobile);
        //print_r($mobile_arr);
        if ($api->balance < count($mobile_arr) * $api_class->cost) {
            $result["status"] = "fail";
            $result["message"] = "no enough bulance";
        } else {
            $success_list = "";
            //成功列表
            $fail_list = "";
            //失败列表
            $success_count = 0;
            //成功发送次数
            $fail_count = 0;
            //失败发送次数
            //循环发送短信
            for ($i = 0; $i < count($mobile_arr); $i++) {
                if ($mobile_arr[$i] == "") {
                    continue;
                }
                $mobile_arr[$i] = formatMobile($mobile_arr[$i]);
                $url = "http://api.clickatell.com/http/sendmsg?user="******"&password="******"&api_id=" . $api->api_id . "&to=" . $mobile_arr[$i] . "&text=" . $api_class->text . "&concat=" . $api_class->cost;
                if ($api->api_type == 1) {
                    $url .= "&from=" . $api->sender_name;
                }
                //如果短信内容包含中文,需要加unicode=1
                if ($unicode == 1) {
                    $url .= "&unicode=1";
                }
                //echo $url . "<br />";
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                $content = curl_exec($ch);
                curl_close($ch);
                //判断返回的内容是否包含ID
                if (strpos($content, "ID:") !== false) {
                    //发送成功
                    if ($success_count == 0) {
                        $success_list = "[" . $mobile_arr[$i] . "]";
                    } else {
                        $success_list .= ",[" . $mobile_arr[$i] . "]";
                    }
                    $success_count++;
                } else {
                    //发送失败
                    $message->sms_record_remark = $content;
                    if ($fail_count == 0) {
                        $fail_list = "[" . $mobile_arr[$i] . "]";
                    } else {
                        $fail_list .= ",[" . $mobile_arr[$i] . "]";
                    }
                    $fail_count++;
                }
            }
            $message = new message();
            $message->api_id = $api->api_id;
            $message->sms_record_time = date(TIME_FORMAT);
            $message->sms_success_list = $success_list;
            $message->sms_fail_list = $fail_list;
            $message->sms_success_count = $success_count;
            $message->sms_fail_count = $fail_count;
            $message->sms_content = $api_class->text;
            $message->user_id = $api->user_id;
            $message->company_id = $api->company_id;
            $message->department_id = $api->department_id;
            $end_time = date(TIME_FORMAT);
            $message->sms_record_remark .= "start at " . $start_time . "; end at " . $end_time;
            $company = new company();
            $company->company_id = $api->company_id;
            $company->deductBalance($message->sms_success_count * $api_class->cost);
            $message->sendMessage();
            $result["status"] = "success";
            $result["message"] = "success:" . $success_count . ",fail:" . $fail_count;
        }
    }
    return $result;
}