介绍

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

您可以在这里找到我们的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()));

但是,如果响应不成功怎么办,我们会遇到一些错误,例如资金不足或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

J2Pay –实施网关相关推荐

  1. stripe pay_J2Pay –实施网关

    stripe pay 介绍 如果您使用任何网关,您都可以在我们的库中实现该网关并支持开源世界,我们将非常高兴地欢迎贡献者. 您可以在这里找到我们的github存储库 在开始实现网关之前,您应该首先看到 ...

  2. J2Pay – API响应

    介绍 该库中的神奇之处在于,无论网关是什么,其响应都是唯一的. 了解API响应后,您便可以轻松地将此响应用于进一步的交易,例如退款,作废或重新开票. 首先,在开始阅读时,所有响应都是JSON. 所有响 ...

  3. wxpay-api:pay_J2Pay – API响应

    wxpay-api:pay 介绍 该库中的神奇之处在于,无论网关是什么,其响应都是唯一的. 了解API响应后,您便可以轻松地将此响应用于进一步的交易,例如退款,作废或重新开票. 首先,在开始阅读时,所 ...

  4. 计算机网络互连基础技术及实战

    网络互连技术及实战 1.互联网概述 什么是计算机网络: 计算机网络就是通信线路和通信设备将分布在不同地点的具有独立功能的多个计算机系统互相连接起来,在网络软件的支持下实现彼此之间的数据通信和资源共享的 ...

  5. 免费ARP(gratuitousARP)

    免费ARP的格式 免费ARP报文与普通ARP请求报文的区别在于普通的ARP请求报文,其ARP封装内的"目的IP地址"是其他机器的IP地址,而免费ARP的请求报文,其ARP封装内的& ...

  6. 计算机网络协议分析全知识点总结兼期末复习重点

    计算机网络协议分析知识点总结 第一章 概述 数据封装与解封装 互联网使用的四种地址 第二章 链路层 信道类型与帧类型* 以太网(Ethernet II帧格式*,MTU) CSMA/CD与CDMA/CA ...

  7. ​ CASB,CWPP,CSPM和CNAPP有什么区别?

    随着企业将工作负载转移到云上,保护云环境已成为当务之急. Gartner预测,到2021年,全球公共云支出将增长18.4%,总额达到3049亿美元.该市场研究公司预测,IT支出向云转移的比例将加速增长 ...

  8. 微服务架构中的软件测试

    近几年来,微服务悄然而又坚定地在拥挤的软件架构市场中占有一席之地.微服务体系结构不同于传统的单一整体体系结构,微服务体系结构并不以单体形式构建.尽管单一整体体系结构是可靠的,但其相关的问题也日益增多, ...

  9. 华为思科基础配置笔记

    华为ensp与思科Packet Tracer配置命令笔记 ​ 本人是网络工程的学生,因为专业课作业经常要配置,命令记不住,上网查配置太浪费时间了,回头重新学习一下,记录基础配置命令,方便回顾,有错的地 ...

最新文章

  1. (转)从CPU架构和技术的演变看GPU未来发展
  2. 查看文件的MD5/SHA1效验值
  3. C#返回mysql查询结果_c#查询MySQL是怎么接收返回结果的
  4. python 关键字参数为什么只能出现在最后_Python笔记2——默认参数,可变参数,关键字参数,参数组合...
  5. 博士期间要注意的几个问题
  6. 2019我做成的事情
  7. 基于wrapper的特征选择——递归特征消除RFE的python实现
  8. vue-resource.js的get和post的正确用法
  9. Linux进程内核栈与thread_info结构详解--Linux进程的管理与调度(九)
  10. IntelliJ IDEA+Maven运行apache-storm的LocalCluster例子
  11. JMM同步规范和Volatile重点概要
  12. spring事务失效一:非public方法
  13. 数据传输类型与通信方式
  14. python科学计算库-Scipy,主要讲解优化,方程求解,积分,蒙特卡洛,插值计算
  15. 基于Javaee的影视创作论坛的设计与实现(含源文件)
  16. 第六章、面向对象(oop)
  17. python可视化(莫烦python代码)
  18. 「MRC干货」如何快速构建一台高精度AGV
  19. 从补天白帽大会看网络世界那些“挖洞”的人
  20. 【艺术硕士论文】现代婚嫁服饰中传统缠花艺术的运用分析(节选)

热门文章

  1. 2021牛客暑期多校训练营6 J-Defend Your Country(无向图点双+思维)
  2. Hadoop入门(八)Mapreduce高级shuffle之Partitioner
  3. 面象对象设计6大原则之四:接口隔离原则
  4. @Resource,@Autowired,@Inject3种注入方式详解
  5. 新闻发布项目——接口类(newsTbDao)
  6. HBase出现java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration问题
  7. php mysql 编码为utf-8_php连mysql用 utf-8编码乱码怎么办
  8. django mysql 创建表_关于 django ORM 中,数据库建表方式的问题
  9. 开发app用户协议_APP软件开发如何让用户更开心地付钱?
  10. redis集群依赖ruby