stripe pay_J2Pay –实施网关

stripe pay

介绍

如果您使用任何网关,您都可以在我们的库中实现该网关并支持开源世界,我们将非常高兴地欢迎贡献者。

您可以在这里找到我们的github存储库

在开始实现网关之前,您应该首先看到其他一些类。

以下是简要定义的类。

HTTP客户端

使用网关时,最主要的是将一些数据发布到网关并解析响应。

为了处理http post请求,此类提供了两个重载的静态httpPost方法。

  1. 公共静态HTTPResponse httpPost(字符串url,字符串postParams,ContentType contentType)
  2. 公共静态HTTPResponse httpPost(字符串url,字符串postParams,ContentType contentType,字符集charset)

因此,您不必担心处理http请求。

帮手

当您使用多个网关时,开发人员通常面临的主要问题是某些网关接收xml,而某些网关接收JSON或查询字符串,因为J2pay始终返回JSON响应,因此您不必担心在这些xml,JSON或任何xml之间进行数据转换。请求参数。

这是com.tranxactive.paymentprocessor.net程序包中的帮助程序类的列表。

  1. QueryStringHelper
  2. JSONHelper
  3. StringHelper
  4. XMLHelper

注意:助手类中定义的所有方法都是静态的。

回应

为了提供通用响应,j2pay在com.tranxactive.paymentprocessor.gateways.responses包中提供了五个响应类。

  1. 错误响应
  2. 购买响应
  3. 重新付款响应
  4. 退款回应
  5. 虚空响应

因为您可以使用它们的名称来标识您是否正在使用购买方法,所以您将使用PurchaseResponse类;如果使用重新计费方法,则将使用RebillRespons类,依此类推

ErrorResponse类是将在所有四个方法中使用的唯一类。

一件事,您还应该知道四个类,但ErrorResponse被视为成功响应。 因此,当且仅当交易成功时,我们才会退还它们。

参数列表

ParamList是位于com.tranxactive.paymentprocessor.gateways.parameters包中的一个枚举,包含所有交易中必须保持通用的变量列表,例如,如果您想将交易ID分配给变量transactionId,则可能会出现拼写错误,但是如果您将使用paramList枚举非常安全。

这是在JSON中分配transactionId时如何使用它。

JSONObject json = new JSONObject();Json.put(ParamList.TRANSACTION_ID.getName(), "1234567890");

现在,您已经拥有集成新网关所需的全部知识。 在此示例中,我们将集成NMI网关。

在研究此示例时,我们假设您已阅读NMI官方文档。

让我们编码。

为了集成NMI网关,我们将在com.tranxactive.paymentprocessor.gateways包中创建一个名称为NMIGateway的类。

接下来,我们将扩展Gateway类,这将导致我们实现网关中必须存在的所有方法。

这是我们班的样子。

public class NMIGateway  extends Gateway{@Overridepublic HTTPResponse purchase(JSONObject apiParameters, Customer customer, CustomerCard customerCard, Currency currency, float amount) { }@Overridepublic HTTPResponse refund(JSONObject apiParameters, JSONObject refundParameters, float amount) { }@Overridepublic HTTPResponse rebill(JSONObject apiParameters, JSONObject rebillParameters, float amount) { }@Overridepublic HTTPResponse voidTransaction(JSONObject apiParameters, JSONObject voidParameters) { }@Overridepublic JSONObject getApiSampleParameters() { }@Overridepublic JSONObject getRefundSampleParameters() { }@Overridepublic JSONObject getRebillSampleParameters() { }@Overridepublic JSONObject getVoidSampleParameters() { }}

接下来,我们将在课程末尾添加以下四个方法。 这些将帮助我们构建需要在网关上发布的最终参数。

private JSONObject buildPurchaseParameters(JSONObject apiParameters, Customer customer, CustomerCard customerCard, Currency currency, float amount){}private JSONObject buildVoidParameters(JSONObject apiParameters, JSONObject voidParameters) {}private JSONObject buildRefundParameters(JSONObject apiParameters, JSONObject refundParameters, float amount){}private JSONObject buildRebillParameters(JSONObject apiParameters, JSONObject rebillParameters, float amount){}

