PayPal开发之IPN的使用
- 確認“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的使用相关推荐
- 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...
本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...
- iOS开发之AVKit框架使用
2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...
- Android NDK开发之旅31 FFmpeg音频解码
###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...
- android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键
本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){ ...
- android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序
android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序 在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...
- 谷歌的AI应用开发之道
https://www.toutiao.com/a6718151019873698308/ 全球AI第一大厂,打造AI产品时有何指导思想? 软件+硬件+AI. 没错,这是谷歌CEO皮猜在Google ...
- WinForm界面开发之“HTML内容编辑控件”
做过了很多Winform的共享软件,对界面的设计有了一定的经验和积累,准备开一个"WinForm界面开发"系列文章,介绍下相关的Winform界面设计和相关控件的使用,促进相互交流 ...
- python运维开发之socket网络编程01
python运维开发之socket网络编程01说明:本文来自来自北京老男孩linux运维实战培训中心-运维开发课程免费视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog ...
- android添加截图功能,Android应用开发之Android 5.0及以上编程实现屏幕截图功能的方法...
本文将带你了解Android应用开发Android 5.0及以上编程实现屏幕截图功能的方法,希望本文对大家学Android有所帮助. 本文实例讲述了Android 5.0及以上编程实现屏幕截图功能 ...
最新文章
- truffle详细使用教程
- 英特尔杀入游戏显卡市场:支持光追和AI超分辨率,挑战AMD英伟达
- redis图形化界面_Redis(六)- Client
- 【BZOJ】2289: 【POJ Challenge】圆,圆,圆
- vector常见用法
- 存储过程与业务类实现业务的差异比较
- 20191102每日一句
- PAIP.java程序调试的注意点及流程总结
- 牛腩新闻发布系统(7)——总结
- 批量找关键词的软件-再也不用担心找不着 关键词了
- lockdir.exe(文件夹加密软件)重装系统后打不开的解决办法
- 西门子SITOP电源维修6EP1336-3BA00冗余电源模块维修概述
- 强烈推荐:程序员接私活那点事
- 《数据结构(C语言版)》严蔚敏代码实现———顺序表
- 为什么微软是数字时代的领头羊?
- 如何关掉苹果iMac开机启动声音
- shopee首站入驻哪个国家?哪个国家更好卖?
- 肝完《浏览器基本原理与实践》的精华分享
- 灵备CDM的技术及原理
- SIL9687读数据手册零碎笔记
热门文章
- 爬虫入门——电影top250爬取
- Understanding Human Behaviors in Crowds by Imitating the Decision-Making Process
- Google Cardboard
- python培训千锋和黑马哪个好
- 戴尔r930服务器U盘装系统,云骑士u盘装机大师dell怎么用u盘装系统
- 本科就学人工智能有意义吗?
- Java中23种设计模式(随时不定时更新)
- 解决python关于UnicodeEncodeError: 'gbk' codec can't encode character '\xa3'报错的问题
- Ribbon与Eureka整合分析(四)、客户端配置延迟加载和启用饥饿加载
- UltraEdit 21.30.1006.0 繁体中文破解版(功能最强的文本编辑器)