首页
学习
活动
专区
圈层
工具
发布

在Classic ASP中使用Paypal REST API

在Classic ASP中使用PayPal REST API

基础概念

PayPal REST API是PayPal提供的现代支付接口,允许开发者通过HTTP请求与PayPal系统交互,处理支付、退款、订阅等交易。Classic ASP(Active Server Pages)是微软早期的服务器端脚本技术,虽然较老但仍在使用。

主要挑战

由于Classic ASP是较老的技术,而PayPal REST API是现代API,主要挑战包括:

  1. Classic ASP原生不支持JSON处理
  2. 缺乏现代HTTP客户端功能
  3. 没有内置的OAuth 2.0支持

解决方案

1. 设置基础环境

首先需要确保服务器支持HTTPS请求和JSON处理。

代码语言:txt
复制
<%
' 设置PayPal API端点
Const PAYPAL_API_SANDBOX = "https://api.sandbox.paypal.com"
Const PAYPAL_API_LIVE = "https://api.paypal.com"

' 选择环境
Dim paypalApiUrl
paypalApiUrl = PAYPAL_API_SANDBOX ' 测试环境
' paypalApiUrl = PAYPAL_API_LIVE ' 生产环境

' 你的PayPal客户端ID和密钥
Const CLIENT_ID = "你的客户端ID"
Const CLIENT_SECRET = "你的客户端密钥"
%>

2. 获取访问令牌

PayPal REST API使用OAuth 2.0认证,需要先获取访问令牌。

代码语言:txt
复制
<%
Function GetPayPalAccessToken()
    Dim http, url, postData, responseText, json
    
    Set http = Server.CreateObject("MSXML2.ServerXMLHTTP")
    url = paypalApiUrl & "/v1/oauth2/token"
    
    ' 准备请求数据
    postData = "grant_type=client_credentials"
    
    ' 设置请求头
    http.Open "POST", url, False
    http.setRequestHeader "Authorization", "Basic " & Base64Encode(CLIENT_ID & ":" & CLIENT_SECRET)
    http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    http.setRequestHeader "Accept", "application/json"
    
    ' 发送请求
    http.Send postData
    
    ' 处理响应
    responseText = http.responseText
    
    ' 解析JSON响应 - 需要JSON解析库或自定义函数
    Set json = ParseJson(responseText)
    
    GetPayPalAccessToken = json("access_token")
    
    Set http = Nothing
End Function

' Base64编码函数
Function Base64Encode(text)
    Dim xml, node
    Set xml = Server.CreateObject("MSXML2.DOMDocument")
    Set node = xml.createElement("b64")
    node.DataType = "bin.base64"
    node.nodeTypedValue = Stream_StringToBinary(text)
    Base64Encode = node.text
    Set node = Nothing
    Set xml = Nothing
End Function

Function Stream_StringToBinary(text)
    Dim stream
    Set stream = Server.CreateObject("ADODB.Stream")
    stream.Type = 2 ' adTypeText
    stream.Charset = "utf-8"
    stream.Open
    stream.WriteText text
    stream.Position = 0
    stream.Type = 1 ' adTypeBinary
    stream.Position = 0
    Stream_StringToBinary = stream.Read
    Set stream = Nothing
End Function
%>

3. 创建支付

获取访问令牌后,可以创建支付请求。

