最近开发微信支付有用到微信退款这块的业务,在解决掉微信退款接口的证书问题之后,美滋滋的去测试退款了,结果发现虽然钱退回来了,但是订单业务订单状态没有更新,经过排查之后发现是因为微信退款接口回调返回的数据里面信息是加密的,需要进行解密。

  确定了问题所在之后解决问题就比较简单了,写一个解密方法就好了。

        /// <summary>
        /// 
        /// </summary>
        /// <param name="str">需要解密的字符串</param>
        /// <param name="key">md5加密后小写的微信key</param>
        /// <returns></returns>
        public static string DecodeAes256Ecb(string str, string key)
        {
            var keyArray = Encoding.UTF8.GetBytes(key);
            var toEncryptArray = Convert.FromBase64String(str);
            var rDel = new RijndaelManaged
            { Key = keyArray, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };
            var cTransform = rDel.CreateDecryptor();
            var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Encoding.UTF8.GetString(resultArray);
        }

        /// <summary>
        /// 解密微信数据
        /// </summary>
        /// <param name="str">加密文本</param>
        /// <returns></returns>
        public static string DecodeReqInfo(string str)
        {
            var key = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(WxPayConfig.WxKey, "md5").ToLower();//WxKey为商户平台设置的密钥key
            str = DecodeAes256Ecb(str, key);
            return str;
        }

到这里就算是解密结束了,然而在获取result_code字段的时候又遇到了错误,按照微信的接口文档来说,result_code 字段是微信返回的业务结果:

然后我没有能获取到这个字段,说好的必填字段呢???

微信文档,不愧是你。

于是,然后我去看了看解密之后的数据,发现了 refund_status字段SUCCESS ,我:emmmm

欧克!修改完之后就没啥问题了,剩下的就是处理自己的业务代码了,就不详述了。


遇到你之后,我才知道,原来这世间是如此的美好。