解释PayPal的工作方式(IPN和PDT流程)。 第一 章第三章

第二章

本章从头到尾介绍一个真实的项目:“通过付款进行注册”,以更好地说明PayPal帐户设置以及与注册表格和数据库的集成。

项目场景

  1. 首先,我们有一个注册表。
  2. 正确填写表格(通过所有验证)后,用户单击“注册”按钮。
  3. 然后重定向到PayPal,用户支付注册费用。
  4. 付款后,PayPal将重定向到结果页面,并在10秒后自动重定向回我们的网站,然后PayPal PDT将处理付款记录。
  5. 但是,用户可能会关闭浏览器,因此我们必须为备份计划实施PayPal IPN。

数据库结构

ER图:

  1. temp_register表:临时存储用户帐户和用户密码,等待付款。 如果已付费,则该元组将被删除,并移至用户表。
  2. 支付表:uid是引用用户的外键,用于连接用户信息和支付信息。
  3. 用户表:存储用户信息,令牌为确认电子邮件中的验证令牌。 如果用户验证了其用户帐户,则已验证将设置为1。

数据库架构:

CREATE TABLE IF NOT EXISTS `payment` (
`payId` int(11) NOT NULL AUTO_INCREMENT,
`timestamp` bigint(20) DEFAULT NULL,
`paid` float DEFAULT NULL COMMENT 'user paid amount returned by paypal',
`bankFee` float DEFAULT NULL,
`currency` varchar(4) DEFAULT NULL,
`txnId` varchar(32) DEFAULT NULL COMMENT 'Transaction ID: specify single unique transaction from paypal. if this field is NOT NULL, means this payment has been process already. So if IPN returns to PHP, we can refuse to update our database.',
`status` varchar(16) DEFAULT NULL,
`uid` int(11) DEFAULT NULL COMMENT 'FK to users PK',
PRIMARY KEY (`payId`),
KEY `uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `temp_register` (
`tRegId` int(11) NOT NULL AUTO_INCREMENT,
`fullName` varchar(255) DEFAULT NULL,
`uAcc` varchar(255) DEFAULT NULL,
`uPwd` varchar(32) DEFAULT NULL,
PRIMARY KEY (`tRegId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='prevent unpaid user take uAcc(UNIQUE) in our users table' AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `users` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`fullName` varchar(255) DEFAULT NULL,
`uAcc` varchar(255) NOT NULL,
`uPwd` varchar(32) NOT NULL,
`token` varchar(32) DEFAULT NULL,
`verified` tinyint(1) NOT NULL DEFAULT '0',
`priviledge` enum('delegate','admin','developer') NOT NULL DEFAULT 'delegate',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
ALTER TABLE `payment`
ADD CONSTRAINT `payment_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`uid`);

用户界面

项目工作流程

  1. 填写表格,并验证所有输入。
  2. 单击注册按钮,重定向到贝宝。
  3. PayPal沙盒“立即付款”:
  4. 重定向贝宝结果页面。
  5. 等待重定向(PDT正常)显示成功/失败页面,或关闭浏览器(IPN正常)。

设置贝宝沙盒

在开始编码之前,我们需要先设置PayPal Sandbox帐户。

假设您已注册一个PayPal开发人员帐户,并在Sandbox中创建了一个业务用户帐户和一个购买者帐户。

然后选择企业帐户,然后单击“输入沙盒测试站点”按钮。

您可以看到主面板弹出页面:

然后,您可以查看所有信息和销售首选项设置。

因此,让我们依次依次设置所有三个选项。

1.启用PDT和设置

设置您的PDT处理函数调用URL。

2.启用IPN和设置

设置您的IPN处理程序函数调用URL。

2.创建一个PayPal按钮和PayPal参数设置


保存更改后,您可以看到PayPal按钮的源代码:

很容易发现该按钮实际上是一种表单,因此我们需要使用其输入来发布数据。
当我们生成“注册”按钮时,重定向URL应包含“&cmd = _s-xclick”和“&hosted_button_id = HA9DZBCKXKCL2”。
现在,贝宝沙盒帐户已设置。 然后开始编码您的PDT和IPN处理程序。

PDT处理程序功能

源代码:

/**
* PAYPAL: PDT HANDLER:
* ====================
* called by PayPal, send tokens back
* get payment details and payment result
* @return $ret array contains result true/false, and user account or error message
*/
private function _PDT()
{
// some indexes can not be missing:
$ruler = array(
'tx', // token from paypal
);
if(count(array_diff($ruler, array_keys($_GET))))
{
return array('result' => false, 'error' => 'Index missing ... ', 'index' => $_GET, 'missing' => array_diff($ruler, array_keys($_GET)));
}
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-synch';
// get token and prepare request url (send back to paypal)
$tx_token = $_GET['tx'];$auth_token = "_PJaHiwRfwMmWzW-9nuPuSguYxC-1d9KpxaasaNANtIvyOcmqY6jXNkRmxW";
// $auth_token = "OxDenzKmrWPyEXU0YzIg2zs-VAe7ufCADyjbfxF_RpREL4rLEslZrSa21R4";$req .= "&tx=$tx_token&at=$auth_token";// post back to PayPal system to validate$header = "POST /cgi-bin/webscr HTTP/1.0rn";$header .= "Host: www.sandbox.paypal.comrn";
// $header .= "Host: www.paypal.comrn";$header .= "Content-Type: application/x-www-form-urlencodedrn";
$header .= "Content-Length: " . strlen($req) . "rnrn";$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); // open socket
// $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30); // open socketif (!$fp)
{
// HTML FAIL
return array('result' => false, 'error' => 'HTTP error ... ');
}
else
{
fputs ($fp, $header . $req);
// read the body data
$res = '';
$headerdone = false;
while (!feof($fp))
{
$line = fgets ($fp, 1024);
if (strcmp($line, "rn") == 0)
{
$headerdone = true; // read the header
}
else if ($headerdone)
{
$res .= $line; // header has been read. now read the contents
}
}// parse the data
$lines = explode("n", $res);
$keyarray = array();
if (strcmp ($lines[0], "SUCCESS") == 0)
{
for ($i=1; $i_validatePaypal($keyarray);
}
// log for manual investigation
else if (strcmp ($lines[0], "FAIL") == 0)
{
// skipped
return array('result' => false, 'error' => 'Transaction failed ... ');
}
}
fclose ($fp);
return $ret;
}

说明:

PayPal调用PDTHandler()函数,然后此处理程序函数处理_PDT()。 如您所见,它从URL($ _GET)接收PayPal提供的参数。 因此,我们通过fsock ssl将令牌和TX发送回PayPal。 然后PayPal将返回付款记录和付款结果(SUCCESS / FAIL)。 _PDT()将那些数据传递到_validatePaypal(),后者将数据保存到数据库中。 然后,根据返回的页面重定向。

IPN处理程序功能

源代码:

/**
* PAYPAL: IPN HANDLER:
* ====================
* called by PayPal, send POSTed payment data back (handshake)
* get payment result
* return: payment VERIFIED: array('result' => true/false, and other user details)
* payment INVALID: false // no further process (see handler in Register Module)
* TODO: return true if success, then send email to buyers
*/
private function _IPN()
{
// get IPN data
$postData = $_POST;// read the post from PayPal system and add 'cmd'
$req = 'cmd=' . urlencode('_notify-validate');
foreach ($postData as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}// CURL: copy from paypal sample code$url= 'https://www.sandbox.paypal.com/cgi-bin/webscr';
// $url= 'https://www.paypal.com/cgi-bin/webscr';$curl_result=$curl_err='';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));curl_setopt($ch, CURLOPT_HEADER , array('Host: www.sandbox.paypal.com'));
// curl_setopt($ch, CURLOPT_HEADER , array('Host: www.paypal.com'));curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);$res = @curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);$keyarray = $postData;if (strcmp (substr($res, '-8'), "VERIFIED") == 0)
{
// validate paypal information
return $this->_validatePaypal($keyarray);
}
elseif (strcmp (substr($res, '-7'), "INVALID") == 0)
{
// log for manual investigation
return false;
}
// return $ret; // Do not need to return, because IPN runs in background
}

说明:

PayPal调用IPNHandler()函数,然后此处理程序函数处理_ IPN()。 如您所见,它从请求($ _POST)接收PayPal提供的数据。 因此,我们通过cURL将付款详细信息发布回PayPal,这是握手过程。 然后PayPal寄回付款结果(VERIFIED / INVALID)。 如果经过验证,则_IPN()将这些数据传递到_validatePaypal(),后者会将数据保存到数据库中。

在zip文件中,它包含模板,javascript文件,css,引导程序,jquery,调试插件和smarty插件,以及所有核心php源代码。

下载项目(344KB)

From: https://www.sitepoint.com/register-paypal-tutorial-3-2-real-register-paypal-project/

使用PayPal补习注册(2/3):PayPal项目的真实注册相关推荐

  1. paypal注册_使用PayPal补习注册(2/3):PayPal项目的真实注册

    paypal注册 解释PayPal的工作方式(IPN和PDT流程). 第一 章第三章 第二章 本章从头到尾介绍一个真实的项目:"通过付款进行注册",以更好地说明PayPal帐户设置 ...

  2. paypal php 返回_接入 paypal PHP-sdk 支付 / 回调 / 退款全流程

    记录一下接入paypal 全过程 因项目的原因要用到国外的支付和国外的信用卡,查了一下paypal就内置了信用卡付款方式,所以只需要接入paypal就能基本满足项目海外支付的需求. 查了一下文档发现w ...

  3. php集成paypal接口,PHP中集成PayPal标准支付,php集成paypal标准_PHP教程

    PHP中集成PayPal标准支付,php集成paypal标准 PayPal支付功能其实一直在更新文档和接口,这里说的是一个简单的支付功能大概流程如下 1,在网站的结账页面,设置一个提交到PayPal网 ...

  4. 遗留非springboot传统项目接入eureka注册与服务发现

    2019独角兽企业重金招聘Python工程师标准>>> 推荐: jeesuite开发框架,免费开源.一站式解决方案. 最近规划自动化运维以及统一监控需求,鉴于目前公司内部大部分项目采 ...

  5. 快速上手Springboot项目(登录注册保姆级教程)

    本文章对SpringBoot开发后端项目结构做了简单介绍,并示范了使用SpringBoot+MySQL实现登录的后端功能,与本博客的另一篇文章 Vue 实现登录注册功能(前后端分离完整案例) | Ma ...

  6. SpringBoot整合Shiro搭建登录注册认证授权权限项目模板

    主要内容: 1 SpringBoot整合Shiro安全框架; 2 Shiro主要学习内容总结;(执行流程.主要对象接口.注意事项等) 3 Redis实现对权限信息缓存; ! 温馨提示: 想要快速搭Sh ...

  7. Vue项目之登录注册

    Vue项目之登录注册 1. 注册 1.1 注册页面的布局 1.2 注册业务逻辑的实现 2. 登录 3.导航守卫 3.1全局导航守卫,全部路由都会经过这里.一定要调用next方法向下执行 3.2 路由独 ...

  8. 详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统)、模糊查询...

    详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统).模糊查询 1,创建数据库,我的用户名:root 密码:root,数据库名称:lianwei,表名:login 2,效果 ...

  9. EClass课堂项目(一)-登录注册

    登录注册功能实现 登录实现 LoginActivity(登录活动) (PS.因为是对前期项目的整理,因此含有部分其他代码,当时未学习注解使用,最好使用注解对View实现实例创建,以及对业务逻辑代码进行 ...

最新文章

  1. 5G年终盘点:2018,意难平
  2. python 中的*(星号)和**(双星号)简介
  3. Windows 系统电脑开机速度加快
  4. (chap6 Http首部) 请求首部字段 RefererTE User-Agent
  5. vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版
  6. 杭州人有福了!菜鸟配送升级新增24小时送药服务
  7. hdu-1114 Piggy-Bank
  8. Arch Linux 安装总结
  9. 301重定向IIS设置,及伪静态后 301重定向出错案例分享
  10. C++算法四:顺序查找
  11. mysql分表全局查询_mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表...
  12. Js获取file上传控件的文件路径总结
  13. typescript探索(一)
  14. 云场景实践研究第46期:吉利汽车
  15. kettle入门教程
  16. CLM5.0模式移植篇——驴某人的自我救赎
  17. SVN(三)利用 IntelliJ IDEA 进行代码对比的方法
  18. addr2line命令使用
  19. 《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
  20. 新畅行业商城软件v1.3.9

热门文章

  1. 慕课作业互评(使用脚本自动互评)
  2. 【概率图与随机过程】06 朴素贝叶斯:基于条件独立性假设
  3. 猿创征文|Highgo Database安全版安装指导手册
  4. 当黑夜自此笼罩-白夜行之感想一二
  5. 黑马程序员————IO流1(day18)
  6. iPad上支持手柄的游戏推荐 - PUSDN
  7. 几类常用Case工具介绍
  8. 矩阵论 施密特正交化的几何解释_最直观图解法
  9. ES6-Promise实时获取地址和天气问题
  10. 【Unity】Post-process后处理之Grain