通联支付(POS机支付功能)

本文档详细记录了使用Java开发POS支付功能的过程,包括业务流程、接口设计和测试。主要内容涉及POS订单添加、查询、支付回调和差错借贷的实现,以及相关数据库表的设计和关键代码展示。在测试阶段,强调了接口的功能、请求参数和返回数据格式,并提醒了交易金额单位和类型转换的注意事项。

公司要求完成一个POS支付的功能,在完成后,为了让自己熟悉该功能的开发流程,防止下一次遇到类似的功能开发。于是以一个文档的形式来记录开发流程。

一:业务流程:

简介:前台页面需要根据项目生成的订单号生成一个二维码,二维码中只需要包括订单号,其余的均不需要添加。需要注意的是,在POS机扫描二维码时,需要在POS订单表中添加一条POS订单数据,也只需要添加POS订单号,其他可默认为0,因为该POS订单表中的参数均是由POS机扫描二维码后,POS系统返回的固定参数,所以一些非空属性可设置为0,因为支付完成后,会修改该POS订单表状态。下面是在开发过程中需要写到的接口:

1.1:POS订单添加:

根据订单号生成二维码,调用添加接口,:向POS订单表添加一条订单号的数据(调用POS订单添加接口)

1.2:订单查询:

POS机扫描二维码,POS系统调用订单查询接口,根据二维码订单号查询学员订单表数据,并返回固定格式信息(调用订单查询接口)

1.3:支付回调:

信息确认后,调用支付回调接口:根据POS系统返回参数,判断是支付回调还是差错借贷。

1.3.1:支付回调:

根据POS系统返回订单号,查询POS订单表该数据,修改数据属性修改成功后,若POS订单交易状态为成功,修改学员订单表支付状态。返回success或error

1.3.2:差错借贷:

根据POS系统返回订单号,查询POS订单表该数据,修改数据属性修改成功后,返回,不更改学员订单表支付状态。

二:开发代码:

2.1:建表:

POS订单表以该页面字段为例:(交易结构通知接口字段&&差错借贷记调整通知)

注意:支付回调和差错借贷调用的是同一接口,只是参数不同,所以需要将他们的参数全部放在一起,其中差错借贷有的参数与支付回调参数相同,可以不填。

https://aipboss.allinpay.com/know/devhelp/main.php?pid=10

POS订单表:与以上参数一样。

学员订单表:除了订单号,其余根据你的业务需求建表。

2.2:代码:

以下俩个实体类是在POS级扫描二维码后,查询订单后,返回的参数需要按照固定格式,需要这俩个实体类来固定格式,不可删除。

BaseRspEntity:

/**
 * 通联支付
 */
public class BaseRspEntity extends BaseEntity implements Serializable {

    private static final long serialVersionUID = -2562256053313369804L;
    public String retcode;
    public String retmsg;

    public String cusid;
    public String appid;
    public String randomstr;
    public String timestamp;

    public String sign;
    public String trxcode;

    public String getRetcode() {
        return retcode;
    }

    public void setRetcode(String retcode) {
        this.retcode = retcode;
    }

    public String getRetmsg() {
        return retmsg;
    }

    public void setRetmsg(String retmsg) {
        this.retmsg = retmsg;
    }

    public String getCusid() {
        return cusid;
    }

    public void setCusid(String cusid) {
        this.cusid = cusid;
    }

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getRandomstr() {
        return randomstr;
    }

    public void setRandomstr(String randomstr) {
        this.randomstr = randomstr;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public String getTrxcode() {
        return trxcode;
    }

    public void setTrxcode(String trxcode) {
        this.trxcode = trxcode;
    }

    public void initHead() {
        cusid = AppConstants.CUSID;
        appid = AppConstants.APPID;
        timestamp = FuncUtil.formatTime(new Date(), "yyyyMMddHHmmss");
        randomstr = FuncUtil.getRandcode(8);
        System.out.println("cusid="+cusid+"\tappid="+appid+"\ttimestamp="+timestamp+"\trandomstr:随机数="+randomstr);
    }

    public static BaseRspEntity getFaildResult(String msg) {
        BaseRspEntity rsp = new BaseRspEntity();
        System.out.println("启动initHead方法");
        rsp.initHead();
        rsp.setRetcode("9999");
        System.out.println("rsp.getRetcode()="+rsp.getRetcode());
        rsp.setRetmsg(msg);
        System.out.println("rsp.getRetmsg()="+rsp.getRetmsg());
        return rsp;
    }

}

QueryRspEntity:

/**
 * 通联支付(格式)
 */
public class QueryRspEntity extends BaseRspEntity implements Serializable {
    private static final long serialVersionUID = 5596863773999858690L;
    public String trxreserve;
    public String bizseq;
    public long amount;

