puzhibing
2023-05-18 0e01134519094f4c13a4d3aa97ec9610d40d8a58
修改bug
8个文件已修改
1个文件已删除
14个文件已添加
937 ■■■■■ 已修改文件
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/enums/BankEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserCallbackController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WithdrawalServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/TinggPayUtil.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/TinggPayoutUtil.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/AuthStatus.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/CallbackRequest.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Credentials.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/ExtraData.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Packet.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayOutload.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Payload.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Payout.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayoutCallbackRequest.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayoutCallbackResponse.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayoutPacket.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayoutResponse.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Results.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/resources/application.yml 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/test/java/com/stylefeng/guns/TestGunsApplication.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/test/sql/test.sql 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/enums/BankEnum.java
@@ -8,7 +8,6 @@
 */
@Getter
public enum BankEnum {
    KCB_BANK("0001", "KCB"),
    STANCHART_BANK("0002", "Stanchart"),
    ABSA_BANK("0003", "ABSA"),
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -16,10 +16,7 @@
import com.stylefeng.guns.modular.system.model.UserInfo;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.system.util.Tingg.model.CallbackRequest;
import com.stylefeng.guns.modular.system.util.Tingg.model.CallbackResponse;
import com.stylefeng.guns.modular.system.util.Tingg.model.CheckoutRequest;
import com.stylefeng.guns.modular.system.util.Tingg.model.Payments;
import com.stylefeng.guns.modular.system.util.Tingg.model.*;
import com.stylefeng.guns.modular.system.warpper.*;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
import com.stylefeng.guns.modular.taxi.model.TransactionDetails;
@@ -1475,4 +1472,27 @@
            e.printStackTrace();
        }
    }
    @ResponseBody
    @PostMapping("/base/IGO/tinggPayoutCallback")
    public PayoutCallbackResponse tinggPayoutCallback(@RequestBody PayoutCallbackRequest request){
        System.err.println("转账回调>>>>" + JSON.toJSONString(request));
        PayoutCallbackResponse payoutCallbackResponse = new PayoutCallbackResponse();
        AuthStatus authStatus = new AuthStatus();
        authStatus.setAuthStatusCode(131);
        authStatus.setAuthStatusDescription("Authentication was successful");
        payoutCallbackResponse.setAuthStatus(authStatus);
        Results results = new Results();
        PayoutPacket packet = request.getPayload().getPacket();
        String beepTransactionID = packet.getBeepTransactionID();
        String payerTransactionID = packet.getPayerTransactionID();
        results.setBeepTransactionID(beepTransactionID);
        results.setPayerTransactionID(payerTransactionID);
        results.setStatusCode("188");
        results.setStatusDescription("Response was received");
        payoutCallbackResponse.setResults(results);
        return payoutCallbackResponse;
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserCallbackController.java
@@ -28,9 +28,6 @@
    @Autowired
    private IUserInfoService userInfoService;
    /*@Autowired
    private ICBCPayUtil icbcPayUtil;*/
    @Autowired
    private PayMoneyUtil payMoneyUtil;
@@ -41,8 +38,9 @@
     * @param callbackRequest
     */
    @ResponseBody
    @PostMapping("/wxCancelUserBalance")
    @PostMapping("/IGO/wxCancelUserBalance")
    public CallbackResponse wxCancelUserBalance(@RequestBody CallbackRequest callbackRequest){
        System.err.println("支付成功回调------>" + JSON.toJSONString(callbackRequest));
        CallbackResponse callbackResponse = new CallbackResponse();
        try {
            /**
@@ -61,9 +59,9 @@
                Payments payments = callbackRequest.getPayments().get(0);
                String order_id = payments.getPayer_transaction_id();
                if(ToolUtil.isNotEmpty(out_trade_no)){
                    Integer language = Integer.valueOf(out_trade_no.substring(17, 18));
                    Integer id = Integer.valueOf(out_trade_no.substring(18));
                    userInfoService.payCancelUserBalance(null, order_id, Integer.valueOf(id), 1, language);
//                    Integer language = Integer.valueOf(out_trade_no.substring(17, 18));
//                    Integer id = Integer.valueOf(out_trade_no.substring(18));
//                    userInfoService.payCancelUserBalance(null, order_id, Integer.valueOf(id), 1, language);
                    callbackResponse.setCheckout_request_id(order_id);
                    callbackResponse.setMerchant_transaction_id(out_trade_no);
                    callbackResponse.setStatus_code("183");
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -491,7 +491,7 @@
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(userInfo.getPhone()));
            checkoutRequest.setCustomerEmail(userInfo.getEmail());
            checkoutRequest.setAccountNumber(accountNumber);
            checkoutRequest.setAccountNumber(userInfo.getPhone());
            checkoutRequest.setCustomerFirstName(userInfo.getFirstName());
            checkoutRequest.setCustomerLastName(userInfo.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/WithdrawalServiceImpl.java
@@ -8,6 +8,10 @@
import com.stylefeng.guns.modular.system.service.IUserInfoService;
import com.stylefeng.guns.modular.system.service.IWithdrawalService;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.Tingg.TinggPayoutUtil;
import com.stylefeng.guns.modular.system.util.Tingg.model.AuthStatus;
import com.stylefeng.guns.modular.system.util.Tingg.model.PayoutResponse;
import com.stylefeng.guns.modular.system.util.Tingg.model.Results;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
@@ -29,8 +33,8 @@
    @Autowired
    private IUserInfoService userInfoService;
  /*  @Autowired
    private ICBCPayUtil icbcPayUtil;*/
    @Autowired
    private TinggPayoutUtil tinggPayoutUtil;
    private Map<String, Timer> timerMap = new HashMap<>();
@@ -70,8 +74,17 @@
        withdrawal.setUserId(uid);
        withdrawal.setUserType(1);
        /*ResultUtil<String> transfer = icbcPayUtil.transfer(Double.valueOf(withdrawal.getMoney() * 100).longValue(), withdrawal.getCode(), withdrawal.getName());
        withdrawal.setSerialNo(transfer.getData());*/
        PayoutResponse payoutResponse = tinggPayoutUtil.sendPayout("+233" + userInfo.getPhone(), withdrawal.getCode(), withdrawal.getMoney(), "", "用户提现");
        AuthStatus authStatus = payoutResponse.getAuthStatus();
        Results results = payoutResponse.getResults().get(0);
        String statusCode = results.getStatusCode();
        if(!"131".equals(authStatus.getAuthStatusCode())){
            return ResultUtil.error(authStatus.getAuthStatusDescription());
        }
        if(!"139".equals(statusCode)){
            return ResultUtil.error(results.getStatusDescription());
        }
        withdrawal.setSerialNo(results.getBeepTransactionID());
        this.insert(withdrawal);
        double v = new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/TinggPayUtil.java
@@ -2,10 +2,16 @@
import com.alibaba.fastjson.JSON;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.Tingg.model.CallbackRequest;
import com.stylefeng.guns.modular.system.util.Tingg.model.CheckoutRequest;
import io.cellulant.model.Payload;
import io.cellulant.service.CheckoutEncryption;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -14,11 +20,11 @@
 */
public class TinggPayUtil {
    private static String accessKey = "KxjPP444jEE7K88E7juej4PKqqzKq7qKjKj84q744q9zj4Ej4zK47uj4KKj4";
    private static String accessKey = "8rc1gTV9n91Tc1Sy9oVWry99fgrgrVV8concf9onWooWSg9TVW8nSgo98g88";
    private static String ivKey = "qsffKsCOJJdhSBCQ";
    private static String ivKey = "ABp0pqpHMteEJM2N";
    private static String secretKey = "9jjz4Ex74P8ue4qK";
    private static String secretKey = "rf8Vo1n9yTSW98cg";
    /**
@@ -32,7 +38,7 @@
            Payload payload = getPayload(checkoutRequest);
            String param = checkoutEncrption.encrypt(payload);
            System.out.println("Encrpted payload=" + param);
            String url = "https://online.uat.tingg.africa/testing/express/checkout?encrypted_payload=" + param + "&access_key=" + accessKey;
            String url = "https://checkout.tingg.africa/express/checkout?encrypted_payload=" + param + "&access_key=" + accessKey;
            return ResultUtil.success(url);
        }catch (Exception e){
            e.printStackTrace();
@@ -47,7 +53,7 @@
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String countryCode="GHA";//收取付款的国家的3位ISO代码
        String currencyCode = "GHS";//3位ISO代码的货币,商家正在开发票。
        String serviceCode="IGOGHANA";//服务代码
        String serviceCode="I-GO_TECHNOLOGIES_LI";//服务代码
        String dueDate = sdf.format(new Date(System.currentTimeMillis() + 1800000));//到期时间
        String languageCode="EN";
        String paymentOptionCode = "";//支付选项码
@@ -59,19 +65,41 @@
    }
    public static CallbackRequest getRequestParam(HttpServletRequest request) throws IOException {
        // 读取参数
        InputStream inputStream;
        StringBuilder sb = new StringBuilder();
        inputStream = request.getInputStream();
        String s;
        BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        while ((s = in.readLine()) != null) {
            sb.append(s);
        }
        in.close();
        inputStream.close();
        String json = sb.toString();
        System.err.println("结果-----》" + json);
        CallbackRequest callbackRequest = JSON.parseObject(json, CallbackRequest.class);
        return callbackRequest;
    }
    public static void main(String[] ages){
        CheckoutRequest checkoutRequest = new CheckoutRequest();
        checkoutRequest.setMsisdn(233240000000L);
        checkoutRequest.setMsisdn(Long.valueOf("233244915521"));
        checkoutRequest.setCustomerEmail("393733352@qq.com");
        checkoutRequest.setAccountNumber("4111111111111111");
        checkoutRequest.setCustomerFirstName("zhibing");
        checkoutRequest.setCustomerLastName("pu");
        checkoutRequest.setAccountNumber("233244915521");
        checkoutRequest.setCustomerFirstName("XIONG");
        checkoutRequest.setCustomerLastName("GOU");
        checkoutRequest.setRequestAmount(1.00D);
        checkoutRequest.setMerchantTransactionId("123456T");
        checkoutRequest.setMerchantTransactionId("00016");
        checkoutRequest.setRequestDescription("payment test");
        checkoutRequest.setCallbackUrl("https://10pz685243.zicp.fun");
        checkoutRequest.setPendingRedirectUrl("https://10pz685243.zicp.fun");
        checkoutRequest.setSuccessRedirectUrl("https://10pz685243.zicp.fun");
        checkoutRequest.setCallbackUrl("https://10pz685243.zicp.fun/base/IGO/wxCancelUserBalance");
        checkoutRequest.setPendingRedirectUrl("https://www.baidu.com");
        checkoutRequest.setSuccessRedirectUrl("https://www.baidu.com");
        checkoutRequest.setFailRedirectUrl("https://www.baidu.com");
        ResultUtil resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
        System.err.println(JSON.toJSONString(resultUtil));
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/TinggPayoutUtil.java
New file
@@ -0,0 +1,75 @@
package com.stylefeng.guns.modular.system.util.Tingg;
import com.alibaba.fastjson.JSON;
import com.stylefeng.guns.modular.system.util.HttpClientUtil;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.Tingg.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * 转账
 * @author zhibing.pu
 * @date 2023/3/17 9:48
 */
@Component
public class TinggPayoutUtil {
    @Autowired
    private RestTemplate restTemplate;
    /**
     * 转账接口
     * @param phone                 电话号码,带国家代码+233
     * @param payerTransactionID    支付单号
     * @param amount                支付金额
     * @param callbackUrl           回调地址
     * @param narration             备注
     * @return
     */
    public PayoutResponse sendPayout(String phone, String payerTransactionID, Double amount, String callbackUrl, String narration) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Credentials credentials = new Credentials("igo_api_user", "mXo%kJM.p;_i)SSZ&^b?6XSH)D+OCPh8");
        List<Packet> packets = new ArrayList<>();
        Packet packet = new Packet();
        packet.setServiceCode("GH-TIGO-B2C");//手机网络运营商 GH-MTN-B2C、GH-TIGO-B2C、GH-VODAFONE-B2C、GH-AIRTEL-B2C
        packet.setMSISDN(phone);
        packet.setAccountNumber(phone);
        packet.setPayerTransactionID(payerTransactionID);
        packet.setAmount(amount);
        packet.setNarration(narration);
        packet.setDatePaymentReceived(sdf.format(new Date()));
        packet.setExtraData(new ExtraData(callbackUrl));
        packet.setCurrencyCode("GHS");
        packets.add(packet);
        Payload payload = new Payload(credentials, packets);
        Payout payout = new Payout("GH", "BEEP.postPayment", payload);
        String string = JSON.toJSONString(payout);
        string = string.replace("mSISDN", "MSISDN");
        System.err.println(string);
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("text/plain");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        HttpEntity<String> formEntity = new HttpEntity<>(string, headers);
        String url = "https://apps.cellulant.co.ke:9801/globalApi/v2/JSON/";
        String s = restTemplate.postForObject(url, formEntity, String.class);
        PayoutResponse payoutResponse = JSON.parseObject(s, PayoutResponse.class);
        System.err.println(s);
        return payoutResponse;
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/AuthStatus.java
New file
@@ -0,0 +1,35 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * @author zhibing.pu
 * @date 2023/3/20 16:52
 */
public class AuthStatus {
    /**
     * 认证状态码
     * 131 客户端认证成功
     * 132 客户端认证失败
     * 174 具有匹配的适当描述的通用故障状态代码
     */
    private Integer authStatusCode;
    /**
     * 账号认证说明
     */
    private String authStatusDescription;
    public Integer getAuthStatusCode() {
        return authStatusCode;
    }
    public void setAuthStatusCode(Integer authStatusCode) {
        this.authStatusCode = authStatusCode;
    }
    public String getAuthStatusDescription() {
        return authStatusDescription;
    }
    public void setAuthStatusDescription(String authStatusDescription) {
        this.authStatusDescription = authStatusDescription;
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/CallbackRequest.java
@@ -1,8 +1,11 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
@@ -177,8 +180,13 @@
        return request_date;
    }
    public void setRequest_date(Date request_date) {
        this.request_date = request_date;
    public void setRequest_date(String request_date) {
        try {
            SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
            this.request_date = format.parse(request_date);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public String getService_code() {
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Credentials.java
New file
@@ -0,0 +1,49 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * 凭证
 * @author zhibing.pu
 * @date 2023/3/17 9:53
 */
public class Credentials {
    /**
     * 用户名称
     */
    private String username;
    /**
     * 密码
     */
    private String password;
    public Credentials() {
    }
    public Credentials(String username, String password) {
        this.username = username;
        this.password = password;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "Credentials{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/ExtraData.java
New file
@@ -0,0 +1,27 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * @author zhibing.pu
 * @date 2023/3/17 10:13
 */
public class ExtraData {
    /**
     * 回调地址
     */
    private String callbackUrl;
    public ExtraData() {
    }
    public ExtraData(String callbackUrl) {
        this.callbackUrl = callbackUrl;
    }
    public String getCallbackUrl() {
        return callbackUrl;
    }
    public void setCallbackUrl(String callbackUrl) {
        this.callbackUrl = callbackUrl;
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Packet.java
New file
@@ -0,0 +1,132 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * 实体包信息
 * @author zhibing.pu
 * @date 2023/3/17 9:56
 */
public class Packet {
    /**
     * 服务产品代码
     */
    private String serviceCode;
    /**
     * 进行支付的客户的手机号码。MSISDN应以国家代码开头,例如254xxxxxxxxx
     */
    private String MSISDN;
    /**
     * 账号为收款账号。如果是手机号码,则应以国家代码开头,例如254xxxxxxxxx
     */
    private String accountNumber;
    /**
     * 由银行为该事务生成的惟一transactionID。
     */
    private String payerTransactionID;
    /**
     * 客户支付的金额
     */
    private Double amount;
    /**
     * 备注信息
     */
    private String narration;
    /**
     * 付款人收到付款的日期。yyyy-mm-dd hh: mm: ss。
     */
    private String datePaymentReceived;
    /**
     * 额外数据
     */
    private ExtraData extraData;
    /**
     * 交易货币的 ISO 代码。
     */
    private String currencyCode;
    public String getServiceCode() {
        return serviceCode;
    }
    public void setServiceCode(String serviceCode) {
        this.serviceCode = serviceCode;
    }
    public String getMSISDN() {
        return MSISDN;
    }
    public void setMSISDN(String MSISDN) {
        this.MSISDN = MSISDN;
    }
    public String getAccountNumber() {
        return accountNumber;
    }
    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber;
    }
    public String getPayerTransactionID() {
        return payerTransactionID;
    }
    public void setPayerTransactionID(String payerTransactionID) {
        this.payerTransactionID = payerTransactionID;
    }
    public Double getAmount() {
        return amount;
    }
    public void setAmount(Double amount) {
        this.amount = amount;
    }
    public String getNarration() {
        return narration;
    }
    public void setNarration(String narration) {
        this.narration = narration;
    }
    public String getDatePaymentReceived() {
        return datePaymentReceived;
    }
    public void setDatePaymentReceived(String datePaymentReceived) {
        this.datePaymentReceived = datePaymentReceived;
    }
    public ExtraData getExtraData() {
        return extraData;
    }
    public void setExtraData(ExtraData extraData) {
        this.extraData = extraData;
    }
    public String getCurrencyCode() {
        return currencyCode;
    }
    public void setCurrencyCode(String currencyCode) {
        this.currencyCode = currencyCode;
    }
    @Override
    public String toString() {
        return "Packet{" +
                "serviceCode='" + serviceCode + '\'' +
                ", MSISDN='" + MSISDN + '\'' +
                ", accountNumber='" + accountNumber + '\'' +
                ", payerTransactionID='" + payerTransactionID + '\'' +
                ", amount=" + amount +
                ", narration='" + narration + '\'' +
                ", datePaymentReceived='" + datePaymentReceived + '\'' +
                ", extraData=" + extraData +
                ", currencyCode='" + currencyCode + '\'' +
                '}';
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayOutload.java
New file
@@ -0,0 +1,33 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * @author zhibing.pu
 * @date 2023/3/20 16:33
 */
public class PayOutload {
    /**
     * 凭证
     */
    private Credentials credentials;
    /**
     * 实体包信息
     */
    private PayoutPacket packet;
    public Credentials getCredentials() {
        return credentials;
    }
    public void setCredentials(Credentials credentials) {
        this.credentials = credentials;
    }
    public PayoutPacket getPacket() {
        return packet;
    }
    public void setPacket(PayoutPacket packet) {
        this.packet = packet;
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Payload.java
New file
@@ -0,0 +1,51 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
import java.util.List;
/**
 * 退款实体
 * @author zhibing.pu
 * @date 2023/3/17 9:51
 */
public class Payload {
    /**
     * 凭证
     */
    private Credentials credentials;
    /**
     * 实体包信息
     */
    private List<Packet> packet;
    public Payload() {
    }
    public Payload(Credentials credentials, List<Packet> packet) {
        this.credentials = credentials;
        this.packet = packet;
    }
    public Credentials getCredentials() {
        return credentials;
    }
    public void setCredentials(Credentials credentials) {
        this.credentials = credentials;
    }
    public List<Packet> getPacket() {
        return packet;
    }
    public void setPacket(List<Packet> packet) {
        this.packet = packet;
    }
    @Override
    public String toString() {
        return "Payload{" +
                "credentials=" + credentials +
                ", packet=" + packet +
                '}';
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Payout.java
New file
@@ -0,0 +1,54 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * 退款
 * @author zhibing.pu
 * @date 2023/3/17 9:49
 */
public class Payout {
    /**
     * 国家代码
     */
    private String countryCode;
    /**
     * 接口类型
     */
    private String function;
    /**
     * 参数实体
     */
    private Payload payload;
    public Payout() {
    }
    public Payout(String countryCode, String function, Payload payload) {
        this.countryCode = countryCode;
        this.function = function;
        this.payload = payload;
    }
    public String getCountryCode() {
        return countryCode;
    }
    public void setCountryCode(String countryCode) {
        this.countryCode = countryCode;
    }
    public String getFunction() {
        return function;
    }
    public void setFunction(String function) {
        this.function = function;
    }
    public Payload getPayload() {
        return payload;
    }
    public void setPayload(Payload payload) {
        this.payload = payload;
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayoutCallbackRequest.java
New file
@@ -0,0 +1,45 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * 转账回调请求
 * @author zhibing.pu
 * @date 2023/3/20 16:31
 */
public class PayoutCallbackRequest {
    /**
     * 国家代码
     */
    private String countryCode;
    /**
     * 调用函数
     */
    private String function;
    /**
     * 数据
     */
    private PayOutload payload;
    public String getCountryCode() {
        return countryCode;
    }
    public void setCountryCode(String countryCode) {
        this.countryCode = countryCode;
    }
    public String getFunction() {
        return function;
    }
    public void setFunction(String function) {
        this.function = function;
    }
    public PayOutload getPayload() {
        return payload;
    }
    public void setPayload(PayOutload payload) {
        this.payload = payload;
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayoutCallbackResponse.java
New file
@@ -0,0 +1,33 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * 转账回调反馈
 * @author zhibing.pu
 * @date 2023/3/20 16:40
 */
public class PayoutCallbackResponse {
    /**
     * 认证状态及说明
     */
    private AuthStatus authStatus;
    /**
     *
     */
    private Results results;
    public AuthStatus getAuthStatus() {
        return authStatus;
    }
    public void setAuthStatus(AuthStatus authStatus) {
        this.authStatus = authStatus;
    }
    public Results getResults() {
        return results;
    }
    public void setResults(Results results) {
        this.results = results;
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayoutPacket.java
New file
@@ -0,0 +1,93 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * 实体包信息
 * @author zhibing.pu
 * @date 2023/3/17 9:56
 */
public class PayoutPacket {
    /**
     * 返回状态
     */
    private String statusCode;
    /**
     * 状态说明
     */
    private String statusDescription;
    /**
     * 正在支付账号。如果是手机号码,应该以国家代码开头,例如2547xxxxxxxx
     */
    private String beepTransactionID;
    /**
     * 由银行为该事务生成的惟一transactionID。
     */
    private String payerTransactionID;
    /**
     * 客户支付的金额。
     */
    private String receiptNumber;
    /**
     * 正在付款的叙述。
     */
    private String receiverNarration;
    public String getStatusCode() {
        return statusCode;
    }
    public void setStatusCode(String statusCode) {
        this.statusCode = statusCode;
    }
    public String getStatusDescription() {
        return statusDescription;
    }
    public void setStatusDescription(String statusDescription) {
        this.statusDescription = statusDescription;
    }
    public String getBeepTransactionID() {
        return beepTransactionID;
    }
    public void setBeepTransactionID(String beepTransactionID) {
        this.beepTransactionID = beepTransactionID;
    }
    public String getPayerTransactionID() {
        return payerTransactionID;
    }
    public void setPayerTransactionID(String payerTransactionID) {
        this.payerTransactionID = payerTransactionID;
    }
    public String getReceiptNumber() {
        return receiptNumber;
    }
    public void setReceiptNumber(String receiptNumber) {
        this.receiptNumber = receiptNumber;
    }
    public String getReceiverNarration() {
        return receiverNarration;
    }
    public void setReceiverNarration(String receiverNarration) {
        this.receiverNarration = receiverNarration;
    }
    @Override
    public String toString() {
        return "PayoutPacket{" +
                "statusCode='" + statusCode + '\'' +
                ", statusDescription='" + statusDescription + '\'' +
                ", beepTransactionID='" + beepTransactionID + '\'' +
                ", payerTransactionID='" + payerTransactionID + '\'' +
                ", receiptNumber='" + receiptNumber + '\'' +
                ", receiverNarration='" + receiverNarration + '\'' +
                '}';
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/PayoutResponse.java
New file
@@ -0,0 +1,35 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
import java.util.List;
/**
 * 转账回调反馈
 * @author zhibing.pu
 * @date 2023/3/20 16:40
 */
public class PayoutResponse {
    /**
     * 认证状态及说明
     */
    private AuthStatus authStatus;
    /**
     *
     */
    private List<Results> results;
    public AuthStatus getAuthStatus() {
        return authStatus;
    }
    public void setAuthStatus(AuthStatus authStatus) {
        this.authStatus = authStatus;
    }
    public List<Results> getResults() {
        return results;
    }
    public void setResults(List<Results> results) {
        this.results = results;
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/Tingg/model/Results.java
New file
@@ -0,0 +1,56 @@
package com.stylefeng.guns.modular.system.util.Tingg.model;
/**
 * @author zhibing.pu
 * @date 2023/3/20 16:55
 */
public class Results {
    /**
     * beep流水ID
     */
    private String beepTransactionID;
    /**
     * 交易id
     */
    private String payerTransactionID;
    /**
     * 188
     */
    private String statusCode;
    /**
     * 状态说明
     */
    private String statusDescription;
    public String getBeepTransactionID() {
        return beepTransactionID;
    }
    public void setBeepTransactionID(String beepTransactionID) {
        this.beepTransactionID = beepTransactionID;
    }
    public String getPayerTransactionID() {
        return payerTransactionID;
    }
    public void setPayerTransactionID(String payerTransactionID) {
        this.payerTransactionID = payerTransactionID;
    }
    public String getStatusCode() {
        return statusCode;
    }
    public void setStatusCode(String statusCode) {
        this.statusCode = statusCode;
    }
    public String getStatusDescription() {
        return statusDescription;
    }
    public void setStatusDescription(String statusDescription) {
        this.statusDescription = statusDescription;
    }
}
UserIGOTravel/guns-admin/src/main/resources/application.yml
@@ -1,5 +1,5 @@
server:
  port: 8006
  port: 82
guns:
  swagger-open: true              #是否开启swagger (true/false)
@@ -13,8 +13,8 @@
  application:
    name: user-server
  profiles:
#    active: dev
    active: produce
    active: dev
#    active: produce
  mvc:
    static-path-pattern: /static/**
    view:
@@ -50,24 +50,24 @@
  base-package: com.stylefeng.guns.modular
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/igotravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: HjKbXilb9zajmXbl
    db-name: guns #用来搜集数据库的所有表
    filters: wall,mergeStat
################# 测试环境 ###################
#spring:
#  datasource:
#    url: jdbc:mysql://127.0.0.1:3306/igotravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
#    username: root
#    password: 123456
#    password: HjKbXilb9zajmXbl
#    db-name: guns #用来搜集数据库的所有表
#    filters: wall,mergeStat
################# 测试环境 ###################
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/igotravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    db-name: guns #用来搜集数据库的所有表
    filters: wall,mergeStat
#多数据源情况的配置
guns:
  muti-datasource:
UserIGOTravel/guns-admin/src/test/java/com/stylefeng/guns/TestGunsApplication.java
New file
@@ -0,0 +1,26 @@
package com.stylefeng.guns;
import com.stylefeng.guns.modular.system.util.Tingg.TinggPayoutUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
 * @author zhibing.pu
 * @date 2023/3/17 11:27
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestGunsApplication {
    @Autowired
    private TinggPayoutUtil tinggPayoutUtil;
    @Test
    public void test(){
        tinggPayoutUtil.sendPayout("+233277211131", "00007", 1D, "https://10pz685243.zicp.fun/base/IGO/tinggPayoutCallback", "Transfer remittance");
    }
}
UserIGOTravel/guns-admin/src/test/sql/test.sql
File was deleted