unpack6280 2018-07-08 06:55 采纳率: 50%
浏览 1131
已结题

C# winform程序实现JAVA josn 请求接

第一次写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&timestamp=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)
            请大神帮忙指教下。
  • 写回答

3条回答 默认 最新

  • unpack6280 2018-07-08 11:36
    关注

    对不起上面不全,忘了写公钥是JAVA的,现在要用C# winform写。
    string pk="{\"val\":\"200005719465\",\"scode\":\"321000006\",\"date\":\
    string sk = "var=200005719465&scode=321000006&date=20180625&flag=0&meraccount=321000000&method=queryJsd&v=3.0&timestamp=20180707";"20180625\",\"flag\":\"0\",\"meraccount\":\"321000000\",\"method\":\"queryJsd\",\"v\":\"3.0\",\"timestamp\":\"20180707\",}";
    我的这两个拼接去转换param_key,secret_key的值对吗?

    评论

报告相同问题?

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)