    public String getTrxreserve() {
        return trxreserve;
    }

    public void setTrxreserve(String trxreserve) {
        this.trxreserve = trxreserve;
    }

    public String getBizseq() {
        return bizseq;
    }

    public void setBizseq(String bizseq) {
        this.bizseq = bizseq;
    }

    public long getAmount() {
        return amount;
    }

    public void setAmount(long amount) {
        this.amount = amount;
    }
}

POS订单表:

/**
 * 通联支付(POS订单表)
 */
public class CmbPosSignEntity extends BaseEntity implements Serializable {

    private static final long serialVersionUID = 8238140738398034733L;
    public Integer id;
    //交易类型
    public String trxcode;
    //收银宝APPID
    public String appid;
    //收银宝商户号
    public String cusid;
    //调用时间戳
    public String timestamp;
    //随机字符串
    public String randomstr;
    //sign校验码
    public String sign;
    //业务流水号
    public String bizseq;
    //交易结果状态码
    public String trxstatus;
    //交易金额
    public String amount;
    //交易流水号
    public String trxid;
    //原交易流水
    public String srctrxid;
    //交易请求日期
    public String trxday;
    //交易完成时间
    public String paytime;
    //终端编码
    public String termid;
    //终端批次号
    public String termbatchid;
    //终端流水
    public String traceno;
    //业务关联内容
    public String trxreserve;
    //借贷标志
    public String accttype;
    //交易帐号
    public String acct;
    //终端授权码
    public String termauthno;
    //终端参考号
    public String termrefnum;
    //手续费
    public String fee;
    //签名类型
    public String signtype;
    //第三方app交易号
    public String outtrxid;
    //原交易金额
    public String trxamt;
    //交易请求日期
    public String trxdate;
    //渠道交易单号
    public String chnltrxid;
    //终端号
    public String termno;
    //终端流水号
    public String termtraceno;
    //原交易通联平台流水号
    public String trxreserved;
    //原交易商户订单号
    public String cusorderid;

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTrxcode() {
        return trxcode;
    }

    public void setTrxcode(String trxcode) {
        this.trxcode = trxcode;
    }

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getCusid() {
        return cusid;
    }

    public void setCusid(String cusid) {
        this.cusid = cusid;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getRandomstr() {
        return randomstr;
    }

    public void setRandomstr(String randomstr) {
        this.randomstr = randomstr;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public String getBizseq() {
        return bizseq;
    }

    public void setBizseq(String bizseq) {
        this.bizseq = bizseq;
    }

    public String getTrxstatus() {
        return trxstatus;
    }

    public void setTrxstatus(String trxstatus) {
        this.trxstatus = trxstatus;
    }

    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }

    public String getTrxid() {
        return trxid;
    }

    public void setTrxid(String trxid) {
        this.trxid = trxid;
    }

    public String getSrctrxid() {
        return srctrxid;
    }

    public void setSrctrxid(String srctrxid) {
        this.srctrxid = srctrxid;
    }

    public String getTrxday() {
        return trxday;
    }

    public void setTrxday(String trxday) {
        this.trxday = trxday;
    }

    public String getPaytime() {
        return paytime;
    }

    public void setPaytime(String paytime) {
        this.paytime = paytime;
    }

    public String getTermid() {
        return termid;
    }

    public void setTermid(String termid) {
        this.termid = termid;
    }

    public String getTermbatchid() {
        return termbatchid;
    }

    public void setTermbatchid(String termbatchid) {
        this.termbatchid = termbatchid;
    }

    public String getTraceno() {
        return traceno;
    }

    public void setTraceno(String traceno) {
        this.traceno = traceno;
    }

    public String getTrxreserve() {
        return trxreserve;
    }

    public void setTrxreserve(String trxreserve) {
        this.trxreserve = trxreserve;
    }

    public String getAccttype() {
        return accttype;
    }

    public void setAccttype(String accttype) {
        this.accttype = accttype;
    }

    public String getAcct() {
        return acct;
    }

    public void setAcct(String acct) {
        this.acct = acct;
    }

    public String getTermauthno() {
        return termauthno;
    }

    public void setTermauthno(String termauthno) {
        this.termauthno = termauthno;
    }

    public String getTermrefnum() {
        return termrefnum;
    }

    public void setTermrefnum(String termrefnum) {
        this.termrefnum = termrefnum;
    }

    public String getFee() {
        return fee;
    }

    public void setFee(String fee) {
        this.fee = fee;
    }

    public String getSigntype() {
        return signtype;
    }

    public void setSigntype(String signtype) {
        this.signtype = signtype;
    }

    public String getOuttrxid() {
        return outtrxid;
    }

    public void setOuttrxid(String outtrxid) {
        this.outtrxid = outtrxid;
    }

    public String getTrxamt() {
        return trxamt;
    }

    public void setTrxamt(String trxamt) {
        this.trxamt = trxamt;
    }

    public String getTrxdate() {
        return trxdate;
    }

    public void setTrxdate(String trxdate) {
        this.trxdate = trxdate;
    }

    public String getChnltrxid() {
        return chnltrxid;
    }

    public void setChnltrxid(String chnltrxid) {
        this.chnltrxid = chnltrxid;
    }

    public String getTermno() {
        return termno;
    }

    public void setTermno(String termno) {
        this.termno = termno;
    }

    public String getTermtraceno() {
        return termtraceno;
    }

    public void setTermtraceno(String termtraceno) {
        this.termtraceno = termtraceno;
    }

    public String getTrxreserved() {
        return trxreserved;
    }

    public void setTrxreserved(String trxreserved) {
        this.trxreserved = trxreserved;
    }

    public String getCusorderid() {
        return cusorderid;
    }

    public void setCusorderid(String cusorderid) {
        this.cusorderid = cusorderid;
    }
}

学员订单表:只有订单号最重要,其他的根据业务需求随意

/**
 * 学员订单表(TBL_STUDENT_ORDER)
 * 
 * @author bianj
 * @version 1.0.0 2018-12-20
 */
public class StudentOrderEntity extends BaseEntity implements Serializable {
    private static final long serialVersionUID = -6434519100462395104L;

