跳到主要内容

附录 1

安全控制

响应页面 SHValue

商户和 PayMaster 将共享一个*​​ 密钥**,双方将使用该密钥为交易数据创建安全哈希值。

  • 密钥应从 PayMaster 网关获取。

支付响应消息将包括SHAlgorithmTypeSHValue。商户应使用这两个值来验证 PayMaster 发送的响应消息,以确保数据未被篡改。

要验证这一点,商家应从响应消息中删除尾部字段(t001_SHTt002_SHV),在剩余消息中附加商家的密钥,然后使用 SHA-256 HMAC 对字符串进行编码哈希算法。

获得编码结果后,将其与SHValue中的值进行比较。

  • 值必须相等。

例子

步骤 1: 删除预告片字段

从 PayMaster 网关返回的响应消息中删除尾部字段(最后两行)。

删除预告片值之前
h001_MTI=0290&h002_VNO=06&h003_TDT=20230811&h004_TTM=16241856&f001_MID=000010000012639&f004_PAN=545301XXXXXX5323&f005_ExpDate=2710&f006_TxnDtTm=20230811162418&f007_TxnAmt=000000000100&f009_RespCode=00&f010_CurrCode=458&f011_AuthIDResp=774585&f019_ExpTxnAmt=2&f023_RRN=322382167159&f024_OrgRespCode=00&f254_DDRespCode=00&f256_FICode=&f257_PGRN=230811162420AC069FNX&f258_TxnStatDetCde=0000&f259_TxnStatMsg=SUCCESS&f260_ServID=FNX&f261_HostID=&f262_SessID=&f263_MRN=20230811162418FNX&f270_ORN=&f277_DDRN=&f283_UPP_PM=00&f286_OrgDDRespCode=22&f350_CrdTyp=MST&f352_AcqBank=&f353_IPPTenure=&f325_ECommMercInd=1&f339_TokenFlg=N&f344_MercCustId=&f346_Token=&f347_TokenShrtNm=&f348_MaskPAN=&f365_POSEnvFlg=&t001_SHT=SH2&t002_SHV=FC63B34696B77153044E6D353D0241088A44EC13CCF5C414FFC30CE815C96614
删除预告片值后
h001_MTI=0290&h002_VNO=06&h003_TDT=20230811&h004_TTM=16241856&f001_MID=000010000012639&f004_PAN=545301XXXXXX5323&f005_ExpDate=2710&f006_TxnDtTm=20230811162418&f007_TxnAmt=000000000100&f009_RespCode=00&f010_CurrCode=458&f011_AuthIDResp=774585&f019_ExpTxnAmt=2&f023_RRN=322382167159&f024_OrgRespCode=00&f254_DDRespCode=00&f256_FICode=&f257_PGRN=230811162420AC069FNX&f258_TxnStatDetCde=0000&f259_TxnStatMsg=SUCCESS&f260_ServID=FNX&f261_HostID=&f262_SessID=&f263_MRN=20230811162418FNX&f270_ORN=&f277_DDRN=&f283_UPP_PM=00&f286_OrgDDRespCode=22&f350_CrdTyp=MST&f352_AcqBank=&f353_IPPTenure=&f325_ECommMercInd=1&f339_TokenFlg=N&f344_MercCustId=&f346_Token=&f347_TokenShrtNm=&f348_MaskPAN=&f365_POSEnvFlg=

步骤 2: 将密钥附加到响应消息中

删除尾部字段后,将密钥附加到响应消息中。这将产生一个格式为“不带尾部字段的响应消息 + 密钥”的字符串。使用SHAlgorithmType中指定的算法对该字符串进行编码。在此示例中,使用 SHA-256

步骤 3: 将编码结果与哈希值进行比较

将编码结果与SHValue中的哈希值进行比较。这两个值必须匹配。

在这个例子中:

  • 假设密钥为00112233445566778899AABBCCDDEEFF,则哈希值为E73CEDA9D9A8D1AAF59BDB919EF7C82D52671A4B457CE816BCE91AFF31485259

商户必须拒绝任何不匹配的结果并将其报告给 PayMaster。

示例代码

public void resPayment() throws Exception {

String secretKey = "B96856FA91749A259F71340E3C6BC3478524320F218587D22071A35DD4E7BXXX";

String response = "h001_MTI=0290&h002_VNO=06&h003_TDT=20230811&h004_TTM=16241856&f001_MID=000010000012639&
f004_PAN=545301XXXXXX5323&f005_ExpDate=2710&f006_TxnDtTm=20230811162418&f007_TxnAmt=000000000100&f009_Resp
Code=00&f010_CurrCode=458&f011_AuthIDResp=774585&f019_ExpTxnAmt=2&f023_RRN=322382167159&f024_OrgRespCode=0
0&f254_DDRespCode=00&f256_FICode=&f257_PGRN=230811162420AC069FNX&f258_TxnStatDetCde=0000&f259_TxnStatMsg=S
UCCESS&f260_ServID=FNX&f261_HostID=&f262_SessID=&f263_MRN=20230811162418FNX&f270_ORN=&f277_DDRN=&f283_UPP_
PM=00&f286_OrgDDRespCode=22&f350_CrdTyp=MST&f352_AcqBank=&f353_IPPTenure=&f325_ECommMercInd=1&f339_TokenFl
g=N&f344_MercCustId=&f346_Token=&f347_TokenShrtNm=&f348_MaskPAN=&f365_POSEnvFlg=" + secretKey;

SecretKeySpec byteSecretKey = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
Mac sha256_MAC = Mac.getInstance("HmacSHA256");
sha256_MAC.init(byteSecretKey);

String hashed = this.bytesToHex(sha256_MAC.doFinal(response.getBytes()));

System.out.println(hashed.equalsIgnoreCase("FCXX3469XX7715304XX6XX53XX241088XX4EXX3CCXXC41XXFXX0CXX15XX6614"));
}

public String bytesToHex(byte[] bytes) {

StringBuilder sb = new StringBuilder();
byte[] var6 = bytes;
int var5 = bytes.length;

for(int var4 = 0; var4 < var5; ++var4) {
byte b = var6[var4];
sb.append(String.format("%02x", b));
}

return sb.toString();// 31
}