.NET中的支付宝测试

前几天公司的总监说网站支付宝支付完成后没有执行后台处理程序,之前没有写过支付宝接口,写之前在网上查了不少资料包括支付宝提供的资料。但是看别人的与自己写的差别还很大的,这次写的主要是关于测试方面的,关于接口中的其他参数的介绍前面有很多前辈已经写出来了,我就不在这里再说一遍了,我只是说一下关于测试的。

1. 关于notify_url与return_url参数

//支付类型
        string payment_type = "1";
        //必填,不能修改
        //服务器异步通知页面路径
        string notify_url = "http://www.sina.com";
        //需http://格式的完整路径,不能加?id=123这类自定义参数http://www.chinamusic.com.s1.kingidc.net/

       //页面跳转同步通知页面路径
        string return_url = "http://www.baidu.com";
        //需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/

        //卖家支付宝帐户
        string seller_email = "***********@b.qq.com";
        //必填

        //商户订单号
        string out_trade_no = horder_id.Value;
        //商户网站订单系统中唯一订单号,必填

支付宝支付完成后需要给咱们的网站传递一些参数。

这些参数是我们用来在后台处理的,例如我们的网站是一个下载**的网站需要下载币之类的,客户通过支付宝充值下载币,充值完成之后支付宝传给我们一下关于客户支付的一些信息与客户在我们网站的一些信息。

客户在我们网站中的信息支付宝是怎么知道的呢?这些信息都是在执行支付跳转到支付宝时我们传递给支付宝的信息,例如客户的ID,订单的信息,地址等等….

这些信息都是我们传递给支付宝的

//把请求参数打包成数组
        SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
        sParaTemp.Add("partner", Config.Partner);
        sParaTemp.Add("_input_charset", Config.Input_charset.ToLower());
        sParaTemp.Add("service", "create_direct_pay_by_user");
        sParaTemp.Add("payment_type", payment_type);
        sParaTemp.Add("notify_url", notify_url);
        sParaTemp.Add("return_url", return_url);
        sParaTemp.Add("seller_email", seller_email);
        sParaTemp.Add("out_trade_no", out_trade_no);
        sParaTemp.Add("subject", subject);
        sParaTemp.Add("total_fee", total_fee);
        sParaTemp.Add("body", body);
        sParaTemp.Add("show_url", show_url);
        sParaTemp.Add("extra_common_param", hmid.Value + "|" + xunibi.ToString() + "|xnb");
        sParaTemp.Add("anti_phishing_key", anti_phishing_key);
        sParaTemp.Add("exter_invoke_ip", exter_invoke_ip);

上面这些参数中就包含我我们要传递的所有信息,有些参数可以为空,有些必须指定参数,例如企业的支付宝账户等。

其中notify_url 这个参数就是我们在支付成功后要进行后台处理页面的地址,一般都是http:/*****/notify_url .aspx

这个参数中的网址必须是在广域网上能访问到的,所以说必须得在服务器上运行才能调试支付宝,在本地localhost:上是不行的,因为支付宝服务器找不到这个地址。

支付宝这个跳转是隐形不可见的,不可见是对用户来说的,下面会有解释

关于用户不可见主要是因为还有return_url这个参数,这个参数就是用户支付完成后在客户端跳转的页面,这个也是支付宝服务器自动完成的。

支付宝传递到 notify_url.aspx 的数据后,我们在notify_url.aspx 这个页面收到支付宝传递的参数后要传递给支付宝一个信息,告诉支付宝我们收到这个信息了。

如果支付宝第一次发送这个参数但没有收到回应就会隔一段世间继续发送,这个时间是48小时之内。

而return_url这个客户端跳转页面的信息支付宝服务器只发送一次。

上面代码中填写的www.baidu.comwww.sian.com 就是因为不了解这些 测试一下retutn_url与notify_url 的区别。

sb.Append("\r\n q.price");
                            _Context.user_cz_price.InsertOnSubmit(q);
                            _Context.SubmitChanges();
                        }
                    }
                }
                else
                {
                }

                //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

                Response.Write("success");  //请不要修改或删除

                /////////////////////////////////////////////////////////////////////////////////////////////////////////////
            }
            else//验证失败
            {
                Response.Write("fail");
                sb.Append("验证失败!");
            }
        }
        else
        {
            Response.Write("无通知参数");

            sb.Append("无通知参数");
        }
        //-------------------------------------------------淫荡的分割线-------------------------------------------------------------
        Log.log(sb.ToString());

上面的这段代码就是在notify_url .aspx.cs 中拷贝的 其中Response.Write("success"); 就是我们在接受到支付宝传递给我们的信息后需要发送的“确认”信息,

