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

时间:2018-07-16 17:45:36

标签: php api codeigniter codeigniter-3 sms-gateway

我有一个将SMS发送给客户的代码,该代码设置为cron作业。我的问题是,当我使用cURL时,它会发送两部分的消息,并且我们的钱包要收费两次。我们平均每天要发送500条消息。我的目标是只将消息分为1部分。

因此,我试图找到不使用cURL循环发送消息的最佳方法。 我已经考虑过将循环中的发布数据保存在数组中,并将其发送到我的视图中。然后,在调用视图时,我将自动发送表单,而无需单击提交按钮并使用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编码,然后我这样做了。因此,从三部分消息变成了两部分。然后他们说,即使以这种方式格式化,它也会以两部分形式发送,因为我们使用的是cURL。他们建议我们使用PostMan,但它不是免费的,因此不是一种选择。

有什么想法可以代替我目前的代码吗?谢谢!

1 个答案:

答案 0 :(得分:1)

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

也许使用$str = iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $message);可以解决问题,而仅在添加其他字符rawurlencode之后使用ex: %20

谢谢大家!