支付宝接口源代码(刚完成,应该是目前最好的了)

来源:互联网 发布:js如何给对象添加属性 编辑:程序博客网 时间:2024/04/29 05:38
支付宝接口源代码(刚完成,应该是目前最好的了)

点击次数 415 添加日期 2007-2-16 18:44:12 回复次数 2 最后更新 2007-2-16 18:49:17 所属分类 .NetFramework 转自【bluewater】 编辑编辑 删除删除   【增大字体】 【缩小字体】 【系统默认字体】
支付宝的接口调用很不方便,刚做好一个封装,实现了虚拟交易和实物交易。
解决方案中有三个项目以及NDoc生成的文档,简单的序列图:CommonAliPay,封装的支付宝接口。

TestAli,asp.net的测试项目
TestCommonAliPay,Nunit的测试项目。
源代码下载地址:http://www.cnblogs.com/Files/bluewater/CommonAliPay.rar

调用方法:

1、引入CommonAliPay.dll
2、实现支付宝服务接口的方法调用方式:
AliPay ap = new AliPay();string key = "";//填写自己的keystring partner = "";//填写自己的PartnerStandardGoods bp = new StandardGoods("trade_create_by_buyer", partner, key, "MD5", "卡2",     Guid.NewGuid().ToString(), 2.551m, 1, "hao_ding2000@yahoo.com.cn", "hao_ding2000@yahoo.com.cn",    "EMS", 25.00m, "BUYER_PAY", "1");bp.Notify_Url = "http://203.86.79.185/ali/notify.aspx";ap.CreateStandardTrade("https://www.alipay.com/cooperate/gateway.do", bp, this);

上面是通用的调用方式。
下面是只支持虚拟货物的方式:
string key = "";//填写自己的keystring partner = "";//填写自己的PartnerAliPay ap = new AliPay();DigitalGoods bp = new DigitalGoods("create_digital_goods_trade_p", partner, key, "MD5", "卡2",    Guid.NewGuid().ToString(), 2.551m, 1, "hao_ding2000@yahoo.com.cn", "hao_ding2000@yahoo.com.cn");bp.Notify_Url = "http://203.86.79.185/ali/notify.aspx";ap.CreateDigitalTrade("https://www.alipay.com/cooperate/gateway.do", bp, this);

