.Net在线付款---Paypal在线付款开发过程

.Net在线付款---Paypal在线付款开发过程

作者: 不高很瘦  来源: 博客园  发布时间:2011-08-02 10:55  阅读:334 次   原文链接    [收藏]  

    最近在做一个Web订单项目,项目有一个需求就是集成PaypalPaydollar在线付款,一开始看到这个需求也是傻了眼,因为以前从来没有做过在线付款的功能,于是打开百度,google狂搜一通,发现.net下面集成这两种付款方式的介绍很不全面,没有找到我心中想要的答案,没有办法,只要老老实实的跟着网站上提供的文文件来做,在项目快完成时,于是想将现在做的一些心得和步骤记录下来,以备以后有用!

 

你可以进入https://www.paypal.com/了解Paypal的更多内容.

你可以進入https://www.paypal-biz.com/developer/ 下載相關的技術文檔

或者直接點擊下載本文相關的文檔:

即时付款通知指南

https://www.paypal-biz.com/development/documentation/PayPal_IPN&PDT_Guide_V1.0.pdf

网页付款标准版集成指南

https://www.paypal-biz.com/development/documentation/PayPal_WPS_Guide_V1.0.pdf

Sandbox測試環境使用指南

https://www.paypal-biz.com/development/documentation/PayPal_Sandbox_Guide_V1.0.pdf

 

 

 

你在做asp.net集成Paypal在线付款需要以下的条件:

1.       需要有.net开发基础(废话).

2.       需要有一个在外网可以访问到的网址.

3.       需要仔细阅读Paypal集成文檔,以备参考.

4.       需要注册Paypal的正式账号与测试账号(本文以测试账号为例).

 

假定我们现在的系统叫Order系统,需要集成在线付款,本文按照如下的流程来讲述Paypal的开发过程:

1.       註冊Paypal的测试账号.

2.       编写一个HTML Form 将订单的一些相关信息POSTPaypal的页面上去.

3.       提供一个页面用于让Paypal更新我们的Order系统.

4.       返回到Order系统的提示页面.

 

 

 获得Paypal的测试账号

Paypal为我们提供一个可以测试的虚拟付款的付款网站:

http://www.sandbox.paypal.com/

界面上要求你用Email Addresspassword来登录,和PayDollar不同的是paypal提供了測試環境的註冊帳號,如果你沒有帳號,可以點擊Sing Up Now註冊一個paypal的測試帳號.

註冊完成後,可以用剛註冊的帳號登錄,再點擊Test Account,然後再註冊一個Business帳號和一個personal帳號,分別用於模擬買家與賣家,或者叫做接款方和付款方.

在注冊business帳號和personal帳號時,會要求你和信用卡與借記卡關聯(這一些信息都可以為假的!).

 

你可以進入官網了解或者百度一下,網上怎樣註冊帳號的資料很多.

 

 

编写一个HTML Form 将订单的一些相关信息POSTpaypal的页面上去.

 

View Code
 1  < form  id ="PayForm"  method ="post"  action ="https://www.sandbox.paypal.com/cgi-bin/webscr" >
 2 
 3  < input  type ="hidden"  name ="cmd"  value ="_xclick" />
 4 
 5  < input  type ="hidden"  name ="business"  value ="XXXX@XXXX.com" />
 6 
 7  < input  type ="hidden"  name ="item_name"  value ="OP0000055" />
 8 
 9  < input  type ="hidden"  name ="amount"  value ="480.00" />
10 
11  < input  type ="hidden"  name ="rm"  value ="2" />
12 
13  < input  type ="hidden"  name ="currency_code"  value ="HKD" />
14 
15  < input  type ="hidden"  name ="on0"  value ="ProductID" />
16 
17  < input  type ="hidden"  name ="os0"  value ="OP0000055" />
18 
19  </ form >

 