下面还有连个类别分别是验证失败与无通知参数。

2. 后台处理 notify_url .aspx.cs

在跳转支付宝支付时传递的那些参数具体都有什么用这个我没仔细的研究,但是这个支付宝给的文档上面有介绍。

关于用户在网站的一些信息原来是把他封装到 extra_common_param 这个参数中,包括客户的ID之类的东西,用 | 进行String 拼接字符串,

在支付宝传回 notify_url.aspx中的数据中还能找到这个参数。

用Request.Params["extra_common_param"]) 来获取,只有这个参数中的信息是我们的网站在支付之前要传递给我们的是我们的网站要在成功支付之后传递给我们的后台的,剩下的一些其他的信息就是支付宝传递给我们的了,包括客户支付的金额等。

我在测试的时候是把付款金额改成0.01元进行测试的,支付宝测试必须进行真是的付款。

//把请求参数打包成数组
        SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
        sParaTemp.Add("partner", Config.Partner);
        sParaTemp.Add("_input_charset", Config.Input_charset.ToLower());
        sParaTemp.Add("service", "create_direct_pay_by_user");
        sParaTemp.Add("payment_type", payment_type);
        sParaTemp.Add("notify_url", notify_url);
        sParaTemp.Add("return_url", return_url);
        sParaTemp.Add("seller_email", seller_email);
        sParaTemp.Add("out_trade_no", out_trade_no);
        sParaTemp.Add("subject", subject);
        sParaTemp.Add("total_fee", total_fee);  //这个就是客户将要支付的金额
        sParaTemp.Add("body", body);
        sParaTemp.Add("show_url", show_url);
        sParaTemp.Add("extra_common_param", hmid.Value + "|" + xunibi.ToString() + "|xnb"); //这个是我们自己打包的客户数据
        sParaTemp.Add("anti_phishing_key", anti_phishing_key);
        sParaTemp.Add("exter_invoke_ip", exter_invoke_ip);

        //建立请求
        string sHtmlText = Submit.BuildRequest(sParaTemp, "post", "确认");
        Response.Write(sHtmlText);

代码最后的 sHtmlText 加密之后的各种参数信息

因为我这里的服务器上面没有装VS 我想一般的都不能装开发工具的,所以我想到了一个好办法。。。。。

那就是把没一部执行的信息都写入到网站的日志,也有说在IIS中的日志查看,但是我没有找到,所以只能自己调用网站的日志方法了

/// <summary>
        /// 记录信息
        /// </summary>
        /// <param name="body">信息</param>
        public static void log(string body)
        {

            try
            {
                string timeStr=getTimeString();
                string strbody="*******************"+timeStr+"*******************\r\n";
                strbody+=body+"\r\n";
                strbody+="*******************"+timeStr+"*******************\r\n";
                strbody+="======>>错误地址:"+System.Web.HttpContext.Current.Request.RawUrl +"\r\n";
                string filename=getFileName()+".log";
                filename=System.Web.HttpContext.Current.Request.MapPath("/log/"+filename);
                StreamWriter swriter=new StreamWriter(filename,true,Encoding.Default,128);
                swriter.Write(strbody);
                swriter.Flush();
                swriter.Close();
            }
            catch
            {}
        }

上面的代码就是写入日志的代码,只要把写入的地址改一下就可以直接用了

我是事先定义的 StringBuilder sb = new StringBuilder();

然后在每一个要检验的代码后面 sb.Append("检验1 商户订单号=" + out_trade_no);

我这个一共是写了11个检验…

并且每一个检验之后都直接写入

q.mid = int.Parse(common_param[0]);
                            q.price = q.price + num;

                            sb.Append("\r\n q.price");
                             Log.log(sb.ToString()); //写入日志

                            _Context.user_cz_price.InsertOnSubmit(q);
                            _Context.SubmitChanges();

为什么要这样做呢?

原因就是看一下代码执行到那一句停止了,在 notify_url .aspx 处理页面如果出错的话网站是不会报错的,所以我们只能执行一句写一句的日志,并把参数写进去看与我们设想的一不一致。

当然了 不是每一行代码后都写入,只是在一些我们拿不准的代码后面才写的。。。

把一些支付宝传过来的数据还有SQL的语句什么的写入日志就可以了,然后在去数据库中查看有没有执行

就是这些了,为了测试这个玩意花了我两毛钱………………

时间: 2024-10-04 12:30:02

.NET中的支付宝测试的相关文章

微信浏览器中调用支付宝支付

