예제 #1
0
    /// <summary>
    /// 对一键支付返回的业务数据进行验签
    /// </summary>
    /// <param name="data"></param>
    /// <param name="encrypt_key"></param>
    /// <param name="yibaoPublickKey"></param>
    /// <param name="merchantPrivateKey"></param>
    /// <returns></returns>
    public static bool checkDecryptAndSign(string data, string encrypt_key,
                                           string yibaoPublickKey, string merchantPrivateKey)
    {
        /** 1.使用YBprivatekey解开aesEncrypt。 */
        string AESKey = "";

        try
        {
            AESKey = RSAFromPkcs8.decryptData(encrypt_key, merchantPrivateKey, "UTF-8");
        }
        catch (Exception e)
        {
            /** AES密钥解密失败 */
            return(false);
        }

        /** 2.用aeskey解开data。取得data明文 */
        string realData = AES.Decrypt(data, AESKey);


        SortedDictionary <string, object> sd = Newtonsoft.Json.JsonConvert.DeserializeObject <SortedDictionary <string, object> >(realData);


        /** 3.取得data明文sign。 */
        string sign = (string)sd["sign"];

        /** 4.对map中的值进行验证 */
        StringBuilder signData = new StringBuilder();

        foreach (var item in sd)
        {
            /** 把sign参数隔过去 */
            if (item.Key == "sign")
            {
                continue;
            }
            signData.Append(item.Value);
        }

        signData = signData.Replace("\r", "");
        signData = signData.Replace("\n", "");
        signData = signData.Replace("    ", "");
        signData = signData.Replace("  ", "");
        signData = signData.Replace("\": \"", "\":\"");
        signData = signData.Replace("\": ", "\":");

        /**5. result为true时表明验签通过 */
        bool result = RSAFromPkcs8.checkSign(Convert.ToString(signData), sign,
                                             yibaoPublickKey, "UTF-8");

        return(result);
    }