接下来,我们将全局定义apiURL变量,在该变量中将发布所有请求。

private final String apiURL = "https://secure.networkmerchants.com/api/transact.php";

接下来,我们将研究四个SampleParameters方法。

首先也是最重要的是执行所有事务所需的getApiSampleParameters方法。

如果您已阅读NMI文档,则将看到API参数是用户名和密码。

这是getApiSampleParameters方法的外观。

@Overridepublic JSONObject getApiSampleParameters() {return new JSONObject().put("username", "the api user name use demo as the user name for testing").put("password", "the api password use password  as the password for testing");}

以下是更新后剩下的三种方法。

@Overridepublic JSONObject getRefundSampleParameters() {return new JSONObject().put(ParamList.TRANSACTION_ID.getName(), "the transaction id which will be refunded");}@Overridepublic JSONObject getRebillSampleParameters() {return new JSONObject().put("customerVaultId", "the customer vault id");}@Overridepublic JSONObject getVoidSampleParameters() {return new JSONObject().put(ParamList.TRANSACTION_ID.getName(), "the transaction id which will be void");}

接下来,我们将研究四种buildparameters方法。 这是插入我们的代码后的样子。

private JSONObject buildPurchaseParameters(JSONObject apiParameters, Customer customer, CustomerCard customerCard, Currency currency, float amount) {JSONObject object = new JSONObject();object.put("type", "sale").put("username", apiParameters.getString("username")).put("password", apiParameters.getString("password")).put("ccnumber", customerCard.getNumber()).put("ccexp", customerCard.getExpiryMonth() + customerCard.getExpiryYear().substring(2)).put("cvv", customerCard.getCvv()).put("amount", amount).put("currency", currency).put("first_name", customer.getFirstName()).put("last_name", customer.getLastName()).put("address1", customer.getAddress()).put("city", customer.getCity()).put("state", customer.getState()).put("zip", customer.getZip()).put("country", customer.getCountry().getCodeISO2()).put("phone", customer.getPhoneNumber()).put("email", customer.getEmail()).put("ipaddress", customer.getIp()).put("customer_vault", "add_customer");return object;}private JSONObject buildVoidParameters(JSONObject apiParameters, JSONObject voidParameters) {JSONObject object = new JSONObject();object.put("type", "void").put("username", apiParameters.getString("username")).put("password", apiParameters.getString("password")).put("transactionid", voidParameters.getString(ParamList.TRANSACTION_ID.getName()));return object;}private JSONObject buildRefundParameters(JSONObject apiParameters, JSONObject refundParameters, float amount) {JSONObject object = new JSONObject();object.put("type", "refund").put("username", apiParameters.getString("username")).put("password", apiParameters.getString("password")).put("transactionid", refundParameters.getString(ParamList.TRANSACTION_ID.getName())).put("amount", Float.toString(amount));return object;}private JSONObject buildRebillParameters(JSONObject apiParameters, JSONObject rebillParameters, float amount) {JSONObject object = new JSONObject();object.put("username", apiParameters.getString("username")).put("password", apiParameters.getString("password")).put("customer_vault_id", rebillParameters.getString("customerVaultId")).put("amount", Float.toString(amount));return object;}

接下来,我们将研究购买方法。

首先,我们将使用buildPurchaseParameters方法构建最终需要发布在网关上的最终参数。

JSONObject requestObject = this.buildPurchaseParameters(apiParameters, customer, customerCard, currency, amount);

接下来,我们将定义一些变量来处理请求,不用担心,这完全取决于您的编码方式。

JSONObject responseObject;String requestString;String responseString;int responseCode;requestObject = JSONHelper.encode(requestObject);requestString = QueryStringHelper.toQueryString(requestObject);HTTPResponse httpResponse;PurchaseResponse successResponse = null;ErrorResponse errorResponse = new ErrorResponse();

