نوب
2 سال پیش توسط نوب مطرح شد
0 پاسخ

مشکل حروف فارسی در لاراول برای curl

سلام
اتصال api پیامکی به سایت رهیاب رایانه گستر نوشتم ولی وقتی پیام فارسی ارسال میکنم پیامک ارسال شده روی گوشی به صورت علامت سوال میاد ولی پیامک انگلیسی درسته

همه جای کد هم utf-8 را تست کردم ولی همچنان مشکل پابرجاست
کسانی که با curl کار کردن میشه راهنمایی کنن ؟
سپاس
لاراول 9 کار میکنم و نسخه php 8.1

رهنمایی در مورد کدها که سریعتر بخونینش و گیج نشید
یه کلاس توی Helpers ساختم و به متد send_sms پیامکم را ارسال میکنم
سایت رهیاب فقط xml برای Api ساپورت میکنه
در آخرای متد send_sms یه متد را فراخوانی کردم به اسم C2Unicode که کارش اینه که تعداد صفحات پیامک را محاسبه کنه
در نهایت هم متن پیام را به متد run_command ارسال میکنه که کار این متد ارسال پیامک به سایت رهیاب هست

مشکل کد من کجاست که پیامک به صورت علامت سوال میاد روی گوشی ؟؟؟؟؟؟؟

<?php

namespace App\Helpers\rahyab;

class SMSTools
{
    var $company = 'myCompanyName';
    var $host = '193.104.22.14';
    var $port = '2055';

    function C2Unicode($uMessage)
    {
        $ret = "";
        $i = 0;
        while ($i < strlen($uMessage)) {
            $hexstr = "";
            if ($i + 1 < strlen($uMessage)) {
                if (mb_substr($uMessage, $i, 1) == "&") {
                    if ($i + 2 < strlen($uMessage) && substr($uMessage, $i + 1, 1) == "#") {
                        $i += 2;
                        $semipos = strrpos($uMessage, ';', $i);
                        if ($semipos > $i) {
                            $hexstr = sprintf("%04x", substr($uMessage, $i, 5));
                            if (substr($uMessage, $i + 3, 1) == ";")
                                $i += 4;
                            else if (substr($uMessage, $i + 4, 1) == ";")
                                $i += 5;
                            else if (substr($uMessage, $i + 5, 1) == ";")
                                $i += 6;
                            else
                                $i += 7;
                        } else {
                            $hexstr = sprintf("%04x", $this->uniord("&"));
                            $hexstr .= sprintf("%04x", $this->uniord("#"));
                        }
                    }
                } else {
                    $hexstr = sprintf("%04x", $this->uniord(substr($uMessage, $i, 1)));
                    $i++;
                }
            } else {
                $hexstr = sprintf("%04x", $this->uniord(substr($uMessage, $i, 1)));
                $i++;
            }

            $ret .= $hexstr;
        }
        return $ret;
    }

    function CorrectNumber($uNumber)
    {

        $uNumber = Trim($uNumber);
        $ret = $uNumber;
        if (substr($uNumber, 0, 4) == "0098") {
            $ret = substr($uNumber, 4);
            $uNumber = $ret;
        }

        if (substr($uNumber, 0, 3) == "098") {
            $ret = substr($uNumber, 3);
            $uNumber = $ret;
        }

        if (substr($uNumber, 0, 3) == "+98") {
            $ret = substr($uNumber, 3);
            $uNumber = $ret;
        }

        if (substr($uNumber, 0, 2) == "98") {
            $ret = substr($uNumber, 2);
            $uNumber = $ret;
        }

        if (substr($uNumber, 0, 1) == "0") {
            $ret = substr($uNumber, 1);
            $uNumber = $ret;
        }

        return "+98" . $ret;
    }

