PayPal开发之IPN的使用
来源:互联网 发布:大数据分析工作 编辑:程序博客网 时间:2024/06/16 07:48
- 確認“payment_status”為“Completed”,因為系統也會為其他結果(如“Pending”或“Failed”)發送 IPN。
- 檢查“txn_id”是否未重復,以防止欺詐者重復使用舊的已完成的交易。
- 驗證“receiver_email”是已在您的PayPal賬戶中註冊的電子郵件地址,以防止將付款發送到欺詐者的賬戶 。
- 檢查其他交易詳情(如物品號和價格),以確認價格未改變完成了以上檢查後,您可以使用 IPN 數據更新您的數據庫,並處理購物。
------------------------------------------------------------------------------------------------------------------------->
这两天突然好奇PayPal和支付宝等第三方支付工具的开发,大概动机好像是看到SpaceX公司的创始人(创建了PayPal卖给了eBay)最近成功地(作为一个非国家力量)发射了火箭而被广泛报道。于是拿PayPal作为研究对象,琢磨到了第二天。
PayPal基本原理
PayPal的大致原理(快速付账和标准付账)是自己的网站提供一个按钮(比如立即购买、捐赠、加入购物车等),作为一个表单(post form)提交相关信息到PayPal的网站;PayPal使用银行卡、电子汇款等等各种方式从买家(自己网站的用户)那里收钱,放到自己在PayPal上的账户里(用过支付宝的应该比较清楚)。
PayPal IPN机制
但是作为开发人员,光收钱不干事是会被用户起诉的。一个最基本的需求,假设你只卖一种东西,你也要知道谁付过钱,(如果你卖几种东西,你还要知道他付了多少钱买的什么东西)。PayPal中你的账户当然可以大概看到账单信息,还有邮件通知你,但是不可能你一封封邮件、一条条账单去查看,然后给用户发送货物或开通服务。那大家都会摒弃你这个网站的。
PayPal提供一个叫Instant Payment Notification(IPN)的机制。以前觉得在线支付安全性要求高,所以自己的网站作为PayPal的“第三方”网站,之间的通讯一定要很有保障才行。但是看了IPN发现真是容易理解:PayPal从用户那里收钱以后,会给一个地址发送这次交易的信息(这个地址由你提供,比如某个你的网站上的php过程),你可以知道谁付了多少钱以及交易状态(completed、pending等等)。这个通知叫做IPN。为了避免恶意用户访问你这个php过程进行欺诈,你需要把PayPal发过来的IPN信息加上一个cmd=verify-xxxx什么的字段发送给PayPal的一个网址(https://www.paypal.com/cgi-bin/webscr),PayPal会将接收的信息在它的系统(数据库?)里比对,每个字段都正确(是它发的原文)它就会返回一个VERIFIED,否则就会返回INVALID。然后你就可以根据先前得到的IPN信息进行自己业务的处理了,比如给这个刚购买服务的用户升级成VIP啊、允许他下载某部爱情动作片啊之类的。
这里分析一下,整个过程比我预计的要简单(我都无法预计过),只要保证你发送回的验证请求是给PayPal的(所以要保护你的网站权限安全)、PayPal形成的交易信息是无法预测的(我记得有些token什么的,比如有个叫txn的,这端由PayPal负责,相信它就是了),那么整个过程就是可信的。
测试过程、问题与解决(主要是测试环境可能出现问题)
好了,这些原理在网上不少文档、教程都有,还有人写了专门的php class处理IPN,而且PayPal自己的在线文档里也有教程和Sample Codes。当然,PayPal还提供了名为Sandbox(沙盒)的测试环境(http://developer.paypal.com)给大家测试,主要功能就是给你注册虚假的测试账号(买家、卖家的),教程在PayPal和网上都有。接下来要记录的是我在测试IPN接口过程中遇到的问题,是网上不太广泛存在的。
首先要理解一下合理的测试过程。首先你需要准备一个带有购买按钮的页面(购买按钮的代码从PayPal教程和demo里有),然后用浏览器打开这个页面,点击购买,可以用注册的虚假买家账号付款。同时,你要有一个接收IPN信息和发送验证请求并对请求结果进行简单处理的脚本(我是用PHP)网页。在前面虚假买家付款成功后,PayPal的服务器会和你的这个脚本网页交互,从而可以测试交易的完整过程。
接下来的问题是理解IPN地址和购买过程的返回地址(我自己本来是很快理解的,但是由于下面说到的原因,让我一度以为自己的理解有误,所以还是在这里阐述一遍)。这两个地址的官方叫法在PayPal里是“IPN Handler”(“通告URL”)和“Return URL”(“返回URL”),都是在卖方账号里的Profile(用户信息)菜单下“即时付款通知习惯设定”和“网站付款设定”页面里设置的。通告URL是自己的网站用来和PayPal的网站交互的那个PHP网页地址,返回URL是用户点击购买并付款结束后自动跳转的页面。我开始的设计是跳转的页面和通告URL页面是同一页面,然后通过传入参数的检测来实现是否处理IPN。注意,不管用户是否跳转到这个php页面,PayPal的服务器在收款后都会生成一个post连接到这个php页面。看得出来这种逻辑不清楚,所以合理的设计是两者分开。好吧,本来两者就是分开的,我开始弱智的想偷懒把自己搞糊涂了。
再下来要注意的(也是我自己测试了很久都不通过的最主要问题)就是测试环境。我的环境是自己的电脑上有一个http server(做开发和测试的),远程服务器有两个,一个是新浪SAE的,一个是Amazon EC2的。因为Amazon EC2的需要ftp和putty连接,所以我先考虑用SAE的。现在到关键了:点击购买的页面可以是放在本地(127.0.0.1)的,返回URL也可以设置成127.0.0.1的(因为这个URL是浏览器端会打开的,在自己电脑上能够访问到即可),但是IPN Handler或者叫通知URL必须是公开可访问的,因为PayPal的服务器要和它交互。我开始把这个也设置成了127.0.0.1,自然是不对。不过这还是关键问题的一小步,因为在PayPal的测试工具(IPN Simulator)中,会提示你给的通告URL无法访问,所以很容易想到不能用本地服务器。
关键问题第二点:SSL连接。我把代码上传到SAE,IPN Handler改成了SAE的地址,比如这个siruisae.sinaapp.com/xxx.php,结果IPN Simulator提示成功发送了IPN消息,我这边也没有验证成功。(我的验证方法是,如果PayPal对我验证请求的返回是VERIFIED,我就在一个文件里写OK,否则就写No)。
通过搜索,有一个相关的问题要注明一下,PHP在windows上(我用xampp安装的开发环境)默认是不能发起SSL连接的,而你要拿着PayPal给你的信息返回它那边去请求验证,是通过HTTPS/SSL协议的。所以需要在php.ini配置文件中加上一句extension=php_openssl.dll。网上说是把这句的注释去掉,并且要拷贝两个dll文件到system32,我发现我的配置文件就不存在带注释这一句,完全要自己手动加上,同时没有拷贝那两个dll文件,加上配置后直接重启Apache服务就OK了(不OK的话IPN Handler的PHP会有Warning提示的)。
好了,继续前一段的问题,改成SAE后本地文件里还是不会写OK或者No,所以我估计SAE的环境也是不能发起SSL连接的(如果有新浪SAE的开发人员希望了解一下)。那么只能就在EC2的环境上测试了。再一次把IPN Handler地址改成EC2的服务器地址(我有自己的域名,不过EC2也可以申请公开IP,总之你保证PayPal能访问到就行)。结果还是不行,没有任何结果写到本地文件里!有点要崩溃的时候想到,可能是EC2权限问题,所以把本地文件的权限放开,给777。再试一次,终于成功了,一个硕大的OK在本地文件里显示出来。(注:“本地文件”指的是和IPN Handler的PHP脚本同一个目录的某个文本文件,不是在127.0.0.1本地服务器的什么文件)。
附注:账户类型的区别
测试账户里面有个人账户和商业账户,在测试和最后使用过程中,都应该是注册商业账户。好像两者的区别是:个人账户是不收费的,但是不能使用IPN服务。也就是PayPal觉得你偶尔卖个二手物品啊什么的,不应该用到IPN,而只能通过查看邮件或交易记录的方式开展后续的发货等。商业账户本身没有费用,但是别人每给你付款PayPal都要从中抽成(2.9%+5美分),而且你要从PayPal电子账户里取现到你的银行卡还要收取每笔35美元的费用(贵啊,建议攒够1000刀以上再取现一次,还算3.5%的取现手续费)。反过来想,不知道个人账户取现要不要收费。都是搜相关技术问题的时候偶尔看的。另外,在测试过程中,你需要先申请开发者账户,用到你的真实邮箱地址和密码。然后设置虚假账户,可以设置账户邮箱(也是测试账户的用户名,登陆时要的),但是给你的是加上一些随机数字后的邮箱,密码也建议自己修改成简单密码,反正全是假的。但是每次虚假交易后会往你开发者账户在测试环境的邮箱(Test Email)里发邮件,比如“某某交易完成”什么的,这个是很多教程里没提到(有一个网页提到)的。不影响IPN的测试,但可以帮助你预习正式部署后的一些收款、运营操作。
基本上就这样测试通过了,下面可以进一步了解返回的IPN信息里有什么字段,用来指导实际网站的业务处理。这个测试环境应该说还是比较有代表性的,云计算嘛,相信总会有人遇到,自己以后也可以避免同样过程。特此记录。
- PayPal开发之IPN的使用
- paypal ipn的使用指南
- Paypal的IPN原理
- paypal的IPN机制
- Paypal IPN接口开发小结
- Paypal IPN接口开发小结
- IPN-Paypal
- ASP.NET集成PayPal(使用IPN)
- PayPal Android SDK的接入和开发、与服务器对接IPN
- paypal ipn 问题
- 转:Paypal ipn
- paypal付款通知IPN
- paypal IPN and PDT
- 【Paypal】即时付款通知IPN
- Paypal-IPN&PDT变量列表
- paypal IPN and PDT 2
- PayPal IPN接口集成经验分享
- zen cart paypal IPN支付设置方法
- _stdcall,_cdecl区别
- 【LeetCode】(162)Find Peak Element(Medium)
- 华为OJ平台试题 ——数组:整形数组合并
- POJ 3532 双连通缩点
- tomcat部署多个项目webAppRootKey冲突
- PayPal开发之IPN的使用
- Android 打包签名(二)
- 打印结点和等于某个值的所有路径
- 使用strace, ltrace寻找故障原因的线索
- linux读取windows共享文件
- Spring Security + Hibernate Annotation Example
- IOS GIF图片解析 将gif图片解析成image数组
- C++ 小技巧
- maven中的pom.xml学习