由于NMI需要发布queryString数据,因此我们使用了两个帮助器类。

JSONHelperQueryStringHelper

首先,我们将借助此代码对buildPurchaseParameters返回的json进行urlencode。

requestObject = JSONHelper.encode(requestObject);

接下来,借助此代码,将编码的json转换为查询字符串。

requestString = QueryStringHelper.toQueryString(requestObject);

您一定想知道为什么我们初始化errorResponse却将successResponse设置为null。 这一切使某些编程登录可以轻松处理请求。

接下来,我们将数据发布到网关,这是我们将如何做的。

httpResponse = HTTPClient.httpPost(this.apiURL, requestString, ContentType.APPLICATION_FORM_URLENCODED);

这里有两个场景必须牢记。

  1. 与网关服务器的通信成功。
  2. 出现某些网络问题,或者网关服务器暂时不可用。

这是您处理第二种情况的方法。

if (httpResponse.getStatusCode() == -1) {return httpResponse;}

如果与网关服务器的通信成功,那么我们的代码将不会从此处返回并继续。

接下来,我们将获取网关响应并将其解析为JSON,以便我们可以轻松地处理响应。

responseString = httpResponse.getContent();responseObject = JSONHelper.decode(QueryStringHelper.toJson(responseString));responseCode = responseObject.getInt("response_code");

如您所见,我们再次使用了QueryStringHelper和JSONHelper。 借助辅助类并不是那么容易。

我们知道网关响应是否成功,因此它必须返回响应代码100。请参见以下代码。

if (responseCode == 100) {httpResponse.setSuccessful(true);successResponse = new PurchaseResponse();successResponse.setMessage(responseObject.getString("responsetext"));successResponse.setTransactionId(responseObject.get("transactionid").toString());successResponse.setCardValuesFrom(customerCard);successResponse.setAmount(amount);successResponse.setCurrencyCode(currency);successResponse.setRebillParams(new JSONObject().put("customerVaultId", responseObject.get("customer_vault_id").toString()));successResponse.setRefundParams(new JSONObject().put(ParamList.TRANSACTION_ID.getName(), responseObject.get("transactionid").toString()));successResponse.setVoidParams(new JSONObject().put(ParamList.TRANSACTION_ID.getName(), responseObject.get("transactionid").toString()));} else {errorResponse.setMessage(responseObject.getString("responsetext"));}

让我们逐行了解上面的代码。

httpResponse.setSuccessful(true);

默认情况下,httpResponse将成功设置为false,因此我们仅在成功情况下才将其设置为true,如上所述。

successResponse = new PurchaseResponse();

我们初始化了在方法开头定义的successResponse变量。

当您查看PurchaseResponse类的代码时,您将看到在返回响应之前必须设置的所有参数。

//this sets the gateway success message.successResponse.setMessage(responseObject.getString("responsetext"));
//this sets the gateway returned transaction id.successResponse.setTransactionId(responseObject.get("transactionid").toString());
//this is our standard we provide some card detail in purchase response. You will see in final response.successResponse.setCardValuesFrom(customerCard);
successResponse.setAmount(amount);successResponse.setCurrencyCode(currency);

接下来,我们设置要收取的金额和货币。

由于我们有责任提供重新使用,退款或作废所需的即用型参数。

这是我们的操作方式。

successResponse.setRebillParams(new JSONObject().put("customerVaultId", responseObject.get("customer_vault_id").toString()));successResponse.setRefundParams(new JSONObject().put(ParamList.TRANSACTION_ID.getName(), responseObject.get("transactionid").toString()));successResponse.setVoidParams(new JSONObject().put(ParamList.TRANSACTION_ID.getName(), responseObject.get("transactionid").toString()));

但是如果React不成功怎么办,我们会遇到一些错误,例如资金不足或avs错误。

这是我们在else块中执行此操作的方式。

errorResponse.setMessage(responseObject.getString("responsetext"));

接下来,我们将返回最终的响应,即HTTPResponse。

