我使用我用PHP 和 MySQL 数据库制作的自定义在线预订系统。目前,当客户以现金面对面预订时进行付款,我现在正在将Paypal 的 IPN 和 PDT付款设置一起实施到系统中,以用作单项付款/“立即付款”选项系统(因此没有购物车) . 价格、日期和用户信息仅有所不同。
在对不同的争论和安全问题进行了数月的研究之后,我得出的结论是,将 IPN 和 PDT 系统一起使用的最佳方式是以先到先得的方式进行,并为每个系统提供一个脚本。无论是 PDT 还是 IPN 脚本处理,先发送确认邮件并将相关信息添加到数据库中。如果 PDT 或 IPN 处理并发现另一个已经处理,它只更新缺少的数据库信息,因为电子邮件已经由另一个脚本发送。
从头开始制作的预订系统已经使用了 2 年没有问题,但现在需要在线支付。
在线预订时,客户输入他们的详细信息,选择开始日期、结束日期、预订时间,然后将信息发布(表单方法 POST)到 PHP 脚本。该脚本验证、处理并向确认页面输出预订成功,并向客户和管理员电子邮件地址发送电子邮件。
MYSQL 数据库当前未用于保存预订详细信息。
我现在想用相同的结构在线支付。
MySQL 数据库现已修改,并有一个新表,其中包含来自 Paypal 的 IPN 或 PDT 回复(成功或失败)的回调可能返回的所有字段,以及有关预订的基本信息。
我遇到的问题是:
PDT 可以伪造。如何避免这种情况,好像来自 PDT 脚本的电子邮件已发送,他们将已经收到确认,这会导致问题? 我可以通过仅发送带有 IPN 脚本的电子邮件并告诉 PDT 流程仅向客户显示预订信息来避免这种情况,但声明将发送确认电子邮件,但有时 IPN 可能需要一段时间,客户需要立即放心预订已确认,因为预订可能是在接下来的 30 分钟内预订。
近一个月来,我尝试根据 Web 上的示例创建几个 PDT 和 IPN 脚本,其中包括 Xcommerce Paypal 开发者网站、Paypal 和许多其他网站,但似乎没有一个能正常工作。 谁能提供一个 PDT 脚本和一个 IPN 脚本,它们都可以处理所有可能的变量并验证订单的关键基本信息,例如姓名、地址、邮政编码和价格? 这对于任何尝试使用 IPN 和 PDT 为任何人创建支付流程的人都会很有用,因为任何人都需要做的就是删除每个脚本不需要的内容。
请注意,每个脚本通过检查 IPN 或 MySQL 表中的 PDT 字段中是否有“1”来检查另一个脚本是否已运行。“0”是默认值。
我期待人们的回复,因为我相信这将帮助每个遇到任何系统问题的人,无论脚本是如何使用的。
提前感谢大家。
如果与下面的不同,请提供经过测试的 MySQL 表,以提供任何答案以帮助其他人阅读答案。
我已经创建并正在使用下表:
CREATE TABLE `bookings` (
`id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`date1` char( 2 ) NOT NULL default '',
`month1` char( 2 ) NOT NULL default '',
`year1` char( 2 ) NOT NULL default '',
`date2` char( 2 ) NOT NULL default '',
`month2` char( 2 ) NOT NULL default '',
`year2` char( 2 ) NOT NULL default '',
`name` text NOT NULL ,
`address` text NOT NULL ,
`zippostcode` text NOT NULL ,
`email` text NOT NULL ,
`price` char( 2 ) NOT NULL default '',
`pdt` varchar( 12 ) NOT NULL default '0',
`ipn` varchar( 12 ) NOT NULL default '0',
`paypalstatus` varchar( 12 ) NOT NULL default '',
`datebooked` varchar( 50 ) NOT NULL default '',
`receiver_email` varchar( 127 ) NOT NULL ,
`payment_status` varchar( 25 ) NOT NULL ,
`pending_reason` varchar( 25 ) NOT NULL ,
`payment_date` varchar( 100 ) NOT NULL ,
`mc_gross` double NOT NULL ,
`mc_fee` double NOT NULL ,
`tax` double NOT NULL ,
`mc_currency` varchar( 10 ) NOT NULL ,
`txn_id` varchar( 25 ) NOT NULL ,
`txn_type` varchar( 25 ) NOT NULL ,
`first_name` varchar( 75 ) NOT NULL ,
`last_name` varchar( 75 ) NOT NULL ,
`address_street` varchar( 200 ) NOT NULL ,
`address_city` varchar( 50 ) NOT NULL ,
`address_state` varchar( 40 ) NOT NULL ,
`address_zip` varchar( 20 ) NOT NULL ,
`address_country` varchar( 64 ) NOT NULL ,
`address_status` varchar( 25 ) NOT NULL ,
`payer_email` varchar( 127 ) NOT NULL ,
`payer_status` varchar( 25 ) NOT NULL ,
`payment_type` varchar( 25 ) NOT NULL ,
`notify_version` varchar( 50 ) NOT NULL ,
`verify_sign` varchar( 255 ) NOT NULL ,
`address_name` varchar( 130 ) NOT NULL ,
`protection_eligibility` varchar( 50 ) NOT NULL ,
`ipn_status` varchar( 25 ) NOT NULL ,
`subscr_id` varchar( 25 ) NOT NULL ,
`reason_code` varchar( 25 ) NOT NULL ,
`contact_phone` varchar( 25 ) NOT NULL ,
`invoice` varchar( 127 ) NOT NULL ,
`for_auction` tinyint( 10 ) NOT NULL ,
`auction_buyer_id` varchar( 75 ) NOT NULL ,
`auction_closing_date` varchar( 100 ) NOT NULL ,
`auction_multi_item` double NOT NULL ,
`address_country_code` varchar( 2 ) NOT NULL ,
`order_id` tinyint( 10 ) NOT NULL ,
`item_name` varchar( 130 ) NOT NULL ,
`item_number` varchar( 130 ) NOT NULL ,
`os0` varchar( 200 ) NOT NULL ,
`on0` varchar( 75 ) NOT NULL ,
`os1` varchar( 200 ) NOT NULL ,
`on1` varchar( 75 ) NOT NULL ,
`quantity` double NOT NULL ,
`custom` varchar( 255 ) NOT NULL ,
`mc_handling` double NOT NULL ,
`mc_shipping` double NOT NULL ,
`creation_timestamp` timestamp NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM AUTO_INCREMENT =1