integration with cz host

This commit is contained in:
kizzy 2026-06-18 12:09:04 +07:00
parent 142716caa4
commit 349d1eed2c
11 changed files with 47 additions and 81 deletions

View File

@ -13,12 +13,29 @@ data class MockCardData(
object MockData { object MockData {
// private val mockCardData: MockCardData = MockCardData(
// cardNo="9503712156912514",
// expDate="2912",
// cardScheme="MPU",
// cardHolderName="Htin Kyaw Win",
// iccData="9503712156912514=29121010000000000000"
// )
// production card
// private val mockCardData: MockCardData = MockCardData(
// cardNo="9503220100322798",
// expDate="2912",
// cardScheme="MPU",
// cardHolderName="Htin Kyaw Win",
// iccData="9503220100322798=300110100000942"
// )
private val mockCardData: MockCardData = MockCardData( private val mockCardData: MockCardData = MockCardData(
cardNo="9503712156912514", cardNo="9503032443884321",
expDate="2912", expDate="3102",
cardScheme="MPU", cardScheme="MPU",
cardHolderName="Htin Kyaw Win", cardHolderName="Htin Kyaw Win",
iccData="9503712156912514=29121010000000000000" iccData="9503032443884321=310220100"
) )
fun generateMPUCard(): CardDataX = CardDataX().apply { fun generateMPUCard(): CardDataX = CardDataX().apply {

View File

@ -28,7 +28,8 @@ public final class TerminalKeyUtil {
SecurityOptV2 mSecurityOptV2 = BaseApplication.getInstance().mSecurityOptV2; SecurityOptV2 mSecurityOptV2 = BaseApplication.getInstance().mSecurityOptV2;
byte[] cvByte = ByteUtil.hexStr2Bytes("B7B520"); byte[] cvByte = ByteUtil.hexStr2Bytes("B7B520");
byte[] dataByte = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // byte[] dataByte = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // mpu
byte[] dataByte = ByteUtil.hexStr2Bytes("05FFB893726A5F1E59692D24E72E36AC");
byte[] makBytes = ByteUtil.hexStr2Bytes("250738083EC15BD3BA67D66B8A7AA13B"); byte[] makBytes = ByteUtil.hexStr2Bytes("250738083EC15BD3BA67D66B8A7AA13B");
// byte[] makCvBytes = ByteUtil.hexStr2Bytes("204E449B97"); // byte[] makCvBytes = ByteUtil.hexStr2Bytes("204E449B97");
@ -46,6 +47,7 @@ public final class TerminalKeyUtil {
int result = 0; int result = 0;
SystemParamsOperation.getInstance().setTMKIndex("9"); SystemParamsOperation.getInstance().setTMKIndex("9");
// SystemParamsOperation.getInstance().setInjectOnce(false);
if(!SystemParamsOperation.getInstance().isInjectOnce()) { if(!SystemParamsOperation.getInstance().isInjectOnce()) {
try { try {
// result = mSecurityOptV2.saveKeyDukpt(AidlConstantsV2.Security.KEY_TYPE_DUPKT_IPEK,IPEKByte,IPEKKCVByte,KSNByte,AidlConstantsV2.Security.KEY_ALG_TYPE_3DES,9); // result = mSecurityOptV2.saveKeyDukpt(AidlConstantsV2.Security.KEY_TYPE_DUPKT_IPEK,IPEKByte,IPEKKCVByte,KSNByte,AidlConstantsV2.Security.KEY_ALG_TYPE_3DES,9);

View File

@ -124,6 +124,7 @@ public class ISOMsgX extends BaseISOMsgX{
Map<String, MsgField> map = FieldUtils.fillEachFieldValue(rm, tradeData); Map<String, MsgField> map = FieldUtils.fillEachFieldValue(rm, tradeData);
tradeData.payDetail.setMsgType(MTI);
return packByte(map, MTI,hostName,isoMode); return packByte(map, MTI,hostName,isoMode);
} }

View File

@ -26,14 +26,11 @@ import java.security.KeyManagementException;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.KeyStoreException; import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.Certificate; import java.security.cert.Certificate;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory; import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -67,7 +64,6 @@ import sunmi.sunmiui.utils.LogUtil;
public class ISOSocket { public class ISOSocket {
private static final String TAG = ISOSocket.class.getSimpleName();
private static final int DEFAULT_TIMEOUT = 30 * 1000; private static final int DEFAULT_TIMEOUT = 30 * 1000;
private String serverIP; private String serverIP;
private int serverPort; private int serverPort;
@ -152,7 +148,7 @@ public class ISOSocket {
private SSLSocketFactory getSSLSocketFactory() private SSLSocketFactory getSSLSocketFactory()
throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException { throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {
CertificateFactory cf = CertificateFactory.getInstance("X.509"); CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = context.getResources().openRawResource(R.raw.mob_uat); // this cert file stored in \app\src\main\res\raw folder path InputStream caInput = context.getResources().openRawResource(R.raw.mob); // this cert file stored in \app\src\main\res\raw folder path
Certificate ca = cf.generateCertificate(caInput); Certificate ca = cf.generateCertificate(caInput);
caInput.close(); caInput.close();
@ -179,7 +175,7 @@ public class ISOSocket {
private OkHttpClient getClient() private OkHttpClient getClient()
throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException { throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {
CertificateFactory cf = CertificateFactory.getInstance("X.509"); CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = context.getResources().openRawResource(R.raw.mob_uat); // this cert file stored in \app\src\main\res\raw folder path InputStream caInput = context.getResources().openRawResource(R.raw.mob); // this cert file stored in \app\src\main\res\raw folder path
Certificate ca = cf.generateCertificate(caInput); Certificate ca = cf.generateCertificate(caInput);
caInput.close(); caInput.close();
@ -330,16 +326,9 @@ public class ISOSocket {
} }
return port; return port;
} }
private String formatDate(Date d) { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d); }
public void switchIp() { public void switchIp() {
isSwitchIp = true; isSwitchIp = true;
// serverIP = "posuat.myanmarorientalbank.com";
// serverPort = 5033;
// serverIP = "192.168.0.100";
// serverPort = 5001;
// serverIP = "103.84.101.82";
// serverPort = 60147;
serverIP = getSecondaryIp(); serverIP = getSecondaryIp();
serverPort = getSecondaryPort(); serverPort = getSecondaryPort();
} }
@ -360,13 +349,6 @@ public class ISOSocket {
if (!isSwitchIp) { if (!isSwitchIp) {
serverIP = getIp(); serverIP = getIp();
serverPort = getPort(); serverPort = getPort();
// serverIP = "192.168.0.100";
// serverPort = 5001;
// serverIP = "103.84.101.82";
// serverPort = 60147;
// SystemParamsOperation.getInstance().setSslSwitchStatus(true);
// serverIP = "posuat.myanmarorientalbank.com";
// serverPort = 5033;
} else { } else {
isSwitchIp = false; isSwitchIp = false;
} }
@ -402,51 +384,16 @@ public class ISOSocket {
if (SystemParamsOperation.getInstance().isSslOn()) { if (SystemParamsOperation.getInstance().isSslOn()) {
try { try {
OkHttpClient client = getClient();
// For MPU sslSocket = (SSLSocket) client.sslSocketFactory().createSocket();
TrustManager[] trustAll = new TrustManager[]{new X509TrustManager() { // while (!isSSLOnline(timeout,subscriber)) {
public void checkClientTrusted(X509Certificate[] chain, String authType) {} // Thread.sleep(150);
public void checkServerTrusted(X509Certificate[] chain, String authType) {} // subscriber.onError(new Throwable("java.net.SocketTimeoutException: connect timed out"));
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } // }
}};
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, trustAll, new SecureRandom());
SSLSocketFactory factory = ctx.getSocketFactory();
sslSocket = (SSLSocket) factory.createSocket();
sslSocket.setEnabledProtocols(new String[]{"TLSv1.2"});
sslSocket.setSoTimeout(60000); sslSocket.setSoTimeout(60000);
sslSocket.connect(new InetSocketAddress(serverIP, serverPort), connectTimeout); sslSocket.connect(new InetSocketAddress(serverIP, serverPort), connectTimeout);
// MPU
sslSocket.startHandshake();
SSLSession session = sslSocket.getSession();
LogUtil.d(TAG, "SSL handshake success to " + serverIP + ":" + serverPort + "\n");
LogUtil.d(TAG, "TLS handshake success to " + serverIP + ":" + serverPort + "\n");
LogUtil.d(TAG, "TLS version: " + session.getProtocol() + "\n");
LogUtil.d(TAG,"Cipher suite: " + session.getCipherSuite() + "\n");
try {
java.security.cert.Certificate[] chain = session.getPeerCertificates();
if (chain != null && chain.length > 0) {
LogUtil.d(TAG,"Peer certificates:\n");
for (int i = 0; i < chain.length; i++) {
X509Certificate x = (X509Certificate) chain[i];
LogUtil.d(TAG, " [" + i + "] Subject: " + x.getSubjectX500Principal().getName() + "\n");
LogUtil.d(TAG," Issuer: " + x.getIssuerX500Principal().getName() + "\n");
LogUtil.d(TAG," Valid: " + formatDate(x.getNotBefore()) + " - " + formatDate(x.getNotAfter()) + "\n");
}
}
} catch (Exception ignored) { }
inputStream = sslSocket.getInputStream(); inputStream = sslSocket.getInputStream();
outputStream = sslSocket.getOutputStream(); outputStream = sslSocket.getOutputStream();
@ -460,11 +407,6 @@ public class ISOSocket {
int len = -1; int len = -1;
if (reversalTestCaseFlag) { if (reversalTestCaseFlag) {
len = inputStream.read(recBuff); len = inputStream.read(recBuff);
} else {
int lenn = inputStream.read(recBuff);
String received = ByteUtil.bytes2HexStr(recBuff);
LogUtil.d(TAG,"Received Response :"+received);
} }
rLen = len; rLen = len;
@ -479,7 +421,7 @@ public class ISOSocket {
subscriber.onComplete(); subscriber.onComplete();
} catch (IOException | } catch (CertificateException | KeyStoreException | IOException |
NoSuchAlgorithmException | KeyManagementException e) { NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace(); e.printStackTrace();
subscriber.onError(e); subscriber.onError(e);
@ -516,11 +458,6 @@ public class ISOSocket {
int len = -1; int len = -1;
if (reversalTestCaseFlag) { if (reversalTestCaseFlag) {
len = inputStream.read(recBuff); len = inputStream.read(recBuff);
} else {
int lenn = inputStream.read(recBuff);
String received = ByteUtil.bytes2HexStr(recBuff);
LogUtil.d(TAG,"Received Response :"+received);
} }
rLen = len; rLen = len;

View File

@ -94,6 +94,7 @@ public class SignOnProcess {
System.arraycopy(field62, 0, encryptedPIK, 0, 8); System.arraycopy(field62, 0, encryptedPIK, 0, 8);
System.arraycopy(field62, 0, encryptedPIK, 8, 8); System.arraycopy(field62, 0, encryptedPIK, 8, 8);
// System.arraycopy(field62, 0, encryptedPIK, 0, 16);
try { try {
byte[] kcv = ByteUtil.hexStr2Bytes(TriDes.getKcv(encryptedPIK)); byte[] kcv = ByteUtil.hexStr2Bytes(TriDes.getKcv(encryptedPIK));
LogUtil.d(TAG, "Encrypted PIK:" + ByteUtil.bytes2HexStr(encryptedPIK)); LogUtil.d(TAG, "Encrypted PIK:" + ByteUtil.bytes2HexStr(encryptedPIK));
@ -122,6 +123,7 @@ public class SignOnProcess {
System.arraycopy(field62, 0, encryptedPIK, 0, 8); System.arraycopy(field62, 0, encryptedPIK, 0, 8);
System.arraycopy(field62, 0, encryptedPIK, 8, 8); System.arraycopy(field62, 0, encryptedPIK, 8, 8);
// System.arraycopy(field62, 0, encryptedPIK, 0, 16); // System.arraycopy(field62, 0, encryptedPIK, 0, 16);
try { try {

View File

@ -5,7 +5,8 @@ public enum HostName {
FINEXUS("FINEXUS"), FINEXUS("FINEXUS"),
CARDZONE("CARDZONE"), CARDZONE("CARDZONE"),
MPU("MPU"); MPU("MPU"),
MOB("MOB");
public final String name; public final String name;

View File

@ -44,7 +44,7 @@ public class HostUtils {
if (hostName == HostName.MPU) { if (hostName == HostName.MPU) {
bitmap = BitmapConfig.MPU_NEW_VOID; bitmap = BitmapConfig.MPU_NEW_VOID;
} else { } else {
bitmap = BitmapConfig.FINEXUS_VOID; bitmap = BitmapConfig.CZ_VOID;
} }
break; break;
case SETTLEMENT: case SETTLEMENT:

View File

@ -193,6 +193,7 @@ public class BitmapConfig {
public static final String MPU_NEW_CASH_ADVANCE="7020058020C09000"; public static final String MPU_NEW_CASH_ADVANCE="7020058020C09000";
public static final String CZ_SALE="7020058020C09000"; public static final String CZ_SALE="7020058020C09000";
public static final String CZ_VOID="723805802CC08010";
public static final String UPI_SALE = "7020058020C09200"; public static final String UPI_SALE = "7020058020C09200";

View File

@ -247,7 +247,7 @@ public class FieldConfig {
// for TTIP MPU // for TTIP MPU
// /* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'}, // /* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
/* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, ' '},
/* FLD 36 */ {3, SDK_8583_LEN_BCD, 999, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, '0'}, /* FLD 36 */ {3, SDK_8583_LEN_BCD, 999, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, '0'},
/* FLD 37 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, /* FLD 37 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'},

View File

@ -4,11 +4,13 @@ import android.text.TextUtils;
import com.sunmi.pay.hardware.aidl.AidlConstants; import com.sunmi.pay.hardware.aidl.AidlConstants;
import com.utsmyanmar.paylibs.Constant; import com.utsmyanmar.paylibs.Constant;
import com.utsmyanmar.paylibs.batch_upload.BatchUploadProcess;
import com.utsmyanmar.paylibs.model.MsgField; import com.utsmyanmar.paylibs.model.MsgField;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.TradeData; import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.model.enums.TransCVM; import com.utsmyanmar.paylibs.model.enums.TransCVM;
import com.utsmyanmar.paylibs.utils.enums.CardScheme; import com.utsmyanmar.paylibs.utils.enums.CardScheme;
import com.utsmyanmar.paylibs.utils.enums.HostName;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.Iterator; import java.util.Iterator;
@ -504,9 +506,12 @@ public class FieldUtils {
break; break;
case 60: //Private(oldMPU) //original Amount Void(new MPU) case 60: //Private(oldMPU) //original Amount Void(new MPU)
String field60 = tradeData.getField60(); String field60 = tradeData.getField60();
String lengthValue = String.format(Locale.getDefault(),"%04d", field60.length())+field60; String lengthValue = String.format(Locale.getDefault(),"%04d", field60.length())+field60;
field.setDataStr(lengthValue); field.setDataStr(lengthValue);
break; break;
case 61: case 61:
// TODO // TODO

View File

@ -83,7 +83,7 @@ public class Params {
payDetail.transNum = System.currentTimeMillis() / 1000; payDetail.transNum = System.currentTimeMillis() / 1000;
// need to add host logic in another place // need to add host logic in another place
// payDetail.setHostName("MPU"); // payDetail.setHostName("MPU");
payDetail.setHostName("MPU"); payDetail.setHostName("MOB");
// payDetail.setHostName("MOB"); // payDetail.setHostName("MOB");
payDetail.setOriginalTransDate(SystemDateTime.getMMDD()+SystemDateTime.getYYYY()); payDetail.setOriginalTransDate(SystemDateTime.getMMDD()+SystemDateTime.getYYYY());