学习过HTML的同学都会知道上面是什么意思,以下是我对上面的一些参数含义的解释,如果你需要更多的帮助,你可以阅读Paypal集成指南的相关章节:

1.       请将formmethod设置成POST action设置成https://www.sandbox.paypal.com/cgi-bin/webscr

如果要变成正式付款请将它设置成:

http://www.paypal.com/cgi-bin/webscr

2.       business设置成Paypal提供给你的账号,如果是正式环境发布,就需要用正式的账号

3.       amout设置成你要付款的金额

4.       item_name设置成你要付款的订单号

5. paypal提供了在Form裏面設置IPN(Instant Payment Notification 即时付款通知)的方法,只要你將下面的代碼加入Form中就可以設置

                   <input type=\"hidden\" name=\"notify_url\" value=http://www.youdomain/PaypalIPN.aspx/>,但本次開發中沒有使用這一種方法,我們會在paypalbusiness帳號的管理界面中設置好,下面的內容會介紹.

設置好這一些參數後,如果提交上去,就會實現這一個功能:將金額為:480.00訂單號為: OP0000055的訂單付款,收款方為XXXX@XXXX.com(business帳號)

 (如果你要更详细的参数设置介绍,你可以查看Paypal集成文档在这里我并不贴出Order系统的其它的代码,我们只要将这个Form的代码生成好,动态替换里面要改变的参数(比如amout,orderref)提交上去就好了,就比如说,一个页面上可以放两个Form,一个Form用于显示购物车里面的信息,另一个Form就可以放以上的代码,只要保证第二个Form提交了就OK了,悄悄的告诉你,我就是用StringBuilder这样一条一条append上去的,遇到要替换的参数我就Replace一下,我相信你一定知道我是怎么做的,哈哈,你信不信不要紧,反正我相信了!

 

 

当你将该Form提交后,你可以看到Order系统已跳转到sandbox.paypal.com的测试付款页面了

 

 

在這裏你就可以輸入你註冊的personal的帳號與密碼付款.

当你点击PayNow按钮时,Paypal就会开始给你做付款操作.

 

 提供一个页面(paypalIPN.aspx)用于让Paypal更新我们的Order系统

 

我们先来看看IPN文档上怎么定义IPN的含义:

在买家通过您的网站付款结束后,PayPal 将异步(即不作为网站付款流程的一部分) 发送付款详细数据到您所指定的 URL,以便您了解买家付款的具体情况并做出相应的响应。 这个过程我们称作即时付款通知 (简称 IPN)。示意图如下:

 

1) 客户点击付款按钮向您的账户付款;

2) PayPal 接受到客户的付款后,向您的服务器指定的 URL 通过 POST 方式发送

IPN

3) 在您的服务器收到 IPN 之后,您必须将收到的 POST 信息对原样返回给 PayPal 进行验证,PayPal 通过此方法帮您防范欺骗或中间人攻击;(对 IPN 信息 的验证过程我们称之为通知确认,详细的可参见 6.3

4) PayPal 返回验证信息,通过验证为 VERIFIED,不通过则为 INVALD

5) 根据验证信息处理付款明细。

【注】每次付款您可能收到多个 IPN 信息,一般来说直到收到 IPN 信息中的付款状态 为 Completed 为止。

IPN 数据包含了整个付款过程的详细信息,通过获取并分析它您可以:

„ 自定义网站对客户购物进行实时回复:您可以以 EMAIL 或其他方式通知客户 付款的状态;

„ 自动履行相关操作:当收到 IPN 数据并确认付款状态已经完成后,您就可以 立刻启动向买家发货的流程,也可以为买家进行虚拟货币的充值或者以某种方 式将虚拟商品的卡号和密码发送给买家;

„ 记录交易信息到您的数据库中。

 

 

