dinghao

记录成长点滴

 

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

支付宝的接口调用很不方便,刚做好一个封装,实现了虚拟交易和实物交易。
解决方案中有三个项目以及NDoc生成的文档,简单的序列图:CommonAliPay,封装的支付宝接口。
 TestAli,asp.net的测试项目
TestCommonAliPay,Nunit的测试项目。
源代码下载地址:http://files.cnblogs.com/bluewater/CommonAliPay.rar
调用方法:
1、引入CommonAliPay.dll
2、实现支付宝服务接口的方法调用方式:
 AliPay ap = new AliPay();
        
string key = "";//填写自己的key
        string partner = "";//填写自己的Partner
        StandardGoods bp = new StandardGoods("trade_create_by_buyer", partner, key, "MD5""卡2", Guid.NewGuid().ToString(), 2.551m1"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 = "";//填写自己的key
        string partner = "";//填写自己的Partner
        AliPay ap = new AliPay();
        DigitalGoods bp 
= new DigitalGoods("create_digital_goods_trade_p", partner, key, "MD5""卡2", Guid.NewGuid().ToString(), 2.551m1"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
<stringstring> sortedList = new SortedList<stringstring>(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<stringstring> sortedList,bool isEncode)
        
{
            StringBuilder param 
= new StringBuilder();
            StringBuilder encodeParam 
= new StringBuilder();
            
if (isEncode == false)
            
{

                
foreach (KeyValuePair<stringstring> kvp in sortedList)
                
{
                    
string t = string.Format("{0}={1}", kvp.Key, kvp.Value);
                    param.Append(t 
+ "&");
                }

                
return param.ToString().TrimEnd('&');
            }

            
else
            
{
                
foreach (KeyValuePair<stringstring> 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://files.cnblogs.com/bluewater/CommonAliPay.rar
因为时间很紧,有些地方还不完善,大家提出意见,有时间我会修改的
可以看:http://www.cnblogs.com/bluewater/archive/2007/07/17/821540.html,新版本
1
0
(请您对文章做出评价)
« 上一篇:错误处理
» 下一篇:对君王的赞歌声中历史面目全非

posted on 2006-10-16 19:09 思无邪 阅读(14565) 评论(42)  编辑 收藏 网摘 所属分类: 开源项目

评论

#1楼 2006-10-16 20:05 acoder[未注册用户]

  回复  引用    

#2楼 2006-10-16 20:20 张家界旅游网[未注册用户]

谢谢。。早点出就好了。。我花了好多时间来搞这事。。唉。。   回复  引用    

#3楼 2006-10-16 20:30 Dflying Chen      

Good,不过出于自私的角度,还是希望能开源,至少有个强签名……毕竟这种东西不是闹着玩的……
不管怎样,还是十分的感谢!
  回复  引用  查看    

#4楼 2006-10-16 20:30 Justin      

不好意思,没用过这个东西,麻烦介绍一下干吗用的?   回复  引用  查看    

#5楼 2006-10-16 21:19 徐灿钊Asp.net专栏      

不敢用,看看.dll先。   回复  引用  查看    

#6楼 2006-10-16 22:04 心不在焉      

希望博主最好开源啊,毕竟是关系到钱的事。。。
不知道博主对payment pro 的实现有没有研究?可以探讨探讨,我目前也只是把payment standard实现了,pro 比较困难。
  回复  引用  查看    

#7楼 2006-10-16 22:46 Clingingboy      

代码看看先...正有用呢,如果效果好的话,LZ考虑下   回复  引用  查看    

#8楼 2006-10-17 00:22 ZergTant      

支持,不过这个的确应该开源,钱的事情不好说,亲兄弟还明算帐呢   回复  引用  查看    

#9楼[楼主] 2006-10-17 09:27 思无邪      

不是有源代码吗?   回复  引用  查看    

#10楼 2006-10-17 09:35 我不是一只鹿      

路过 聆听   回复  引用  查看    

#11楼 2006-10-17 12:14 涟漪勇      

代码看完了.You do a good job!!   回复  引用  查看    

#12楼 2006-10-17 14:31 心不在焉      

yeah ,you really did a good job ~~

thx for your openning source
  回复  引用  查看    

#13楼 2006-10-30 15:03 S.Sams      

有没有试过 即时到帐 接口.   回复  引用  查看    

#14楼 2006-10-31 00:07 S.Sams      

已经是开源项目来的,各位下载源码看看就知道,差点被大家误导啦.
谢谢楼主, 省了我不少时间!
  回复  引用  查看    

#15楼 2006-11-07 21:02 brucehawking[未注册用户]

最近也在搞这事,看到了,顶一下,下下来,慢慢研究,呵呵.   回复  引用    

#16楼 2006-11-10 20:12 蓝血人[未注册用户]

楼主你好:
我还是自己做不好它,你能否帮助一下。帮我弄一个。
谢谢
zhaodx21cn@21cn.com
因为我找不到你的联系方式,谢谢!
  回复  引用    

#17楼 2006-11-16 10:07 Ansel      

强烈要求能开源。   回复  引用  查看    

#18楼 2006-11-16 10:24 Ansel      

gg,你这个是.net 2.0 的版本阿
能不能编译一个2003版本的出来啊~~~
等待中....
  回复  引用  查看    

#19楼 2006-11-29 16:28 chs[未注册用户]

你好,例子中有ap_WaitBuyerPay和ap_WaitSellerSendGoods的处理方法,交易完成的那段方法怎么写呢?谢谢!   回复  引用    

#20楼[楼主] 2006-12-11 20:07 思无邪      

响应TradeFinished事件

  回复  引用  查看    

#21楼 2006-12-17 23:47 Hanvi[未注册用户]

发布到空间上,支付宝回Notify消息后总是报
Unable to load DLL 'iphlpapi.dll': 找不到指定的模块。 (Exception from HRESULT: 0x8007007E)
  回复  引用    

#22楼[楼主] 2007-01-09 15:36 思无邪      

这个异常是你自己的程序抛出的,我写的库不会出现   回复  引用  查看    

#23楼 2007-02-12 10:53 请教[未注册用户]

1.为什么设置了notify_url而支付成功后本地系统没收到任何反应.
2.return_url验证后总是返回flase
  回复  引用    

#24楼[楼主] 2007-03-02 15:27 思无邪      

好久没有弄过支付宝了,不知道是否是因为yahoo改变了文档,这个类库有个日期格式bug,如:2007-03-04,2007-3-4,可以自己修改。
有时间了我会把最终版本传上去,可以用notify模拟return的调用
  回复  引用  查看    

#25楼 2007-04-27 16:22 sp586[未注册用户]

等待最新版。。。。   回复  引用    

#26楼 2007-06-16 23:13 桂圆      

谢谢楼主共享 支持   回复  引用  查看    

#27楼 2007-07-03 14:29 wdx2008      

好~~~   回复  引用  查看    

#28楼 2007-08-14 17:32 nyist[未注册用户]

lz是乐天么,这么强,一日不见如隔三秋啊。   回复  引用    

#29楼 2007-10-12 09:35 Sanlen[未注册用户]

谁知道你里面搞了些什么啊!   回复  引用    

#30楼 2007-10-12 10:21 H2ppYstaR      

为什么支付能够成功,但是却收不到通知?
怎样才能让页面在支付成功后跳到自己的页面来呢?

自己弄好久了,还是不行。楼主能否帮我一下
我的E-mail:sxzxwxf22@163.com
谢谢楼主

  回复  引用  查看    

#31楼 2007-10-17 11:49 在线代理[未注册用户]

博主好人啊,可惜现在用不着,相信一定有用得到的地方。留个名   回复  引用    

#32楼 2007-10-19 09:39 某某人[未注册用户]

请问这里的KEY 。指的是sign吗?
  回复  引用    

#33楼 2007-12-25 16:43 fsdfsdgddsg[未注册用户]

@Justin
xxxxx
  回复  引用    

#34楼 2008-01-10 14:33 杨发红[未注册用户]

好方便   回复  引用    

#35楼 2008-01-23 09:16 yb[未注册用户]

lz,弄个.net 1、1版本的来嘛。我改了其中用到的2。0部分。就是还不知道能不能用。最好lz好人做到底。弄个1。1版本的。谢谢。我的邮箱:styaobin@gmail.com   回复  引用    

#36楼 2008-01-26 22:42 lexus      

调试错误,请回到请求来源地,重新发起请求。

错误代码ILLEGAL_ARGUMENT
说明:如果您不是因为本接口集成调试而看见该错误提醒,请联系本次请求来源网站,本错误属于网站集成接口的错误。

在运行standarpay.aspx时报如上错误,请问是怎么回事啊?急求解答
  回复  引用  查看    

#37楼 2008-06-16 11:27 JoyBin      

这东西将来一定会用到的。呵呵。签名   回复  引用  查看    

#38楼 2008-06-27 00:56 簡簡單單..      

Mark   回复  引用  查看    

#39楼 2008-07-28 16:05 zjianjun/Andy      

在下载的代码中咋没有实现支付宝服务接口的方法调用方式的原代码啊??
写在那里?
AliPay ap = new AliPay();
string key = "";//填写自己的key
string partner = "";//填写自己的Partner
StandardGoods 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);
  回复  引用  查看    

#40楼 2008-08-06 17:48 绵阳百可网购[未注册用户]

有没有可以测试的支付宝patnerid啊?   回复  引用    

#41楼 2009-08-08 15:28 ylf      

我也正要做一个,谢谢指点,我的QQ185827426,谢谢!   回复  引用  查看    

#42楼 2009-12-25 09:03 jtome      

引用/
  回复  引用  查看    

导航

统计

搜索

 

常用链接

我参与的团队

随笔分类

随笔档案

收藏站点

文章收藏

积分与排名

最新评论

阅读排行榜