各种语言调用中通开放平台接口的方式(仅供参考) - chocotan/ztosdk GitHub Wiki
本文已过期,请点击查看官方示例:http://58.40.16.125:9001/zopdoc
本文仅供参考,异常处理、编码问题请自行修改
JAVA8可以直接使用 https://github.com/chocotan/ztosdk
import java.io.*;
import java.math.BigInteger;
import java.net.*;
import java.nio.Buffer;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
class Main {
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
// TODO 请自行进行异常处理和关闭资源
String companyId = "your_company_id";
String key = "your_key";
Map<String, String> parameters = new HashMap<>();
parameters.put("data", "['728350000001']");
parameters.put("company_id", companyId);
parameters.put("msg_type", "NEW_TRACES");
String strToDigest = paramsToQueryString(parameters) + key;
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(strToDigest.getBytes(Charset.forName("UTF-8")));
String dataDigest = Base64.getEncoder().encodeToString(md.digest());
URL url = new URL("http://japi.zto.cn/traceInterfaceNewTraces");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
con.setDoOutput(true);
con.setConnectTimeout(5000);
con.setReadTimeout(5000);
con.setRequestProperty("x-datadigest", dataDigest);
con.setRequestProperty("x-companyid", companyId);
DataOutputStream out = new DataOutputStream(con.getOutputStream());
out.write(paramsToQueryStringUrlencoded(parameters).getBytes(Charset.forName("UTF-8")));
out.flush();
out.close();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer content = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
System.out.println(content.toString());
}
public static String paramsToQueryString(Map<String, String> params) {
return params.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&"));
}
public static String paramsToQueryStringUrlencoded(Map<String, String> params) {
return params.entrySet().stream().map(e -> {
try {
return e.getKey() + "=" + URLEncoder.encode(e.getValue(), "UTF-8");
} catch (UnsupportedEncodingException e1) {
return e.getValue();
}
}).collect(Collectors.joining("&"));
}
}
$url = 'http://japi.zto.cn/traceInterfaceNewTraces';
$company_id = 'your_companyid';
$key = 'your_key';
$data = array('data' => '["728350000001"]', 'company_id' => $company_id,
'msg_type'=>'NEW_TRACES');
$str_to_digest = "";
foreach ($data as $k=>$v) {
$str_to_digest =$str_to_digest.$k."=".$v."&";
}
$str_to_digest = substr($str_to_digest, 0, -1).$key;
$data_digest = base64_encode(md5($str_to_digest,TRUE));
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded; charset=utf-8\r\n".
"x-companyid: ".$company_id."\r\n".
"x-datadigest: ".$data_digest."\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;
from urllib.parse import urlencode
from urllib.request import Request, urlopen
import hashlib
import base64
company_id='your_company_id'
digest_key='your_key'
url = 'http://japi.zto.cn/traceInterfaceNewTraces'
post_fields = {'company_id': company_id,'data':'["728350000001"]','msg_type':'NEW_TRACES'}
str_to_digest = ''
for key, value in post_fields.items():
str_to_digest+=(key+'='+value+'&')
str_to_digest = str_to_digest[:-1] + digest_key
m = hashlib.md5()
m.update(str_to_digest.encode("UTF-8"))
data_digest=base64.b64encode(m.digest())
request = Request(url, urlencode(post_fields).encode())
request.add_header('x-companyid',company_id)
request.add_header('x-datadigest',data_digest)
json = urlopen(request).read().decode()
print(json)
var crypto = require('crypto');
var fetch = require('node-fetch');
var querystring = require('querystring');
let company_id = "your_company_id";
let key = "your_key";
let requestBody = {
data: "['728350000001']",
company_id: company_id,
msg_type: "NEW_TRACES"
}
let query_string = [];
for(let k in requestBody){
query_string.push(k+"="+requestBody[k]);
}
let str_to_digest = query_string.join("&")+key;
let data_digest = crypto.createHash('md5')
.update(str_to_digest)
.digest('base64');
var query_string_urlencoded = querystring.stringify(requestBody);
fetch("http://japi.zto.cn/traceInterfaceNewTraces", {
method: 'POST',
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"x-companyid":company_id,
"x-datadigest":data_digest
},
body: query_string_urlencoded,
}).then(response => {
if (response.ok) {
response.json().then(data => {
console.log(data);
})
}
})
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Web;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace ztotest
{
class Program
{
static void Main(string[] args)
{
string company_id = "kfpttestCode";
string key = "kfpttestkey==";
string data = "{\"unionCode\":\"536178917071\",\"send_province\":\"上海市\",\"send_city\":\"上海市\",\"send_district\":\"青浦区\",\"send_address\":\"华新镇华志路123号\",\"receive_province\":\"四川省\",\"receive_city\":\"成都市\",\"receive_district\":\"武侯区\",\"receive_address\":\"610号和兴润园二期1栋2单元1003室\"}";
var bodyNvc = new NameValueCollection();
bodyNvc.Add("company_id", company_id);
bodyNvc.Add("msg_type", "GETMARK");
bodyNvc.Add("data", data);
// 这里生成签名的body字符串的拼接顺序,要和http请求的参数顺序一致,也就是和上面bodyNvc的添加顺序一致
string body = "company_id=" + company_id + "&msg_type=GETMARK" + "&data=" + data;
var headersNvc = new NameValueCollection();
headersNvc.Add("x-companyId", company_id);
//得到签名
string dataDigest = EncryptMD5Base64(body + key);
headersNvc.Add("x-dataDigest", dataDigest);
Console.WriteLine(CreatePostSysHttpResponse("http://58.40.16.120:9001/bagAddrMarkGetmark", headersNvc, bodyNvc, 5000, Encoding.UTF8, null));
}
/// <summary>
/// 调用接口的方法
/// </summary>
/// <param name="url">调用的接口地址</param>
/// <param name="postValues">参数集合</param>
/// <returns></returns>
public static string Redirect(string url, NameValueCollection postValues)
{
// -- 需要调用的接口 ---
var request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
SetWebRequest(request);
var data = EncodePars(postValues);
WriteRequestData(request, data);
var response = request.GetResponse() as HttpWebResponse;
var responseStream = response.GetResponseStream();
var encoding = new UTF8Encoding(false);
var reader = new System.IO.StreamReader(responseStream, encoding);
var rValue = reader.ReadToEnd();
reader.Close();
responseStream.Close();
return rValue;
}
#region 创建POST方式的HTTP请求
/// <summary>
/// 创建POST方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="Hederparameters"></param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
/// <param name="contentType">请求的发送编码方式</param>
/// <param name="method">请求的方式GET、POST</param>
/// <returns></returns>
public static string CreatePostSysHttpResponse(string url, NameValueCollection Hederparameters, NameValueCollection parameters, int? timeout, Encoding requestEncoding, CookieCollection cookies, string contentType = "application/x-www-form-urlencoded", string method = "POST")
{
string returns = "";
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = method;
request.ContentType = contentType;
if (Hederparameters != null)
{
request.Headers.Add(Hederparameters);
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//如果需要POST数据
if (!(parameters == null || parameters.Count == 0))
{
StringBuilder buffer = new StringBuilder();
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, HttpUtility.UrlEncode(parameters[key],Encoding.UTF8));
}
else
{
buffer.AppendFormat("{0}={1}", key, HttpUtility.UrlEncode(parameters[key],Encoding.UTF8));
}
i++;
}
byte[] data = requestEncoding.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, requestEncoding);
string ret = reader.ReadToEnd();
reader.Close();
responseStream.Close();
returns = ret;
return returns;
}
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //总是接受
}
#endregion
#region 帮助方法
/// <summary>
/// 设置请求的参数信息
/// </summary>
/// <param name="request"></param>
private static void SetWebRequest(HttpWebRequest request)
{
request.Credentials = CredentialCache.DefaultCredentials;
request.Timeout = 10000;
}
/// <summary>
/// 请求数据
/// </summary>
/// <param name="request"></param>
/// <param name="data"></param>
private static void WriteRequestData(HttpWebRequest request, byte[] data)
{
request.ContentLength = data.Length;
Stream writer = request.GetRequestStream();
writer.Write(data, 0, data.Length);
writer.Close();
}
/// <summary>
/// 编码方式
/// </summary>
/// <param name="Pars"></param>
/// <returns></returns>
private static byte[] EncodePars(NameValueCollection Pars)
{
return Encoding.UTF8.GetBytes(ParsToString(Pars));
}
/// <summary>
/// 参数转为字符串
/// </summary>
/// <param name="Pars"></param>
/// <returns></returns>
private static String ParsToString(NameValueCollection Pars)
{
StringBuilder sb = new StringBuilder();
foreach (string k in Pars.Keys)
{
if (sb.Length > 0)
{
sb.Append("&");
}
sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
}
return sb.ToString();
}
#endregion
/// <summary>
/// 开放平台签名[MD5 + BASE64]
/// </summary>
/// <param name="encryptStr">加密的字符串(请求数据[data] + 消息密钥[key])</param>
/// <param name="charset">编码方式, 默认UTF-8</param>
/// <returns></returns>
public static string EncryptMD5Base64(string encryptStr, string charset = "UTF-8")
{
string rValue = "";
var m5 = new MD5CryptoServiceProvider();
byte[] inputBye;
byte[] outputBye;
try
{
inputBye = Encoding.GetEncoding(charset).GetBytes(encryptStr);
}
catch (Exception)
{
inputBye = Encoding.UTF8.GetBytes(encryptStr);
}
outputBye = m5.ComputeHash(inputBye);
rValue = Convert.ToBase64String(outputBye, 0, outputBye.Length);
return rValue;
}
}
}