Java SMS Payment system 如何按 # 拆分短信
支付阿杰
结论
使用 String.split("#") 就能把短信拆成 pay、merchant 和 amount。拆分后要检查字段数量和内容,避免格式错误的短信导致程序异常。
基本写法
String message = "pay#merchant#amount";
String[] parts = message.split("#");
if (parts.length == 3) {
String command = parts[0];
String merchant = parts[1];
String amount = parts[2];
System.out.println(command); // pay
System.out.println(merchant); // merchant
System.out.println(amount); // amount
} else {
System.out.println("短信格式错误,应为 pay#merchant#amount");
}
split() 接收的是正则表达式。# 在 Java 正则表达式中没有特殊含义,可以直接使用,不需要转义。
更稳妥的处理方式
收到的短信可能带有前后空格,也可能缺少字段或包含多余的 #。可以限制拆分次数,再逐项校验:
String message = receivedMessage.trim();
String[] parts = message.split("#", 3);
if (parts.length != 3) {
throw new IllegalArgumentException(
"短信格式错误,应为 pay#merchant#amount"
);
}
String command = parts[0].trim();
String merchant = parts[1].trim();
String amountText = parts[2].trim();
if (!"pay".equalsIgnoreCase(command)) {
throw new IllegalArgumentException("不支持的短信指令");
}
if (merchant.isEmpty() || amountText.isEmpty()) {
throw new IllegalArgumentException("商户和金额不能为空");
}
try {
BigDecimal amount = new BigDecimal(amountText);
if (amount.signum() <= 0) {
throw new IllegalArgumentException("金额必须大于 0");
}
// 校验商户、创建支付请求等后续处理
} catch (NumberFormatException e) {
throw new IllegalArgumentException("金额格式不正确", e);
}
还需要导入:
import java.math.BigDecimal;
split("#", 3) 最多生成三个部分。即使第三个字段中意外出现 #,也不会继续拆出更多数组元素。不过支付协议通常应直接拒绝不符合既定格式的消息。
注意事项
- 访问
parts[0]、parts[1]和parts[2]前必须检查数组长度,否则短信格式不完整时会抛出ArrayIndexOutOfBoundsException。 - Java 的
split()默认会丢弃末尾的空字段。例如,"pay#merchant#".split("#")可能只返回两个元素。需要保留空字段做严格校验时,可以使用:
String[] parts = message.split("#", -1);
- 支付金额应使用
BigDecimal,不要用float或double,以免产生二进制浮点精度问题。 - 拆分成功只能说明语法格式正确。执行支付前,还要验证发送方身份、商户是否存在、金额范围、重复请求,以及短信签名或验证码等安全信息。
- 如果以后把分隔符改成
*,由于*是正则表达式中的特殊字符,需要写成:
String[] parts = message.split("\\*");
备注:内容仅供参考。
