PAYATHON 2026

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("\\*");

备注:内容仅供参考。