    /** 自增列 */
    private Integer id;

    /** 所属机构Id 关联机构表Id字段 */
    private Integer institutionid;

    /** 学员 关联学员表Id字段 */
    private Integer studentid;

    /** 订单编号 */
    private String orderno;

    /** 应收总计 */
    private Float totalreceivables;

    /** 使用余额 */
    private Float balanceused;

    /** 余额变更前 */
    private Float balancechangebefore;

    /** 余额变更后 */
    private Float balancechangeafter;

    /** 实收总计 */
    private Float totalcollection;

    /** 经办校区 关联组织机构表Id字段 */
    private Integer orgid;

    /** 销售来源 */
    private String salessource;

    /** 采单员 关联员工表Id */
    private Integer minerid;

    /** 电话销售 关联员工表Id */
    private Integer telesalesid;

    /** 销售员 关联员工表Id */
    private Integer salesid;

    /** 副销售员 关联员工表Id  */
    private Integer deputysalesid;

    /** 经办日期 */
    private String rundate;

    /** 创建时间 */
    private Date createtime;

    /** 创建用户Id 关联用户表Id字段 */
    private Integer createuserid;

    /** 关联学员订单表Id字段 */
    private Integer relatedorderid;

    /** 关联订单类型。1:日志 */
    private Integer relatedordertype;

    /** 订单类型。1:报名;2:账户余额变动;3:补费:4:转班;5:停课;6:复课;7:全额退费;8:部分退费;9:教材杂费;10:积分变动 */
    private Integer ordertype;

    /** 交易内容 */
    private String ordercontent;

    /** 欠费 */
    private Float arrears;

    /** 到款状态。0:未到款;1:已到款 */
    private Integer arrivalstatus;

    /** 对内备注 */
    private String remarkin;

    /** 对外备注 */
    private String remarkout;

    /** 积分变动 */
    private Float integralchanged;

    /** 积分变更前 */
    private Float integralchangebefore;

    /** 积分变更后 */
    private Float integralchangeafter;

    /** 报名类型  1:新办;2:续费;3:无 */
    private Integer signupstatus;

    /** 渠道 */
    private Integer channelid;

    public Integer getChannelid() {
        return channelid;
    }

    public void setChannelid(Integer channelid) {
        this.channelid = channelid;
    }

    public Integer getSignupstatus() {
        return signupstatus;
    }

    public void setSignupstatus(Integer signupstatus) {
        this.signupstatus = signupstatus;
    }

    /** 学员自定义属性 */
    private String studentsignuptag;

    public String getStudentsignuptag() {
        return studentsignuptag;
    }

    public void setStudentsignuptag(String studentsignuptag) {
        this.studentsignuptag = studentsignuptag;
    }

