支付提供了两种风格的API接口(如居多)

2024-05-09
来源:网络整理

支付提供两种风格的API接口(如下图),一种是经典的NVP/SOAP风格接口,另一种是比较新的风格接口。 NVP风格目前被视为遗留接口,官方推荐使用该接口进行访问。 不过目前网上流传的资料大多是关于NVP的,介绍REST接口的比较少。

本文是对目前支付接口的总结,也可供有类似需求的朋友参考。

注册并访问

要使用该界面,您首先应该拥有一个帐户并登录开发者后端。 需要注意的是:

接口文档

一般来说,我们需要理解的文档包括这几个部分:

Docs是文档的总目录,包括各种接口和服务的访问链接; API描述了API接口的使用细节;

可以从顶部链接直接访问上述链接。

从API部分我们可以看到接口支持的内容非常广泛。 这里我们只介绍(支付)API相关部分。 所有接口的访问方式都是类似的。 一旦你掌握了其中之一,你就可以推论其他的。

API文档中各个接口的具体用法值得仔细阅读。 页面中间部分是接口参数和返回内容的说明,右侧列出了示例代码。 如果你有curl工具,并且已经获取了接口的访问权限(后面代码部分会讲如何获取),甚至可以直接复制示例代码。 转到终端窗口进行测试。

包含多种语言的SDK源码及下载资源。 我们在这里使用 C#,因此您可以在 .Net SDK 页面上找到 SDK 的下载链接。 如果您使用其他编程语言,可以从上述主页找到对应语言的访问地址。 (界面采用了简洁的风格,所以手动构建并不是特别麻烦。但是为了简化工作并避免潜在的bug,我还是建议大家在条件运行的情况下尽可能使用官方的SDK)。

创建 REST 应用程序

为了调用REST接口,首先我们需要创建一个REST App。

返回主页并确保在左侧导航栏中选择“我的应用程序”。 然后在右侧内容中搜索 REST API Apps,然后单击该应用程序。

创建应用程序时需要填写的内容很少。 您需要填写一个唯一的App名称(建议使用纯英文字母)并与一个用户账户关联(如果您想更仔细地管理,可以进入创建用户账户页面)。

支付pay的过去式_paypal如何支付_paypal

当REST App创建完成后,浏览器会跳转到其详情页,这里有一些重要的内容需要注意。

接下来还有一个配置,是什么? 即当特定事件发生时(比如用户支付完成),会向您的网站发送一个HTTP请求,告诉您这个事件发生了。 当然,要使用它,你的网站必须有一个公网地址(最好是域名),部署在局域网上是不行的。

还有一个非常有趣的页面(如下图所示)。 您的网站部署完成后,您可以在这里要求模拟发送消息,以验证您的网站是否正常运行。 当然,这里生成的信息是随机生成的(比如支付订单号可能根本不在你的系统中),所以在处理Web 的时候一定要处理好异常,不要让网站因为随机数据而跳过。

付款流程

好了,现在上面的配置工具都准备好了,我们就可以开始编写代码了。 不过先别忙,我们先来了解一下付款流程是怎样的:

示例代码

现在我们了解了这个过程,让我们看看实际的代码。 为了方便阅读和避免泄露业务内容,我删除了一些错误处理和业务相关的代码。 当然,开发时应该小心处理错误。

调用该接口首先需要实现用户认证和授权。 REST 接口使用协议。 如果您使用SDK,这部分已经给您封装好了。 只需要传入ID/:

var clientId = "..."; var clientSecret = "..."; var credential = new OAuthTokenCredential(clientId, clientSecret); var accessToken = credential.GetAccessToken(); apiContext = new APIContext(accessToken); return apiContext;

接下来是调用部分。 这部分构造数据的结构很复杂,但其实内容并不多,所以我就不详细写出来了,大家可以参考一下。 需要注意的是,响应数据时需要根据这个地址向浏览器返回一个跳转(302)。

接下来是部分,这一步很简单:

var payerId = Request.QueryString["PayerID"]; var paymentId = Request.QueryString["paymentId"]; var paymentExecution = new PaymentExecution() { payer_id = payerId }; var paymentIn = Payment.Get(apiContext, paymentId); var paymentOut = paymentIn.Execute(apiContext, paymentExecution);

最后,作为补充,我也列出一下大致的处理代码:

Request.InputStream.Seek(0, SeekOrigin.Begin); using (var reader = new StreamReader(Request.InputStream, Encoding.UTF8)) { string json = await reader.ReadToEndAsync(); dynamic jsonBody = JObject.Parse(json); string webhookId = jsonBody.id; var whe = WebhookEvent.Get(apiContext, webhookId); switch (whe.event_type) { case "PAYMENT.CAPTURE.COMPLETED": ... case "PAYMENT.CAPTURE.DENIED": ... } }

事件类型的分类和具体描述请参考API文档。

参考资源

分享