if (successResponse != null) {successResponse.setGatewayResponse(responseObject);httpResponse.setContent(successResponse.getResponse().toString());} else {errorResponse.setGatewayResponse(responseObject);httpResponse.setContent(errorResponse.getResponse().toString());}return httpResponse;

这就是我们已经成功集成了NMI购买方法的全部,接下来的三种方法将相同,除了您将为每种方法使用不同的Response类(即,您将使用)

RebillRebill方法中的响应。
RefundResponse退款方式。
voidTransaction方法中的VoidResponse。 而不是PurchaseResponse。

强烈建议查看所有这些响应类的来源以及示例响应(在此处给出)

要查看NMI网关的完整代码,请参见我们的github存储库 。

翻译自: https://www.javacodegeeks.com/2018/12/j2pay-implementing-gateway.html

stripe pay

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux l文件共享,llinux服务器文件共享的一种简单的方法

如果Centos虚拟机没有安装文件共享功能,那么客户端与服务器文件共享会产生一些困扰;这里有一个小的方法,可以快速实现linux服务器与windows共享;这里以CentOS 6.4 版本为例;通过xshell链接到服务器上;要在l…

BeanUtils的学习

BeanUtils 用于将数据封装成 JavaBean。 什么是 JavaBean 一种标准的 Java 类 要求: 1.类必须被public修饰 2.必须提供空参的构造器 3.成员变量必须使用private修饰 4.提供公共setter和getter方法 功能: JavaBean用于封装数据 主要的方法 popular&a…

java方法可选参数_Java可选参数

java方法可选参数在Java类中设计方法时,某些参数对于其执行而言可能是可选的。 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的。 从本文中, 您将学习如何在Java中处理可选参数 。 我们将专注于常规方…

linux清空串口接收buff,openwrt解除console对串口的占用

console对串口的占用openwrt会将串口配置成console便于用户控制,以本人使用的WNDR4300为例打开盒子后可以看到一个串口被引出,开机后能够打印bootloder以及linux的启动日志。在启动到一定阶段之后可以作为console登陆有时候希望自己的程序占用串口来发送…

Druid Spring JDBC Servlet 实现登录功能

Druid 数据库连接池的实现技术 Spring JDBC 需要使用数据库连接池,Spring JDBC 提供非常好用的查询数据、插入数据、更新数据的API 开发步骤: 1.数据库的设计(创建数据库、数据表) 2.创建 Java EE 项目 3.导入相关的 jar 包 comm…

世界是沙粒还是宇宙_看到一个沙粒世界:再一次你好世界

世界是沙粒还是宇宙“看到一个沙粒中的世界”,我们很可能会看到最简单的“ Hello World”中的世界,所以我们开始吧,再一次向世界问好。 我猜所有的Java课程,教程都是从这个著名的Hello World程序开始的,这是我可以在没…

电脑word在哪_到底哪个PDF转Word最好用?

今天的内容很简单,就聊一个很基本的问题:PDF格式转换。而PDF转换中最具有代表性以及最常用的,莫过于PDF转Word了。那咱们今天就从PDF转Word着手,找出最好用的PDF转Word神器。特别提醒,这是一篇将近2000字长文。不想看过…

linux视音频解码教程,音视频编解码:NVIDIA Jetson Linux Multimedia API(总结)

音视频编解码:NVIDIA Jetson Linux Multimedia API(总结)2020年12月02日| 萬仟网IT编程| 我要评论一、官网链接官网链接:https://docs.nvidia.com/jetson/l4t-multimedia/index.html二、环境我这边用的是jetson nano,刷机是JetPack4.4版本。j…

IntelliJ IDEA for Mac下载、安装、使用TunnelliJ插件(一种TCP/IP Monitor)

文章目录下载和安装 TunnelliJ使用 TunnelliJIntelliJ IDEA 要使用类似于 Eclipse 的 TCP/IP Monitor,需要下载第三方插件,推荐使用 TunnelliJ 插件。下载和安装 TunnelliJ 或者按快捷键 ⇧ ⌘ A,搜索 plugins 也能打开插件管理界面&#…

