zoukankan      html  css  js  c++  java
  • 中小学教育缴费----支付宝回传数据.net core 接收中文乱码

    问题描述:

           中小学教育缴费,发送账单到家长支付宝,家长支付成功之后,支付宝回传数据,验签的时候失败了,排查之后发现账单名称乱码了。支付宝回传的时候中文传的是GBK编码格式,但是我接收的是%D5˵%A5%B2%E2%CA%D4这样的,、、很显然不是正常的编码格式,程序也解析不了。

           框架用的是.net core 2.0,支付宝的官方文档提供的接收参数的类型,不支持NameValueCollection类型,程序用的是另一种方法。

           支付宝官方提供接收参数方法:

            public Dictionary<string, string> GetRequestGet()
            {
                int i = 0;
                Dictionary<string, string> sArray = new Dictionary<string, string>();
                NameValueCollection coll;
                coll = Request.QueryString;
                string[] requestItem = coll.AllKeys;
                for (i = 0; i < requestItem.Length; i++)
                {
                    sArray.Add(requestItem[i], Request.QueryString[requestItem[i]]);
                }
                return sArray;
            }

           .net core 用的接收参数方法

            private Dictionary<string, string> GetRequestPost()
            {
                Dictionary<string, string> sArray = new Dictionary<string, string>();
                ICollection<string> requestItem = Request.Form.Keys;
                foreach (var item in requestItem)
                {
                    sArray.Add(item, Request.Form[item]);
                }
                return sArray;
            }

    当时怀疑是参数处理的问题,然后用下载的官方DOME,去接收回传值,测试之后接收正常。可以确定问题的原因在接收参数这里。看了我的接收参数,我什么也没处理,只是获取了一下而已呀。

    解决办法:

                Dictionary<string, string> sArray = new Dictionary<string, string>();
                try
                {
                    string jsonData = new StreamReader(Request.Body).ReadToEnd();
                    var reqParamKvs = jsonData.Split(new char[] { '&' });
                    reqParamKvs.Where(s => s.Contains("=")).ToList().ForEach(s =>
                    {
                        var kv = (s ?? string.Empty).Split(new char[] { '=' });
                        sArray.Add(kv[0], HttpUtility.UrlDecode(kv[1], System.Text.Encoding.GetEncoding("GBK")));
                    });
                }
                catch
                {
                    return Content("fail");
                }

          我解决不了,求助老大,他在body的时候就把接收的值截取了,然后查看了接收值,发现这时候还没有乱码,但是body接收的时候已经乱码了。截取之后的值是一个字符串,没办法现在只能自己处理了,按照格式自己截取,虽然麻烦了一点,但是问题也算解决了。

          最后也不知道什么原因导致的乱码。猜测是支付宝那边可能处理了,接收的时候识别不了。或者程序接收的时候又处理了。

          

  • 相关阅读:
    柯南君:看大数据时代下的IT架构(3)消息队列之RabbitMQ-安装、配置与监控
    柯南君:看大数据时代下的IT架构(2)消息队列之RabbitMQ-基础概念详细介绍
    看大数据时代下的IT架构(1)业界消息队列对比
    vagrant打造自己的开发环境
    !!运维博客
    git搭建服务器
    Tuxedo入门学习
    ubuntu环境ceph配置入门(一)
    谷歌技术&quot;三宝&quot;之MapReduce
    Eclipse中SVN的安装步骤(两种)和用法
  • 原文地址:https://www.cnblogs.com/zhangjd/p/10148219.html
Copyright © 2011-2022 走看看