API для своего сайта на PHP

Доброго времени суток!
Есть задумка обмениваться информацией с другими сайтами, так сказать, раздавать виджеты. Я при помощи Яндекса, нашёл массу вариантов, надо только поправить под себя. Как правило, всё происходит через JS, отправляется Ajax запрос на мой сервер, сервер получив сигнал, проверяет идентификатор сайта и возвращает ему инфу, на странице выводится текст или картинка.

Обычный Ajax запрос: $.ajax({ ... });, обычный php скрипт, всё работает прекрасно только, когда виджет находится на моём сайте, виджет на другом сайте не хочет работать. Сайт, что раздаёт виджеты, находится на https, сайт, что носит виджет может быть и на http и на https, всё ровно не работает.
Научите, как делать правильно, чтобы виджет работал на другом сайте. Спасибо.
Вы дали мало информации, чтобы понять, в чем ваша проблема, мне необходимо глянуть код, возможно, тогда я найду причину.

Для отправки запроса вы используете jQuery ($.ajax({ ... });), а на сайте, что размещен виджет подключена библиотека jQuery? Вообще, лучше посылать запросы без сторонних библиотек, а на чистом JS (Ajax на чистом JavaScript), так, как не все сайты используют jQuery и, конечно, на таких сайтах работать не будет. Гляньте, что сообщается в консоли браузера?

Как вы принимаете запрос в PHP? Для того, чтобы принимать кроссдоменный Ajax, я вставлял в начале файла, к которому происходит обращение строку отдачи заголовка "Access-Control-Allow-Origin", вот так:
header('Access-Control-Allow-Origin: *');

Звездочка * говорит, что работать можно с любым сайтом.
Заголовок был, только с перечислением доменных имён, заменил на звёздочку, не хочет работать. Читал, что звёздочка в таком заголовке может принести вред сайту, его могут взломать, через эту звёздочку.

Вы правы, не все сайты используют jquery и с ними могут быть проблемы. Переписал Ajax на Ajax из темы Ajax на чистом JavaScript и работать перестало даже на своём сайте, пока восстановил на jquery. В консоль ни каких ошибок не было брошено.
Взломать сайт могут и без этого заголовка... Для того, чтобы не взломали принимайте меры безопасности.

