第一次写winfrom 不知道怎么写,以下是给的接口说明
HTTP请求方式:GET
http://ip:port/lanshuijsdService/3.0/hts/queryCyr?param_key=?&secret_key=?
1) 注意:
以JSON格式传入输入参数
1) 请求参数
参数名称 类型 必需 描述
param_key 字符串 是 输入参数值
secret_key 字符串 是 Md5摘要信息
Param_key中包含的输入json中的字段描述如下:
参数名称 类型 必需 描述
meraccount string 是 商户账户(321000000)
method string 是 API的资源操作方法名(queryCyr)
timestamp number 是 用户发起请求时的unix时间戳。
v number 是 API版本号,默认使用最高版本(1.0)。
⦁ 请求示例:
将param_key内的json中元素按照参数名排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串后进行MD5,以形成secret_key值
param_key值=RSA(URLEncoder ({”name2”:”value2”, “name1”:”value1”,”name3”:”value3”},”UTF-8”))
secret_key值= URLEncoder (md5(name1=value1& name2=value2&name3=value3) ,”UTF-8”)
⦁ 签名算法
服务API使用的签名算法如下:
⦁ 获取请求的HTTP method;
⦁ 获取请求的URL,包括host和scheme,但不包括query_string的部分
⦁ 将所有参数(包括GET或POST的参数,但不包含签名字段)格式化为“key=value”格式,如“k1=v1”、“k2=v2”、“k3=v3”;
⦁ 将格式化好的参数键值对以字典序升序排列后,拼接在一起,如“k1=v1&k2=v2&k3=v3”,并将HTTP method和URL按顺序拼接在这个字符串前面;
⦁ 在拼接好的字符串末尾追加上应用的secret_key,并进行urlencode形成base_string;
⦁ 上述字符串的MD5值即为签名的值:
sign= urlencode(MD5(k1=v1&k2=v2&k3=v3));
⦁ 安全加密
为了确保敏感数据的可靠传输。必须对传输数据使用RSA的公钥进行非对称加密,私钥由服务提供方妥善保管,公钥由客户端经过身份验证之后获得。安全加密算法如下:
RSA(URLEncoder ({”name2”:”value2”, “name1”:”value1”,”name3”:”value3”},”UTF-8”))
分配的RSA公钥如下:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsoGCMo/XE+fNlLQBLK4VBYe8pVZe71Eb5fZOxd213vvshmWA/9c+vSM/uUAcD/W/It+xnJE1TECCTbV6uCqgfmrztwe2OQS2kGhLPGIYfo9ha2NufghUNAHAB9M0m1lp7y2m8T27iPhy
下面我写的代码:
string strURL = "http://192.168.200.207:8088/lsjsdService/3.0/hts/queryJsd?param_key=";
string md5 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GyRRxv35xuamvvnzQDOerH3yrrCLnJ6bQIDAQAB";
string pk="{\"val\":\"200005719465\",\"scode\":\"321000006\",\"date\":\"20180625\",\"flag\":\"0\",\"meraccount\":\"321000000\",\"method\":\"queryJsd\",\"v\":\"3.0\",\"timestamp\":\"20180707\",}";
string param_key = ToUrlEncode(pk);
string sk = "var=200005719465&scode=321000006&date=20180625&flag=0&meraccount=321000000&method=queryJsd&v=3.0×tamp=20180707";
string secret_key = sign(sk, md5, "UTF-8");
strURL = "http://192.168.200.207:8088/lsjsdService/3.0/hts/queryJsd?param_key=" + param_key + "&secret_key=" + secret_key;
string h = HttpApi(strURL, "{}", "get");
public static string ToUrlEncode(string strCode)
{
StringBuilder sb = new StringBuilder();
byte[] byStr = System.Text.Encoding.UTF8.GetBytes(strCode); //默认是System.Text.Encoding.Default.GetBytes(str)
System.Text.RegularExpressions.Regex regKey = new System.Text.RegularExpressions.Regex("^[A-Za-z0-9]+$");
for (int i = 0; i < byStr.Length; i++)
{
string strBy = Convert.ToChar(byStr[i]).ToString();
if (regKey.IsMatch(strBy))
{
//是字母或者数字则不进行转换
sb.Append(strBy);
}
else
{
sb.Append(@"%" + Convert.ToString(byStr[i], 16));
}
}
return (sb.ToString());
}
public static string sign(string content, string privateKey, string input_charset)
{
Encoding code = Encoding.GetEncoding(input_charset);
byte[] Data = code.GetBytes(content);
RSACryptoServiceProvider rsa = DecodePemPrivateKey(privateKey);
SHA1 sh = new SHA1CryptoServiceProvider();
byte[] signData = rsa.SignData(Data, sh);
return Convert.ToBase64String(signData);
}
/// <summary>
/// 调用api返回json
/// </summary>
/// <param name="url">api地址</param>
/// <param name="jsonstr">接收参数</param>
/// <param name="type">类型</param>
/// <returns></returns>
public static string HttpApi(string url, string jsonstr, string type)
{
Encoding encoding = Encoding.UTF8;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//webrequest请求api地址
request.Accept = "text/html,application/xhtml+xml,*/*";
request.ContentType = "application/json";
request.Method = type.ToUpper().ToString();//get或者post
byte[] buffer = encoding.GetBytes(jsonstr);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
文档里说的:param_key,secret_key 这两个值我都不知道我转换对没?以上我拼接的字符串正确吗?sign方法老是报错
![图片说明](https://img-ask.csdn.net/upload/201807/08/1531032895_957209.png)
请大神帮忙指教下。