在没有cURL的循环中提交POST数据并获取响应数据-CodeIgniter



我有一个代码,可以向设置为cron作业的客户发送SMS。我的问题是,当我使用cURL时,它会发送两部分信息,而我们的钱包会被收取两次费用。我们平均每天要发送500条消息。我的目标是使信息只包含一部分。

因此,我正在努力寻找在不使用cURL的情况下循环发送消息的最佳方式。我曾想过将循环中的post数据保存在一个数组中,并将其发送到我的视图中。然后,当视图被调用时,我将自动发送表单,而无需点击提交按钮并使用javascript自动提交。调用视图后,我将使用file_get_contents((从URL获取响应。但我不能让它工作:

  1. 视图在循环中不起作用。它只是在循环之外工作
  2. 如果我在视图中而不是在控制器中传递循环,我如何获得每个循环的响应数据

我在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编码,我照做了。因此,从三部分信息变成了两部分。然后他们说它将以2部分的形式发送,即使它是这样格式化的,因为我们使用cURL。他们建议我们使用PostMan,但它不是免费的,所以这不是一个选择。

有什么可以取代我当前代码的想法吗?谢谢

很抱歉造成混淆。我能够在不更改所有代码的情况下解决这个问题。我刚刚删除了字符串消息中的rawurlencode,它现在正在发送一条由1部分组成的消息。

也许使用$str = iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $message);已经达到了效果,而使用rawurlencode只是添加了额外的字符ex: %20

谢谢大家!

相关内容

  • 没有找到相关文章

最新更新