3、实现支付宝通知接口方法的调用(支持虚拟和实物):
protected void Page_Load(object sender, EventArgs e){    string key = "";//填写自己的key    string partner = "";//填写自己的Partner    AliPay ap = new AliPay();    string notifyid = Request.Form["notify_id"];    Verify v = new Verify("notify_verify", partner, notifyid);    ap.WaitSellerSendGoods += new AliPay.ProcessNotifyEventHandler(ap_WaitSellerSendGoods);    ap.WaitBuyerPay += new AliPay.ProcessNotifyEventHandler(ap_WaitBuyerPay);    ap.ProcessNotify(this, "https://www.alipay.com/cooperate/gateway.do", key, v, "utf-8");}void ap_WaitBuyerPay(object sender, NotifyEventArgs e){    // //加入自己的处理逻辑    Log4net.log.Error("wait buyer pay fire");}private void ap_WaitSellerSendGoods(object sender, NotifyEventArgs e){    //加入自己的处理逻辑    Log4net.log.Error("WaitSellerSendGoods fire");}

支付宝的交易状态都被定义成了类似名称的事件。

部分源代码解析:

1、解析Forms集合到NotifyEventArgs类,因为后面此类的数据要用来做MD5Sign,所以所有值类型,不能存在初始值,如:int的0等。因此用Nullable范型。
private NotifyEventArgs ParseNotify(NameValueCollection nv, object obj){    PropertyInfo[] propertyInfos = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);    foreach (PropertyInfo pi in propertyInfos)    {        string v = nv.Get(pi.Name.ToLower());        if (v != null)        {            if (pi.PropertyType == typeof(string))            {                pi.SetValue(obj, v, null);            }            else if (pi.PropertyType == typeof(int?))            {                pi.SetValue(obj, int.Parse(v), null);            }            else if (pi.PropertyType == typeof(decimal?))            {                pi.SetValue(obj, decimal.Parse(v), null);            }            else if (pi.PropertyType == typeof(DateTime?))            {                pi.SetValue(obj, DateTime.Parse(v), null);            }            else if (pi.PropertyType == typeof(bool))            {                pi.SetValue(obj, bool.Parse(v), null);            }            else            {                //转型失败会抛出异常                pi.SetValue(obj, v, null);            }        }    }    return (NotifyEventArgs) obj;}

2、从类型中获取排序后的参数
/// <summary>/// 获取排序后的参数/// </summary>/// <param name="obj"></param>/// <returns></returns>private SortedList<string, string> GetParam(object obj){    PropertyInfo[] propertyInfos = obj.GetType().GetProperties(        BindingFlags.Public | BindingFlags.Instance);    SortedList<string, string> sortedList         = new SortedList<string, string>(StringComparer.CurrentCultureIgnoreCase);    foreach (PropertyInfo pi in propertyInfos)    {        if (pi.GetValue(obj, null) != null)        {            if (pi.Name == "Sign" || pi.Name == "Sign_Type")            {                continue;            }            sortedList.Add(pi.Name.ToLower(), pi.GetValue(obj, null).ToString());        }    }    return sortedList;}

3、从SortedList中产生参数
private string GetUrlParam(SortedList<string, string> sortedList, bool isEncode){    StringBuilder param = new StringBuilder();    StringBuilder encodeParam = new StringBuilder();    if (isEncode == false)    {        foreach (KeyValuePair<string, string> kvp in sortedList)        {            string t = string.Format("{0}={1}", kvp.Key, kvp.Value);            param.Append(t + "&");        }        return param.ToString().TrimEnd('&');    }    else    {        foreach (KeyValuePair<string, string> kvp in sortedList)        {            string et = string.Format("{0}={1}",                HttpUtility.UrlEncode(kvp.Key), HttpUtility.UrlEncode(kvp.Value));            encodeParam.Append(et + "&");        }        return encodeParam.ToString().TrimEnd('&');    }}


下载地址

http://www.cnblogs.com/Files/bluewater/CommonAliPay.rar
因为时间很紧,有些地方还不完善,大家提出意见,有时间我会修改的

网上赠与服务集成技术文档V1.35.pdf
http://www.chenjiliang.com/Article/ArticleAttach/84/2123/apply_alipay_donate_service.zip
  相关附件
commonalipay.rar  文件大小 [483.245K] 下载次数 [42]
说明:
   上 5 篇文章   · 支付宝Payto接口的c#.net实现 · C#.net 支付宝接口 · 一个阴历阳历互相转化的类(C#源码) · C#中捕捉对话框的文本内容 EnumChildWindows · OWC绘图控件研究
   下 5 篇文章   · 不排序和可以重复Key的SortedList · 如何让.NET中的强类型的排序列表SortedList支持重复键 · 手机短信和AT指令VS2005源代码,含插件式结构,方便扩展 · C#的鼠标控制代码 · app.config的节点AppSetting新增或修改操作
  网友评论
  心情 Notify.aspx通过支付宝返回后,总是有错误,怎样解决?  张亮 删除 124.129.56.* Email 主页 #1  string orderNo = Request["out_trade_no"];

获取传过来的订单号是否应该是这一句?

时间 2007-3-14 21:15:23 心情 没有通过支付宝实名验证,未调试过哦。  阿良 删除 121.12.34.* Email 287800360 主页 #2 试试order_no看看行不行。

我这里提供的是网上赠与的技术文档,这里说的应该是商城之类的,具体自动下载。

out_trade_no
外部交易号,合作伙伴交易号,确保在合作伙伴系统中唯一

order_no
商户系统订单号,对应交易在商户系统内的流水号

还有个notyfy_id,支付宝通知流水号,合作伙伴可以用这个流水号询问支付宝该条通知的合法性
 
原创粉丝点击