我有一个将SMS发送给客户的代码,该代码设置为cron作业。我的问题是,当我使用cURL时,它会发送两部分的消息,并且我们的钱包要收费两次。我们平均每天要发送500条消息。我的目标是只将消息分为1部分。
因此,我试图找到不使用cURL循环发送消息的最佳方法。 我已经考虑过将循环中的发布数据保存在数组中,并将其发送到我的视图中。然后,在调用视图时,我将自动发送表单,而无需单击提交按钮并使用javascript自动提交。调用视图后,我将使用file_get_contents()从URL获得响应。但是我无法使其工作:
我当前在CURL中的代码:
public function send_sms_globe(){
error_reporting(-1);
ini_set('display_errors', 1);
set_time_limit(0);
//get all data from the database pull with status = queue
$globe_data = $this->New_Sms_Api_model->get_queued_data('globe_api');
$passphrase = '[our_pass_phrase]';
$app_id = '[our_app_id]';
$app_secret = '[our_app_secret]';
$url = 'https://devapi.globelabs.com.ph/smsmessaging/v1/outbound/<our_shortcode>/requests/';
$ch = curl_init($url);
$limit = 0;
foreach($globe_data AS $records_data){
if($limit == 49){
break;
}
switch($limit) {
case 49:
$limit = 0;
break;
default:
if($records_data['Remarks'] == 'LOADED'){
if($records_data['sent_to'] == 'sender'){
$address = $records_data['sender_phone_number'];
}else if($records_data['sent_to'] == 'consignee'){
$address = $records_data['consignee_phone_number'];
}
} else {
$address = $records_data['sender_phone_number'];
}
//$address = '+63917*******';//address : *subscriber number $records_data['phone_number'];
$message = (isset($records_data['Message']) && $records_data['Message'] != '') ? $records_data['Message']:''; //message : *sms content
$str = iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $message);
$post_data = [
'app_id' => $app_id,
'app_secret' => $app_secret,
'passphrase' => $passphrase,
'message' => rawurlencode($str),
'address' => $address
];
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// execute!
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$queue_id = $records_data['ID'];
$invoice_number = $records_data['InvoicecNumber'];
$status_remark = $records_data['Remarks'];
$record_id = $records_data['record_id'];
if($http_code == 201 || $http_code == 200){
$no_of_tries = $records_data['no_of_tries'];
if($no_of_tries == 0){
$no_of_tries = 1;
} else {
$no_of_tries = $records_data['no_of_tries'];
}
$status = 'sent';
$retry = 0;
} else {
$no_of_tries = $records_data['no_of_tries'] + 1;
if($no_of_tries == 3){
$status = 'failed';
$retry = 0;
} else {
$status = 'retry';
$retry = 1;
}
}
$update_queued_data = $this->New_Sms_Api_model->update_queued_data($queue_id, $invoice_number, $status, $retry, $no_of_tries);
if($update_queued_data){
if($status == 'sent'){
if($status_remark == 'LOADED'){
$sent_to = $records_data['sent_to'];
} else {
$sent_to = NULL;
}
$this->New_Sms_Api_model->save_to_cq_sms($invoice_number, $status_remark, $record_id,$sent_to);
echo $records_data['record_id'].' ---- '.$status;
}
$limit++;
}
}
}
// close the connection, release resources used
curl_close($ch);
}
我们有一条包含157个字符(最多160个字符)的消息。我已经谈过我们正在使用的API支持。首先,他们建议将我的消息格式化为URL编码,然后我这样做了。因此,从三部分消息变成了两部分。然后他们说,即使以这种方式格式化,它也会以两部分形式发送,因为我们使用的是cURL。他们建议我们使用PostMan,但它不是免费的,因此不是一种选择。
有什么想法可以代替我目前的代码吗?谢谢!
答案 0 :(得分:1)
很抱歉造成混乱。我能够在不更改所有代码的情况下解决此问题。我刚刚在字符串消息中删除了rawurlencode
,它现在正在发送由1部分组成的消息。
也许使用$str = iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $message);
可以解决问题,而仅在添加其他字符rawurlencode
之后使用ex: %20
。
谢谢大家!