Beispiel #1
0
        /// <summary>
        /// 获取微信退款异步通知结果
        /// 接受退款通知不需要验证签名
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public Message GetPayRefundNotifyResult(string ApiKey, Dictionary <string, string> Parameters)
        {
            var result = new Message();

            if (Parameters["return_code"] == "SUCCESS")
            {
                var    strA = Parameters["req_info"];           //得到加密字符串
                string key  = TenPayHelp.MD5(ApiKey).ToLower();
                var    strB = TenPayHelp.AESDecrypt(strA, key); //AES解密
                Parameters = Parameters.Union(TenPayHelp.GetDictionaryFromCDATAXml(strB)).ToDictionary(pi => pi.Key, pi => pi.Value);
                if (Parameters["refund_status"] == "SUCCESS")
                {//支付成功
                    result.state = true;
                    result.error = "退款成功";
                }
                else
                {
                    if (Parameters["refund_status"] == "CHANGE")
                    {
                        result.error = "退款异常";
                    }
                    if (Parameters["refund_status"] == "REFUNDCLOSE")
                    {
                        result.error = "退款关闭";
                    }
                }
                result.data       = string.Format("{0},{1}", Parameters["out_refund_no"], Parameters["refund_id"]);
                result.paramsData = strB;
            }
            else
            {
                result.error = Parameters["return_msg"];
            }
            return(result);
        }
Beispiel #2
0
        /// <summary>
        /// 获取随机字符串
        /// </summary>
        /// <returns></returns>
        public static string nonce_str()
        {
            // 生成随机数算法
            //微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。
            //我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。
            Random Ran       = new Random();
            string nonce_str = Ran.Next(11111111, 99999999).ToString() + "CNMB";

            return(TenPayHelp.MD5(nonce_str));
        }
Beispiel #3
0
        /*******************微信支付的请求和接收数据均需要校验签名,详细方法请参考安全规范-签名算法********************/

        /*
         * 签名算法
         * 签名生成的通用步骤如下:
         * 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),
         * 使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
         * 特别注意以下重要规则:
         * ◆ 参数名ASCII码从小到大排序(字典序);
         * ◆ 如果参数的值为空不参与签名;
         * ◆ 参数名区分大小写;
         * ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
         * ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
         * 第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
         * key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
         */


        /// <summary>
        /// 创建签名
        /// </summary>
        /// <param name="Parameters"></param>
        /// <returns></returns>
        public static string CreateSign(Dictionary <string, string> Parameters, string ApiKey)
        {
            StringBuilder Sign = new StringBuilder();
            var           Keys = new ArrayList(Parameters.Keys);

            Keys.Sort();//字典排序
            foreach (string key in Keys)
            {
                if (!string.IsNullOrEmpty(Parameters[key]))
                {//拼接成键值对字符串
                    Sign.Append(key + "=" + Parameters[key] + "&");
                }
            }
            Sign.Append("key=" + ApiKey);
            string sign = TenPayHelp.MD5(Sign.ToString()).ToUpper();

            return(sign);
        }