使用 PayPal IPN 作为电子商务平台销售软件






4.82/5 (9投票s)
使用 PayPal API 自动化软件销售,向客户发送带有许可证密钥的模板化电子邮件
引言
软件业务最重要的方面之一是用于实际销售和交付软件给客户的平台。除了 RegNow、ShareIt 等软件特定平台之外,还有一些通用电子商务平台,如 PayPal,它们提供了一些优势。对我来说,最大的优势(至少对我而言)是,一旦客户支付了软件费用,钱就可以立即进入我的账户,无需等到月底才能收款。此外,在许多情况下,每笔销售的佣金也较低。
我注意到的是,并非许多软件公司将 PayPal 用作软件电子商务平台,因为它并非为软件交付量身定制。但是,它确实提供了即时付款通知 API(PayPal IPN),可用于构建此类平台。
在本文中,我将介绍一个简单但灵活的 Web 服务,用于通过 PayPal IPN 进行软件交付。它提供了在付款完成后向客户发送易于自定义的电子邮件的方法,用于交付生成的许可证密钥(还有一个生成许可证密钥的选项),并将销售记录到数据库中。基本上,您只需在数据库和配置文件中设置一些参数,即可开始使用。源代码是用 ASP.NET/C# 编写的,并包含在随附的归档文件中可供下载。
PayPal IPN Web 服务
一个简单的 ASP.NET ASHX 处理程序用于实现 Web 服务。该处理程序接收 PayPal IPN 请求,根据 PayPal 文档执行所有必需的检查,然后向客户发送包含购买产品许可证密钥的自定义电子邮件。它还处理许可证密钥管理,并将购买记录到数据库的特定表中。有关更多详细信息,请参见 PayPal.ashx 文件。
许可数据库
Web 服务包含一个包含 3 个表的数据库:
“Products”表存储有关正在销售的产品的信息:名称、价格、货币、许可证密钥模板(可选,如果使用许可证密钥生成器而不是 LicenseKeys 表来获取许可证密钥)
“Purchases”表存储有关产品购买的信息:产品 ID、客户姓名、客户电子邮件、国家/地区、许可证密钥等。此表中记录的一个重要元素是 PayPal 交易 ID。PayPal 有时会重新发送 IPN 通知,因此在尝试处理交易之前,必须检查该交易是否已处理。
“LicenseKeys”表充当许可证密钥的池。对于售出的每件产品,都会从该表中移除一个许可证密钥并发送给客户。您负责不时地向此数据库填充新的许可证密钥(或使用第三方密钥生成器,请继续阅读)。
模板化电子邮件发件人
App_Code 文件夹中包含的 TemplateMailer 类使用电子邮件模板发送自定义电子邮件。电子邮件模板是一个 HTML 文档(存储在 App_Data 文件夹中),其中包含 ##PARAMETER_NAME## 形式的占位符,这些占位符在发送电子邮件之前会被实际值替换。实际的参数-值替换集作为字典发送到模板邮件程序。<title> 标签包含电子邮件主题。主题也可以包含参数占位符。使用这种方法,在将 ##PRODUCT_NAME## 和 ##LICENSE_KEY## 参数替换为实际值后,电子邮件就会发送给客户。
许可证密钥生成
Web 服务包含两种获取需要发送给客户的许可证密钥的方法
第一种方法是从 LicenseKeys 表获取所需的许可证密钥。您必须在此表中插入足够的密钥,供 Web 服务在每次支付特定产品时使用。随附的数据库已经插入了一些示例密钥。
第二种方法是使用第三方密钥生成器。在此示例中,我使用了 www.softactivate.com 的 SoftActivate Licensing SDK,因为我为我的产品也使用它。它使用椭圆曲线密码学生成数字签名的短许可证密钥。不幸的是,它不是免费的,必须购买其许可证(在本示例中它以演示模式运行),但价格相当便宜。
对于特定产品 ID,在两种模式之间的选择基于该产品对应的 LicenseKeyTemplate 列值是 NULL 还是非 NULL。如果为 NULL,则选择第一种方法。否则,选择第二种方法。
记录错误和异常
如果在 PayPal 通知请求期间发生任何错误,Logs\PayPal.txt 文件将被追加一条解释性消息。应不时检查此日志文件,以确保所有许可证密钥都已成功发送给客户。
在共享托管环境(例如 GoDaddy 共享托管)中托管 Web 服务
确保 Web 服务在 Medium Trust 环境中运行
该服务设计为在中等信任度下运行,但是,需要一些额外的权限。Web 服务需要 WebPermission 和特定的 SocketPermission 才能正常运行。它需要这些权限来验证发往 PayPal 的请求,并发送实际的电子邮件。幸运的是,GoDaddy 允许这些权限。但您必须使用它们的 SMTP 服务器。GoDaddy 共享托管的 SMTP 服务器是 'relay-hosting.secureserver.net',端口为 25,无需身份验证。
避免发送的电子邮件到达客户的“垃圾邮件”文件夹
假设您要从中发送电子邮件的地址是 'support@mycompany.com'。在这种情况下,您必须确保域名 'mycompany.com' 在 DNS 中注册了适当的 SPF 记录,以便目标电子邮件服务器可以看到发件人服务器是合法的。在 GoDaddy 共享托管上,我发现将 'spf.secureserver.net' 包含在域名 'mycompany.com' 的 SPF 记录中可以解决此问题。这是一个应该可以正常工作的 SPF 记录示例:“v=spf1 include:spf.secureserver.net ~all。”
兴趣点
在开发和测试此 Web 服务期间,我学到了共享托管环境的一些局限性。您必须非常小心,避免中等信任度问题,避免您的电子邮件进入垃圾邮件文件夹,并且还要避免由于 PayPal 在某些情况下会重新发送 IPN 通知而导致向客户发送重复电子邮件。所有这些都在上面进行了解释。另一个值得注意的有趣之处在于,如何使用 SQL Server 特定的功能,如 ROWLOCK 和 OUTPUT 指令,将 LicenseKeys 表用作队列(因此您可以原子地“弹出”元素)。
在同一 HTML 页面(ASP.NET 中)放置多个 PayPal 按钮
在处理 PayPal 按钮和 ASPX 页面时,一个特别重要但看似简单的问题是:在同一页面上放置多个 PayPal 按钮。仔细查看 PayPal 按钮生成的 HTML 代码,您会注意到按钮代码是一个 HTML <form> 元素及其内容。但是,在渲染 ASPX 页面时,页面内容已经被 ASPX 引擎包含在 <form> 标签中,因此将 PayPal 按钮放置在生成的页面中会导致嵌套的 <form> 元素,这是 HTML 标准不允许的,并会导致许多问题。
解决方案是禁用 ASPX 引擎生成 <form> 标签,只为 PayPal 按钮保留 <form> 标签。我找到了一个很有用的博客文章,展示了如何做到这一点:http://jerschneid.blogspot.com/2007/03/hide-form-tag-but-leave-content.html。这种方法也有一些限制,但总的来说是有效的。
使用代码
为了在开发计算机上测试和调试 Web 服务,需要执行以下步骤
- 将文件解压缩到指定文件夹
- 使用 Visual Studio 打开 Web 服务,选择“文件”->“打开”->“Web 站点”(而不是“文件”->“打开”->“项目/解决方案!”
- 编辑 web.config 文件,并在指定的键/值对中添加一些有效的 SMTP 设置
- 使用 Default.aspx 页面开始调试。按“测试”按钮。如果一切顺利,“SUCCESS”将出现,并且电子邮件
- 创建或编辑 PayPal“立即购买”按钮,并将 Web 服务 URL(指向 *PayPal.ashx* 页面的 URL)包含在按钮的 notify_url 自定义变量中。另外,请注意,“立即购买”按钮上产品的可选项目编号必须与数据库中的产品 ID 相同!为了测试目的,您可以使用 PayPal Sandbox 或创建一个价格非常低(0.01 美元)的产品。这样就可以测试按钮了。
为了配置 Web 服务以供生产使用,需要执行以下步骤
- 将文件解压缩到指定文件夹
- 编辑 web.config 文件,并在其中找到的指定键/值对中输入您的 SMTP 服务器设置,包括主机名、端口、用户名、密码(无身份验证时留空)以及 SMTP 服务器是否需要 SSL/TLS 连接
- 在 web.config 文件中设置您的 PayPal 电子邮件地址
- 编辑 Licensing 数据库中的 Products 表,输入有关您的产品的信息(名称、价格等)
- 在 LicenseKeys 表中插入一些许可证密钥(或使用包含的密钥生成器)
- 创建或编辑 PayPal“立即购买”按钮,并将 Web 服务 URL(指向 PayPal.ashx 页面的 URL)包含在按钮的 notify_url 自定义变量中。另外,请注意,“立即购买”按钮上产品的可选项目编号必须与数据库中的产品 ID 相同!
- 编辑 App_Data 文件夹中的电子邮件模板以满足您的需求
- 这应该就差不多了。但是,如果您使用的是共享托管,则需要将 App_Data 文件夹中的数据库重新创建到共享托管数据库服务器上。您可以使用 SQL Server Management Studio Express 进行此操作(使用数据库备份/还原功能)。
历史
2012 年 5 月 12 日:首次发布。
2012 年 5 月 16 日:添加了一些关于如何在同一 ASPX 页面上插入多个 PayPal 按钮的有用信息。还进行了一些小的更正和补充。