众所周知,在微信浏览器中是无法唤起支付宝的,会提示请在浏览器中打开,如果非要在微信浏览器中调起支付宝的话,只能是跳出微信浏览器,关于这一点,在支付宝官网给出了一个例子.但是,话说回去,后来我仔细想想,其实真的没有必要非要在微信浏览器中调起支付宝支付(当时真是一根筋啊啊啊...) 支付宝手机网站支付的官方文档: https://doc.open.alipay.com/docs/doc.htm?treeId=203&articleId=105288&docType=1 快速接入: https:

软件测试中的数据库测试

数据库中数据的基本结构 定义一:数据元素集合(也可称数据对象)中各元素的关系. 定义二:相互之间存在特定关系的数据元素集合. 一个表(数据库),我们就称它为一个数据结构,它由很多记录(数据元素)组成,每个元素又包括很多 字段(数据项)组成数据库测试分类系统测试.集成测试.单元测试.功能测试.性能测试.安全测试系统测试.数据库在初期设计中需要进行分析测试. 对于各种数据元素进行完美融合,并理清相互之间的关系便是数据库结构的基本定义. 在数据库中,不同数据之间会存在既定的特殊关系,其属于各种数据元素

PHP 使用Apache 中的ab 测试网站的压力性能

打开Apache服务器的安装路径(我用的是 WampServer),在bin目录中有一个ab.exe的可执行程序,它就是要介绍的压力测试工具. 在Windows系统的命令行下,进入ab.exe程序所在目录,执行ab.exe程序.注意直接双击无法正确运行. d:(回车/进入D盘) cd wamp\bin\apache\Apache2.4.4\bin(回车/进入 bin目录) ab(回车/) 如果看到下列一些帮助信息就说明成功启动ab     开始启动ab 压力测试 ab -n 5000 -c 20

Android Day02-Android中单元测试(junit测试)&monkey测试

Android中junit测试有2种实现方式 第1种:一般Android工程的实现方式 1.在清单文件中添加2项内容 首先在AndroidManifest.xml中加入下面红色代码: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.itcast.action" android:versionCode="1"  android:v

vs2010中使用Nunit测试c#代码结果的正确性

http://www.nunit.org/index.php?p=download 上面地址下载,有安装版的,有直接解压版的,只有里面的nunit.framewor.dll就可以做简单的测试了. 安装版的路径默认为:C:\Program Files \NUnit 2.6\bin\framework\nunit.framewor.dll 从vs2010中直接下载安装插件: 安装完后提示重启vs,然后就可以打开用了,在视图中可以打开: 然后写好测试代码之后,就能够看到结果,不对的话会有相应的错误..

cocos2dx工程中接入支付宝sdk

1. 首先去支付宝官网下载开发者文档 2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图: (1)将从支付宝官方网站获得的支付宝的sdk的jar包拷贝到工程中的libs目录下,如图 (2)右键工程选择Properties,弹出如下窗口,首先选择1,其次选中2,最后点击3将拷到工程中的三个支付宝的jar包一一关联到工程中 3.  最后修改工程的AndroidManifest.xml文件,添加新的权限和支付宝的Activity,代码如下: 新权限: <uses-pe

Android中的Junit测试

在开发中Junit测试可以很方便的帮助开者尽可能早的发现并处理问题,而且使用也非常简单,只需要导入Junit测试相关的jar包并创建测试类,就可以对业务功能进行测试,而不用为了测试在代码中添加输出语句把代码搞得面目全非.需要注意的是,编写的测试方法只能是public void并且无参,在测试方法中就可以为所欲为了. @Test public void testAdd(){ Demo d = new Demo(); System.out.println(d.add(1,2,3)); } 在Andr

在Ubuntu中部署并测试Fabric 1.0 Beta

今天HyperLedger Fabric放出了1.0 Beta版的镜像,按照命名上来说,这应该是一个基本可用的版本了,所以我赶紧第一时间下载下来,把玩把玩.以下是在Ubuntu中安装并测试Fabric 1.0 Beta的步骤: 一.环境准备 1.1 安装VirtualBox并在其中安装好Ubuntu 这一步其实没啥好说的,下载好最新版的VirtualBox,下载Ubuntu Server,我用的是16.10 X64.在安装完Ubuntu后,需要保证apt source是国内的,不然如果是国外的话

虚拟机迁移过程中网络状况测试的测试程序

最近一直在弄项目的虚拟机网络的配置,现在主要的问题就是要测试在我们进行虚拟机迁移的过程中的网络情况.于是写了一个网络测试程序,因为基于TCP连接的网络,网络是不会丢包的,所以为了更好的显示网络情况,本测试程序是基于UDP的. 客户端程序 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include