Paypal在做付款操作时,paypal会将本次付款的信息(如交易号,付款状态等)PostOrder系统,以便Order系统更新自己的系统,比如说更新订单的交易号与交易日期所以我们要提供一个页面来接收这一些数据,这个页面在Paypal里面叫IPN(Instant Payment Notification 即时付款通知)页面,(这个页面我们取名为paypalIPN.aspx)如果你想了解更多IPN的知识,请阅读即時付款通知指南

 

IPN可以在Form裏面設置也可以在Business帳號的管理頁面配置:

sandbox裏選擇business帳號,然後點擊入business的帳號管理頁面

點用用戶信息-更多選項

               

就會進入如下頁面:

 

更改即時付款通知習慣設定

在通告Url中填入IPN的頁面地址(需要可以在外網訪問的地址):

選擇接收即時付款通知消息(已啟用),然後按保存.

 

paypalIPN.aspx的后台代码如下:

 

View Code
 1   private  void Page_Load( object sender, System.EventArgs e)
 2 
 3            {
 4 
 5                  //  Put user code to initialize the page here
 6 
 7                 Response.Write( " 200 OK ");
 8 
 9  
10 
11                  string strResponse=ValidatePaypalInfo();
12 
13                  if(strResponse== " VERIFIED ")
14 
15                 {
16 
17                       string pay_status=Request.Form[ " payment_status "].ToString();
18 
19                       if(pay_status== " Completed ")
20 
21                      {
22 
23                             string payID=Request.Form[ " txn_id "].ToString();
24 
25  // 獲取交易號
26 
27                             string orderID=Request.Form[ " item_name "].ToString();
28 
29                             // 獲取訂單號
30 
31                            OrderProvider provider= new OrderProvider();
32 
33                            service.SetOrderIsPay(payID,orderID);
34 
35                      }
36 
37                 }
38 
39  
40 
41            }
42 
43  
44 
45             private  string ValidatePaypalInfo()
46 
47            {
48 
49                  string strFormValues;
50 
51                  string strNewValues;
52 
53                  string strResponse;
54 
55                 HttpWebRequest req=(HttpWebRequest)WebRequest.Create(PayPaypal.FormPostAddress);
56 
57                 req.Method= " POST ";
58 
59                 req.ContentType= " application/x-www-form-urlencoded ";
60 
61                  byte[] param=HttpContext.Current.Request.BinaryRead(HttpContext.Current.Request.ContentLength);
62 
63                 strFormValues=Encoding.ASCII.GetString(param);
64 
65                 strNewValues=strFormValues+ " &cmd=_notify-validate ";
66 
67                 req.ContentLength=strNewValues.Length;
68 
69  
70 
71                 StreamWriter stout= new StreamWriter(req.GetRequestStream(),Encoding.ASCII);
72 
73                 stout.Write(strNewValues);
74 
75                 stout.Close();
76 
77  
78 
79                 StreamReader sr= new StreamReader(req.GetResponse().GetResponseStream());
80 
81                 strResponse=sr.ReadToEnd();
82 
83                 sr.Close();
84 
85                  return strResponse;
86 
87            }

 

     代碼主要是接收https://www.sandbox.paypal.com/cgi-bin/webscr的返回值是否為VERIFIED,如果為true就可以用Request.form去獲取paypal返回的數據去更新Order系統,如果你想了解更多,請詳細閱讀即時付款通知指南

个人体会:

1.我个人认为,paypal要求我们提供的IPN页面只能用于更新Order系统,不应该用于显示界面(包括付款结果),不要將IPN頁面和Order系統付款結果頁面混為一談(IPN頁面只是用來更新系統,不用於顯示,而付款結果頁面只是用於顯示付款結果).

2.Order系统提供的IPN页面,是一定要有外网上可以访问的,要不然会造成返回参数接收不成功!我曾经在这个地方卡住很久,后来换成外网地址后就可以接收返回参数.

 

 

 返回到Order系统的提示页面

