stripe pay
介绍
如果您使用任何网关,您都可以在我们的库中实现该网关并支持开源世界,我们将非常高兴地欢迎贡献者。
您可以在这里找到我们的github存储库
在开始实现网关之前,您应该首先看到其他一些类。
以下是简要定义的类。
HTTP客户端
使用网关时,最主要的是将一些数据发布到网关并解析响应。
为了处理http post请求,此类提供了两个重载的静态httpPost方法。
- 公共静态HTTPResponse httpPost(字符串url,字符串postParams,ContentType contentType)
- 公共静态HTTPResponse httpPost(字符串url,字符串postParams,ContentType contentType,字符集charset)
因此,您不必担心处理http请求。
帮手
当您使用多个网关时,开发人员通常面临的主要问题是某些网关接收xml,而某些网关接收JSON或查询字符串,因为J2pay始终返回JSON响应,因此您不必担心在这些xml,JSON或任何xml之间进行数据转换。请求参数。
这是com.tranxactive.paymentprocessor.net程序包中的帮助程序类的列表。
- QueryStringHelper
- JSONHelper
- StringHelper
- XMLHelper
注意:助手类中定义的所有方法都是静态的。
回应
为了提供通用响应,j2pay在com.tranxactive.paymentprocessor.gateways.responses包中提供了五个响应类。
- 错误响应
- 购买响应
- 重新付款响应
- 退款回应
- 虚空响应
因为您可以使用它们的名称来标识您是否正在使用购买方法,所以您将使用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{
@Override
public HTTPResponse purchase(JSONObject apiParameters, Customer customer, CustomerCard customerCard, Currency currency, float amount) { }
@Override
public HTTPResponse refund(JSONObject apiParameters, JSONObject refundParameters, float amount) { }
@Override
public HTTPResponse rebill(JSONObject apiParameters, JSONObject rebillParameters, float amount) { }
@Override
public HTTPResponse voidTransaction(JSONObject apiParameters, JSONObject voidParameters) { }
@Override
public JSONObject getApiSampleParameters() { }
@Override
public JSONObject getRefundSampleParameters() { }
@Override
public JSONObject getRebillSampleParameters() { }
@Override
public 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方法的外观。
@Override
public 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");
}
以下是更新后剩下的三种方法。
@Override
public JSONObject getRefundSampleParameters() {
return new JSONObject()
.put(ParamList.TRANSACTION_ID.getName(), "the transaction id which will be refunded");
}
@Override
public JSONObject getRebillSampleParameters() {
return new JSONObject()
.put("customerVaultId", "the customer vault id");
}
@Override
public 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数据,因此我们使用了两个帮助器类。
JSONHelper和QueryStringHelper
首先,我们将借助此代码对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);
这里有两个场景必须牢记。
- 与网关服务器的通信成功。
- 出现某些网络问题,或者网关服务器暂时不可用。
这是您处理第二种情况的方法。
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