博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net集成PayPal的Demo
阅读量:6428 次
发布时间:2019-06-23

本文共 4547 字,大约阅读时间需要 15 分钟。

近来项目中需要使用Paypal(贝宝)支付,研究了一下接口,真是吐血,花了一个下午+一个晚上,屡败屡战,海淘了若干文档,终于尝试成功了,分享一下,希望对将要使用paypal的朋友有所帮助。

paypal提供3种类型的对外付款接口,可参考:https://cms.paypal.com/c2/cgi-bin/?cmd=_render-content&content_ID=pages_c2/profile_comparison_new&fli=true

我们这里采用标准的网页版本,其中标准的网页版本又分为三种实现方式:

1.按钮方式,也就是一个商品一个按钮

2.购物车方式,让paypal托管你的购物车

3.你自己的购物网站有购物车,付款时候将购物车数据提交到paypal即可付款

考虑自由度问题,当然我们需要第三种方式。

准备工作

1.到www.paypal.com中申请一个正式的账号,注意银行卡目前只能用信用卡和借记卡,并且需要支持不同币种的,否则可能开通失败。

2.用刚才申请的账号到https://developer.paypal.com/ 中创建开发者模拟账号,为啥?因为开发者账号测试不需要收费

这里需要创建两个账号,买家和卖家,默认系统会给你创建卖家的。

账号创建好了之后,注意修改每个账号的登录密码,在profile里改。

哦,忘记了,创建买家账号的时候,千万别忘记充值哦,充值金额<10000刀。

 

3.设置好了之后,我们到沙箱里登录卖家账号,单击链接 Enter Sandbox site,用Business类型账号登录,然后做如下设置

 IPN即时付款通知的意义是什么呢?交互原理如下:

我们提交购物车到paypal,完成付款以后,paypal会想我们设置好的IPN代理,发送消息,从而使我们自己的程序得知是否付款成功,以备后续操作,而且这个操作是在后台调用的,其主要目的就是为了防止用户主动关闭浏览器,造成程序订单状态无法更新的问题。

付款自动返回设置,指的是完成付款之后跳转到我们自己网站的界面,这个是显示给用户看的,而且这个接收界面,paypal会发送相关订单数据,付款状态等到这个页面上,也就是“付款数据传输(可选)”这项,勾上之后在返回URL界面就可接收到相关数据了(用户付款完成后,恶意关闭的情况除外)

4.当然上面两个值在账号里面设置是全局的,你可以在具体的提交按钮里面设置

5.在我们的购物网站,实现购物车界面代码:

     

6.付款成功界面代码,也就是return

string strFormValues = Request.Params.ToString();            string strNewValue;            string strResponse;            string serverURL = "https://www.sandbox.paypal.com/cgi-bin/webscr";            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(serverURL);            req.Method = "POST";            req.ContentType = "application/x-www-form-urlencoded";            strNewValue = "cmd=_notify-validate";            strNewValue = "cmd=_notify-synch&tx=" + Request.QueryString["tx"] + "&at=access_token你的";            //req.ContentLength = strNewValue.Length;            StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);            stOut.Write(strNewValue);            stOut.Close();            StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());            strResponse = stIn.ReadToEnd();            stIn.Close();            if (strResponse.StartsWith("SUCCESS"))            {            }            else            {            }

 

 7.IPN后台数据接收

//Post back to either sandbox or live        string strSandbox = "https://www.sandbox.paypal.com/cgi-bin/webscr";        string strLive = "https://www.paypal.com/cgi-bin/webscr";        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strSandbox);        //Set values for the request back        req.Method = "POST";        req.ContentType = "application/x-www-form-urlencoded";        byte[] param = Request.BinaryRead(HttpContext.Current.Request.ContentLength);        string strRequest = Encoding.ASCII.GetString(param);        string ipnPost = strRequest;        strRequest += "&cmd=_notify-validate";        req.ContentLength = strRequest.Length;        //for proxy        //WebProxy proxy = new WebProxy(new Uri("http://url:port#"));        //req.Proxy = proxy;        //Send the request to PayPal and get the response        StreamWriter streamOut = new StreamWriter(req.GetRequestStream(),                                 System.Text.Encoding.ASCII);        streamOut.Write(strRequest);        streamOut.Close();        StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());        string strResponse = streamIn.ReadToEnd();        streamIn.Close();        // logging ipn messages... be sure that you give write        // permission to process executing this code        string logPathDir = ResolveUrl("");        string logPath = string.Format("{0}\\{1}.txt",                         Server.MapPath(logPathDir), DateTime.Now.Ticks);        File.WriteAllText(logPath, ipnPost + " " + strResponse);        //        if (strResponse == "VERIFIED")        {            //check the payment_status is Completed            //check that txn_id has not been previously processed            //check that receiver_email is your Primary PayPal email            //check that payment_amount/payment_currency are correct            //process payment        }        else if (strResponse == "INVALID")        {            //log for manual investigation        }        else        {            //log response/ipn data for manual investigation        }        Response.Write(strResponse);

8.最后听我一言,程序写好了之后,一定要发布到公网iis上,再测试,不然IPN永远都是INVALID,就是这个鸟问题让我搞了一个晚上,气死了。 

 

ok了,再有问题,可以联系我。

Demo下载地址:http://files.cnblogs.com/qidian10/PayPal-Demo%26SDK.rar

转载地址:http://ggjga.baihongyu.com/

你可能感兴趣的文章
JS 循环遍历JSON数据
查看>>
sentences in movies and teleplays[1]
查看>>
【20181023T1】战争【反向并查集】
查看>>
win7网络共享原来如此简单,WiFi共享精灵开启半天都弱爆了!
查看>>
iOS9 未受信任的企业级开发者
查看>>
paper 40 :鲁棒性robust
查看>>
优化MySchool数据库(事务、视图、索引)
查看>>
使用笔记:TF辅助工具--tensorflow slim(TF-Slim)
查看>>
CCF-NOIP-2018 提高组(复赛) 模拟试题(一)
查看>>
大话设计模式读书笔记3——单例模式
查看>>
Java多线程之ReentrantLock与Condition
查看>>
实验三
查看>>
Vue 项目构建
查看>>
[Ruby on Rails系列]2、开发环境准备:Ruby on Rails开发环境配置
查看>>
在反射中如何调用类中的Setter()AndGetter()方法
查看>>
android studio adb
查看>>
框架源码系列二:手写Spring-IOC和Spring-DI(IOC分析、IOC设计实现、DI分析、DI实现)...
查看>>
asp.net编译 懒人脚本
查看>>
二分答案经典入门题:)
查看>>
为什么你需要将代码迁移到ASP.NET Core 2.0?
查看>>