在一个项目中,一般都会支付相关的业务,而涉及到支付必定会有转账的操作,转账这一步想起来算是比较关键的部分,这个接口的设计能力,也大致体现出一个人的水平。
昨天碰到了一个题目:
尝试用java编写一个转账接口,传入主要业务参数包括转出账号,转入账号,转账金额,完成转出和转入账号的资金处理,该服务要确保在资金处理时转出账户的余额不会透支,金额计算准确。
设计
首先一般在系统中的参数不会有这么少,一般情况下请求参数还会有一些公共的信息,比如请求来源(请求ip与系统)、请求流水号,请求时间,等信息。网关上一般会拦截一些不合法的请求
如果有返回结果,一般包含处理结果,响应时间,处理后的状态,原始的请求信息一般也会返回去
看要求是否有强一致性的需求,如果没有强一致性的需求,是否要及时返回结果。根据需求做出来,如果不用实时返回结果,可以在后端不断的重试,知道有最终结果,有强一致性的要求,则需要做一些特殊处理,如果没有保证最终一致性即可。
幂等性设计,一个唯一的请求流水号只能对应一笔支付,防止重复扣款
可能会涉及到一些其它的远程服务,做一些操作,这里就需要根据与其它系统协商来处理,当然这个接口的入参也要与会调用这个系统的人说下
题目说的,要对余额做判断,内部要判断用户的资金是否足够。可以从数据库层面上,让用户的余额不能小于0。金额计算准确,一般用BigDecimal。
写代码的时候注意一些规范事项
内部注意一些限制条件,账户是否合法
代码
我的代码里面没有做幂等性的处理。可能代码还有一些其它的问题,如果有没考虑到的点,欢迎指出
package me.aihe.demo;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.HashMap;
/**
* 尝试用java编写一个转账接口,