paypal付款成功后,我们会一直停留在paypal的付款完成页面,如果我们想要他自动返回我们的Order系统的某个页面,以显示出付款结果(或有其它的操作),我们就要用使用PDT,我们先来看一下实时付款通知文档里面PDT的意义是什么:

PDT 是一个安全获取付款明细的方式。在买家付完款后,卖家可以通过此方式即时获取付款明细并显示给买家看。PDT 的流程示意图如下所示:

 

 

1) 买家通过 PayPal 付款后根据事先设定的返回 URL(return)返回到您的网站;

2) PayPal 将在返回的 URL 附加变量 tx,即 PayPal 的交易流水号;

3) 将收到的交易流水号 tx 和您的身份标记通过 POST 方式发回给 PayPal

4) PayPal 接受请求后验证身份标记及交易流水号后将付款明细发送回给网站;

5) 将接受到的付款明细处理后显示在买家的网页浏览器中。

Paypal的付款结果页面比paydollar的相对来说更复杂,我们首先要到你注册的business账号的管理页面去设置一下PDT

 

 

进入网站付款习惯设定

 

 

将自动返回设置成开启

将返回URL设置成你想要返回的页面地址

将付款数据传输设置为开启

请记录下你的身份标记,在以后的开发时用得上.

 

假定我们设置的PDT页面为:paypalResult.aspx,那么后台代码和IPN页面的代码很相似:

 

View Code
 1  protected System.Web.UI.WebControls.Label lab_message;
 2 
 3          private  void Page_Load( object sender, System.EventArgs e)
 4 
 5         {
 6 
 7              string result=GetPaypalPDTString();
 8 
 9              switch(result)
10 
11             {
12 
13                  case  " SUCCESS ":
14 
15                     lab_message.Text=PayResultConst.PAY_SUCCESS_MESSAGE;
16 
17                      break;
18 
19                  case  "":
20 
21                     lab_message.Text=PayResultConst.PAY_FAIL_MESSAGE;
22 
23                      break;
24 
25                  default:
26 
27                     lab_message.Text=PayResultConst.PAY_ORTHER_ERROR_MESSAGE;
28 
29                      break;
30 
31             }
32 
33         }
34 
35  
36 
37          private  string GetPaypalPDTString()
38 
39         {
40 
41              string strFormValues;
42 
43              string strNewValues;
44 
45              string strResponse;
46 
47              string txToken=Request.QueryString[ " tx "].ToString();
48 
49              string query= " cmd=_notify-synch&tx= " + txToken +  " &at= " + PayPaypal.PDTToken;
50 
51              // 请注意,请将PayPaypal.PDTToken设置为上文中你记录下来的身份标记
52 
53             HttpWebRequest req=(HttpWebRequest)WebRequest.Create(PayPaypal.FormPostAddress);
54 
55             req.Method= " POST ";
56 
57             req.ContentType= " application/x-www-form-urlencoded ";
58 
59              byte[] param=HttpContext.Current.Request.BinaryRead(HttpContext.Current.Request.ContentLength);
60 
61             strFormValues=Encoding.ASCII.GetString(param);
62 
63             strNewValues=strFormValues+query;
64 
65              // query附加上去一起发送给paypal
66 
67             req.ContentLength=strNewValues.Length;
68 
69  
70 
71             StreamWriter stout= new StreamWriter(req.GetRequestStream(),Encoding.ASCII);
72 
73             stout.Write(strNewValues);
74 
75             stout.Close();
76 
77  
78 
79             StreamReader sr= new StreamReader(req.GetResponse().GetResponseStream());
80 
81             strResponse=sr.ReadToEnd();
82 
83             sr.Close();
84 
85              return strResponse.Substring( 0,strResponse.IndexOf( " \n "));
86 
87      }
88 
89  

当系统开发完成后,你的公司可能会向Paypal申请正式的账号,这时你需要将Form的一些测试信息更改成正式信息(比如说action地址,business账号等等)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值