重点:

1.C#和JAVA 的UrlEncode结果不同,不能使用C#自带的UrlEncode。

2.http header 和 body 里的键值对都参与签名,transCode不参与。

 3.RSA with SHA256 算出的值byte[] ,转字符串时为16进制字符串,小写。

 4.测试环境和生产环境的channelId、ChannelNbr 是一样的,channelId=45、ChannelNbr=03。

 5.由于pfx证书文件不方便保存和部署,我这边是把pfx里的私钥导出来,存入数据库,用来签名。公钥证书也是保存的字符串到数据库。

 

说明:

不能使用C#自带的UrlEncode,C#  JAVA urlencode  结果不兼容。C# 需要encode的部分是小写。JAVA 需要encode的部分是大写。

使用下面这个方法处理。

/// <summary>
        /// java UrlEncode 特点是:需要UrlEncode字符,UrlEncode后要大写。
        /// </summary>
        /// <param name="str"></param>
        /// <param name="charSet"></param>
        /// <returns></returns>
        public static string CSharpToJavaUrlEncode(string str,string charSet)
        {
            Encoding enc = Encoding.GetEncoding(charSet);

            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < str.Length; i++)
            {
                string t = str[i].ToString();
                string k = HttpUtility.UrlEncode(t, enc);
                if (t == k)
                {
                    stringBuilder.Append(t);
                }
                else
                {
                    stringBuilder.Append(k.ToUpper());
                }
            }
            return stringBuilder.ToString();
        }