Я для рекламной сети (делал одно время) написал такой JavaScript:
function danfaProcess() {
	var danfa = {
		'id'    : danfaId,
		'limit' : danfaLimit,
		'pose'  : danfaPose,
		'style' : (typeof danfaStyle !== 'undefined') ? danfaStyle : true,
		'url'   : escape(window.location.href),
		'width' : document.getElementById('danfa').offsetWidth
	};
	danfa = JSON.stringify(danfa);

	var XHR = ('onload' in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest;
	var danfaXHR = new XHR();
	danfaXHR.open('GET', 'https://danfa.net/block.php?ad=' + danfa, true);
	danfaXHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
	danfaXHR.send();
	danfaXHR.onreadystatechange = function() {
		if (this.readyState != 4) {
			return false;
		};

		if (this.status != 200) {
			return false;
		};

		document.getElementById('danfa').innerHTML = this.responseText;
	};
};
danfaProcess();

if (typeof danfaReboot !== 'undefined' && danfaReboot != false) {
	setInterval(danfaProcess, 300000);
};

Данный сценарий подключался к странице таким образом (параметры и подключение файла):
<!-- Danfa.Net -->
<div id="danfa">
<script type="text/javascript">
	var danfaId    = 1; // Identifier
	var danfaLimit = 3; // Max 4
	var danfaPose  = 'horizontal'; // 'horizontal' | 'vertical'
</script>
<script type="text/javascript" src="//danfa.net/file/js/ad.js"></script>
<!-- Danfa.Net End -->

JS передавал необходимые параметры в PHP, где проводились необходимые проверки и если все в порядке, PHP отдавал HTML рекламного блока:
<?php
header('Access-Control-Allow-Origin: *');

error_reporting(0); // Отключение вывода ошибок

require_once('include/define.php');
require_once('include/library/reqvest' . PHP);

if (!$ad = reqvest::get('get', 'ad'))
{
	exit;
}

$ad = json_decode($ad, true);
if (empty($ad['id']) | empty($ad['limit']) | !is_numeric($ad['id']) | !is_numeric($ad['limit']))
{
	exit;
}

$id    = $ad['id'];
$limit = ($ad['limit'] > 4) ? 4 : $ad['limit'];
$count = 0;

require_once('include/library/device' . PHP);
require_once('include/library/db' . PHP);

// Вычисление: сколько объявлений подать (определяется по ширине блока)
if ($limit != 1 && $ad['pose'] == 'horizontal' && isset($ad['width']) && $ad['width'] <= 750)
{
	if ($ad['width'] <= 750 && $ad['width'] > 600 && $limit == 4)
	{
		$limit = 3;
	}
	else if ($ad['width'] <= 600 && $ad['width'] > 450 && $limit > 2)
	{
		$limit = 2;
	}
	else if ($ad['width'] < 450)
	{
		$limit = 1;
	}
} // Вычисление: сколько объявлений подать (определяется по ширине блока) End

$q = 'SELECT site_id, url, status
    FROM sites
	WHERE site_id = ' . (int) $id;
$row = db::associative($q);
if (empty($row['site_id']) | parse_url($ad['url'], PHP_URL_HOST) != $row['url'] | $row['status'] != 1)
{
	exit;
}

$q = 'SELECT ad_id, site, link, name, description, img
    FROM ads
	WHERE site NOT IN (' . (int) $id . ')
	    AND status = 1
			AND activity = 1
				AND site IN (SELECT site_id FROM sites WHERE activity = 1 AND status = 1 AND account > 0)
					AND owner IN (SELECT user_id FROM users WHERE status = 1)
	ORDER BY RAND()
	LIMIT ' . (int) $limit;

if (db::quantity($q))
{
	$val = db::inquiry($q);
	$data = array();
	$ad_ids = '';
	while ($line = db::fetchArray($val))
	{
	    $ad_ids .= $line['ad_id'] . ', ';

		$data[] = $line;
		$count++;
	}

	$ad_ids = substr($ad_ids, 0, -2);

	$q = 'UPDATE ads
		SET
	        review = review + 1
		WHERE ad_id IN (' . $ad_ids . ')';
	db::inquiry($q);
}

$service = device::param('site.url');

$block  = '<div class="danfa_block">';
$block .= '	<div class="danfa_ad">';
$block .= '		<a href="' . $service . '" class="danfa_service" title:"' . device::lang('core.site_name') . '" target="_blank">' . device::lang('core.icon') . '</a>';
$block .= '	</div>';
$block .= '	<table class="danfa_table">';
if ($count)
{
	if ($ad['pose'] == 'horizontal' && $count == 2)
	{
		$style_td = ' style="width: 50%;"';
	}
	else if ($ad['pose'] == 'horizontal' && $count == 3)
	{
		$style_td = ' style="width: 33%;"';
	}
	else if ($ad['pose'] == 'horizontal' && $count == 4)
	{
		$style_td = ' style="width: 25%;"';
	}
	else
	{
		$style_td = ' style="width: 100%;"';
	}

	$block .= ($ad['pose'] == 'horizontal') ? '		<tr>' : null;
	foreach ($data as $line)
	{
		$link  = $service . '/url.php?link=' . base64_encode($id . '::' . $line['ad_id'] . '::' . $line['site'] . '::' . $line['link']);

		$anchor      = (mb_strlen($line['name']) > 50) ? mb_substr($line['name'], 0, 46) . ' ...' : $line['name'];
		$description = (mb_strlen($line['description']) > 100) ? mb_substr($line['description'], 0, 96) . ' ...' : $line['description'];
		$url         = parse_url($line['link'], PHP_URL_HOST);

		$block .= ($ad['pose'] == 'vertical') ? '		<tr>' : null;
		$block .= '			<td class="danfa_td"' . $style_td . '>';
		$block .= '				<a href="' . $link . '" class="danfa_link" title:"' . $line['name'] . '" target="_blank">' . $anchor . '</a>';
		$block .= '				<div>';
		$block .= (!empty($line['img'])) ? '					<img src="' . $service . '/' . URL_AD_IMG . $line['img'] . '" alt="' . $line['name'] . '" class="danfa_img" />' : null;
		$block .= '					<div class="danfa_div">' . $description . '</div>';
		$block .= '					<a href="' . $link . '" class="danfa_a" title:"' . $url . '" target="_blank">' . $url . '</a>';
		$block .= '				</div>';
		$block .= '			</td>';
		$block .= ($ad['pose'] == 'vertical') ? '		</tr>' : null;
	}
	$block .= ($ad['pose'] == 'horizontal') ? '		</tr>' : null;
}
$block .= '	</table>';
$block .= '</div>';
if ($ad['style'])
{
	$block .= '<link rel="stylesheet" type="text/css" href="' . $service . '/file/css/default.css">';
}

echo $block;

Вы так и не показали код, что у вас там, по этому разобраться, где у вас ошибка я не могу. Но из моего кода, думаю, вы сможете написать себе рабочий виджет. Мой код рабочий, я его взял с рабочего сайта.
Тоже заинтересовал вопрос создания сервиса взаимодействия с другими сайтами. Интересна тема именно размещения рекламы на других проектах. Так вот, как определить версию стороннего сайта, мобильная или дестопная?
Думаю, можно определять устройство пользователя по UserAgent.

Однако, на мобильном устройстве, можно переходить на полную версию, и наоборот. К тому же версия может быть одна, сайт может иметь адаптивную вёрстку.

Вам для какой цели?