代码语言:txt
复制
<%
Function CreatePayPalPayment(amount, currency, description, returnUrl, cancelUrl)
    Dim http, url, postData, responseText, json, accessToken
    
    ' 获取访问令牌
    accessToken = GetPayPalAccessToken()
    
    Set http = Server.CreateObject("MSXML2.ServerXMLHTTP")
    url = paypalApiUrl & "/v1/payments/payment"
    
    ' 准备JSON请求数据
    postData = "{"
    postData = postData & """intent"":""sale"","
    postData = postData & """payer"":{""payment_method"":""paypal""},"
    postData = postData & """transactions"":[{"
    postData = postData & """amount"":{"
    postData = postData & """total"":""" & amount & ""","
    postData = postData & """currency"":""" & currency & """"
    postData = postData & "},"
    postData = postData & """description"":""" & description & """"
    postData = postData & "}],"
    postData = postData & """redirect_urls"":{"
    postData = postData & """return_url"":""" & returnUrl & ""","
    postData = postData & """cancel_url"":""" & cancelUrl & """"
    postData = postData & "}"
    postData = postData & "}"
    
    ' 设置请求头
    http.Open "POST", url, False
    http.setRequestHeader "Authorization", "Bearer " & accessToken
    http.setRequestHeader "Content-Type", "application/json"
    http.setRequestHeader "Accept", "application/json"
    
    ' 发送请求
    http.Send postData
    
    ' 处理响应
    responseText = http.responseText
    
    ' 解析JSON响应
    Set json = ParseJson(responseText)
    
    ' 返回支付链接
    For Each link In json("links")
        If link("rel") = "approval_url" Then
            CreatePayPalPayment = link("href")
            Exit For
        End If
    Next
    
    Set http = Nothing
End Function
%>

4. 执行支付

用户批准后执行支付:

代码语言:txt
复制
<%
Function ExecutePayPalPayment(paymentId, payerId)
    Dim http, url, postData, responseText, json, accessToken
    
    ' 获取访问令牌
    accessToken = GetPayPalAccessToken()
    
    Set http = Server.CreateObject("MSXML2.ServerXMLHTTP")
    url = paypalApiUrl & "/v1/payments/payment/" & paymentId & "/execute"
    
    ' 准备JSON请求数据
    postData = "{""payer_id"":""" & payerId & """}"
    
    ' 设置请求头
    http.Open "POST", url, False
    http.setRequestHeader "Authorization", "Bearer " & accessToken
    http.setRequestHeader "Content-Type", "application/json"
    http.setRequestHeader "Accept", "application/json"
    
    ' 发送请求
    http.Send postData
    
    ' 处理响应
    responseText = http.responseText
    
    ' 解析JSON响应
    Set json = ParseJson(responseText)
    
    ' 返回支付状态
    ExecutePayPalPayment = json("state")
    
    Set http = Nothing
End Function
%>

JSON处理

Classic ASP没有内置JSON解析器,需要添加JSON解析功能:

代码语言:txt
复制
<%
' 简单的JSON解析函数
Function ParseJson(jsonText)
    Dim dict, matches, match, key, value, i
    Set dict = Server.CreateObject("Scripting.Dictionary")
    
    ' 使用正则表达式提取键值对
    Dim regex
    Set regex = New RegExp
    regex.Pattern = """([^""]+)""\s*:\s*(""[^""]*""|\d+|true|false|null)"
    regex.Global = True
    
    Set matches = regex.Execute(jsonText)
    
    For Each match In matches
        key = Mid(match.SubMatches(0), 1)
        value = match.SubMatches(1)
        
        ' 去除字符串值的引号
        If Left(value, 1) = """" Then
            value = Mid(value, 2, Len(value) - 2)
        End If
        
        dict.Add key, value
    Next
    
    Set ParseJson = dict
    Set regex = Nothing
End Function
%>

完整示例

代码语言:txt
复制
<%
' 创建支付示例
Dim paymentUrl, amount, currency, description, returnUrl, cancelUrl

amount = "10.00"
currency = "USD"
description = "测试支付"
returnUrl = "http://yourdomain.com/success.asp"
cancelUrl = "http://yourdomain.com/cancel.asp"

paymentUrl = CreatePayPalPayment(amount, currency, description, returnUrl, cancelUrl)

If paymentUrl <> "" Then
    Response.Redirect paymentUrl
Else
    Response.Write "创建支付失败"
End If
%>

常见问题解决

  1. HTTP请求失败
    • 确保服务器支持TLS 1.2(最低要求)
    • 检查防火墙设置是否允许出站HTTPS连接
  • 认证失败
    • 验证客户端ID和密钥是否正确
    • 确保Base64编码正确
  • JSON解析错误
    • 考虑使用更健壮的JSON解析库如VBScript_JSON
  • 响应处理问题
    • 添加错误处理检查HTTP状态码
    • 记录完整的响应文本以调试

替代方案

如果遇到太多技术限制,可以考虑:

  1. 使用PayPal的经典NVP/SOAP API(更兼容老系统)
  2. 创建一个中间API服务(如用现代语言编写)作为Classic ASP和PayPal REST API之间的桥梁
  3. 使用PayPal的按钮或托管解决方案,减少集成复杂度

安全注意事项

  1. 永远不要在客户端存储或暴露客户端密钥
  2. 使用HTTPS保护所有通信
  3. 验证支付状态和金额,防止篡改
  4. 考虑实现IPN(即时支付通知)作为额外验证
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在 ASP.NET Core 中实现幂等 REST API

幂等性是 REST API 的一个关键概念,可确保系统的可靠性和一致性。幂等操作可以重复多次,而不会更改初始 API 请求之外的结果。...在 API 中实现幂等性有几个好处: 它可以防止意外的重复操作 它提高了分布式系统的可靠性 它有助于处理网络问题并正常重试 在本周的期刊中,我们将探讨如何在 ASP.NET Core API 中实现幂等性...POSTPOST 在 ASP.NET Core 中实现幂等性 为了实现幂等性,我们将使用涉及幂等性键的策略: 客户端为每个操作生成一个唯一密钥,并在自定义标头中发送该密钥。...合理的缓存时间通常从几分钟到 24-48 小时不等,具体取决于您的具体使用案例。 并发可能很痛苦,尤其是在高流量 API 中。使用分布式锁的线程安全实现效果很好。当同时收到多个请求时,它可以控制事情。...在 REST API 中实现幂等性可以提高服务的可靠性和一致性。它确保相同的请求产生相同的结果,防止意外的重复并妥善处理网络问题。 虽然我们的实施提供了一个基础,但我建议您根据自己的需求进行调整。

36410

使用PHP对接国外的PAYPAL支付最新REST API接口。

PayPal是一个第三方支付系统,类似于我国的支付宝。PayPal于1998年12月建立,总部在美国加利福尼亚州圣荷塞市。2002年,PayPal在纳斯达克首次上市,随后被eBay收购。...,以及后续调用capture接口的URL地址 3.使用浏览器(或者APP中的webview)打开approve_link,让买家登录PayPal账号并确认支付(之后可以通过在创建订单是指定的return...接下来我们到官方网站看一下API的使用方法就好了。...把ID 和 SECRET 这两个参数保存起来,在调用接口中的时候会用到。。 从文档中我们可以看到,要调用REST API接口首先要获取TOKEN。 ?...至止,PAYPAL的订单生成 确认 捕获并扣款流程才算走完。。 以上就是接入PAYPAL REST API 的最终成功方法。。

8.1K30
  • REST在许多API使用场景中仍然优于GraphQL

    即使在 2024 年,GraphQL 仍然存在一些基本问题。 译自 REST Still Outshines GraphQL for Many API Use Cases,作者 Gil Feig。...但是,当您 开始使用 GraphQL 时,您会发现它会产生一整套新的问题,这些问题会压倒其优势。 我将分解这些问题,以便您更好地决定 GraphQL 是否值得在您的集成中使用。...由于这些响应不像 REST 中那样标准化,因此它们更难计划和自动处理。 许多工程师都有构建和/或维护 REST API 集成的经验。 各种规模的公司主要使用 REST API。...举个例子:根据 Gartner 的研究,85% 的组织使用 REST API——而 GraphQL 仅被 19% 的组织使用。...在竞争的 API 架构能够超越——甚至匹配——REST 对提供者和消费者双方的实用性之前,REST 将继续成为首选。

    63510

    聊聊asp.net中Web Api的使用

    扯淡到这就完了,下来就聊聊今天的主角web api,web api 是mvc4.0之后出现的一种技术吧,他的创建和带来的便利我就不介绍了。这边文章主要聊聊,我对web api开发的一些理解。...FromBody]特性修饰符 FromBody是一个修饰参数的特性,比如:public void Post([FromBody]string name),那么他的作用是什么呢,其实他的作用是查询post请求中参数为...就要封装成对象进行数据专递了,比如:public void Post([FromBody]string name,[FromBody]int id)是取不到值的,要把id和name封装成Userinfo对象,使用...话题二:post传递多个不同对象的参数 已经post请求需要使用[FromBody]特性修饰符接收,但是FromBody只能接收单个参数,如果需要传递不同对象的输出就比较麻烦了,新建实体对象成本太大,也不能完全适应适应的类型...,这个时候需要使用JObject来处理,代码如下: jQuery.post("/Api/Userinfo/Add/", { mobile: "18049579804", pwd: "123456

    1.8K60

    在 SwiftUI 中实战使用 MapKit API

    前言SwiftUI 与 MapKit 的集成在今年发生了重大变化。在之前的 SwiftUI 版本中,我们将 MKMapView 的基本功能封装到名为 Map 的 SwiftUI 视图中。...幸运的是,事情发生了变化,SwiftUI 引入了与 MapKit 集成的新 API。本篇文章我们将学习如何在 SwiftUI 的最新版本中使用可用的新功能丰富的 API 与 MapKit 集成。...正如我之前所说,在 SwiftUI 框架的早期版本中,我们有一个 Map 视图,为我们提供了 MapKit 的基本功能,该功能现在已被弃用。...让我们从使用 SwiftUI 中最新迭代中提供的新 MapKit API 集成的基本示例开始。...MapContentBuilder 类型与符合 MapContent 协议的任何类型一起使用。在我们的示例中,我们使用了 Marker 和 Annotation 类型。

    1.2K00

    在ASP.NET 5中使用SignalR

    题记:SignalR作为ASP.NET中进行Web实时双向通信的组件,在ASP.NET 5中也得到了同步发展。不过,用法和之前还是在细节上有所不同,而资料又相对稀少。本文就是一个简单的入门向导。...通过SignalR,开发人员可以在ASP.NET开发的Web应用中实现服务器和客户端的双向实时通信。服务器可以即时推送内容给在线的客户端。...同时,用法和之前在ASP.NET 4.x时代(比如在ASP.NET MVC 5中)还是有点细微的区别,所以导致参考现有文档可能会遇到错误。...接着在”Configure“中添加1行代码app.UseSignalR(); 7,在视图文件中实现加入、发送消息、显示消息的界面,代码基本参考了(http://www.asp.net/signalr/overview...SignalR的连接通过日益流行的WebSockets API完成,而如果WebSockets无法使用,它会透明地回落为长轮询技术(long-polling technique)。

    3.9K100

    Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用

    写在前面   Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择。...限制器:流量限制功能; 传输转换:新增、删掉、或者修改你的请求或者响应; 缓存:请求缓存; CLI:命令行控制支持; Rest Api:Rest Api控制支持; Geo-Replicated...consul提供内置Dns解析和Rest Api 两种方式集成做服务发现,我们这里跟kong的集成选用的Dns方式。.../values ok 到目前为止我们只完成了本文目的1、2 3,和4三请往下看; 在Asp.net Core中的使用   以之前的DemoApi31为例,换成5003端口,我需要达到的效果是,程序启动的时候就把服务注册到...有区别的是程序退出时不会去删对应的路由; 总结   我在各技术博客都没有看到总结的比较好的kong+consul+asp.net core的集成文章,特此总结。

    2.8K30

    如何使用RESTler对云服务中的REST API进行模糊测试

    RESTler RESTler是目前第一款有状态的针对REST API的模糊测试工具,该工具可以通过云服务的REST API来对目标云服务进行自动化模糊测试,并查找目标服务中可能存在的安全漏洞以及其他威胁攻击面...如果目标云服务带有OpenAPI/Swagger规范,那么RESTler则会分析整个服务规范,然后通过其REST API来生成并执行完整的服务测试。...在测试期间,它会检查特定类型的漏洞,并从先前的服务响应中动态地解析服务的行为。这种智能化的方式使RESTler能够探索只有通过特定的请求序列才能达到的更深层次的服务状态,并找到更多的安全漏洞。.../build-restler.py --dest_dir 注意:如果你在源码构建过程中收到了Nuget 错误 NU1403的话,请尝试使用下列命令清理缓存...C:\RESTler\restler\Restler.exe compile --api_spec C:\restler-test\swagger.json Test:在已编译的RESTler语法中快速执行所有的

    6.3K10

    在asp.net web api 2 (ioc autofac) 使用 Serilog 记录日志

    在我个人的asp.net web api 2 基础框架(Github地址)里,我原来使用的是NLog,但是由于好奇心,我决定使用Serilog代替Nlog。...这里有一个列表,列出了所有的Sink:https://github.com/serilog/serilog/wiki/Provided-Sinks 由于我使用的是asp.net web api 2.2...配置IOC 因为我的框架都是使用依赖注入模式的,所以Serilog配置完之后,我们要进行IOC的配置,我使用的是Autofac(非常好的库),它可以自动Dispose配置的类,如果这个类实现了IDisposable...全局异常记录 针对asp.net web api 2,我使用了自定义的全局异常记录类:MyExceptionLogger.cs GlobalConfiguration.Configuration.Services.Add...问题 经使用测试,输出到Debug窗口和Sql Server数据库是没有问题的,但是在asp.net web api 2项目的开发环境里一直无法输出到文件,我新建立了一个web api项目也是如此,但是在控制台应用却没有问题

    2.4K80

    在ASP.NET 2.0中使用样式、主题和皮肤

    本文用大量的示例演示了在ASP.NET 2.0中如何使用样式、主题和皮肤特性。 给控件应用样式 Web用户界面是非常灵活的,不同的Web站点的外观和感觉是截然不同的。...在主题应用到程序上之后,主题定义中的样式属性会重载应用程序页面中的目标控件的属性值。 另一方面,开发者独立地构建样式信息也很常见。例如,在独立的文件中,使用级联样式表(CSS)来定义控件和标记样式。...在主题中使用CSS 通过把级联样式表(CSS)放置在命名主题的子目录中,你可以给该主题添加CSS。...在主题中使用图像 主题中也可以包含图像,它们是皮肤文件中的控件定义引用的。皮肤文件中的图像引用必须使用主题目录下的图像文件夹的相对路径,这样皮肤文件和图像才能轻易地随应用程序迁移。..." runat="server"></asp:Literal> </LayoutTemplate> </asp:Login> 在主题中使用数据绑定和表达式 请注意,在主题模板中使用<%# Eval %>

    4K30
    领券