前言
大宗物资行业实现货物的快速周转,对公司利润率影响很大,大宗物资特性决定了资金的大额收入,往往单次资金支付都是过百万,所以必须是通过银行支付,没办法通过微信或者支付宝。现有的一些银企直联系统,实际17点之后的收付流水就会在第二日做推送,但往往业务对资金是否到账的查询要求非常及时,钱到账后才可以进行货权的转移,规避业务风险。本文章通过银行支付短信通知来解决到账通知查询。
一、前提条件
首先必须开通银行帐户变动短信通知,在实际业务过程中,笔者公司还没有出现过公对公付款收到了银行短信,第二天网银查询资金没有到账情况。
二、收款短信的格式
笔者这里是中国银行的开户,收款通知的短信实例如下:
您公司账户XXXXX,于02051143收入(网银网上支付)人民币800000.00当前余额999999,对方为XXXXXX(账号*3333)(我行吸收的本外币存款依照《存款保险条例》受到保护)【中国银行】
收款信息的格式是相对固定的,都是以您公司账户XXXXX开头,如果不是这个开头,那么收到短信认为不是收款短信。同时如果短信内容含有 支出 ,认为也不是收款短信,而是支付短信;如果短信不含 “对方为” ,也认为不是收款短信。那么从短信中我们可以提取出以下信息。
三、短信提出所需要的信息
实例中02051143就是收款发生事件 0205 ,2月5日;1143 事件11:43, 正则匹配规则:
Match m3 = Regex.Match(totalMessage, @"[0-9]{8}");
人民币800000.00 就是支付的金额,匹配正则为:
string numberPattern = @"币([0-9]{2,}\.?[0-9]{2})";
方为XXXXXX 为付款的单位,匹配正则规则为:
Match m2 = Regex.Match(totalMessage, @"对方为(.*?)\(");
这样就可以解析出我们所需要的核心信息,对方付款时间、付款人、付款金额
四、如何接收短信
1. 开个手机号
银行短信只能发送到固定的号码,所以必须先去开个号,网上的短信平台发送号码是不行的。
2. 购置短信接收设备
在京东上可以买到支持4g的短信接收猫,并且提供接收sdk和范例的。
3. 通过com口连接短信接收设备。
程序轮询com口来查询是否短信接收过来。
4. 短信拼接
一条短信的字符数是有限制的,往往我们认为是一条短信,实际接收是被拆成两条的。如下:
95566 230201您公司账户9765,于02051143收入(网银网上支付)人民币800000.00当前余额6603079.14,对方为云南海盈商贸有限
95566 230202公司(账号*7135)(我行吸收的本外币存款依照《存款保险条例》受到保护)【中国银行】
使用空格作为分隔符,得到数组前面是发送过来的号码,后面是短信正文内容。
string msgBody = Regex.Split(builder.ToString(), " +")[1];
msgbody的前6位十六进制为短信序号,如果是同一条短信,前4位是一样的,顺序是+1,通过这个规则来判断收到的短信是否是同一条短信被拆分,默认认为只会是被拆分为两条短信。
String msgCode = msgBody.Substring(0, 6);
rawMessage.ToDB(builder.ToString(),msgCode);
if (LastMessageCode != "" )
{
if (msgCode.Substring(0, 4) == LastMessageCode.Substring(0, 4) && (RecDateTime - LastDateTime).TotalSeconds < 30 ) //两次信息的差小于30 .如果两次的时间差大于30秒那么表明不是同一条短信了
{
if (Convert.ToInt32(msgCode.Substring(5, 1)) > Convert.ToInt32(LastMessageCode.Substring(5, 1)))
{
if (msgBody.IndexOf("\r\n") < 5)
{
totalMessage = LastMessageBody + msgBody.Substring(6);
}
else {
totalMessage = LastMessageBody + msgBody.Substring(6, msgBody.IndexOf("\r\n") - 5);
}
}
else
{
if (msgBody.IndexOf("\r\n") < 5)
{
totalMessage = msgBody.Substring(6) + LastMessageBody;
}
else {
totalMessage = msgBody.Substring(6, msgBody.IndexOf("\r\n") - 5) + LastMessageBody;
}
}
totalMessage = totalMessage.Replace("\r", "").Replace("\n", "");
}
}
总结
需要解决的技术难点首先是如何接收短信,需要硬件配合了。
再次就是如何对接收短信进行拼接了。
拿到拼接的短信需要过滤到那些不是收款的短信。
根据固定的格式提取我们需要的收款信息了