سلام
اتصال 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;
}
}
به نوب کمک کنید تا مشکل خودش را حل کند؛ اینطور میتوانیم با هم پیشرفت کنیم.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