    function uniord($c)
    {
        $ud = 0;
        if (ord($c[0]) >= 0 && ord($c[0]) <= 127)
            $ud = ord($c[0]);
        if (ord($c[0]) >= 192 && ord($c[0]) <= 223)
            $ud = (ord($c[0]) - 192) * 64 + (ord($c[1]) - 128);
        if (ord($c[0]) >= 224 && ord($c[0]) <= 239)
            $ud = (ord($c[0]) - 224) * 4096 + (ord($c[1]) - 128) * 64 + (ord($c[2]) - 128);
        if (ord($c[0]) >= 240 && ord($c[0]) <= 247)
            $ud = (ord($c[0]) - 240) * 262144 + (ord($c[1]) - 128) * 4096 + (ord($c[2]) - 128) * 64 + (ord($c[3]) - 128);
        if (ord($c[0]) >= 248 && ord($c[0]) <= 251)
            $ud = (ord($c[0]) - 248) * 16777216 + (ord($c[1]) - 128) * 262144 + (ord($c[2]) - 128) * 4096 + (ord($c[3]) - 128) * 64 + (ord($c[4]) - 128);
        if (ord($c[0]) >= 252 && ord($c[0]) <= 253)
            $ud = (ord($c[0]) - 252) * 1073741824 + (ord($c[1]) - 128) * 16777216 + (ord($c[2]) - 128) * 262144 + (ord($c[3]) - 128) * 4096 + (ord($c[4]) - 128) * 64 + (ord($c[5]) - 128);
        if (ord($c[0]) >= 254 && ord($c[0]) <= 255) //error
            $ud = false;
        return $ud;
    }

    function Base64Encode($inData)
    {
        return base64_encode($inData);
    }

    function run_command($username, $password, $xml)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'http://' . $this->host . ':' . $this->port . '/CPSMSService/Access');
        curl_setopt($ch, CURLOPT_FAILONERROR, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 500);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        curl_setopt($ch, CURLOPT_FAILONERROR, 0);
        curl_setopt($ch, CURLOPT_VERBOSE, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array("authorization:Basic " . $this->Base64Encode($username . ":" . $password), 'Content-Type: text/xml', 'Connection: Keep-Alive'));
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_COOKIEFILE, 1);

        $result = curl_exec($ch);
        curl_close($ch);

        return $result;
    }

    public function send_sms($username, $password, $from_number, $receiver, $message)
    {
        $smsid_arr = array();
        $perfix = $this->company . "+" . date("YmdHis");
        $BatchID = $perfix . sprintf("%03d", rand(0, 999));
        $txt = "";
        $txt = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
        $txt .= "<!DOCTYPE smsBatch PUBLIC \"-//PERVASIVE//DTD CPAS 1.0//EN\" \"http://www.ubicomp.ir/dtd/Cpas.dtd/\">\n";
        $txt .= "<smsBatch company=\"" . $this->company . "\" batchID=\"" . $BatchID . "\">\n";
        preg_match('/([^\x{0080}-\x{FFFF}])/u', $message) ? $vFarsi = 1 : $vFarsi = 2;
        if ($vFarsi == 1) {
            $txt .= "<sms binary=\"true\" dcs=\"8\">\n";
            $vMessage = $this->C2Unicode($message);
        } else {
            $txt .= "<sms  binary=\"false\" dcs=\"0\">\n";
            $vMessage = $message;
        }
        $txt .= "<destAddr><![CDATA[" . $this->CorrectNumber($receiver) . "]]></destAddr>\n";
        $txt .= "<origAddr><![CDATA[" . $this->CorrectNumber($from_number) . "]]></origAddr>\n";
        $txt .= "<message><![CDATA[" . $vMessage . "]]></message>\n";
        $txt .= "</sms>\n";
        $txt .= "</smsBatch>\n";
        $res = $this->run_command($username, $password, $txt);

        if (preg_match('#CHECK_OK#i', $res)) {
            $smsid_arr [$receiver] = $BatchID;
        } else {
            $smsid_arr [$receiver] = "Failed";
        }
        return $smsid_arr;
    }
}

ثبت پرسش جدید

به همدیگه کمک کنیم

به نوب کمک کنید تا مشکل خودش را حل کند؛ این‌طور می‌توانیم با هم پیشرفت کنیم.

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام