J2Pay –实施网关

介绍

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

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

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

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

相关文章

linux中jq的使用方法,linux使用jq工具解析json

jq类似一个awk或grep一样的神器,可以方便地在命令行操作json一、安装官网:https://stedolan.github.io/jq/download/基本就是brew install、apt install、yum install之类的,很简单二、常用操作1.格式化json直接请求格式如下,不易…

linux手机摩托,Linux操作系统触控智能机 摩托ZN4图赏

北京时间2008年11月25日,有国外的网友拿到由通信运营商Verizon Wireless定制的摩托罗拉ZN4真机。摩托罗拉ZN4的发布已经过了一个多月了,网友们对于这款手机的评论可谓是褒贬不一。有的朋友们指出摩托罗拉ZN4在造型上面抄袭了经典“明”系列设计&#xff…

Apache Camel 2.23发布

昨天发布了Apache Camel 2.23 ,其中最值得注意的新功能是对Spring Boot 2.1的支持,我们还改进了启动器组件以包括更多的元数据,并对改进的Spring Boot自动配置进行了优化。 此版本主要是一个大的错误修复版本和一些其他小的新增功能。 这些功…

对c语言字符数组描述错误的是,下述对C语言字符数组的描述中错误的是( )。

摘要:条形图用频率值型来表分组分布示数数据,下述没有相邻之间间隔竖条。中国:在中大学列联分析,字符百分表的条件正确关于的是方向说法。条形图用频率值型来表分组分布示数数据,数组述中没有相邻之间间隔竖条。...条形图用频率值…

android 实现自动拍照,Android自定义相机实现定时拍照功能

这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能。首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件:activity_main.xmlandroid:layout_width"match_parent"android:layout_height"match_…

10个步骤的筛选器模式

过滤器是仅在某些情况下应应用的模式。 在原始帖子中 ,我提供了一个非常简单的示例,旨在演示如何应用它。 在这篇文章中,我提供了一个更详细的示例,该示例还旨在说明何时以及为什么应用它。 介绍 该职位包括以下10个简短步骤 。…

android 网络调试工具,安卓网络调试助手

安卓网络调试助手源码是一款专门为专业人士准备的安卓网络调试软件,安卓网络调试助手apk支持各种进制的转换发生和多种端口协议,让用户操作起来更加方便,安卓网络调试助手源码有着专业的操作流程,帮助用户快速上手,就算…

android版本8.1.0和9的区别,安卓8.1和9.0的区别是什么

安卓8.1和9.0的主要差别是:流畅度、耗电量、功能等等方面的不同。在手机配置足够的情况下,9.0要比8.1更流畅和省电,它可以同时让后台保持更多APP,每个APP运行的时候更加流畅,其新的智能电量管理功能、暗黑模式让手机更…

看到一个沙粒世界:再一次你好世界

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

[渝粤教育] 西南科技大学 中国现代文学 在线考试复习资料

中国现代文学——在线考试复习资料 一、单选题 1.不属于“五四”时期的“问题小说”作家的是( )。 A.冰心 B.庐隐 C.刘呐鸥 D.王统照 2.巴金小说《家》中的觉新是( )。 A.顽固的封建卫道者 B.腐朽堕落者 C.有新思想的懦弱者 D.与封建思想大胆斗争的反抗者 3.《画梦录》的作者…

[渝粤教育] 西南科技大学 中学英语教材教法 在线考试复习资料

中学英语教材教法——在线考试复习资料 一、单选题 1.关于写作评估以下说法正确的是? A.写作评估既要有结果评估,也要有过程评估 B.写作教学评估有写长法又有写短法 C.课堂评估的作用仅为监控学生 D.课堂评估与课堂的具体教学内容有关,可以使用统一的评估模式 2.以下哪种方式…

moreunit_MoreUnit与MoreUnit

moreunit就在一年多以前,我写了一篇关于在Eclipse中使用JUnit的文章。 评论者之一推荐MoreUnit ,以进一步提高测试效率。 尝试一下让我感到很高兴,并且我的自主神经系统立即记住了该插件的键盘快捷键…… 另外,在使用MoreUnit一段…

[渝粤教育] 西南科技大学 人力资源管理 在线考试复习资料(1)

人力资源管理——在线考试复习资料 一、单选题 1.实施工作轮换方案之前要做好的工作不包括( ) A.复查每一个连续在同一职业岗位上于了5年以上.特别是更长时间的、正处于职业中期的员工(包括经理在内) 的人事文件 B.评价这些员工的工作,认清其工作专长,了解其个人特征、才干等 C…

android 获取 meid 代码,Android 各个版本获取IMEI、MEID

public class IMEIUtil {/*** 获取默认的imei 一般都是IMEI 1** param context* return*/public static String getIMEI1(Context context) {//优先获取IMEI(即使是电信卡) 不行的话就获取MEIDreturn getImeiOrMeid(context, 0);}/*** 获取imei2** param context* return*/publ…

JMetro版本5发布

Java的第5版JavaFX主题JMetro刚刚发布。 这是此版本中的新功能: 新的文本区域明暗风格; 现有控件样式的一些更改; 新CSS变量称为accent_color。 顾名思义,它允许您定义JMetro控件中使用的强调颜色。 已经进行了很大的重构&am…

[渝粤教育] 西南科技大学 会计学原理 在线考试复习资料(1)

会计学原理——在线考试复习资料 一、单选题 1.资产负债表是反映企业( )财务状况的会计报表。 A.某一特定日期 B.一定时期内 C.某一月份内 D.某一年份内 2.某企业本期盘亏的材料已查明原因,属于自然损耗,批准处理时应编制的会计分录( )。 A.借记“待处理财产损溢”,…

android 开发 矩形截屏插件,Android 上如何实现矩形区域截屏

对屏幕进行截屏并裁剪有两种方式:早截图和晚截图。早截图,就是先截取全屏,再让用户对截取到的图片进行修改;与之相对的,晚截图,就是先让用户在屏幕上划好区域,再进行截图和裁剪。其实两者并没有什么太大的区…

[渝粤教育] 西南科技大学 供应链管理 在线考试复习资料

供应链管理——在线考试复习资料 一、单选题 1.人们设置库存的目的,不包括以下哪种? A.增加固定资产 B.防止缺货 C.保持生产连续性 D.快速满足订货需求 2.费希尔(Fisher)按市场需求模式将产品分为两类,即功能性产品和创新性产品。下面属于功能性产品的是: A.时装 B.石油 C.手…

[渝粤教育] 西南科技大学 信息组织与检索 在线考试复习资料2021版

信息组织与检索——在线考试复习资料2021版 一、单选题 1.要求两个关键词至少有一个出现在检索结果中需使用的操作符是( )。 A. ND B. OR C. ND NOT D. NEAR 答案:看左边查询 2.要求两个关键词都必须出现在检索结果中需使用的操作符是( )。 A. ND B. OR C. ND NOT D. NE…

Android布局怎么画图形,Android开发者的图形化布局

图形化布局编辑器允许你通过拖放来创建UI。在早期版本的ADT中,图形化布局编辑器并不是很有帮助,幸运的是,最新版本非常强大,可以用来创建复杂的包含有复合组件以及动画的布局。(1)Configuration下拉菜单让你可以改变当前布局展示的…