package com.dsh.course.util.midtrans;
|
|
import com.dsh.guns.modular.system.util.ResultUtil;
|
import com.midtrans.Config;
|
import com.midtrans.Midtrans;
|
import com.midtrans.httpclient.IrisApi;
|
import org.json.JSONArray;
|
import org.json.JSONObject;
|
|
import java.util.*;
|
|
/**
|
* 付款工具类
|
* @author zhibing.pu
|
* @date 2023/5/4 19:22
|
*/
|
public class Payouts {
|
|
private static String sandbox_merchant_id = "G118246934";
|
|
private static String sandbox_serverKey = "IRIS-330198f0-e49d-493f-baae-585cfded355d";
|
|
// private static String sandbox_serverKey = "SB-Mid-server-qR4Xy4kbpyxND_7f6c1_knb9";
|
|
private static String sandbox_clientKey = "SB-Mid-client-xhRbIV8lsbu7bKCE";
|
|
private static String merchant_id = "G118246934";
|
|
private static String serverKey = "Mid-server-w1ATM2ldDpd0c4Q0s9sNfeNN";
|
|
private static String clientKey = "Mid-client-X22yMA1Wvs0v1vfO";
|
|
|
/**
|
* 添加转账账户信息
|
* @param beneficiary_name
|
* @param beneficiary_account
|
* @param beneficiary_bank
|
* @param beneficiary_email
|
* @return
|
*/
|
public static ResultUtil addBeneficiaries(String beneficiary_name, String alias_name, String beneficiary_account, String beneficiary_bank, String beneficiary_email){
|
try {
|
//沙箱环境
|
Midtrans.serverKey = sandbox_serverKey;
|
Midtrans.clientKey = sandbox_clientKey;
|
Midtrans.isProduction = false;
|
|
//生产环境
|
// Midtrans.serverKey = serverKey;
|
// Midtrans.clientKey = clientKey;
|
// Midtrans.isProduction = true;
|
Map<String, String> requestBody = new HashMap<>();
|
requestBody.put("name", beneficiary_name);
|
requestBody.put("account", beneficiary_account);
|
requestBody.put("bank", beneficiary_bank);
|
requestBody.put("alias_name", alias_name);
|
requestBody.put("email", beneficiary_email);
|
JSONObject beneficiaries = IrisApi.createBeneficiaries(requestBody, Config.getGlobalConfig());
|
String status = beneficiaries.getString("status");
|
if("created".equals(status)){
|
return ResultUtil.success();
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
return ResultUtil.error("失败");
|
}
|
|
|
/**
|
* 更新转账用户数据
|
* @param beneficiary_name
|
* @param beneficiary_account
|
* @param beneficiary_bank
|
* @param beneficiary_email
|
* @return
|
*/
|
public static ResultUtil editBeneficiaries(String beneficiary_name, String alias_name, String beneficiary_account, String beneficiary_bank, String beneficiary_email){
|
try {
|
//沙箱环境
|
Midtrans.serverKey = sandbox_serverKey;
|
Midtrans.clientKey = sandbox_clientKey;
|
Midtrans.isProduction = false;
|
|
//生产环境
|
// Midtrans.serverKey = serverKey;
|
// Midtrans.clientKey = clientKey;
|
// Midtrans.isProduction = true;
|
Map<String, String> requestBody = new HashMap<>();
|
requestBody.put("name", beneficiary_name);
|
requestBody.put("account", beneficiary_account);
|
requestBody.put("bank", beneficiary_bank);
|
requestBody.put("alias_name", alias_name);
|
requestBody.put("email", beneficiary_email);
|
JSONObject beneficiaries = IrisApi.updateBeneficiaries(alias_name, requestBody, Config.getGlobalConfig());
|
String status = beneficiaries.getString("status");
|
if("updated".equals(status)){
|
return ResultUtil.success();
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
return ResultUtil.error("失败");
|
}
|
|
|
/**
|
* 获取转账用户
|
* @param account
|
* @return
|
*/
|
public static Beneficiaries getBeneficiaries(String account){
|
try {
|
//沙箱环境
|
Midtrans.serverKey = sandbox_serverKey;
|
Midtrans.clientKey = sandbox_clientKey;
|
Midtrans.isProduction = false;
|
|
//生产环境
|
// Midtrans.serverKey = serverKey;
|
// Midtrans.clientKey = clientKey;
|
// Midtrans.isProduction = true;
|
JSONArray beneficiaries = IrisApi.getBeneficiaries(Config.getGlobalConfig());
|
for (int i = 0; i < beneficiaries.length(); i++) {
|
JSONObject jsonObject = beneficiaries.getJSONObject(i);
|
String account1 = jsonObject.getString("account");
|
if(account.equals(account1)){
|
Beneficiaries beneficiaries1 = new Beneficiaries();
|
beneficiaries1.setName(jsonObject.getString("name"));
|
beneficiaries1.setAccount(jsonObject.getString("account"));
|
beneficiaries1.setAlias_name(jsonObject.getString("alias_name"));
|
beneficiaries1.setBank(jsonObject.getString("bank"));
|
beneficiaries1.setEmail(jsonObject.getString("email"));
|
return beneficiaries1;
|
}
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
|
|
/**
|
* 单笔转账
|
* @param beneficiary_name 转账用户名称
|
* @param alias_name 用户别名
|
* @param beneficiary_account 转账用户账号
|
* @param beneficiary_bank 转账银行
|
* @param beneficiary_email 邮箱
|
* @param amount 金额
|
* @param notes 备注
|
* @return
|
*/
|
public static ResultUtil<String> payout(String beneficiary_name, String alias_name, String beneficiary_account, String beneficiary_bank, String beneficiary_email, Double amount, String notes){
|
try {
|
//沙箱环境
|
Midtrans.serverKey = sandbox_serverKey;
|
Midtrans.clientKey = sandbox_clientKey;
|
Midtrans.isProduction = false;
|
|
//生产环境
|
// Midtrans.serverKey = serverKey;
|
// Midtrans.clientKey = clientKey;
|
// Midtrans.isProduction = true;
|
Beneficiaries beneficiaries = getBeneficiaries(beneficiary_account);
|
if(null == beneficiaries){
|
ResultUtil resultUtil = addBeneficiaries(beneficiary_name, alias_name, beneficiary_account, beneficiary_bank, beneficiary_email);
|
if(resultUtil.getCode() != 200){
|
System.err.println(resultUtil.getMsg());
|
return resultUtil;
|
}
|
}else{
|
ResultUtil resultUtil = editBeneficiaries(beneficiary_name, alias_name, beneficiary_account, beneficiary_bank, beneficiary_email);
|
if(resultUtil.getCode() != 200){
|
return resultUtil;
|
}
|
}
|
|
List<Map<String, Object>> list = new ArrayList<>();
|
Map<String, Object> map = new HashMap<>();
|
map.put("beneficiary_name", beneficiary_name);
|
map.put("beneficiary_account", beneficiary_account);
|
map.put("beneficiary_bank", beneficiary_bank);
|
map.put("beneficiary_email", beneficiary_email);
|
map.put("amount", amount.toString());
|
map.put("notes", notes);
|
list.add(map);
|
|
Map<String, Object> requestBody = new HashMap<>();
|
requestBody.put("payouts", list);
|
JSONObject jsonObject = IrisApi.createPayouts(requestBody, Config.getGlobalConfig());
|
JSONArray payouts = jsonObject.getJSONArray("payouts");
|
JSONObject jsonObject1 = payouts.getJSONObject(0);
|
String status = jsonObject1.getString("status");//状态(queued:付款正在等待执行,processed:付款请求已发送到银行并完成,completed:付款请求将发送到银行并通过收款人帐户接收,failed:付款未通过)
|
String reference_no = jsonObject1.getString("reference_no");//流水号
|
if("queued".equals(status)){
|
return ResultUtil.success("付款正在等待执行", reference_no, "0");
|
}
|
if("processed".equals(status)){
|
return ResultUtil.success("付款请求已发送到银行并完成", reference_no, "1");
|
}
|
if("completed".equals(status)){
|
return ResultUtil.success("付款请求将发送到银行并通过收款人帐户接收", reference_no, "1");
|
}
|
if("failed".equals(status)){
|
return ResultUtil.error("付款未通过");
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
return ResultUtil.runErr();
|
}
|
return ResultUtil.error("未知错误");
|
}
|
|
|
/**
|
* 确认转账付款操作
|
* @param reference_no 转账流水号
|
* @param otp 谷歌身份验证OTP(QR码将在合作伙伴注册期间发送到审批者的电子邮件)
|
* @return
|
*/
|
public static ResultUtil approve(String reference_no, String otp){
|
try {
|
//沙箱环境
|
Midtrans.serverKey = sandbox_serverKey;
|
Midtrans.clientKey = sandbox_clientKey;
|
Midtrans.isProduction = false;
|
|
//生产环境
|
// Midtrans.serverKey = serverKey;
|
// Midtrans.clientKey = clientKey;
|
// Midtrans.isProduction = true;
|
|
List<String> list = new ArrayList<>();
|
list.add(reference_no);
|
|
Map<String, Object> requestBody = new HashMap<>();
|
requestBody.put("reference_nos", list);
|
requestBody.put("otp", otp);
|
JSONObject jsonObject = IrisApi.approvePayouts(requestBody, Config.getGlobalConfig());
|
String status = jsonObject.getString("status");
|
if("ok".equals(status)){
|
return ResultUtil.success();
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
return ResultUtil.runErr(e.getMessage());
|
}
|
return ResultUtil.error("未知错误");
|
}
|
|
|
/**
|
* 拒绝转账付款操作
|
* @param reference_no 转账流水号
|
* @param reject_reason 拒绝付款的原因
|
* @return
|
*/
|
public static ResultUtil reject(String reference_no, String reject_reason){
|
try {
|
//沙箱环境
|
Midtrans.serverKey = sandbox_serverKey;
|
Midtrans.clientKey = sandbox_clientKey;
|
Midtrans.isProduction = false;
|
|
//生产环境
|
// Midtrans.serverKey = serverKey;
|
// Midtrans.clientKey = clientKey;
|
// Midtrans.isProduction = true;
|
|
List<String> list = new ArrayList<>();
|
list.add(reference_no);
|
|
Map<String, Object> requestBody = new HashMap<>();
|
requestBody.put("reference_nos", list);
|
requestBody.put("reject_reason", reject_reason);
|
JSONObject jsonObject = IrisApi.rejectPayouts(requestBody, Config.getGlobalConfig());
|
String status = jsonObject.getString("status");
|
if("ok".equals(status)){
|
return ResultUtil.success();
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
return ResultUtil.runErr(e.getMessage());
|
}
|
return ResultUtil.error("未知错误");
|
}
|
|
|
/**
|
* 获取转账付款详情
|
* @param reference_no
|
* @return
|
*/
|
public static ResultUtil<Integer> getPayout(String reference_no){
|
/**
|
* {
|
* "amount": "200000.00", 已处理的付款金额
|
* "beneficiary_name": "Ryan Renolds", 收款人姓名
|
* "beneficiary_account": "33287352", 收款人的收款账号
|
* "bank": "Bank Central Asia ( BCA )", 收款人使用的银行名称
|
* "reference_no": "83hgf882", 付款流水号reference_no
|
* "notes": "Payout June 17", 备注
|
* "beneficiary_email": "beneficiary@example.com", 邮箱
|
* "status": "queued", 状态
|
* "created_by": "John Doe", 由制造商创建的付款
|
* "created_at": "2017-01-11T00:00:00Z",
|
* "updated_at": "2017-01-11T00:00:00Z"
|
* }
|
*/
|
try {
|
//沙箱环境
|
Midtrans.serverKey = sandbox_serverKey;
|
Midtrans.clientKey = sandbox_clientKey;
|
Midtrans.isProduction = false;
|
|
//生产环境
|
// Midtrans.serverKey = serverKey;
|
// Midtrans.clientKey = clientKey;
|
// Midtrans.isProduction = true;
|
|
JSONObject jsonObject = IrisApi.getPayoutDetails(reference_no, Config.getGlobalConfig());
|
String status = jsonObject.getString("status");
|
if("queued".equals(status)){
|
return ResultUtil.success("付款正在等待执行", 0);
|
}
|
if("processed".equals(status)){
|
return ResultUtil.success("付款请求已发送到银行并完成", 1);
|
}
|
if("completed".equals(status)){
|
return ResultUtil.success("付款请求将发送到银行并通过收款人帐户接收", 1);
|
}
|
if("failed".equals(status)){
|
return ResultUtil.error("付款未通过");
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
return ResultUtil.runErr();
|
}
|
return ResultUtil.error("未知错误");
|
}
|
|
|
|
}
|