PayPal 快速、安全而又方便,是跨國交易的首選在線付款方式。現在PayPal可以和國內大部分信用卡關聯,可以實現國人的跨國交易收支。
申請PayPal註冊網址:https://www.paypal.com/
paypal接口與其它接口有些不同,稍微復雜一點。 其實銀行接口也算是一個站點的插件。
所謂paypal ipn(Instant Payment Notification),就是Paypal開發的一種能主動通知第三方賣家系統交易狀態的一種機制。IPN的原理很簡單,就是當產生了一個交易之後, 交易狀態發生變化時,如用戶已經付款、或者退款、撤銷時,Paypal利用常用的HTTP POST方式,將交易的一些變量提交給網站的某個頁面(稱之為IPN Handler),當這個頁面接受到請求時候,將這些數據原封不動加上一個指示驗證的cmd=_notify-validate,POST回Paypal 的接口地址,如果數據正確,那麽Paypal返回字符串VERIFIED,否則為INVALID,如果結果為VERIFIED,那麽你的程序就可以使用這 些數據進行操作。
開設Sandbox帳號
但代碼的調試是一件很痛苦的事情,因為作為第三方開發人員,不可能開兩個帳號,每次測試還要 之間交易一些錢,所以Paypal專門開發了Sandbox給開發人員進行開發,首先到https://developer.paypal.com/ 註冊一個開發帳號,好了之後再進入Sandbox建立測試用的Paypal虛擬帳號(至少應該建立一個Business的和一個Personal的),這 種賬號註冊方法和Paypal的流程一樣,信息可以是假的,包括銀行帳號、信用卡(其實Paypal Sandbox會自動生成一些隨機的號碼)。接下來需要激活Paypal Sandbox的虛擬帳號,註意,這裏不管你在Paypal Sanbox註冊時填什麽郵件地址,有任何發送到虛擬帳號所填郵箱的郵件都存會在開發帳號的管理界面中的Email頁(導航欄上有)中。登錄 Sandbox的虛擬Paypal環境,還需要驗證虛擬帳號的銀行,這裏可以隨便填,然後通過Add Funds來給賬戶充值(想填多少填多少 920-203 920-533 )。然後,還需要激活IPN的選項,在Business的那個賬戶的Profile設置頁面中,點擊,然後點擊Edit按鈕,打開IPN,這裏如果你使用的是固定的IPN Handle,可以直接將地址填入。
接下來,我們測試的時候,應該將Paypal接口的地址設置為 https://www.sandbox.paypal.com/cgi-bin/webscr
基本的流程
當客戶向您付款時,PayPal將向位於指定 URL (type=”hidden” name=”notify_url” value=” “)的服務器發送一個通知。此通知中將包括您的客戶的所有付款信息(例如,客戶名稱、金額),以及一段加密代碼。當服務器收到通知時,它隨後會將該信息 (包括加密代碼)發送回安全的PayPal URL。PayPal將通過檢查加密字符串對交易進行身份驗證。這種將 IPN 數據傳回PayPal的操作防止了“欺騙”,因此您可以確保 IPN 來自PayPal。在進行驗證時,PayPal會將其合法性的確認信息發送回您的服務器。
提示:要啟用即時付款通知,您將需要輸入一個 URL,通過它您可以接收到來自您的用戶信息的通知。
啟用了即時付款通知後,每次當您接收付款時您的服務器都會收到一個通知,此通知將以隱藏的“FORM POST”的方式發送到指定的 URL,並將包括所有付款信息。此頁面的底部列出了通知的 FORM 變量。
每次收到來自PayPal的 IPN 時,您必須在實施訂單之前完成如下所述的通知確認過程。確認列出的信息將可確保交易合法。
通知確認IPN
為了確保付款已進入您的PayPal賬戶,您必須驗證用作“receiver_email”的電子郵件地址是否已在您的PayPal賬戶中註冊並得到確認。
服務器收到即時付款通知後,您將需要通過構建一個發送到PayPal的 HTTP POST 對其進行確認。您的 POST 應發送到https://www.paypal.com/cgi-bin/webscr
您必須完全按照收到表單變量時的原樣發送所有收到的表單變量。您還需要將一個值為“_notify-validate”的名為“cmd”變量(例如,cmd=_notify-validate)附加到 POST 字符串。
PayPal將回復該 POST,並在回復的正文中包含一個單詞“VERIFIED”或“INVALID”。當您收到 VERIFIED 回復時,您需要在實施訂單之前執行若幹檢查:
  • 確認“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的使用相关推荐

  1. 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...

    本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...

  2. iOS开发之AVKit框架使用

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...

  3. Android NDK开发之旅31 FFmpeg音频解码

    ###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...

  4. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键

    本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){         ...

  5. android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

    android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序   在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...

  6. 谷歌的AI应用开发之道

    https://www.toutiao.com/a6718151019873698308/ 全球AI第一大厂,打造AI产品时有何指导思想? 软件+硬件+AI. 没错,这是谷歌CEO皮猜在Google ...

  7. WinForm界面开发之“HTML内容编辑控件”

    做过了很多Winform的共享软件,对界面的设计有了一定的经验和积累,准备开一个"WinForm界面开发"系列文章,介绍下相关的Winform界面设计和相关控件的使用,促进相互交流 ...

  8. python运维开发之socket网络编程01

    python运维开发之socket网络编程01说明:本文来自来自北京老男孩linux运维实战培训中心-运维开发课程免费视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog ...

  9. android添加截图功能,Android应用开发之Android 5.0及以上编程实现屏幕截图功能的方法...

    本文将带你了解Android应用开发Android 5.0及以上编程实现屏幕截图功能的方法,希望本文对大家学Android有所帮助. 本文实例讲述了Android   5.0及以上编程实现屏幕截图功能 ...

最新文章

  1. truffle详细使用教程
  2. 英特尔杀入游戏显卡市场:支持光追和AI超分辨率,挑战AMD英伟达
  3. redis图形化界面_Redis(六)- Client
  4. 【BZOJ】2289: 【POJ Challenge】圆,圆,圆
  5. vector常见用法
  6. 存储过程与业务类实现业务的差异比较
  7. 20191102每日一句
  8. PAIP.java程序调试的注意点及流程总结
  9. 牛腩新闻发布系统(7)——总结
  10. 批量找关键词的软件-再也不用担心找不着 关键词了
  11. lockdir.exe(文件夹加密软件)重装系统后打不开的解决办法
  12. 西门子SITOP电源维修6EP1336-3BA00冗余电源模块维修概述
  13. 强烈推荐:程序员接私活那点事
  14. 《数据结构(C语言版)》严蔚敏代码实现———顺序表
  15. 为什么微软是数字时代的领头羊?
  16. 如何关掉苹果iMac开机启动声音
  17. shopee首站入驻哪个国家?哪个国家更好卖?
  18. 肝完《浏览器基本原理与实践》的精华分享
  19. 灵备CDM的技术及原理
  20. SIL9687读数据手册零碎笔记

热门文章

  1. 爬虫入门——电影top250爬取
  2. Understanding Human Behaviors in Crowds by Imitating the Decision-Making Process
  3. Google Cardboard
  4. python培训千锋和黑马哪个好
  5. 戴尔r930服务器U盘装系统,云骑士u盘装机大师dell怎么用u盘装系统
  6. 本科就学人工智能有意义吗?
  7. Java中23种设计模式(随时不定时更新)
  8. 解决python关于UnicodeEncodeError: 'gbk' codec can't encode character '\xa3'报错的问题
  9. Ribbon与Eureka整合分析(四)、客户端配置延迟加载和启用饥饿加载
  10. UltraEdit 21.30.1006.0 繁体中文破解版(功能最强的文本编辑器)