支付宝的接口调用很不方便,刚刚做了一个包pi支付宝对接,实现虚拟交易和实体交易。
解决方案中有三个项目和NDoc生成的文档,一个简单的时序图: ,封装的支付宝接口。
, 测试项目
, Nunit 的测试项目。
调用方式:
1. 导入.dll
下载链接:
2.实现支付宝服务接口的方法调用方法:
ap=新();
key=””;//填写自己的key
=””;//自己填写
bp=new (“r”, , key, “MD5”, “Card 2”, Guid.().(), 2.551m, 1, “”, “”
, “EMS”, 25.00m, “”,”1″);
bp。=””;
ap.(“”, bp, 这个); 上述文章内容是常用的调用方式。
以下是仅支持虚拟商品的方式:
key=””;//填写自己的key
=””;//自己填写
ap=新();
bp=new (“”, , key, “MD5”, “Card 2”, Guid.().(), 2.551m, 1, “”, “”);
bp。=””;
ap.(“”, bp, this);3. 实现支付宝通知接口方法的调用(支持虚实对象):
无效 ( , e)
{
key=””;//填写自己的key
=””;//自己填写
ap=新();
=.Form[“”];
v=新 (“”, , );
ap.+=新的 .ndler(ds);
ap。+=新的 .ndler();
ap.(this, “”,key,v, “utf-8”);
}
无效 ( , e)
{
// //添加自己的处理逻辑
.log.Error(“等待买家付款”);
}
无效 ds( , e)
{
//添加自己的处理逻辑
.log.Error(“火”);
} 支付宝的交易状态定义为同名事件。
部分源码分析:
1.将Forms集合解析成一个类,因为这个类型的数据是后面要用到的,所以所有的值类型都不能有初始值pi支付宝对接,比如:int的0等。所以使用泛型。
(nv, 对象)
{
[]=obj.().(.|.);
(圆周率输入)
{
v=nv.Get(pi.Name.());
如果 (v !=null)
{
如果 (pi.==())
{
pi.(obj, v, null);
}
else if (pi.==(int?))
{
pi.(obj, int.Parse(v), null);
}
else if (pi.==(?))
{
pi.(obj, .Parse(v), null);
}
else if (pi.==(?))
{
pi.(obj, .Parse(v), null);
}
否则 if (pi.==(bool))
{
pi.(obj, bool.Parse(v), null);
}
别的
{
// 如果转换失败,会抛出异常
pi.(obj, v, null);
}
}
}
()obj;
}
2.从类型中获取排序后的参数
/**
/// 获取排序后的参数
///
///
///
(对象)
{
[]=obj.().(.|.);
=新的(。案例);
(圆周率输入)
{
if (pi.(obj, null) !=null)
{
if (pi.Name==”签名” || pi.Name==””)
{
;
}
.Add(pi.Name.(), pi.(obj, null).());
}
}
;
3. 从中生成参数
( , 布尔 )
{
参数=新();
=新的();
如果(==假)
{
( kvp 输入 )
{
t=.(“{0}={1}”, kvp.Key, kvp.Value);
参数。(t + “&”);
}
参数.().(‘&’);
}
别的
{
( kvp 输入 )
{
et=.(“{0}={1}”, .(kvp.Key), .(kvp.Value));
.(et + “&”);
}
.().(‘&’);
}
}