刚做完支付的项目,写一下工作总结:
1.做项目需要有规划,做支付,总体看,其会包括多种支付方式,所以写一个公共的入口是很重要的。支付最基础的接口分为支付和回调两个入口。我们可以写一个公共的接口来实现,然后不通的支付方式,写不通的接口来继承这个父类的接口。同时把其发送的数据和接收的数据(payresult)封装到一个公共类里面。ag:
public interface A(){
public payrequest pay(payrequest);
public payrequest callback(payrequest);
}
public interface way1 implements A(){
......
//注意可以写支付方式1,他独特有的方法或者类。
boolean savePayRecord(String FlowNo);
}
2.细节方面。payresult里一般会有payAmount,channelNo(渠道),BaseBodyDto baseBodyDto(用来存放其接收货发送银行的实体数据)。
每一个实体类。例如:
public class BaseBodyDto implements Serializable (){
public String toString() {
return ToStringBuilder.reflectionToString(this,
ToStringStyle.SHORT_PREFIX_STYLE);
}
}
public class BocNetBody extends BaseBodyDto {
//写银行接收的参数,根据银行的文档,来定义DTO,
//根据不同的参数来定义
}
3.具体的实现。
public void way1Impl implenments way1{
//注入内部类实现。
@Autowired
@Qualifier("way2PayService")
private Way2PayService Way2PayService;
public Payrequest pay(payrequest){
}
public Payrequest callback(payrequest){
}
}
public class Way2PayServiceImpl extends BasePayService implements Way2PayService(){
//其是支付的内部类实现
};
注意此处的Qualifier(spingmvc的注解),由于其内部类Way2PayService Impl 即继承了BasePayService 有实现了Way2PayService,所以要声明一下这个引用是哪个类的。
BasePayService 里是一些基础的方法,一般是对流水的一些操作。由于不同的方式其加密和验证签名的方式是不同的,所以一般都写到自己封装的实体类里,或者独有的包和类里。BasePayService 注解的类,在其子类里可以直接使用。
4.大致的步骤就是以上三点。在此处具体的来实现一个支付方式。
银联的手机支付:支付接口Pay: 1.根据前面传过来的流水号,在支付流水里查询,其是否支付过,如果没有支付过,保存支付流水支付中,去支付。若支付过,看起支付的状态来判断其是否可以继续支付。
2.发送支付内容。
支付的回调内容:1:判断其流水是否为等待中,更新数据库的流水,如果成功修改数据库的订单状态。最后在finally中记入日历。