基本参数及校验
<h2>基础参数, 所有接口必传!</h2>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">必选</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">appKey</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>分配给第三方的key 即推广位</td>
</tr>
<tr>
<td style="text-align: left;">time</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>时间戳 <code>秒级</code></td>
</tr>
<tr>
<td style="text-align: left;">sign</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>签名 <code>小写</code></td>
</tr>
</tbody>
</table>
<h3>签名规则如下</h3>
<h4>1. 除[sign]以外, 所有参数按照键名排序。</h4>
<p>以下为php demo</p>
<pre><code> //除了[sign]的所有参数
$params = [
'appKey' =&gt; 123
'time' =&gt; 456
....
]
//按键名升序排序
$param = ksort($param)</code></pre>
<h4>2. 遍历数组, 将参数的key与value用[=]连接,得到字符串。 再将所有得到的字符串用[&]连接,得到新字符串。</h4>
<h4>以上述例子,得到的字符串为:$str = 'appKey=123&time=456'</h4>
<h4>3. 将生成后的字符串同样与appSecret拼接</h4>
<pre><code> $appSecret = '789'
$str = $str . '&amp;appSecret=789'
//$str = 'appKey=123&amp;time=456&amp;appSecret=789'</code></pre>
<h4>4. 将字符串进行md5加密,得到签名[sign]</h4>
<pre><code> $sign = md5($str)</code></pre>
<h4>5.签名完成,最终请求参数为:</h4>
<pre><code> $param = [
'appKey' =&gt; 123
'time' =&gt; 456,
...
'sign' =&gt; $sign
]</code></pre>
<h4>6. 错误则返回错误结果,如</h4>
<pre><code> {
&quot;success&quot;: false,
&quot;message&quot;: &quot;请求过期&quot;,
&quot;data&quot;: [],
&quot;code&quot;: 40057
}</code></pre>
<h5>返回参数说明</h5>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td style="text-align: left;">int</td>
<td>状态码</td>
</tr>
<tr>
<td style="text-align: left;">data</td>
<td style="text-align: left;">array</td>
<td>调用成功接口返回的数据</td>
</tr>
<tr>
<td style="text-align: left;">message</td>
<td style="text-align: left;">string</td>
<td>结果返回说明</td>
</tr>
<tr>
<td style="text-align: left;">success</td>
<td style="text-align: left;">boolean</td>
<td>调用结果</td>
</tr>
</tbody>
</table>
<h5>备注</h5>
<ul>
<li>更多返回错误代码请看首页的错误代码描述</li>
</ul>
<h5>坐标系转换</h5>
<pre><code> public static double pi = 3.1415926535897932384626;
public static double x\_pi = 3.14159265358979324 \* 3000.0 / 180.0;
public static double a = 6378245.0;
public static double ee = 0.00669342162296594323;
public static double transformLat(double x, double y) {
double ret = -100.0 \+ 2.0 \* x + 3.0 \* y + 0.2 \* y \* y + 0.1 \* x \* y
+ 0.2 \* Math.sqrt(Math.abs(x));
ret += (20.0 \* Math.sin(6.0 \* x \* pi) + 20.0 \* Math.sin(2.0 \* x \* pi)) \* 2.0 / 3.0;
ret += (20.0 \* Math.sin(y \* pi) + 40.0 \* Math.sin(y / 3.0 \* pi)) \* 2.0 / 3.0;
ret += (160.0 \* Math.sin(y / 12.0 \* pi) + 320 \* Math.sin(y \* pi / 30.0)) \* 2.0 / 3.0;
return ret;
}
public static double transformLon(double x, double y) {
double ret = 300.0 \+ x + 2.0 \* y + 0.1 \* x \* x + 0.1 \* x \* y + 0.1
\* Math.sqrt(Math.abs(x));
ret += (20.0 \* Math.sin(6.0 \* x \* pi) + 20.0 \* Math.sin(2.0 \* x \* pi)) \* 2.0 / 3.0;
ret += (20.0 \* Math.sin(x \* pi) + 40.0 \* Math.sin(x / 3.0 \* pi)) \* 2.0 / 3.0;
ret += (150.0 \* Math.sin(x / 12.0 \* pi) + 300.0 \* Math.sin(x / 30.0
\* pi)) \* 2.0 / 3.0;
return ret;
}
public static double\[\] transform(double lat, double lon) {
if (outOfChina(lat, lon)) {
return new double\[\]{lat,lon};
}
double dLat = transformLat(lon - 105.0, lat - 35.0);
double dLon = transformLon(lon - 105.0, lat - 35.0);
double radLat = lat / 180.0 \* pi;
double magic = Math.sin(radLat);
magic = 1 \- ee \* magic \* magic;
double sqrtMagic = Math.sqrt(magic);
dLat = (dLat \* 180.0) / ((a \* (1 \- ee)) / (magic \* sqrtMagic) \* pi);
dLon = (dLon \* 180.0) / (a / sqrtMagic \* Math.cos(radLat) \* pi);
double mgLat = lat + dLat;
double mgLon = lon + dLon;
return new double\[\]{mgLat,mgLon};
}
public static boolean outOfChina(double lat, double lon) {
if (lon &lt; 72.004 || lon &gt; 137.8347)
return true;
if (lat &lt; 0.8293 || lat &gt; 55.8271)
return true;
return false; }
/\*\*
\* 84 to 火星坐标系 (GCJ-02) World Geodetic System ==&gt; Mars Geodetic System
\* \* @param lat
\* @param lon
\* @return
\*/
public static double\[\] gps84\_To\_Gcj02(double lat, double lon) {
if (outOfChina(lat, lon)) {
return new double\[\]{lat,lon};
}
double dLat = transformLat(lon - 105.0, lat - 35.0);
double dLon = transformLon(lon - 105.0, lat - 35.0);
double radLat = lat / 180.0 \* pi;
double magic = Math.sin(radLat);
magic = 1 \- ee \* magic \* magic;
double sqrtMagic = Math.sqrt(magic);
dLat = (dLat \* 180.0) / ((a \* (1 \- ee)) / (magic \* sqrtMagic) \* pi);
dLon = (dLon \* 180.0) / (a / sqrtMagic \* Math.cos(radLat) \* pi);
double mgLat = lat + dLat;
double mgLon = lon + dLon;
return new double\[\]{mgLat, mgLon};
}
/\*\*
\* \* 火星坐标系 (GCJ-02) to 84 \* \* @param lon \* @param lat \* @return
\* \*/ public static double\[\] gcj02\_To\_Gps84(double lat, double lon) {
double\[\] gps = transform(lat, lon);
double lontitude = lon \* 2 \- gps\[1\];
double latitude = lat \* 2 \- gps\[0\];
return new double\[\]{latitude, lontitude};
}
/\*\*
\* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标
\*
\* @param lat
\* @param lon
\*/ public static double\[\] gcj02\_To\_Bd09(double lat, double lon) {
double x = lon, y = lat;
double z = Math.sqrt(x \* x + y \* y) + 0.00002 \* Math.sin(y \* x\_pi);
double theta = Math.atan2(y, x) + 0.000003 \* Math.cos(x \* x\_pi);
double tempLon = z \* Math.cos(theta) + 0.0065;
double tempLat = z \* Math.sin(theta) + 0.006;
double\[\] gps = {tempLat,tempLon};
return gps;
}
/\*\*
\* \* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 \* \* 将 BD-09 坐标转换成GCJ-02 坐标 \* \* @param
\* bd\_lat \* @param bd\_lon \* @return \*/ public static double\[\] bd09\_To\_Gcj02(double lat, double lon) {
double x = lon - 0.0065, y = lat - 0.006;
double z = Math.sqrt(x \* x + y \* y) - 0.00002 \* Math.sin(y \* x\_pi);
double theta = Math.atan2(y, x) - 0.000003 \* Math.cos(x \* x\_pi);
double tempLon = z \* Math.cos(theta);
double tempLat = z \* Math.sin(theta);
double\[\] gps = {tempLat,tempLon};
return gps;
}
/\*\*将gps84转为bd09
\* @param lat
\* @param lon
\* @return
\*/
public static double\[\] gps84\_To\_bd09(double lat,double lon){
double\[\] gcj02 = gps84\_To\_Gcj02(lat,lon);
double\[\] bd09 = gcj02\_To\_Bd09(gcj02\[0\],gcj02\[1\]);
return bd09;
}
public static double\[\] bd09\_To\_gps84(double lat,double lon){
double\[\] gcj02 = bd09\_To\_Gcj02(lat, lon);
double\[\] gps84 = gcj02\_To\_Gps84(gcj02\[0\], gcj02\[1\]);
//保留小数点后六位
gps84\[0\] = retain6(gps84\[0\]);
gps84\[1\] = retain6(gps84\[1\]);
return gps84;
}
/\*\*保留小数点后六位
\* @param num
\* @return
\*/
private static double retain6(double num){
String result = String .format(&quot;%.6f&quot;, num);
return Double.valueOf(result);
} </code></pre>