    /**
     * 获取自增列
     * 
     * @return 自增列
     */
    public Integer getId() {
        return this.id;
    }

    /**
     * 设置自增列
     * 
     * @param id
     *          自增列
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * 获取所属机构Id 关联机构表Id字段
     * 
     * @return 所属机构Id 关联机构表Id字段
     */
    public Integer getInstitutionid() {
        return this.institutionid;
    }

    /**
     * 设置所属机构Id 关联机构表Id字段
     * 
     * @param institutionid
     *          所属机构Id 关联机构表Id字段
     */
    public void setInstitutionid(Integer institutionid) {
        this.institutionid = institutionid;
    }

    /**
     * 获取学员 关联学员表Id字段
     * 
     * @return 学员 关联学员表Id字段
     */
    public Integer getStudentid() {
        return this.studentid;
    }

    /**
     * 设置学员 关联学员表Id字段
     * 
     * @param studentid
     *          学员 关联学员表Id字段
     */
    public void setStudentid(Integer studentid) {
        this.studentid = studentid;
    }

    /**
     * 获取订单编号
     * 
     * @return 订单编号
     */
    public String getOrderno() {
        return this.orderno;
    }

    /**
     * 设置订单编号
     * 
     * @param orderno
     *          订单编号
     */
    public void setOrderno(String orderno) {
        this.orderno = orderno;
    }

    /**
     * 获取应收总计
     * 
     * @return 应收总计
     */
    public Float getTotalreceivables() {
        return this.totalreceivables;
    }

    /**
     * 设置应收总计
     * 
     * @param totalreceivables
     *          应收总计
     */
    public void setTotalreceivables(Float totalreceivables) {
        this.totalreceivables = totalreceivables;
    }

    /**
     * 获取使用余额
     * 
     * @return 使用余额
     */
    public Float getBalanceused() {
        return this.balanceused;
    }

    /**
     * 设置使用余额
     * 
     * @param balanceused
     *          使用余额
     */
    public void setBalanceused(Float balanceused) {
        this.balanceused = balanceused;
    }

    /**
     * 获取余额变更前
     * 
     * @return 余额变更前
     */
    public Float getBalancechangebefore() {
        return this.balancechangebefore;
    }

    /**
     * 设置余额变更前
     * 
     * @param balancechangebefore
     *          余额变更前
     */
    public void setBalancechangebefore(Float balancechangebefore) {
        this.balancechangebefore = balancechangebefore;
    }

    /**
     * 获取余额变更后
     * 
     * @return 余额变更后
     */
    public Float getBalancechangeafter() {
        return this.balancechangeafter;
    }

    /**
     * 设置余额变更后
     * 
     * @param balancechangeafter
     *          余额变更后
     */
    public void setBalancechangeafter(Float balancechangeafter) {
        this.balancechangeafter = balancechangeafter;
    }

    /**
     * 获取实收总计
     * 
     * @return 实收总计
     */
    public Float getTotalcollection() {
        return this.totalcollection;
    }

    /**
     * 设置实收总计
     * 
     * @param totalcollection
     *          实收总计
     */
    public void setTotalcollection(Float totalcollection) {
        this.totalcollection = totalcollection;
    }

    /**
     * 获取经办校区 关联组织机构表Id字段
     * 
     * @return 经办校区 关联组织机构表Id字段
     */
    public Integer getOrgid() {
        return this.orgid;
    }

    /**
     * 设置经办校区 关联组织机构表Id字段
     * 
     * @param orgid
     *          经办校区 关联组织机构表Id字段
     */
    public void setOrgid(Integer orgid) {
        this.orgid = orgid;
    }

    /**
     * 获取销售来源
     * 
     * @return 销售来源
     */
    public String getSalessource() {
        return this.salessource;
    }

    /**
     * 设置销售来源
     * 
     * @param salessource
     *          销售来源
     */
    public void setSalessource(String salessource) {
        this.salessource = salessource;
    }

    /**
     * 获取采单员 关联员工表Id
     * 
     * @return 采单员 关联员工表Id
     */
    public Integer getMinerid() {
        return this.minerid;
    }

    /**
     * 设置采单员 关联员工表Id
     * 
     * @param minerid
     *          采单员 关联员工表Id
     */
    public void setMinerid(Integer minerid) {
        this.minerid = minerid;
    }

    /**
     * 获取电话销售 关联员工表Id
     * 
     * @return 电话销售 关联员工表Id
     */
    public Integer getTelesalesid() {
        return this.telesalesid;
    }

    /**
     * 设置电话销售 关联员工表Id
     * 
     * @param telesalesid
   
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值