用C#网页 做手机支付宝功能,用RSA签名
结果  支付宝接口 接入的时候出错SortedDictionary<string, string> sd = new SortedDictionary<string, string>();
        int count = 0;
        string sparam = "";
        string key = "";
        string value = "";
        for (int i = 0; i < result.Length; i++)
        {
            sparam = result[i];
            count = sparam.IndexOf('=');
            key = sparam.Substring(0, count);
            value = sparam.Substring(count + 1, sparam.Length - (count + 1));
            sd.Add(key, value);
        }
       //  出错  给定关键字不在字典中?
        string sign = sd["sign"];        //配置待签名数据
        Dictionary<string, string> dicData = MobileFunction.FilterPara(sd);
        string req_Data = MobileFunction.CreateLinkString(dicData);有人知道为什么

解决方案 »

  1.   

    那就是 sd 字典中没有 key为sign 的咯
      

  2.   

    count = sparam.IndexOf('=');==>count = sparam.IndexOf('=') - 1;  
    或者
    key = sparam.Substring(0, count); ==>key = sparam.Substring(0, count-1); 
      

  3.   

    你可以先判断一下是否包含 sign 的 key
    if(sd.ContainsKey("sign"))
    {
        string sign = sd["sign"]; 
    }
      

  4.   

    关键是这个方法/// <summary>
        /// 构造HTTP的POST请求
        /// </summary>
        /// <param name="sParaTemp">请求参数数组</param>
        /// <param name="gateway">网关地址</param>
        /// <param name="sellprivatekey">商户私钥</param>
        /// <param name="input_charset">编码格式</param>
        /// <returns>支付宝返回结果</returns>
        public static string SendPostInfo(SortedDictionary<string, string> sParaTemp, string gateway, string key, string input_charset, string signType)
        {
            string strRequestData = "";                strRequestData = BuildRequestParaToString(sParaTemp, key, input_charset);
           //format=xml&partner=2088901722289620&req_data=<direct_trade_create_req><subject></subject><out_trade_no>1305311728069918</out_trade_no><total_fee>0.01</total_fee><seller_account_name>[email protected]</seller_account_name><notify_url>MNotifyUrl.aspx</notify_url><out_user></out_user><merchant_url>MMerchantUrl.aspx</merchant_url><call_back_url>MReturnUrl.aspx</call_back_url></direct_trade_create_req>&req_id=2013/5/31 16:43:03&sec_id=0001&service=alipay.wap.trade.create.direct&v=2.0&sign=UTtYagNY6B4vnub0D3%2bjIo7xC5bEIcVrMaZf2wF5fdowoeRQXsgg6W6Njnajh74VA8u4IF6vcTC%2fIg%2b6aKk4EKwcN14ia8w08wr62tPpIdm%2bbkcCDfX%2bg%2fFjYpDOMkGysWy3WyHI7gt4DhHwAqrnxBnTddjS3%2b3xzq148xfGfEQ%3d
           //strRequestData  里面是有 sign的  我调试过了 这里有sign属性
            if (signType == "&sign_type=0001")
            {
                strRequestData += signType;
            }        Encoding code = Encoding.GetEncoding(input_charset);        byte[] bytesRequestData = code.GetBytes(strRequestData);        string strUrl = gateway;        HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(strUrl);
            myReq.Method = "post";
            myReq.ContentType = "application/x-www-form-urlencoded";        myReq.ContentLength = bytesRequestData.Length;        using (Stream reqStream = myReq.GetRequestStream())
            {
                reqStream.Write(bytesRequestData, 0, bytesRequestData.Length);
            }
            using (WebResponse wr = myReq.GetResponse())
            {
                Stream myStream = wr.GetResponseStream();
                StreamReader sr = new StreamReader(myStream, code);
                string strResult = sr.ReadToEnd();
                // 到这里  没有sign属性了  突然消失了  不知道为什么
                // 不知道为什么少了一个 sign 属性
                return strResult;
            }
        }