公司要求完成一个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