银商大华捷通平台对接代收款接口规范
最近业务用到与大华捷通代收款(POS支付),要与其对接获取订单数据和支付通知两个接口。主要流程如下:
1. 中心系统产生订单,生成包含订单号的二维码,并显示在店铺的APP页面上;
2. 大华POS通过扫描店铺APP页面二维码获取到订单号,中心接收到请求要核对POS的机具序列号是否正确;
3. 大华POS根据此订单号向中心系统发送请求,获取到订单金额等数据;
4. 大华POS根据订单号、订单金额等数据跳转生成支付页面,由客户支付;
5. 支付成功,进行支付回调通知,中心系统收到通知相应改变订单状态。
支付流程图
相关文档:
银商大华捷通平台与第三方物流ERP系统接口规范-完整版_V2.7.3.pdf
主要问题: MAC加密验证主要代码:
import org.apache.commons.lang3.StringUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.jsoup.Jsoup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.StringWriter; import java.math.BigDecimal; import java.security.MessageDigest; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by think on 2017/4/12. */ @Service public class DahuaPaymentServiceImpl extends BaseJpaServiceImpl<PayPaymentEntity,Long,PayPaymentDaoImpl> implements DahuaPaymentService { private Logger log = LoggerFactory.getLogger(DahuaPaymentServiceImpl.class); //双方预定约好的MAC——32位 @Value("${dahua.mac.appointed}") private String MAC_APPOINTED; @Autowired private ShopOrderService shopOrderService; @Autowired private PayPaymentService paymentService; @Autowired private WkOrderService wkOrderService; /** * 通过订单SN号获取订单信息 * @param request * @param response * @throws IOException */ @RequestMapping(value = "/getOrderData", method = RequestMethod.POST) public void getOrderData(HttpServletRequest request, HttpServletResponse response) throws IOException { log.debug("大华获取订单数据开始"); String result = request.getParameter("context"); log.debug("大华获取订单数据请求报文: " + result); String mac = Jsoup.parse(result).select("mac").html(); if(!checkSignMac(result)){ response.getWriter().write(errorXml(DahuaResponseCodeEnum.MAC_ERROR.getCode(), DahuaResponseCodeEnum.MAC_ERROR.getName())); return; } String orderSn = Jsoup.parse(result).select("orderno").html(); String version = Jsoup.parse(result).select("version").html(); String employno = Jsoup.parse(result).select("employno").html(); String termid = Jsoup.parse(result).select("termid").html(); if(null == termid || termid.length() < 1){ response.getWriter().write(errorXml("05", "缺少设备ID信息(termid)")); return; } QueryFilter filter = QueryFilterBuilder.of() .joinFetch("t.mbTenant") .eq("t.sn", orderSn) .build(); ShopOrderEntity entity = shopOrderService.get(filter); //判断是否存在这个订单 if(null == entity || null == entity.getId()){ response.getWriter().write(errorXml(DahuaResponseCodeEnum.NON_ORDER.getCode(), DahuaResponseCodeEnum.NON_ORDER.getName())); return; } //判断工单的店铺信息是否正常 if(null == entity.getMbTenant() || null == entity.getMbTenant().getId()){ response.getWriter().write(errorXml(DahuaResponseCodeEnum.NOT_THIS_SHOP.getCode(), DahuaResponseCodeEnum.NOT_THIS_SHOP.getName())); return; } //判断设备号是否相符 if(!termid.