Ruby Script для переполнения стека

У меня есть сценарий ниже, написанный на Ruby. Мне было интересно, кто-нибудь может помочь мне преобразовать его в PHP. Я знаю, это большой вопрос. Я хочу преобразовать скрипт ruby ​​в запрос PHP curl.

Смотрите ссылку на документацию https://www.sinch.com/docs/rest-apis/api-documentation/#applicationsignedrequest

Первый код — это ОБРАЗЕЦ сценария ruby. В то время как второй ниже это то, что я пытался написать на PHP самостоятельно. Без успеха, потому что я получаю «Недопустимая ошибка подписи».

require "base64"require "openssl"require "time"require "net/http"require "uri"require "json"
to = "+4412345678"message = "Test sms message"key = "wwwwwwwwwxxxxxxxx" //Key as supplied by sinch.com
secret = "zzzzzzzyyyyyyyyy" // Secret as supplied by sinch.com

body = "{\"message\":\"" + message + "\"}"timestamp = Time.now.iso8601
http_verb = "POST"path = "/v1/sms/" + to
scheme = "Application"content_type = "application/json"digest = OpenSSL::Digest.new('sha256')
canonicalized_headers = "x-timestamp:" + timestamp
content_md5 = Base64.encode64(Digest::MD5.digest(body.encode("UTF-8"))).strip
string_to_sign = http_verb + "\n" + content_md5 + "\n" + content_type + "\n" + canonicalized_headers + "\n" + path
signature = Base64.encode64(OpenSSL::HMAC.digest(digest, Base64.decode64(secret), string_to_sign.encode("UTF-8"))).strip
authorization = "Application " + key + ":" + signature

uri = URI.parse("https://messagingApi.sinch.com" + path)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
headers = {"content-type" => "application/json", "x-timestamp" => timestamp, "authorization" => authorization}
request = Net::HTTP::Post.new(uri.request_uri)
request.initialize_http_header(headers)
request.body = body
puts JSON.parse(http.request(request).body)

Ниже приведен мой сценарий, и у меня нет проблем с принятием совершенно нового сценария. Я супер Рубин новобранец. Пожалуйста помоги.

$to="+4412345678";
$text="Hello there test message";
$curl_post_data = array(
'Message' => $text
);

$curl_post_data=json_encode($curl_post_data);

$timestamp=date("c");
$key = "wwwwwwwwwwwxxxxxxxxxxx";
$secret = "zzzzzzzzzzzzyyyyyyyyyyy";
$http_verb="POST";
$path = "/v1/sms/".$to."";
$scheme = "Application ";
$content_type = "application/json";
$canonicalized_headers = "x-timestamp:".$timestamp."";
$content_md5=base64_encode( md5($curl_post_data,true) );
$string_to_sign = array(
'http_verb' => $http_verb,
'content_md5' => $content_md5,
'content_type' => $content_type,
'canonicalized_headers' =>$canonicalized_headers
);
$signature = hash_hmac("sha256", $secret,json_encode($string_to_sign));
$authorization = "".$scheme."".$key.":".$signature."";

$service_url = 'https://messagingapi.sinch.com/v1/sms/'.$to.'';
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=UTF-8', 'x-timestamp: '.$timestamp.'','authorization: '.$authorization.''));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$curl_response = curl_exec($curl);
$response = json_decode($curl_response);
curl_close($curl);

var_dump($response);

?>

Любая помощь, пожалуйста, Stackoverflow был полезным ресурсом, когда я застрял с чем-то, я надеюсь, что мой вопрос поможет другим.

-3

Решение

Я получил его на работу, пришлось переписать несколько вещей. В любом случае, вот рабочий код для тех, кому это может понадобиться.

<?php

$to="+4412345678";
$text2="Test sms message from PHP";
$curl_post_data = array(
'message' => $text2
);

$timestamp=date("c");
$key = "wwwwwwwwwwwwwxxxxxxxxxxxxxxx";
$secret ="zzzzzzzzzzzzyyyyyyyyyyyyyy";
$http_verb="POST";
$path = "/v1/sms/".$to."";
$scheme = "Application";
$content_type = "application/json";
$canonicalized_headers = "x-timestamp:".$timestamp."";

$content_md5=md5(json_encode($curl_post_data),true);

$string_to_sign ="".$http_verb."\n".$content_md5."\n".$content_type."\n".$canonicalized_headers."\n".$path."\n";

$signature = hash_hmac("sha256", base64_encode($secret),utf8_encode($string_to_sign) true);
$signature=base64_encode($signature);
$authorization = "".$scheme."".$key.":".$signature."";$curl_post_data=json_encode($curl_post_data);
$service_url = 'https://messagingapi.sinch.com/v1/sms/'.$to.'';
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=UTF-8','x-timestamp:'.$timestamp.'','authorization:'.$authorization.''));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$curl_response = curl_exec($curl);
$response = json_decode($curl_response);
curl_close($curl);
var_dump($response);
?>
1

Другие решения

Полностью рабочий код. Также спасибо Стивену за базовый перенос с Ruby на PHP. Это экономит мне много времени.
Некоторые заметки:

  • Ключ должен быть скопирован из меню приложений учетной записи sinch как есть (без какого-либо преобразования)
  • Строка для подписи не должна содержать новую строку в конце. Также, пожалуйста, проверяйте все изменения, устанавливая значения по умолчанию из закомментированного кода.
  • В PHP функция hash_hmac должна быть определена cody до секрет (в Ruby аргументы должны быть определены в другом порядке)
  • Если фактические заголовки будут содержать определение набора символов — string_to_sign также должен содержать его. Я их вообще удалил.

    $key     = 'key';
    $secret  = 'secret';
    $message = 'your message';
    $phone   = '+000000000000';
    
    $body = json_encode(array('message'=>$message));
    $timestamp = date("c");
    
    // {{{ test values for checking code (from docs)
    /*
    $phone="+46700000000";
    $key = "5F5C418A0F914BBC8234A9BF5EDDAD97";
    $secret ="JViE5vDor0Sw3WllZka15Q==";
    $timestamp='2014-06-04T13:41:58Z';
    $body = '{"message":"Hello world"}';
    */
    // result:
    //      content-md5 should be 'jANzQ+rgAHyf1MWQFSwvYw=='
    //      signature should be 'qDXMwzfaxCRS849c/2R0hg0nphgdHciTo7OdM6MsdnM='
    // }}}
    
    $path                  = "/v1/sms/" . $phone;
    $content_type          = "application/json";
    $canonicalized_headers = "x-timestamp:" . $timestamp;
    
    $content_md5 = base64_encode( md5( utf8_encode($body), true ));
    
    $string_to_sign =
    "POST\n".
    $content_md5."\n".
    $content_type."\n".
    $canonicalized_headers."\n".
    $path;
    
    $signature = base64_encode(hash_hmac("sha256", utf8_encode($string_to_sign), base64_decode($secret), true));
    $authorization = "Application " . $key . ":" . $signature;
    
    $curl_post_data=json_encode($curl_post_data);
    $service_url = 'https://messagingapi.sinch.com'.$path;
    $curl = curl_init($service_url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'content-type: '.$content_type,
    'x-timestamp:' . $timestamp,
    'authorization:' . $authorization
    ));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $curl_response = curl_exec($curl);
    // @todo: checking response / working with results
    curl_close($curl);
    
0

По вопросам рекламы [email protected]