干支纪年法简便算法_民间玄学:那些年我理解的何谓“天干”,“地支”,“干支”...

文/天泽子在我很小的时候,大概6岁左右,父亲带着我跟这一方面的知识开始接触,那个时候的我不明白天干,地支是什么?父亲的小学文化程度,只对我说“天干分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(d…

corda_吞吐量-Corda的故事

corda我最近启动了一个针对特定用例的Corda性能的项目。 该项目的结果使我们在170多个节点的网络上一天之内处理了1.15亿个请求。 此外,Corda每秒能够处理6300个请求,确认满足了网络的最高要求。 迄今为止,这是迄今为止已部署的最大的Corda网…

linux webapi测试,Webapi管理和性能测试工具WebBenchmark

WebBenchmark是一款基于开源通讯组件Beetlex扩展的Webapi管理和性能测试工具,在传统工具中一般管理工具缺乏性能压测能力或有性能测试的缺少管理功能;WebBenchmark的设计目标是就管理和性能压测能力同时具备。接下来介绍一下工具的功能和使用&#xff1a…

小程序影藏溢出的gif_ScreenToGif:一款小巧实用动图gif制作神器

ScreenToGif是一个小型的便携式的gif录屏程序,它能使您记录您的屏幕上的任何内容并将其保存为GIF动画。您可以自由地移动捕获帧录制视频上的 web 页或屏幕活动在您的桌面上。捕获可以暂停和恢复,一旦你完成录制,程序带来了一种简单的编辑器,允…

Servlet的重定向和转发特点

重定向 重定向的特点: 1.地址栏发生变化 2.重定向可以访问其他站点(服务器)的资源 3.重定向是两次请求,不可以使用Request对象共享数据 重定向的示例代码: package priv.lwx.javaex.servlet_demo.web.servlet.response;import javax.servl…

java 动画_Java安全动画

java 动画总览 自从JDK 1.2中引入安全沙箱模型以及JDK提供的安全API的发展以来,Java安全就一直是一个复杂的话题。 并发实用程序也观察到类似的问题,并且开发了一种名为Java Concurrent Animated的工具,目的是通过有趣而有趣的方式降低进入这…

u盘插在linux电脑上没有反应,U盘插在自己电脑上没有反应,别人电脑有反应的解决方法...

近期,将U盘插到自己电脑上无法读盘,虽然通知栏那里显示了设备已连接,但是在电脑里看不到盘符,以为是U盘损坏了,但是插到别人电脑上却可以正常使用,这就证明了U盘肯定没有问题的。那么遇到这个问题我们要如何…

绝对路径/相对路径

文章目录1.相对路径2.绝对路径1.相对路径 通过相对路径不可以确定唯一资源。 如: ./index. html。 不以/开头,以.开头路径。 规则:找到当前资源和目标资源之间的相对位置关系。 ./:当前目录 ../:后退一级目录&…

局域网网管软件_网管软件有哪些?那些不同之处

企业管理一般用到的网管软件,就是局域网监控软件的一种,它不同于网吧管理用的管理软件,它是集网络监控,监管一体的软件。网管软件并不是单单的一种软件,它在市面上也是包含很多类的。行业内知名的超级眼局域网监控软件…

stripe pay_J2Pay –完整示例

stripe pay介绍 在本节中,我们将详细探讨如何使用网关并成功调用所有四种方法,即购买,退款,作废和重新计费。 对于此示例,我们将使用授权网关。 让我们开始。 首先,我们将获得授权网关对象。 Gateway ga…

Linux主机通过直连线直连,【IT基础】网线的直连线与交叉线之间的区别

小续嵌入式开发的运行环境是目标板,而开发环境是宿主机。因此需要把宿主机中经过编译之后的可执行文件下载到目标板上去。需要注意的是,这里所讲的下载是下载到目标机中的SDRAM常见的下载方式有网络下载(如TFTP、FTP等方式)、串口下载、USB下载等当用TFT…