瀏覽代碼

增加了支付宝支付

hhq 5 年之前
父節點
當前提交
eab646c6a3
共有 29 個文件被更改,包括 2575 次插入1 次删除
  1. 106 0
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderAlipayRecordController.java
  2. 59 1
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java
  3. 16 0
      kmall-admin/src/main/java/com/kmall/admin/dao/OrderAlipayRecordDao.java
  4. 460 0
      kmall-admin/src/main/java/com/kmall/admin/entity/OrderAlipayRecordEntity.java
  5. 77 0
      kmall-admin/src/main/java/com/kmall/admin/service/OrderAlipayRecordService.java
  6. 107 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderAlipayRecordServiceImpl.java
  7. 226 0
      kmall-admin/src/main/resources/mybatis/mapper/OrderAlipayRecordDao.xml
  8. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/alipay-sdk-java-3.3.0-source.jar
  9. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/alipay-sdk-java-3.3.0.jar
  10. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/alipay-trade-sdk-20161215-source.jar
  11. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/alipay-trade-sdk-20161215.jar
  12. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/commons-codec-1.10.jar
  13. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/commons-configuration-1.10.jar
  14. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/commons-lang-2.6.jar
  15. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/commons-logging-1.1.1.jar
  16. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/core-2.1.jar
  17. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/gson-2.3.1.jar
  18. 二進制
      kmall-admin/src/main/webapp/WEB-INF/lib/hamcrest-core-1.3.jar
  19. 7 0
      kmall-manager/pom.xml
  20. 247 0
      kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayConfigs.java
  21. 214 0
      kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayMicropayApiResult.java
  22. 131 0
      kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayRequestParams.java
  23. 310 0
      kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayUtil.java
  24. 16 0
      kmall-manager/src/main/java/com/kmall/manager/manager/alipay/service/AlipayTradeService.java
  25. 461 0
      kmall-manager/src/main/java/com/kmall/manager/manager/pay/alipay/AliPayMain.java
  26. 55 0
      kmall-manager/src/main/java/com/kmall/manager/manager/pay/alipay/DemoHbRunner.java
  27. 57 0
      kmall-manager/src/main/resources/conf/alipay.properties
  28. 25 0
      kmall-manager/src/main/resources/log4j.properties
  29. 1 0
      kmall-manager/src/main/resources/spring/spring-manager-context.xml

+ 106 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/OrderAlipayRecordController.java

@@ -0,0 +1,106 @@
+package com.kmall.admin.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.entity.OrderAlipayRecordEntity;
+import com.kmall.admin.service.OrderAlipayRecordService;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 支付宝付款码支付记录Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+@Controller
+@RequestMapping("orderalipayrecord")
+public class OrderAlipayRecordController {
+    @Autowired
+    private OrderAlipayRecordService orderAlipayRecordService;
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("orderalipayrecord:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<OrderAlipayRecordEntity> orderAlipayRecordList = orderAlipayRecordService.queryList(query);
+        int total = orderAlipayRecordService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(orderAlipayRecordList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("orderalipayrecord:info")
+    @ResponseBody
+    public R info(@PathVariable("id") Integer id) {
+        OrderAlipayRecordEntity orderAlipayRecord = orderAlipayRecordService.queryObject(id);
+
+        return R.ok().put("orderAlipayRecord", orderAlipayRecord);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @RequiresPermissions("orderalipayrecord:save")
+    @ResponseBody
+    public R save(@RequestBody OrderAlipayRecordEntity orderAlipayRecord) {
+        orderAlipayRecordService.save(orderAlipayRecord);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @RequiresPermissions("orderalipayrecord:update")
+    @ResponseBody
+    public R update(@RequestBody OrderAlipayRecordEntity orderAlipayRecord) {
+        orderAlipayRecordService.update(orderAlipayRecord);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @RequiresPermissions("orderalipayrecord:delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]ids) {
+        orderAlipayRecordService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<OrderAlipayRecordEntity> list = orderAlipayRecordService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+}

+ 59 - 1
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -4,6 +4,9 @@ import com.kmall.admin.dto.OrderExpressDto;
 import com.kmall.admin.entity.*;
 import com.kmall.common.constant.JxlsXmlTemplateName;
 import com.kmall.common.utils.excel.ExcelUtil;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
+import com.kmall.manager.manager.alipay.AliPayRequestParams;
+import com.kmall.manager.manager.alipay.AliPayUtil;
 import com.kmall.manager.manager.wechat.WechatUtil;
 import com.kmall.manager.manager.wechat.WechatGlobalUtil;
 import com.kmall.manager.manager.wechat.wxglobal.dto.WechatGlobalRefundApiResult;
@@ -62,12 +65,13 @@ public class OrderController {
     @Autowired
     private OrderWXPayRecordService orderWXPayRecordService;
     @Autowired
+    private OrderAlipayRecordService orderAlipayRecordService;
+    @Autowired
     private PinganResponseService pinganResponseService;
     @Autowired
     private ExcelUtil excelUtil;
     @Autowired
     private ShippingService shippingService;
-
     /**
      * 列表
      */
@@ -691,6 +695,60 @@ public class OrderController {
         }
         return r;
     }
+
+    /**
+     * 支付宝付款码支付
+     *
+     * @return
+
+    @RequestMapping("/aliPayTradePay")
+    //    @RequiresPermissions("order:aliPay")
+    public R aliPayTradePay(AliPayRequestParams params){
+        Long id = 5L;
+        R r = null;
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        if (user == null) {
+            throw new RRException("用户登录超时,请重新登录");
+        }
+        if (!user.getRoleType().equalsIgnoreCase("2")) {
+            throw new RRException("该操作只允许店员账户操作");
+        }
+        OrderEntity orderEntity = orderService.queryObject(id);
+        if (orderEntity == null) {
+            throw new RRException("此订单不存在!");
+        }
+        if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
+            throw new RRException("此订单已付款!");
+        }
+        if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_301.getItem())) {
+            throw new RRException("此订单已完成!");
+        }
+        if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_101.getItem())) {
+            throw new RRException("此订单已取消!");
+        }
+        if (orderEntity.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_102.getItem())) {
+            throw new RRException("此订单已删除!");
+        }
+
+        //保存支付记录
+        OrderAlipayRecordEntity orderAlipayRecordEntity = orderAlipayRecordService.saveRecord(orderEntity);
+        StoreEntity store = storeService.queryObject(orderEntity.getStoreId());
+
+        AliPayMicropayApiResult result = null;
+        try {
+            result = AliPayUtil.aliTradePay(params);
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.info(e.getMessage());
+        }
+        orderAlipayRecordService.updateRecord(orderAlipayRecordEntity.getId(),result);
+
+        r = R.ok().put("result", result);
+        return r;
+    }
+
+     */
+
     /**
      * 订单导出请求
      */

+ 16 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/OrderAlipayRecordDao.java

@@ -0,0 +1,16 @@
+package com.kmall.admin.dao;
+
+import com.kmall.admin.entity.OrderAlipayRecordEntity;
+import com.kmall.manager.dao.BaseDao;
+
+/**
+ * 支付宝付款码支付记录Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+public interface OrderAlipayRecordDao extends BaseDao<OrderAlipayRecordEntity> {
+    public int countByOutTradeNo(String outTradeNo);
+
+}

+ 460 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/OrderAlipayRecordEntity.java

@@ -0,0 +1,460 @@
+package com.kmall.admin.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 支付宝付款码支付记录实体
+ * 表名 mall_order_alipay_record
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+public class OrderAlipayRecordEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    private Integer id;
+    /**
+     * 返回状态码
+     */
+    private String returnCode;
+    /**
+     * 返回信息
+     */
+    private String returnMsg;
+    /**
+     * 业务结果
+     */
+    private String resultCode;
+    /**
+     * 错误代码
+     */
+    private String errCode;
+    /**
+     * 错误代码描述
+     */
+    private String errCodeDes;
+    /**
+     * 买家支付宝账号
+     */
+    private String buyerLogonId;
+    /**
+     * 是否关注公众账号(未使用)
+     */
+    private String isSubscribe;
+    /**
+     * 交易类型(MICROPAY 付款码支付)
+     */
+    private String tradeType;
+    /**
+     * 货币类型(默认人民币:CNY)
+     */
+    private String feeType;
+    /**
+     * 订单金额(订单总金额,单位为分,只能为整数)
+     */
+    private String totalFee;
+    /**
+     * 支付宝交易号
+     */
+    private String tradeNo;
+    /**
+     * 商户订单号
+     */
+    private String outTradeNo;
+    /**
+     * 发送给支付宝的商户订单号  outTradeNo + _ + (发送次数-1)
+     */
+    private String outTradeNoAlipay;
+    /**
+     * 商家数据包,原样返回
+     */
+    private String attach;
+    /**
+     * 支付完成时间,格式为yyyyMMddHHmmss
+     */
+    private String timeEnd;
+    /**
+     * 交易状态,SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(付款码支付),USERPAYING--用户支付中(付款码支付),PAYERROR--支付失败(其他原因,如银行返回失败)
+     */
+    private String tradeState;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+    /**
+     * 网关返回码
+     */
+    private String code;
+    /**
+     * 网关返回码描述
+     */
+    private String msg;
+    /**
+     * 业务返回码
+     */
+    private String subCode;
+    /**
+     * 业务返回码描述
+     */
+    private String subMsg;
+
+    /**
+     * 设置:编号
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取:编号
+     */
+    public Integer getId() {
+        return id;
+    }
+    /**
+     * 设置:返回状态码
+     */
+    public void setReturnCode(String returnCode) {
+        this.returnCode = returnCode;
+    }
+
+    /**
+     * 获取:返回状态码
+     */
+    public String getReturnCode() {
+        return returnCode;
+    }
+    /**
+     * 设置:返回信息
+     */
+    public void setReturnMsg(String returnMsg) {
+        this.returnMsg = returnMsg;
+    }
+
+    /**
+     * 获取:返回信息
+     */
+    public String getReturnMsg() {
+        return returnMsg;
+    }
+    /**
+     * 设置:业务结果
+     */
+    public void setResultCode(String resultCode) {
+        this.resultCode = resultCode;
+    }
+
+    /**
+     * 获取:业务结果
+     */
+    public String getResultCode() {
+        return resultCode;
+    }
+    /**
+     * 设置:错误代码
+     */
+    public void setErrCode(String errCode) {
+        this.errCode = errCode;
+    }
+
+    /**
+     * 获取:错误代码
+     */
+    public String getErrCode() {
+        return errCode;
+    }
+    /**
+     * 设置:错误代码描述
+     */
+    public void setErrCodeDes(String errCodeDes) {
+        this.errCodeDes = errCodeDes;
+    }
+
+    /**
+     * 获取:错误代码描述
+     */
+    public String getErrCodeDes() {
+        return errCodeDes;
+    }
+    /**
+     * 设置:买家支付宝账号
+     */
+    public void setBuyerLogonId(String buyerLogonId) {
+        this.buyerLogonId = buyerLogonId;
+    }
+
+    /**
+     * 获取:买家支付宝账号
+     */
+    public String getBuyerLogonId() {
+        return buyerLogonId;
+    }
+    /**
+     * 设置:是否关注公众账号(未使用)
+     */
+    public void setIsSubscribe(String isSubscribe) {
+        this.isSubscribe = isSubscribe;
+    }
+
+    /**
+     * 获取:是否关注公众账号(未使用)
+     */
+    public String getIsSubscribe() {
+        return isSubscribe;
+    }
+    /**
+     * 设置:交易类型(MICROPAY 付款码支付)
+     */
+    public void setTradeType(String tradeType) {
+        this.tradeType = tradeType;
+    }
+
+    /**
+     * 获取:交易类型(MICROPAY 付款码支付)
+     */
+    public String getTradeType() {
+        return tradeType;
+    }
+    /**
+     * 设置:货币类型(默认人民币:CNY)
+     */
+    public void setFeeType(String feeType) {
+        this.feeType = feeType;
+    }
+
+    /**
+     * 获取:货币类型(默认人民币:CNY)
+     */
+    public String getFeeType() {
+        return feeType;
+    }
+    /**
+     * 设置:订单金额(订单总金额,单位为分,只能为整数)
+     */
+    public void setTotalFee(String totalFee) {
+        this.totalFee = totalFee;
+    }
+
+    /**
+     * 获取:订单金额(订单总金额,单位为分,只能为整数)
+     */
+    public String getTotalFee() {
+        return totalFee;
+    }
+    /**
+     * 设置:支付宝交易号
+     */
+    public void setTradeNo(String tradeNo) {
+        this.tradeNo = tradeNo;
+    }
+
+    /**
+     * 获取:支付宝交易号
+     */
+    public String getTradeNo() {
+        return tradeNo;
+    }
+    /**
+     * 设置:商户订单号
+     */
+    public void setOutTradeNo(String outTradeNo) {
+        this.outTradeNo = outTradeNo;
+    }
+
+    /**
+     * 获取:商户订单号
+     */
+    public String getOutTradeNo() {
+        return outTradeNo;
+    }
+    /**
+     * 设置:发送给支付宝的商户订单号  outTradeNo + _ + (发送次数-1)
+     */
+    public void setOutTradeNoAlipay(String outTradeNoAlipay) {
+        this.outTradeNoAlipay = outTradeNoAlipay;
+    }
+
+    /**
+     * 获取:发送给支付宝的商户订单号  outTradeNo + _ + (发送次数-1)
+     */
+    public String getOutTradeNoAlipay() {
+        return outTradeNoAlipay;
+    }
+    /**
+     * 设置:商家数据包,原样返回
+     */
+    public void setAttach(String attach) {
+        this.attach = attach;
+    }
+
+    /**
+     * 获取:商家数据包,原样返回
+     */
+    public String getAttach() {
+        return attach;
+    }
+    /**
+     * 设置:支付完成时间,格式为yyyyMMddHHmmss
+     */
+    public void setTimeEnd(String timeEnd) {
+        this.timeEnd = timeEnd;
+    }
+
+    /**
+     * 获取:支付完成时间,格式为yyyyMMddHHmmss
+     */
+    public String getTimeEnd() {
+        return timeEnd;
+    }
+    /**
+     * 设置:交易状态,SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(付款码支付),USERPAYING--用户支付中(付款码支付),PAYERROR--支付失败(其他原因,如银行返回失败)
+     */
+    public void setTradeState(String tradeState) {
+        this.tradeState = tradeState;
+    }
+
+    /**
+     * 获取:交易状态,SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(付款码支付),USERPAYING--用户支付中(付款码支付),PAYERROR--支付失败(其他原因,如银行返回失败)
+     */
+    public String getTradeState() {
+        return tradeState;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+    /**
+     * 设置:网关返回码
+     */
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    /**
+     * 获取:网关返回码
+     */
+    public String getCode() {
+        return code;
+    }
+    /**
+     * 设置:网关返回码描述
+     */
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    /**
+     * 获取:网关返回码描述
+     */
+    public String getMsg() {
+        return msg;
+    }
+    /**
+     * 设置:业务返回码
+     */
+    public void setSubCode(String subCode) {
+        this.subCode = subCode;
+    }
+
+    /**
+     * 获取:业务返回码
+     */
+    public String getSubCode() {
+        return subCode;
+    }
+    /**
+     * 设置:业务返回码描述
+     */
+    public void setSubMsg(String subMsg) {
+        this.subMsg = subMsg;
+    }
+
+    /**
+     * 获取:业务返回码描述
+     */
+    public String getSubMsg() {
+        return subMsg;
+    }
+}

+ 77 - 0
kmall-admin/src/main/java/com/kmall/admin/service/OrderAlipayRecordService.java

@@ -0,0 +1,77 @@
+package com.kmall.admin.service;
+
+import com.kmall.admin.entity.OrderAlipayRecordEntity;
+import com.kmall.admin.entity.OrderEntity;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 支付宝付款码支付记录Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+public interface OrderAlipayRecordService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param id 主键
+     * @return 实体
+     */
+    OrderAlipayRecordEntity queryObject(Integer id);
+
+    public OrderAlipayRecordEntity saveRecord(OrderEntity order);
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<OrderAlipayRecordEntity> queryList(Map<String, Object> map);
+
+    int updateRecord(Integer id, AliPayMicropayApiResult apiResult);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param orderAlipayRecord 实体
+     * @return 保存条数
+     */
+    int save(OrderAlipayRecordEntity orderAlipayRecord);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param orderAlipayRecord 实体
+     * @return 更新条数
+     */
+    int update(OrderAlipayRecordEntity orderAlipayRecord);
+
+    /**
+     * 根据主键删除
+     *
+     * @param id
+     * @return 删除条数
+     */
+    int delete(Integer id);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param ids
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[] ids);
+}

+ 107 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderAlipayRecordServiceImpl.java

@@ -0,0 +1,107 @@
+package com.kmall.admin.service.impl;
+
+import com.kmall.admin.dao.OrderAlipayRecordDao;
+import com.kmall.admin.entity.OrderAlipayRecordEntity;
+import com.kmall.admin.entity.OrderEntity;
+import com.kmall.admin.service.OrderAlipayRecordService;
+import com.kmall.common.utils.Constant;
+import com.kmall.common.utils.DateUtils;
+import com.kmall.common.utils.RRException;
+import com.kmall.manager.manager.alipay.AliPayMicropayApiResult;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 支付宝付款码支付记录Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2020-05-21 09:31:51
+ */
+@Service("orderAlipayRecordService")
+public class OrderAlipayRecordServiceImpl implements OrderAlipayRecordService {
+    @Autowired
+    private OrderAlipayRecordDao orderAlipayRecordDao;
+
+    @Override
+    public OrderAlipayRecordEntity queryObject(Integer id) {
+        return orderAlipayRecordDao.queryObject(id);
+    }
+
+    @Override
+    public List<OrderAlipayRecordEntity> queryList(Map<String, Object> map) {
+        return orderAlipayRecordDao.queryList(map);
+    }
+
+    @Override
+    public OrderAlipayRecordEntity saveRecord(OrderEntity order) {
+        if (order == null) {
+            throw new RRException("订单信息为空");
+        }
+
+        int count = countByOutTradeNo(order.getOrderSn());
+        OrderAlipayRecordEntity alipayRecordEntity  = new OrderAlipayRecordEntity();
+        alipayRecordEntity.setFeeType("CNY");
+        alipayRecordEntity.setTotalFee(String.valueOf(order.getActualPrice().multiply(Constant.ONE_HUNDRED).intValue()));
+        alipayRecordEntity.setTradeType("MICROPAY");
+        alipayRecordEntity.setOutTradeNo(order.getOrderSn());
+        alipayRecordEntity.setOutTradeNoAlipay(order.getOrderSn() + "_" + count);
+        alipayRecordEntity.setCreateTime(new Date());
+        alipayRecordEntity.setModTime(new Date());
+        alipayRecordEntity.setTradeState("NOTPAY");
+        orderAlipayRecordDao.save(alipayRecordEntity);
+        return alipayRecordEntity;
+    }
+    @Override
+    public int updateRecord(Integer id, AliPayMicropayApiResult apiResult) {
+        OrderAlipayRecordEntity alipayRecordEntity = new OrderAlipayRecordEntity();
+        alipayRecordEntity.setId(id);
+        alipayRecordEntity.setCode(apiResult.getCode());
+        alipayRecordEntity.setMsg(apiResult.getMsg());
+        alipayRecordEntity.setTradeNo(apiResult.getTradeNo());
+        alipayRecordEntity.setTotalFee(apiResult.getTotalAmount());
+        alipayRecordEntity.setOutTradeNo(apiResult.getOutTradeNo());
+        alipayRecordEntity.setTimeEnd(DateUtils.format(apiResult.getGmtPayment(),DateUtils.DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS));
+        alipayRecordEntity.setTradeState(apiResult.getTradeState());
+        alipayRecordEntity.setModTime(new Date());
+        orderAlipayRecordDao.update(alipayRecordEntity);
+        return 0;
+    }
+
+    public int countByOutTradeNo(String outTradeNo) {
+        if (StringUtils.isEmpty(outTradeNo)) {
+            throw new RRException("订单编号为空");
+        }
+        return orderAlipayRecordDao.countByOutTradeNo(outTradeNo);
+    }
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return orderAlipayRecordDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(OrderAlipayRecordEntity orderAlipayRecord) {
+        return orderAlipayRecordDao.save(orderAlipayRecord);
+    }
+
+    @Override
+    public int update(OrderAlipayRecordEntity orderAlipayRecord) {
+        return orderAlipayRecordDao.update(orderAlipayRecord);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        return orderAlipayRecordDao.delete(id);
+    }
+
+    @Override
+    public int deleteBatch(Integer[]ids) {
+        return orderAlipayRecordDao.deleteBatch(ids);
+    }
+}

+ 226 - 0
kmall-admin/src/main/resources/mybatis/mapper/OrderAlipayRecordDao.xml

@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.kmall.admin.dao.OrderAlipayRecordDao">
+
+    <resultMap type="com.kmall.admin.entity.OrderAlipayRecordEntity" id="orderAlipayRecordMap">
+        <result property="id" column="id"/>
+        <result property="returnCode" column="return_code"/>
+        <result property="returnMsg" column="return_msg"/>
+        <result property="resultCode" column="result_code"/>
+        <result property="errCode" column="err_code"/>
+        <result property="errCodeDes" column="err_code_des"/>
+        <result property="buyerLogonId" column="buyer_logon_id"/>
+        <result property="isSubscribe" column="is_subscribe"/>
+        <result property="tradeType" column="trade_type"/>
+        <result property="feeType" column="fee_type"/>
+        <result property="totalFee" column="total_fee"/>
+        <result property="tradeNo" column="trade_no"/>
+        <result property="outTradeNo" column="out_trade_no"/>
+        <result property="outTradeNoAlipay" column="out_trade_no_alipay"/>
+        <result property="attach" column="attach"/>
+        <result property="timeEnd" column="time_end"/>
+        <result property="tradeState" column="trade_state"/>
+        <result property="createrSn" column="creater_sn"/>
+        <result property="createTime" column="create_time"/>
+        <result property="moderSn" column="moder_sn"/>
+        <result property="modTime" column="mod_time"/>
+        <result property="tstm" column="tstm"/>
+        <result property="code" column="code"/>
+        <result property="msg" column="msg"/>
+        <result property="subCode" column="sub_code"/>
+        <result property="subMsg" column="sub_msg"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.OrderAlipayRecordEntity">
+		select
+			`id`,
+			`return_code`,
+			`return_msg`,
+			`result_code`,
+			`err_code`,
+			`err_code_des`,
+			`buyer_logon_id`,
+			`is_subscribe`,
+			`trade_type`,
+			`fee_type`,
+			`total_fee`,
+			`trade_no`,
+			`out_trade_no`,
+			`out_trade_no_alipay`,
+			`attach`,
+			`time_end`,
+			`trade_state`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`,
+			`code`,
+			`msg`,
+			`sub_code`,
+			`sub_msg`
+		from mall_order_alipay_record
+		where id = #{id}
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+	</select>
+
+	<select id="queryList" resultType="com.kmall.admin.entity.OrderAlipayRecordEntity">
+		select
+    		`id`,
+    		`return_code`,
+    		`return_msg`,
+    		`result_code`,
+    		`err_code`,
+    		`err_code_des`,
+    		`buyer_logon_id`,
+    		`is_subscribe`,
+    		`trade_type`,
+    		`fee_type`,
+    		`total_fee`,
+    		`trade_no`,
+    		`out_trade_no`,
+    		`out_trade_no_alipay`,
+    		`attach`,
+    		`time_end`,
+    		`trade_state`,
+    		`creater_sn`,
+    		`create_time`,
+    		`moder_sn`,
+    		`mod_time`,
+    		`tstm`,
+    		`code`,
+    		`msg`,
+    		`sub_code`,
+    		`sub_msg`
+		from mall_order_alipay_record
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_order_alipay_record
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.OrderAlipayRecordEntity" useGeneratedKeys="true" keyProperty="id">
+		insert into mall_order_alipay_record(
+			`return_code`,
+			`return_msg`,
+			`result_code`,
+			`err_code`,
+			`err_code_des`,
+			`buyer_logon_id`,
+			`is_subscribe`,
+			`trade_type`,
+			`fee_type`,
+			`total_fee`,
+			`trade_no`,
+			`out_trade_no`,
+			`out_trade_no_alipay`,
+			`attach`,
+			`time_end`,
+			`trade_state`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`,
+			`code`,
+			`msg`,
+			`sub_code`,
+			`sub_msg`)
+		values(
+			#{returnCode},
+			#{returnMsg},
+			#{resultCode},
+			#{errCode},
+			#{errCodeDes},
+			#{buyerLogonId},
+			#{isSubscribe},
+			#{tradeType},
+			#{feeType},
+			#{totalFee},
+			#{tradeNo},
+			#{outTradeNo},
+			#{outTradeNoAlipay},
+			#{attach},
+			#{timeEnd},
+			#{tradeState},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm},
+			#{code},
+			#{msg},
+			#{subCode},
+			#{subMsg})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.OrderAlipayRecordEntity">
+		update mall_order_alipay_record 
+		<set>
+			<if test="returnCode != null">`return_code` = #{returnCode}, </if>
+			<if test="returnMsg != null">`return_msg` = #{returnMsg}, </if>
+			<if test="resultCode != null">`result_code` = #{resultCode}, </if>
+			<if test="errCode != null">`err_code` = #{errCode}, </if>
+			<if test="errCodeDes != null">`err_code_des` = #{errCodeDes}, </if>
+			<if test="buyerLogonId != null">`buyer_logon_id` = #{buyerLogonId}, </if>
+			<if test="isSubscribe != null">`is_subscribe` = #{isSubscribe}, </if>
+			<if test="tradeType != null">`trade_type` = #{tradeType}, </if>
+			<if test="feeType != null">`fee_type` = #{feeType}, </if>
+			<if test="totalFee != null">`total_fee` = #{totalFee}, </if>
+			<if test="tradeNo != null">`trade_no` = #{tradeNo}, </if>
+			<if test="outTradeNo != null">`out_trade_no` = #{outTradeNo}, </if>
+			<if test="outTradeNoAlipay != null">`out_trade_no_alipay` = #{outTradeNoAlipay}, </if>
+			<if test="attach != null">`attach` = #{attach}, </if>
+			<if test="timeEnd != null">`time_end` = #{timeEnd}, </if>
+			<if test="tradeState != null">`trade_state` = #{tradeState}, </if>
+			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
+			<if test="modTime != null">`mod_time` = #{modTime}, </if>
+			<if test="tstm != null">`tstm` = #{tstm}, </if>
+			<if test="code != null">`code` = #{code}, </if>
+			<if test="msg != null">`msg` = #{msg}, </if>
+			<if test="subCode != null">`sub_code` = #{subCode}, </if>
+			<if test="subMsg != null">`sub_msg` = #{subMsg}</if>
+		</set>
+		where id = #{id}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_order_alipay_record where id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_order_alipay_record where id in 
+		<foreach item="id" collection="array" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+	<select id="countByOutTradeNo" resultType="int">
+		select count(id) from mall_order_alipay_record where out_trade_no = #{outTradeNo}
+	</select>
+
+</mapper>

二進制
kmall-admin/src/main/webapp/WEB-INF/lib/alipay-sdk-java-3.3.0-source.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/alipay-sdk-java-3.3.0.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/alipay-trade-sdk-20161215-source.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/alipay-trade-sdk-20161215.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/commons-codec-1.10.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/commons-configuration-1.10.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/commons-lang-2.6.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/commons-logging-1.1.1.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/core-2.1.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/gson-2.3.1.jar


二進制
kmall-admin/src/main/webapp/WEB-INF/lib/hamcrest-core-1.3.jar


+ 7 - 0
kmall-manager/pom.xml

@@ -19,6 +19,13 @@
             <artifactId>kmall-common</artifactId>
             <version>${kmall-version}</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
+        <!--<dependency>-->
+            <!--<groupId>com.alipay.sdk</groupId>-->
+            <!--<artifactId>alipay-sdk-java</artifactId>-->
+            <!--<version>4.9.5.ALL</version>-->
+        <!--</dependency>-->
+
     </dependencies>
 
 

+ 247 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayConfigs.java

@@ -0,0 +1,247 @@
+package com.kmall.manager.manager.alipay;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class AliPayConfigs {
+    private static Log log = LogFactory.getLog(AliPayConfigs.class);
+    private static Configuration configs;
+
+    private static String openApiDomain;   // 支付宝openapi域名
+    private static String mcloudApiDomain;  // 支付宝mcloudmonitor域名
+    private static String pid;             // 商户partner id
+    private static String appid;           // 商户应用id
+
+    private static String privateKey;      // RSA私钥,用于对商户请求报文加签
+    private static String publicKey;       // RSA公钥,仅用于验证开发者网关
+    private static String alipayPublicKey; // 支付宝RSA公钥,用于验签支付宝应答
+    private static String signType;     // 签名类型
+
+    private static int maxQueryRetry;   // 最大查询次数
+    private static long queryDuration;  // 查询间隔(毫秒)
+
+    private static int maxCancelRetry;  // 最大撤销次数
+    private static long cancelDuration; // 撤销间隔(毫秒)
+
+    private static long heartbeatDelay ; // 交易保障线程第一次调度延迟(秒)
+    private static long heartbeatDuration ; // 交易保障线程调度间隔(秒)
+
+    private AliPayConfigs() {
+        // No Constructor
+    }
+
+    // 根据文件名读取配置文件,文件后缀名必须为.properties
+    public synchronized static void init(String filePath) {
+        if (configs != null) {
+            return;
+        }
+
+        try {
+            configs = new PropertiesConfiguration(filePath);
+        } catch (ConfigurationException e) {
+            e.printStackTrace();
+        }
+
+        if (configs == null) {
+            throw new IllegalStateException("can`t find file by path:" + filePath);
+        }
+
+        openApiDomain = configs.getString("open_api_domain");
+        mcloudApiDomain = configs.getString("mcloud_api_domain");
+
+        pid = configs.getString("pid");
+        appid = configs.getString("appid");
+
+        // RSA
+        privateKey = configs.getString("private_key");
+        publicKey = configs.getString("public_key");
+        alipayPublicKey = configs.getString("alipay_public_key");
+        signType = configs.getString("sign_type");
+
+        // 查询参数
+        maxQueryRetry = configs.getInt("max_query_retry");
+        queryDuration = configs.getLong("query_duration");
+        maxCancelRetry = configs.getInt("max_cancel_retry");
+        cancelDuration = configs.getLong("cancel_duration");
+
+        // 交易保障调度线程
+        heartbeatDelay = configs.getLong("heartbeat_delay");
+        heartbeatDuration = configs.getLong("heartbeat_duration");
+
+        log.info("配置文件名: " + filePath);
+        log.info(description());
+    }
+
+    public static String description() {
+        StringBuilder sb = new StringBuilder("Configs{");
+        sb.append("支付宝openapi网关: ").append(openApiDomain).append("\n");
+        if (StringUtils.isNotEmpty(mcloudApiDomain)) {
+            sb.append(", 支付宝mcloudapi网关域名: ").append(mcloudApiDomain).append("\n");
+        }
+
+        if (StringUtils.isNotEmpty(pid)) {
+            sb.append(", pid: ").append(pid).append("\n");
+        }
+        sb.append(", appid: ").append(appid).append("\n");
+
+        sb.append(", 商户RSA私钥: ").append(getKeyDescription(privateKey)).append("\n");
+        sb.append(", 商户RSA公钥: ").append(getKeyDescription(publicKey)).append("\n");
+        sb.append(", 支付宝RSA公钥: ").append(getKeyDescription(alipayPublicKey)).append("\n");
+        sb.append(", 签名类型: ").append(signType).append("\n");
+
+        sb.append(", 查询重试次数: ").append(maxQueryRetry).append("\n");
+        sb.append(", 查询间隔(毫秒): ").append(queryDuration).append("\n");
+        sb.append(", 撤销尝试次数: ").append(maxCancelRetry).append("\n");
+        sb.append(", 撤销重试间隔(毫秒): ").append(cancelDuration).append("\n");
+
+        sb.append(", 交易保障调度延迟(秒): ").append(heartbeatDelay).append("\n");
+        sb.append(", 交易保障调度间隔(秒): ").append(heartbeatDuration).append("\n");
+        sb.append("}");
+        return sb.toString();
+    }
+
+    private static String getKeyDescription(String key) {
+        int showLength = 6;
+        if (StringUtils.isNotEmpty(key) &&
+            key.length() > showLength) {
+            return new StringBuilder(key.substring(0, showLength))
+                    .append("******")
+                    .append(key.substring(key.length() - showLength))
+                    .toString();
+        }
+        return null;
+    }
+
+    public static Configuration getConfigs() {
+        return configs;
+    }
+
+    public static String getOpenApiDomain() {
+        return openApiDomain;
+    }
+
+    public static Log getLog() {
+        return log;
+    }
+
+    public static void setLog(Log log) {
+        AliPayConfigs.log = log;
+    }
+
+    public static void setConfigs(Configuration configs) {
+        AliPayConfigs.configs = configs;
+    }
+
+    public static void setOpenApiDomain(String openApiDomain) {
+        AliPayConfigs.openApiDomain = openApiDomain;
+    }
+
+    public static String getMcloudApiDomain() {
+        return mcloudApiDomain;
+    }
+
+    public static void setMcloudApiDomain(String mcloudApiDomain) {
+        AliPayConfigs.mcloudApiDomain = mcloudApiDomain;
+    }
+
+    public static String getPid() {
+        return pid;
+    }
+
+    public static void setPid(String pid) {
+        AliPayConfigs.pid = pid;
+    }
+
+    public static String getAppid() {
+        return appid;
+    }
+
+    public static void setAppid(String appid) {
+        AliPayConfigs.appid = appid;
+    }
+
+    public static String getPrivateKey() {
+        return privateKey;
+    }
+
+    public static void setPrivateKey(String privateKey) {
+        AliPayConfigs.privateKey = privateKey;
+    }
+
+    public static String getPublicKey() {
+        return publicKey;
+    }
+
+    public static void setPublicKey(String publicKey) {
+        AliPayConfigs.publicKey = publicKey;
+    }
+
+    public static String getAlipayPublicKey() {
+        return alipayPublicKey;
+    }
+
+    public static void setAlipayPublicKey(String alipayPublicKey) {
+        AliPayConfigs.alipayPublicKey = alipayPublicKey;
+    }
+
+    public static String getSignType() {
+        return signType;
+    }
+
+    public static void setSignType(String signType) {
+        AliPayConfigs.signType = signType;
+    }
+
+    public static int getMaxQueryRetry() {
+        return maxQueryRetry;
+    }
+
+    public static void setMaxQueryRetry(int maxQueryRetry) {
+        AliPayConfigs.maxQueryRetry = maxQueryRetry;
+    }
+
+    public static long getQueryDuration() {
+        return queryDuration;
+    }
+
+    public static void setQueryDuration(long queryDuration) {
+        AliPayConfigs.queryDuration = queryDuration;
+    }
+
+    public static int getMaxCancelRetry() {
+        return maxCancelRetry;
+    }
+
+    public static void setMaxCancelRetry(int maxCancelRetry) {
+        AliPayConfigs.maxCancelRetry = maxCancelRetry;
+    }
+
+    public static long getCancelDuration() {
+        return cancelDuration;
+    }
+
+    public static void setCancelDuration(long cancelDuration) {
+        AliPayConfigs.cancelDuration = cancelDuration;
+    }
+
+    public static long getHeartbeatDelay() {
+        return heartbeatDelay;
+    }
+
+    public static void setHeartbeatDelay(long heartbeatDelay) {
+        AliPayConfigs.heartbeatDelay = heartbeatDelay;
+    }
+
+    public static long getHeartbeatDuration() {
+        return heartbeatDuration;
+    }
+
+    public static void setHeartbeatDuration(long heartbeatDuration) {
+        AliPayConfigs.heartbeatDuration = heartbeatDuration;
+    }
+}
+

+ 214 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayMicropayApiResult.java

@@ -0,0 +1,214 @@
+package com.kmall.manager.manager.alipay;
+
+import java.util.Date;
+
+/**
+ * 响应信息
+ */
+public class AliPayMicropayApiResult {
+
+    //公共响应参数
+    private String code;    //返回状态码
+    private String msg;     //返回信息
+    private String subCode;    //业务返回码
+    private String subMsg;     //业务返回码描述
+
+
+    private String buyerLogonId;    //买家支付宝账号
+    private String buyerUserId;    //买家在支付宝的用户id
+    //支付
+    private String tradeNo;    //支付宝交易号
+    private String outTradeNo;    //商户订单号
+    private String receiptAmount;    //实收金额
+    private String buyerPayAmount;    //买家付款的金额
+    private Date gmtPayment;    //交易支付时间
+
+
+    //退款
+    private String fundChange;    //本次退款是否发生了资金变化 Y
+    private String refundFee;    //退款总金额
+    private Date gmtRefundPay;    //退款支付时间
+    private String presentRefundDiscountAmount;  //本次退款金额中平台优惠退款金额
+
+
+    //撤销
+    private String retryFlag;   //是否需要重试
+    private String action;  //本次撤销触发的交易动作,接口调用成功且交易存在时返回。可能的返回值:close:交易未支付,触发关闭交易动作,无退款;refund:交易已支付,触发交易退款动作;未返回:未查询到交易,或接口调用失败;
+
+
+    //查询
+    private String tradeStatus;//交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易结束,不可退款)
+    private String totalAmount;//交易的订单金额,单位为元,两位小数
+
+    /**
+     * SUCCESS—支付成功
+     REFUND—转入退款
+     NOTPAY—未支付
+     CLOSED—已关闭
+     REVOKED—已撤销
+     USERPAYING--用户支付中
+     PAYERROR--支付失败
+     */
+    private String tradeState; //支付状态
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public String getSubCode() {
+        return subCode;
+    }
+
+    public void setSubCode(String subCode) {
+        this.subCode = subCode;
+    }
+
+    public String getTradeState() {
+        return tradeState;
+    }
+
+    public void setTradeState(String tradeState) {
+        this.tradeState = tradeState;
+    }
+
+    public String getSubMsg() {
+        return subMsg;
+    }
+
+    public void setSubMsg(String subMsg) {
+        this.subMsg = subMsg;
+    }
+
+    public String getBuyerLogonId() {
+        return buyerLogonId;
+    }
+
+    public void setBuyerLogonId(String buyerLogonId) {
+        this.buyerLogonId = buyerLogonId;
+    }
+
+    public String getTradeNo() {
+        return tradeNo;
+    }
+
+    public void setTradeNo(String tradeNo) {
+        this.tradeNo = tradeNo;
+    }
+
+    public String getOutTradeNo() {
+        return outTradeNo;
+    }
+
+    public void setOutTradeNo(String outTradeNo) {
+        this.outTradeNo = outTradeNo;
+    }
+
+    public String getReceiptAmount() {
+        return receiptAmount;
+    }
+
+    public void setReceiptAmount(String receiptAmount) {
+        this.receiptAmount = receiptAmount;
+    }
+
+    public String getBuyerPayAmount() {
+        return buyerPayAmount;
+    }
+
+    public void setBuyerPayAmount(String buyerPayAmount) {
+        this.buyerPayAmount = buyerPayAmount;
+    }
+
+    public Date getGmtPayment() {
+        return gmtPayment;
+    }
+
+    public void setGmtPayment(Date gmtPayment) {
+        this.gmtPayment = gmtPayment;
+    }
+
+    public String getFundChange() {
+        return fundChange;
+    }
+
+    public void setFundChange(String fundChange) {
+        this.fundChange = fundChange;
+    }
+
+    public String getRefundFee() {
+        return refundFee;
+    }
+
+    public void setRefundFee(String refundFee) {
+        this.refundFee = refundFee;
+    }
+
+    public Date getGmtRefundPay() {
+        return gmtRefundPay;
+    }
+
+    public void setGmtRefundPay(Date gmtRefundPay) {
+        this.gmtRefundPay = gmtRefundPay;
+    }
+
+    public String getBuyerUserId() {
+        return buyerUserId;
+    }
+
+    public void setBuyerUserId(String buyerUserId) {
+        this.buyerUserId = buyerUserId;
+    }
+
+    public String getPresentRefundDiscountAmount() {
+        return presentRefundDiscountAmount;
+    }
+
+    public void setPresentRefundDiscountAmount(String presentRefundDiscountAmount) {
+        this.presentRefundDiscountAmount = presentRefundDiscountAmount;
+    }
+
+    public String getRetryFlag() {
+        return retryFlag;
+    }
+
+    public void setRetryFlag(String retryFlag) {
+        this.retryFlag = retryFlag;
+    }
+
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String action) {
+        this.action = action;
+    }
+
+    public String getTradeStatus() {
+        return tradeStatus;
+    }
+
+    public void setTradeStatus(String tradeStatus) {
+        this.tradeStatus = tradeStatus;
+    }
+
+    public String getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(String totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+}

+ 131 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayRequestParams.java

@@ -0,0 +1,131 @@
+package com.kmall.manager.manager.alipay;
+
+
+
+import com.alipay.api.domain.GoodsDetail;
+
+import java.util.List;
+
+/**
+ * 请求参数
+ */
+public class AliPayRequestParams {
+    private String outTradeNo;            //商户订单号
+    private String authCode;               //支付授权码
+    private String subject;                 //订单标题
+    private String totalAmount;            //订单总金额,单位为元,精确到小数点后两位
+    private String body;                    //订单描述
+    private String storeId;              //商户门店编号
+
+    private String operatorId;             //操作员id
+    private String productCode;            //销售产品码
+    private String scene = "bar_code";     //支付场景;条码支付,取值:bar_code;声波支付,取值:wave_code
+    private String buyerId;                //买家的支付宝用户 id,如果为空,会从传入的码值信息中获取买家 ID
+    private String sellerId;               //卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,如果该值为空,则默认为商户签约账号对应的支付宝用户ID
+//    private List<GoodsDetail> goodsDetail; //订单包含的商品列表信息
+    private String timeoutExpress = "5m";  //该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天
+
+    public String getOutTradeNo() {
+        return outTradeNo;
+    }
+
+    public void setOutTradeNo(String outTradeNo) {
+        this.outTradeNo = outTradeNo;
+    }
+
+    public String getAuthCode() {
+        return authCode;
+    }
+
+    public void setAuthCode(String authCode) {
+        this.authCode = authCode;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(String totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+    public String getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(String storeId) {
+        this.storeId = storeId;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public String getScene() {
+        return scene;
+    }
+
+    public void setScene(String scene) {
+        this.scene = scene;
+    }
+
+    public String getBuyerId() {
+        return buyerId;
+    }
+
+    public void setBuyerId(String buyerId) {
+        this.buyerId = buyerId;
+    }
+
+    public String getSellerId() {
+        return sellerId;
+    }
+
+    public void setSellerId(String sellerId) {
+        this.sellerId = sellerId;
+    }
+//
+//    public List<GoodsDetail> getGoodsDetail() {
+//        return goodsDetail;
+//    }
+//
+//    public void setGoodsDetail(List<GoodsDetail> goodsDetail) {
+//        this.goodsDetail = goodsDetail;
+//    }
+
+    public String getTimeoutExpress() {
+        return timeoutExpress;
+    }
+
+    public void setTimeoutExpress(String timeoutExpress) {
+        this.timeoutExpress = timeoutExpress;
+    }
+
+    public String getOperatorId() {
+        return operatorId;
+    }
+
+    public void setOperatorId(String operatorId) {
+        this.operatorId = operatorId;
+    }
+}

+ 310 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/alipay/AliPayUtil.java

@@ -0,0 +1,310 @@
+package com.kmall.manager.manager.alipay;
+
+import com.alibaba.druid.support.logging.Log;
+import com.alibaba.druid.support.logging.LogFactory;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.request.AlipayTradeCancelRequest;
+import com.alipay.api.response.AlipayTradeCancelResponse;
+import com.alipay.demo.trade.config.Configs;
+import com.alipay.demo.trade.model.builder.AlipayTradeCancelRequestBuilder;
+import com.alipay.demo.trade.model.builder.AlipayTradePayRequestBuilder;
+import com.alipay.demo.trade.model.builder.AlipayTradeQueryRequestBuilder;
+import com.alipay.demo.trade.model.builder.AlipayTradeRefundRequestBuilder;
+import com.alipay.demo.trade.model.result.AlipayF2FPayResult;
+import com.alipay.demo.trade.model.result.AlipayF2FQueryResult;
+import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
+import com.alipay.demo.trade.service.AlipayTradeService;
+import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
+
+import java.util.*;
+
+public class AliPayUtil {
+    private static Log log = LogFactory.getLog(AliPayUtil.class);
+
+    // 支付宝当面付2.0服务
+    private static AlipayTradeService tradeService;
+
+    // 支付宝当面付2.0服务(集成了交易保障接口逻辑)
+    //    private static AlipayTradeService   tradeWithHBService;
+
+
+    static {
+        /** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数
+         *  Configs会读取classpath下的zfbinfo.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录
+         */
+        Configs.init("conf/alipay.properties");
+        AliPayConfigs.init("conf/alipay.properties");
+
+        /**
+         * 使用Configs提供的默认参数
+         *  AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new
+         */
+        tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();
+
+        // 支付宝当面付2.0服务(集成了交易保障接口逻辑)
+        //        tradeWithHBService = new AlipayTradeWithHBServiceImpl.ClientBuilder().build();
+
+    }
+
+    public enum AliPayTradeState {
+        /**
+         * 支付成功
+         */
+        SUCCESS("SUCCESS", "支付成功"),
+        /**
+         * 转入退款
+         */
+        REFUND("REFUND", "转入退款"),
+
+        /**
+         * 未支付
+         */
+        NOTPAY("NOTPAY", "未支付"),
+
+        /**
+         * 已关闭
+         */
+        CLOSED("CLOSED", "已关闭"),
+
+        /**
+         * 已撤销(付款码支付)
+         */
+        REVOKED("REVOKED", "已撤销"),
+
+        /**
+         * 用户支付中(付款码支付)
+         */
+        USERPAYING("USERPAYING", "用户支付中"),
+
+        /**
+         * 支付失败(付款码支付)
+         */
+        PAYERROR("PAYERROR", "支付失败");
+
+        private String code;
+        private String codeZn;
+
+        private AliPayTradeState(String code, String codeZn) {
+            this.code = code;
+            this.codeZn = codeZn;
+        }
+
+        public String getCode() {
+            return code;
+        }
+
+        public String getCodeZn() {
+            return codeZn;
+        }
+    }
+
+    /**
+     * 支付宝退款
+     * @param outTradeNo    外部订单号,需要退款交易的商户外部订单号
+     * @param refundAmount  退款金额,该金额必须小于等于订单的支付金额
+     * @param refundReason  退款原因
+     * @param storeId   商户门店编号
+     * @return
+     * @throws Exception
+     */
+    public static AliPayMicropayApiResult aliTradeRefund(String outTradeNo,String refundAmount,String refundReason,String storeId) throws Exception{
+        // (可选,需要支持重复退货时必填) 商户退款请求号,相同支付宝交易号下的不同退款请求号对应同一笔交易的不同退款申请,
+        // 对于相同支付宝交易号下多笔相同商户退款请求号的退款交易,支付宝只会进行一次退款
+        String outRequestNo = "";
+
+        // 创建退款请求builder,设置请求参数
+        AlipayTradeRefundRequestBuilder builder =
+                new AlipayTradeRefundRequestBuilder().setOutTradeNo(outTradeNo)
+                                                     .setRefundAmount(refundAmount)
+                                                     .setRefundReason(refundReason)
+                                                     .setOutRequestNo(outRequestNo)
+                                                     .setStoreId(storeId);
+
+        AlipayF2FRefundResult result = tradeService.tradeRefund(builder);
+        AliPayMicropayApiResult apiResult = new AliPayMicropayApiResult();
+
+        apiResult.setCode(result.getResponse().getCode());
+        apiResult.setMsg(result.getResponse().getMsg());
+        apiResult.setSubCode(result.getResponse().getSubCode());
+        apiResult.setSubMsg(result.getResponse().getSubMsg());
+
+        apiResult.setOutTradeNo(result.getResponse().getOutTradeNo());
+        apiResult.setTradeNo(result.getResponse().getTradeNo());
+        apiResult.setBuyerLogonId(result.getResponse().getBuyerLogonId());
+        apiResult.setBuyerUserId(result.getResponse().getBuyerUserId());
+
+        apiResult.setRefundFee(result.getResponse().getRefundFee());
+        apiResult.setGmtRefundPay(result.getResponse().getGmtRefundPay());
+        apiResult.setPresentRefundDiscountAmount(result.getResponse().getPresentRefundDiscountAmount());
+
+        if ("SUCCESS".equals(result.getTradeStatus().name())) {
+            apiResult.setTradeState(AliPayTradeState.REFUND.getCode());
+        }
+
+        return apiResult;
+    }
+
+    /**
+     * 查询订单
+     *
+     * @param outTradeNo 订单编号
+     * @param tradeNo    支付宝交易号
+     * @return
+     */
+    public static AliPayMicropayApiResult aliTradeQuery(String outTradeNo, String tradeNo) throws Exception{
+
+        // 创建查询请求builder,设置请求参数
+        AlipayTradeQueryRequestBuilder builder = new AlipayTradeQueryRequestBuilder().setOutTradeNo(outTradeNo);
+
+        AlipayF2FQueryResult result = tradeService.queryTradeResult(builder);
+        AliPayMicropayApiResult apiResult = new AliPayMicropayApiResult();
+
+        apiResult.setCode(result.getResponse().getCode());
+        apiResult.setMsg(result.getResponse().getMsg());
+        apiResult.setSubCode(result.getResponse().getSubCode());
+        apiResult.setSubMsg(result.getResponse().getSubMsg());
+
+        apiResult.setOutTradeNo(result.getResponse().getOutTradeNo());
+        apiResult.setTradeNo(result.getResponse().getTradeNo());
+        apiResult.setBuyerLogonId(result.getResponse().getBuyerLogonId());
+        apiResult.setBuyerUserId(result.getResponse().getBuyerUserId());
+
+        apiResult.setReceiptAmount(result.getResponse().getReceiptAmount());
+        apiResult.setBuyerPayAmount(result.getResponse().getBuyerPayAmount());
+        apiResult.setTradeStatus(result.getResponse().getTradeStatus());
+        apiResult.setTotalAmount(result.getResponse().getTotalAmount());
+
+        if ("WAIT_BUYER_PAY".equals(apiResult.getTradeStatus())) {
+            apiResult.setTradeState(AliPayTradeState.NOTPAY.getCode());
+        } else if ("TRADE_CLOSED".equals(apiResult.getTradeStatus())) {
+            apiResult.setTradeState(AliPayTradeState.CLOSED.getCode());
+        } else if ("TRADE_SUCCESS".equals(apiResult.getTradeStatus())) {
+            apiResult.setTradeState(AliPayTradeState.SUCCESS.getCode());
+        } else if ("TRADE_FINISHED".equals(apiResult.getTradeStatus())) {
+            apiResult.setTradeState(AliPayTradeState.CLOSED.getCode());
+        }
+        return apiResult;
+    }
+
+    /**
+     * 支付宝支付
+     *
+     * 功能描述:   必填参数
+     * OutTradeNo 订单编号
+     * Subject  订单标题
+     * AuthCode 付款码
+     * TotalAmount  订单金额
+     * StoreId  商户ID
+     *
+     * @version 1.0.0
+     * 2020/5/21 16:52
+     */
+    public static AliPayMicropayApiResult aliTradePay(AliPayRequestParams params) throws Exception{
+
+        //        String appAuthToken = "应用授权令牌";//根据真实值填写
+
+        // 创建条码支付请求builder,设置请求参数
+        AlipayTradePayRequestBuilder builder = new AlipayTradePayRequestBuilder()
+                //            .setAppAuthToken(appAuthToken)
+                .setOutTradeNo(params.getOutTradeNo())
+                .setSubject(params.getSubject())
+                .setAuthCode(params.getAuthCode())
+                .setTotalAmount(params.getTotalAmount())
+                .setStoreId(params.getStoreId())
+                .setBody(params.getBody())
+                .setOperatorId(params.getOperatorId())
+                .setSellerId(params.getSellerId())
+//                .setGoodsDetailList(params.getGoodsDetail())
+                .setTimeoutExpress(params.getTimeoutExpress());
+
+
+        // 调用tradePay方法获取当面付应答
+        AlipayF2FPayResult result = tradeService.tradePay(builder);
+        AliPayMicropayApiResult apiResult = new AliPayMicropayApiResult();
+
+        apiResult.setCode(result.getResponse().getCode());
+        apiResult.setMsg(result.getResponse().getMsg());
+        apiResult.setSubCode(result.getResponse().getSubCode());
+        apiResult.setSubMsg(result.getResponse().getSubMsg());
+
+        apiResult.setOutTradeNo(result.getResponse().getOutTradeNo());
+        apiResult.setTradeNo(result.getResponse().getTradeNo());
+        apiResult.setBuyerLogonId(result.getResponse().getBuyerLogonId());
+        apiResult.setBuyerUserId(result.getResponse().getBuyerUserId());
+
+        apiResult.setReceiptAmount(result.getResponse().getReceiptAmount());
+        apiResult.setBuyerPayAmount(result.getResponse().getBuyerPayAmount());
+        apiResult.setGmtPayment(result.getResponse().getGmtPayment());
+
+        if ("SUCCESS".equals(result.getTradeStatus().name())) {
+            apiResult.setTradeState(AliPayTradeState.SUCCESS.getCode());
+        } else {
+            apiResult.setTradeState(AliPayTradeState.PAYERROR.getCode());
+        }
+
+        return apiResult;
+    }
+
+    /**
+     * 撤销
+     * @param outTradeNo 订单编号
+     * @param tradeNo    支付宝交易号
+     * @return
+     */
+    public static AliPayMicropayApiResult aliTradeCancel(String outTradeNo, String tradeNo) throws Exception{
+
+        AlipayClient alipayClient = new DefaultAlipayClient
+                (AliPayConfigs.getOpenApiDomain(), AliPayConfigs.getAppid(), AliPayConfigs.getPrivateKey(), "json", "GBK", AliPayConfigs.getAlipayPublicKey(), "RSA2");
+        AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
+        request.setBizContent("{" +
+                              "\"out_trade_no\":"+outTradeNo+"," +
+                              "\"trade_no\":"+tradeNo+"}");
+        AlipayTradeCancelResponse response = null;
+        try {
+            response = alipayClient.execute(request);
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+            log.info("支付宝撤销异常!!");
+            log.info(e.getErrMsg());
+        }
+
+        AliPayMicropayApiResult apiResult = new AliPayMicropayApiResult();
+
+        apiResult.setCode(response.getCode());
+        apiResult.setMsg(response.getMsg());
+        apiResult.setSubCode(response.getSubCode());
+        apiResult.setSubMsg(response.getSubMsg());
+
+        apiResult.setOutTradeNo(response.getOutTradeNo());
+        apiResult.setTradeNo(response.getTradeNo());
+        apiResult.setAction(response.getAction());
+        apiResult.setRetryFlag(response.getRetryFlag());
+
+        if(response.isSuccess()){
+            apiResult.setTradeState(AliPayTradeState.REVOKED.getCode());
+        }
+        return apiResult;
+    }
+
+    public static void main(String[] args) throws Exception{
+        //支付
+//        AliPayRequestParams params = new AliPayRequestParams();
+//        params.setAuthCode("283476976115347941");
+//        params.setBody("");
+//        params.setOutTradeNo("521521521521521");
+//        params.setSubject("main测试");
+//        params.setStoreId("200");
+//        params.setTotalAmount("10");
+//        AliPayMicropayApiResult aliPayMicropayApiResult = aliTradePay(params);
+//        System.out.println(aliPayMicropayApiResult.getSubMsg());
+        //查询
+//        AliPayMicropayApiResult aliPayMicropayApiResult = aliTradeQuery("521521521521521", "");
+        //退款
+        AliPayMicropayApiResult aliPayMicropayApiResult = aliTradeRefund("521521521521521", "10","正常退款","10");
+        //撤销
+//        AliPayMicropayApiResult aliPayMicropayApiResult = aliTradeCancel("521521521521324", "");
+        System.out.println(aliPayMicropayApiResult.getSubMsg());
+    }
+}

+ 16 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/alipay/service/AlipayTradeService.java

@@ -0,0 +1,16 @@
+//package com.kmall.manager.manager.alipay.service;
+//
+///**
+// * @author zhangjun
+// * @version 1.0.0
+// * ${date} ${time}
+// */
+//public interface AlipayTradeService {
+//    AlipayF2FPayResult tradePay(AlipayTradePayRequestBuilder var1);
+//
+//    AlipayF2FQueryResult queryTradeResult(AlipayTradeQueryRequestBuilder var1);
+//
+//    AlipayF2FRefundResult tradeRefund(AlipayTradeRefundRequestBuilder var1);
+//
+//    AlipayF2FPrecreateResult tradePrecreate(AlipayTradePrecreateRequestBuilder var1);
+//}

+ 461 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/pay/alipay/AliPayMain.java

@@ -0,0 +1,461 @@
+package com.kmall.manager.manager.pay.alipay;
+
+import com.alipay.api.AlipayResponse;
+import com.alipay.api.domain.TradeFundBill;
+import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.alipay.api.response.AlipayTradeQueryResponse;
+import com.alipay.api.response.MonitorHeartbeatSynResponse;
+import com.alipay.demo.trade.config.Configs;
+import com.alipay.demo.trade.model.ExtendParams;
+import com.alipay.demo.trade.model.GoodsDetail;
+import com.alipay.demo.trade.model.builder.*;
+import com.alipay.demo.trade.model.hb.*;
+import com.alipay.demo.trade.model.result.AlipayF2FPayResult;
+import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
+import com.alipay.demo.trade.model.result.AlipayF2FQueryResult;
+import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
+import com.alipay.demo.trade.service.AlipayMonitorService;
+import com.alipay.demo.trade.service.AlipayTradeService;
+import com.alipay.demo.trade.service.impl.AlipayMonitorServiceImpl;
+import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
+import com.alipay.demo.trade.service.impl.AlipayTradeWithHBServiceImpl;
+import com.alipay.demo.trade.utils.Utils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.*;
+
+/**
+ * Created by liuyangkly on 15/8/9.
+ * 简单main函数,用于测试当面付api
+ * sdk和demo的意见和问题反馈请联系:liuyang.kly@alipay.com
+ */
+public class AliPayMain {
+    private static Log log = LogFactory.getLog(AliPayMain.class);
+
+    // 支付宝当面付2.0服务
+    private static AlipayTradeService   tradeService;
+
+    // 支付宝当面付2.0服务(集成了交易保障接口逻辑)
+    private static AlipayTradeService   tradeWithHBService;
+
+    // 支付宝交易保障接口服务,供测试接口api使用,请先阅读readme.txt
+    private static AlipayMonitorService monitorService;
+
+    static {
+        /** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数
+         *  Configs会读取classpath下的zfbinfo.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录
+         */
+        Configs.init("conf/alipay.properties");
+
+//        AliPayProperties instance = AliPayPropertiesBuilder.instance();
+        /**
+         * 使用Configs提供的默认参数
+         *  AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new
+         */
+        tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();
+
+        // 支付宝当面付2.0服务(集成了交易保障接口逻辑)
+        tradeWithHBService = new AlipayTradeWithHBServiceImpl.ClientBuilder().build();
+
+        /** 如果需要在程序中覆盖Configs提供的默认参数, 可以使用ClientBuilder类的setXXX方法修改默认参数 否则使用代码中的默认设置 */
+        monitorService = new AlipayMonitorServiceImpl.ClientBuilder()
+            .setGatewayUrl("http://mcloudmonitor.com/gateway.do").setCharset("GBK")
+            .setFormat("json").build();
+    }
+
+    // 简单打印应答
+    private void dumpResponse(AlipayResponse response) {
+        if (response != null) {
+            log.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg()));
+            if (StringUtils.isNotEmpty(response.getSubCode())) {
+                log.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(),
+                    response.getSubMsg()));
+            }
+            log.info("body:" + response.getBody());
+        }
+    }
+
+    public static void main(String[] args) {
+        AliPayMain main = new AliPayMain();
+
+        // 系统商商测试交易保障接口api
+        //        main.test_monitor_sys();
+
+        // POS厂商测试交易保障接口api
+        //        main.test_monitor_pos();
+
+        // 测试交易保障接口调度
+        //        main.test_monitor_schedule_logic();
+
+        // 测试当面付2.0支付(使用未集成交易保障接口的当面付2.0服务)
+        main.test_trade_pay(tradeService,"123","284239087978423252");
+
+        // 测试查询当面付2.0交易
+        //        main.test_trade_query();
+
+        // 测试当面付2.0退货
+        //        main.test_trade_refund();
+
+        // 测试当面付2.0生成支付二维码
+//        main.test_trade_precreate();
+    }
+
+    /**
+     * 当面付
+     */
+    public void tradePay(String outTradeNo,String auth_code){
+        test_trade_pay(tradeService,outTradeNo,auth_code);
+    }
+    // 测试系统商交易保障调度
+//    public void test_monitor_schedule_logic() {
+//        // 启动交易保障线程
+//        DemoHbRunner demoRunner = new DemoHbRunner(monitorService);
+//        demoRunner.setDelay(5); // 设置启动后延迟5秒开始调度,不设置则默认3秒
+//        demoRunner.setDuration(10); // 设置间隔10秒进行调度,不设置则默认15 * 60秒
+//        demoRunner.schedule();
+//
+//        // 启动当面付,此处每隔5秒调用一次支付接口,并且当随机数为0时交易保障线程退出
+//        while (Math.random() != 0) {
+//            test_trade_pay(tradeWithHBService);
+//            Utils.sleep(5 * 1000);
+//        }
+//
+//        // 满足退出条件后可以调用shutdown优雅安全退出
+//        demoRunner.shutdown();
+//    }
+
+    // 系统商的调用样例,填写了所有系统商商需要填写的字段
+    public void test_monitor_sys() {
+        // 系统商使用的交易信息格式,json字符串类型
+        List<SysTradeInfo> sysTradeInfoList = new ArrayList<SysTradeInfo>();
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000001", 5.2, HbStatus.S));
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000002", 4.4, HbStatus.F));
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000003", 11.3, HbStatus.P));
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000004", 3.2, HbStatus.X));
+        sysTradeInfoList.add(SysTradeInfo.newInstance("00000005", 4.1, HbStatus.X));
+
+        // 填写异常信息,如果有的话
+        List<ExceptionInfo> exceptionInfoList = new ArrayList<ExceptionInfo>();
+        exceptionInfoList.add(ExceptionInfo.HE_SCANER);
+        //        exceptionInfoList.add(ExceptionInfo.HE_PRINTER);
+        //        exceptionInfoList.add(ExceptionInfo.HE_OTHER);
+
+        // 填写扩展参数,如果有的话
+        Map<String, Object> extendInfo = new HashMap<String, Object>();
+        //        extendInfo.put("SHOP_ID", "BJ_ZZ_001");
+        //        extendInfo.put("TERMINAL_ID", "1234");
+
+        String appAuthToken = "应用授权令牌";//根据真实值填写
+
+        AlipayHeartbeatSynRequestBuilder builder = new AlipayHeartbeatSynRequestBuilder()
+            .setAppAuthToken(appAuthToken).setProduct(Product.FP).setType(Type.CR)
+            .setEquipmentId("cr1000001").setEquipmentStatus(EquipStatus.NORMAL)
+            .setTime(Utils.toDate(new Date())).setStoreId("store10001").setMac("0a:00:27:00:00:00")
+            .setNetworkType("LAN").setProviderId("2088911212323549") // 设置系统商pid
+            .setSysTradeInfoList(sysTradeInfoList) // 系统商同步trade_info信息
+            //                .setExceptionInfoList(exceptionInfoList)  // 填写异常信息,如果有的话
+            .setExtendInfo(extendInfo) // 填写扩展信息,如果有的话
+        ;
+
+        MonitorHeartbeatSynResponse response = monitorService.heartbeatSyn(builder);
+        dumpResponse(response);
+    }
+
+    // POS厂商的调用样例,填写了所有pos厂商需要填写的字段
+    public void test_monitor_pos() {
+        // POS厂商使用的交易信息格式,字符串类型
+        List<PosTradeInfo> posTradeInfoList = new ArrayList<PosTradeInfo>();
+        posTradeInfoList.add(PosTradeInfo.newInstance(HbStatus.S, "1324", 7));
+        posTradeInfoList.add(PosTradeInfo.newInstance(HbStatus.X, "1326", 15));
+        posTradeInfoList.add(PosTradeInfo.newInstance(HbStatus.S, "1401", 8));
+        posTradeInfoList.add(PosTradeInfo.newInstance(HbStatus.F, "1405", 3));
+
+        // 填写异常信息,如果有的话
+        List<ExceptionInfo> exceptionInfoList = new ArrayList<ExceptionInfo>();
+        exceptionInfoList.add(ExceptionInfo.HE_PRINTER);
+
+        // 填写扩展参数,如果有的话
+        Map<String, Object> extendInfo = new HashMap<String, Object>();
+        //        extendInfo.put("SHOP_ID", "BJ_ZZ_001");
+        //        extendInfo.put("TERMINAL_ID", "1234");
+
+        AlipayHeartbeatSynRequestBuilder builder = new AlipayHeartbeatSynRequestBuilder()
+            .setProduct(Product.FP)
+            .setType(Type.SOFT_POS)
+            .setEquipmentId("soft100001")
+            .setEquipmentStatus(EquipStatus.NORMAL)
+            .setTime("2015-09-28 11:14:49")
+            .setManufacturerPid("2088000000000009")
+            // 填写机具商的支付宝pid
+            .setStoreId("store200001").setEquipmentPosition("31.2433190000,121.5090750000")
+            .setBbsPosition("2869719733-065|2896507033-091").setNetworkStatus("gggbbbgggnnn")
+            .setNetworkType("3G").setBattery("98").setWifiMac("0a:00:27:00:00:00")
+            .setWifiName("test_wifi_name").setIp("192.168.1.188")
+            .setPosTradeInfoList(posTradeInfoList) // POS厂商同步trade_info信息
+            //                .setExceptionInfoList(exceptionInfoList) // 填写异常信息,如果有的话
+            .setExtendInfo(extendInfo) // 填写扩展信息,如果有的话
+        ;
+
+        MonitorHeartbeatSynResponse response = monitorService.heartbeatSyn(builder);
+        dumpResponse(response);
+    }
+
+    // 测试当面付2.0支付
+    public void test_trade_pay(AlipayTradeService service,String outTradeNo,String authCode) {
+        // (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
+        // 需保证商户系统端不能重复,建议通过数据库sequence生成,
+//        String outTradeNo = "tradepay" + System.currentTimeMillis()
+//                            + (long) (Math.random() * 10000000L);
+
+        // (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店消费”
+        String subject = "xxx品牌xxx门店当面付消费";
+
+        // (必填) 订单总金额,单位为元,不能超过1亿元
+        // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
+        String totalAmount = "1";
+
+        // (必填) 付款条码,用户支付宝钱包手机app点击“付款”产生的付款条码
+//        String authCode = "283644246383364778";//"用户自己的支付宝付款码"; // 条码示例,286648048691290423
+        // (可选,根据需要决定是否使用) 订单可打折金额,可以配合商家平台配置折扣活动,如果订单部分商品参与打折,可以将部分商品总价填写至此字段,默认全部商品可打折
+        // 如果该值未传入,但传入了【订单总金额】,【不可打折金额】 则该值默认为【订单总金额】- 【不可打折金额】
+        //        String discountableAmount = "1.00"; //
+
+        // (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段
+        // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
+        String undiscountableAmount = "0.0";
+
+        // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)
+        // 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
+        String sellerId = "";
+
+        // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品3件共20.00元"
+        String body = "购买商品3件共20.00元";
+
+        // 商户操作员编号,添加此参数可以为商户操作员做销售统计
+        String operatorId = "test_operator_id";
+
+        // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
+        String storeId = "test_store_id";
+
+        // 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持
+        String providerId = "2088100200300400500";
+        ExtendParams extendParams = new ExtendParams();
+        extendParams.setSysServiceProviderId(providerId);
+
+        // 支付超时,线下扫码交易定义为5分钟
+        String timeoutExpress = "5m";
+
+        // 商品明细列表,需填写购买商品详细信息,
+        List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();
+        // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail
+        GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx面包", 1000, 1);
+        // 创建好一个商品后添加至商品明细列表
+        goodsDetailList.add(goods1);
+
+        // 继续创建并添加第一条商品信息,用户购买的产品为“黑人牙刷”,单价为5.00元,购买了两件
+        GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2);
+        goodsDetailList.add(goods2);
+
+        String appAuthToken = "应用授权令牌";//根据真实值填写
+
+        // 创建条码支付请求builder,设置请求参数
+        AlipayTradePayRequestBuilder builder = new AlipayTradePayRequestBuilder()
+            //            .setAppAuthToken(appAuthToken)
+            .setOutTradeNo(outTradeNo).setSubject(subject).setAuthCode(authCode)
+            .setTotalAmount(totalAmount).setStoreId(storeId)
+            .setUndiscountableAmount(undiscountableAmount).setBody(body).setOperatorId(operatorId)
+            .setExtendParams(extendParams).setSellerId(sellerId)
+            .setGoodsDetailList(goodsDetailList).setTimeoutExpress(timeoutExpress);
+
+        // 调用tradePay方法获取当面付应答
+        AlipayF2FPayResult result = service.tradePay(builder);
+        switch (result.getTradeStatus()) {
+            case SUCCESS:
+                log.info("支付宝支付成功: )");
+                break;
+
+            case FAILED:
+                log.error("支付宝支付失败!!!");
+                break;
+
+            case UNKNOWN:
+                log.error("系统异常,订单状态未知!!!");
+                break;
+
+            default:
+                log.error("不支持的交易状态,交易返回异常!!!");
+                break;
+        }
+    }
+
+    // 测试当面付2.0查询订单
+    public void test_trade_query() {
+        // (必填) 商户订单号,通过此商户订单号查询当面付的交易状态
+        String outTradeNo = "tradepay14817938139942440181";
+
+        // 创建查询请求builder,设置请求参数
+        AlipayTradeQueryRequestBuilder builder = new AlipayTradeQueryRequestBuilder()
+            .setOutTradeNo(outTradeNo);
+
+        AlipayF2FQueryResult result = tradeService.queryTradeResult(builder);
+        switch (result.getTradeStatus()) {
+            case SUCCESS:
+                log.info("查询返回该订单支付成功: )");
+
+                AlipayTradeQueryResponse response = result.getResponse();
+                dumpResponse(response);
+
+                log.info(response.getTradeStatus());
+                if (Utils.isListNotEmpty(response.getFundBillList())) {
+                    for (TradeFundBill bill : response.getFundBillList()) {
+                        log.info(bill.getFundChannel() + ":" + bill.getAmount());
+                    }
+                }
+                break;
+
+            case FAILED:
+                log.error("查询返回该订单支付失败或被关闭!!!");
+                break;
+
+            case UNKNOWN:
+                log.error("系统异常,订单支付状态未知!!!");
+                break;
+
+            default:
+                log.error("不支持的交易状态,交易返回异常!!!");
+                break;
+        }
+    }
+
+    // 测试当面付2.0退款
+    public void test_trade_refund() {
+        // (必填) 外部订单号,需要退款交易的商户外部订单号
+        String outTradeNo = "tradepay14817938139942440181";
+
+        // (必填) 退款金额,该金额必须小于等于订单的支付金额,单位为元
+        String refundAmount = "0.01";
+
+        // (可选,需要支持重复退货时必填) 商户退款请求号,相同支付宝交易号下的不同退款请求号对应同一笔交易的不同退款申请,
+        // 对于相同支付宝交易号下多笔相同商户退款请求号的退款交易,支付宝只会进行一次退款
+        String outRequestNo = "";
+
+        // (必填) 退款原因,可以说明用户退款原因,方便为商家后台提供统计
+        String refundReason = "正常退款,用户买多了";
+
+        // (必填) 商户门店编号,退款情况下可以为商家后台提供退款权限判定和统计等作用,详询支付宝技术支持
+        String storeId = "test_store_id";
+
+        // 创建退款请求builder,设置请求参数
+        AlipayTradeRefundRequestBuilder builder = new AlipayTradeRefundRequestBuilder()
+            .setOutTradeNo(outTradeNo).setRefundAmount(refundAmount).setRefundReason(refundReason)
+            .setOutRequestNo(outRequestNo).setStoreId(storeId);
+
+        AlipayF2FRefundResult result = tradeService.tradeRefund(builder);
+        switch (result.getTradeStatus()) {
+            case SUCCESS:
+                log.info("支付宝退款成功: )");
+                break;
+
+            case FAILED:
+                log.error("支付宝退款失败!!!");
+                break;
+
+            case UNKNOWN:
+                log.error("系统异常,订单退款状态未知!!!");
+                break;
+
+            default:
+                log.error("不支持的交易状态,交易返回异常!!!");
+                break;
+        }
+    }
+
+    // 测试当面付2.0生成支付二维码
+    public void test_trade_precreate() {
+        // (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
+        // 需保证商户系统端不能重复,建议通过数据库sequence生成,
+        String outTradeNo = "tradeprecreate" + System.currentTimeMillis()
+                            + (long) (Math.random() * 10000000L);
+
+        // (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
+        String subject = "xxx品牌xxx门店当面付扫码消费";
+
+        // (必填) 订单总金额,单位为元,不能超过1亿元
+        // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
+        String totalAmount = "0.01";
+
+        // (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段
+        // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
+        String undiscountableAmount = "0";
+
+        // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)
+        // 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
+        String sellerId = "";
+
+        // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
+        String body = "购买商品3件共20.00元";
+
+        // 商户操作员编号,添加此参数可以为商户操作员做销售统计
+        String operatorId = "test_operator_id";
+
+        // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
+        String storeId = "test_store_id";
+
+        // 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持
+        ExtendParams extendParams = new ExtendParams();
+        extendParams.setSysServiceProviderId("2088100200300400500");
+
+        // 支付超时,定义为120分钟
+        String timeoutExpress = "120m";
+
+        // 商品明细列表,需填写购买商品详细信息,
+        List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();
+        // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail
+        GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx小面包", 1000, 1);
+        // 创建好一个商品后添加至商品明细列表
+        goodsDetailList.add(goods1);
+
+        // 继续创建并添加第一条商品信息,用户购买的产品为“黑人牙刷”,单价为5.00元,购买了两件
+        GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2);
+        goodsDetailList.add(goods2);
+
+        // 创建扫码支付请求builder,设置请求参数
+        AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder()
+            .setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo)
+            .setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body)
+            .setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams)
+            .setTimeoutExpress(timeoutExpress)
+            //                .setNotifyUrl("http://www.test-notify-url.com")//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置
+            .setGoodsDetailList(goodsDetailList);
+
+        AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);
+        switch (result.getTradeStatus()) {
+            case SUCCESS:
+                log.info("支付宝预下单成功: )");
+
+                AlipayTradePrecreateResponse response = result.getResponse();
+                dumpResponse(response);
+
+                // 需要修改为运行机器上的路径
+                String filePath = String.format("/Users/sudo/Desktop/qr-%s.png",
+                    response.getOutTradeNo());
+                log.info("filePath:" + filePath);
+                //                ZxingUtils.getQRCodeImge(response.getQrCode(), 256, filePath);
+                break;
+
+            case FAILED:
+                log.error("支付宝预下单失败!!!");
+                break;
+
+            case UNKNOWN:
+                log.error("系统异常,预下单状态未知!!!");
+                break;
+
+            default:
+                log.error("不支持的交易状态,交易返回异常!!!");
+                break;
+        }
+    }
+}

+ 55 - 0
kmall-manager/src/main/java/com/kmall/manager/manager/pay/alipay/DemoHbRunner.java

@@ -0,0 +1,55 @@
+package com.kmall.manager.manager.pay.alipay;
+
+import com.alipay.demo.trade.model.builder.AlipayHeartbeatSynRequestBuilder;
+import com.alipay.demo.trade.model.hb.*;
+import com.alipay.demo.trade.service.AlipayMonitorService;
+import com.alipay.demo.trade.service.impl.hb.AbsHbRunner;
+import com.alipay.demo.trade.service.impl.hb.HbQueue;
+import com.alipay.demo.trade.utils.Utils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by liuyangkly on 15/10/23.
+ 执行调度,主要任务由两个线程完成,交易线程(调用当面付2.0接口)和交易保障线程(轮询),具体需要做的事情
+ 1.当面付程序每执行完一笔交易后将交易结果保存在临时队列
+ 2.轮询线程读取临时队列,获取基础采集信息和最多30条trade_info信息,调用支付宝monitor.heartbeat.syn接口
+ 示例代码仅封装了如何调用该接口api,采集数据,比如采集网络信息、交易耗时、异常信息等,需要系统商开发者自行完成。
+ */
+public class DemoHbRunner
+        extends AbsHbRunner {
+
+    public DemoHbRunner(AlipayMonitorService monitorService) {
+        super(monitorService);
+    }
+
+    @Override
+    public String getAppAuthToken() {
+        // 对于系统商,如果是为了商户开发监控保障接口,则需要传此值,否则如果为系统商自己做交易保障接口开发,则可不传。
+        return null;
+    }
+
+    @Override
+    public AlipayHeartbeatSynRequestBuilder getBuilder() {
+        // 系统商使用的交易信息格式,json字符串类型,从交易队列中获取
+        List<SysTradeInfo> sysTradeInfoList = HbQueue.poll();
+
+        // 异常信息的采集,系统商自行完成
+        List<ExceptionInfo> exceptionInfoList = new ArrayList<ExceptionInfo>();
+        //        exceptionInfoList.add(ExceptionInfo.HE_SCANER);
+        //        exceptionInfoList.add(ExceptionInfo.HE_PRINTER);
+        //        exceptionInfoList.add(ExceptionInfo.HE_OTHER);
+
+        AlipayHeartbeatSynRequestBuilder builder = new AlipayHeartbeatSynRequestBuilder()
+            .setProduct(Product.FP).setType(Type.CR).setEquipmentId("cr1000001")
+            .setEquipmentStatus(EquipStatus.NORMAL).setTime(Utils.toDate(new Date()))
+            .setStoreId("store10001").setMac("0a:00:27:00:00:00").setNetworkType("LAN")
+            .setProviderId("2088911212323549") // 设置系统商pid
+            .setSysTradeInfoList(sysTradeInfoList) // 系统商同步trade_info信息
+            .setExceptionInfoList(exceptionInfoList) // 填写异常信息,如果有的话
+        ;
+        return builder;
+    }
+}

+ 57 - 0
kmall-manager/src/main/resources/conf/alipay.properties

@@ -0,0 +1,57 @@
+# [dev, prod]
+pay.ali.env=dev
+# 沙箱 支付宝网关名、partnerId和appId
+open_api_domain=https://openapi.alipaydev.com/gateway.do
+mcloud_api_domain=http://mcloudmonitor.com/gateway.do
+pid=2088102176590386
+appid=2016092100561081
+# RSA私钥、公钥和支付宝公钥
+private_key=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCAw4hQJytraRr7yJUYkVh38rHuciupGZZwVUbwWFMw5AT/Ms0+UgwleeOc6KHDbwanGD4ZYwBjEGQGisj6Bxgu+2M2voS50J+YM+MAL/X7AF+kIbmuHBZjIzuvWEDOZnt+ZXks+gsXZKh0wc9wZpwb/jG8uHmBAhWcCvPz+dx5TSh6KcWuFLR2rf76mwRkCMx+xtHw9Dh+02Fuhx7tb1Wp4lQZzQ3X+pyRVYvjdoPOSuAUY0NwZ7YK1kBzfYaTcK31kp+quqr6zdJTeNDIswt7VJb2gKHkahJmTAcFZza4AbPEDXmDQ0gDoy6I3wOs3OUFHDEjN1+ZMj/D99MEuKThAgMBAAECggEAGjy9h+eTV12hW/CxQMJNDpPrYbTt5JUMLHOT8uFsgifURNPrMmmxg+lkUdKtM49qAZ5U+QNNTuJGH3ckIJ5VdS1QOBV2Ig66ll7sQFuFedHHq0Ab/7hFb4n8XWxUODp1q3mtyVZh8DBYiwH67OJbqPCQ3e2RBJKSKKuqreoZ3LVsCsks4l7hpxgw0KbFqGhVaTOhYlUdGwJ10PPtWwnIDAMIM87uvf2Q9wxPGtGVO3CmvwGS8vZNkyXcO37DLPM/RTsq+KU3melfAh9asm15aW5CGlXgiVzzGv9syoNl+ENS7ezO0oIzpKROPLRhmD9gxVj1JGqo7ggIErYr/slCqQKBgQDBCFfVZgkbohPbcMtcTwgCU1XLBMIYgfPeDkOUGLalXO6mkManGQk8ywhKEP2M035XmX5PmApSqusVZbFc/gZlXFTHZqLDu0LR2nhJPL0TsgAJhBuywOAbI8/7UbwqL3sG99vm1NSVVAs8MJwQVMa7kALKpnS4SWRA1a5gXWaTtwKBgQCqxERuDBXLjjY5mznHABG9X3Mf4hB5AyGFEwMzbyx+p0zG+i9DCHljXeoRL0gn/2btUoP9dVhulKXSbD/mVv0V3WcYadEfNCzvTkih5BBtDYtjc9oCcE59myf4CMfVXiKLfnt6sXrjK6okPq0vwbwKxWO7uv2sF0+CHjU6lND8JwKBgCDAuaaL2Z/GsHfbe6X+Au3iFfyMoiJmamqTIQRP7S3BxvycNBjGNrsJ+C4ZE+yBNj7G3JfExHuiZKEM0DtnHs60C+6Ji7SKYZwZ5a8Hj014Nmlm8QwzjdMNEI0kITlHNSjJhZZ1JlzwFbfwx4o92DqbBN49wDBEw638k8nmDzGhAoGAXz09SP72fOOgvHolPCZ+vlZot8R2GXe0jypuY5ZCg5S9DlBkYYdtZAzxyYnMPXqFJiEaOhbjLjE7VmNHNCkZ18L2h7gkiLmpwgGwIpI20wt1zQ7E7Q1DyWvqW7xR718j9xaguWoYtnAY4UQPhQ4Q2RUDraT5a6xIjLJaT4TGFYsCgYBNH5GsYBzoo+U6N0bnia1r5mBQZtVHPE1pkChhvlGJPu1U5iMDttGb2Xsmyk7n9QyRdcCmvyd0TnFaUCokPs4OjBqpi3X5yWuldbVKDQ/swsyIpUIEVm7idlv8dbladu3QFxw17LBvSglsB/jJZEMc1JlgizNIiQRngA96mfmLIw==
+public_key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgMOIUCcra2ka+8iVGJFYd/Kx7nIrqRmWcFVG8FhTMOQE/zLNPlIMJXnjnOihw28Gpxg+GWMAYxBkBorI+gcYLvtjNr6EudCfmDPjAC/1+wBfpCG5rhwWYyM7r1hAzmZ7fmV5LPoLF2SodMHPcGacG/4xvLh5gQIVnArz8/nceU0oeinFrhS0dq3++psEZAjMfsbR8PQ4ftNhboce7W9VqeJUGc0N1/qckVWL43aDzkrgFGNDcGe2CtZAc32Gk3Ct9ZKfqrqq+s3SU3jQyLMLe1SW9oCh5GoSZkwHBWc2uAGzxA15g0NIA6MuiN8DrNzlBRwxIzdfmTI/w/fTBLik4QIDAQAB
+#SHA1withRsa对应支付宝公钥
+#alipay_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
+#SHA256withRsa对应支付宝公钥
+alipay_public_key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtr0hvHSwFmRHx/NAaKgqVZ2zDLrCoJiMKOYeL1BtKXhT6IbgnXERgxXgW1T+XC1ZdkagQa7nhw8ckEGTwfvhbJXryA+9hpePjeouFf+IOU7Qlk/ndjT7mmSAi/rP8FsJJ8p1/NcxcRRtFC0zUolC8ZgcfTcJgJb1dnAlZWOCB7+JQrxQbk1Gn7m2oAOl8gBQSFfmtEBBosZwq2PWM4psHoQ5yrfMJHmCrWGSEu3UVAZwNNMJ4hclgMGiVxRvzUPX80IuOOlHTZOaF01EjTPsKxF9SvXqSlnMGot3rTmlAP/RYplhwHSKi5JBxPYu4AiTMLgfzPbg61pmNeELO11QpwIDAQAB
+# 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
+sign_type=RSA2
+# 当面付最大查询次数和查询间隔(毫秒)
+max_query_retry=5
+query_duration=5000
+# 当面付最大撤销次数和撤销间隔(毫秒)
+max_cancel_retry=3
+cancel_duration=2000
+# 交易保障线程第一次调度延迟和调度间隔(秒)
+heartbeat_delay=5
+heartbeat_duration=900
+
+
+
+## 支付宝网关名、partnerId和appId
+#open_api_domain = https://openapi.alipay.com/gateway.do
+#mcloud_api_domain = http://mcloudmonitor.com/gateway.do
+#pid = 此处请填写你的PID
+#appid = 此处请填写你当面付的APPID
+#
+## RSA私钥、公钥和支付宝公钥
+#private_key = 此处请填写你的商户私钥且转PKCS8格式
+#public_key = 此处请填写你的商户公钥
+#
+##SHA1withRsa对应支付宝公钥
+##alipay_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
+#
+##SHA256withRsa对应支付宝公钥
+#alipay_public_key = MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjrEVFMOSiNJXaRNKicQuQdsREraftDA9Tua3WNZwcpeXeh8Wrt+V9JilLqSa7N7sVqwpvv8zWChgXhX/A96hEg97Oxe6GKUmzaZRNh0cZZ88vpkn5tlgL4mH/dhSr3Ip00kvM4rHq9PwuT4k7z1DpZAf1eghK8Q5BgxL88d0X07m9X96Ijd0yMkXArzD7jg+noqfbztEKoH3kPMRJC2w4ByVdweWUT2PwrlATpZZtYLmtDvUKG/sOkNAIKEMg3Rut1oKWpjyYanzDgS7Cg3awr1KPTl9rHCazk15aNYowmYtVabKwbGVToCAGK+qQ1gT3ELhkGnf3+h53fukNqRH+wIDAQAB
+#
+## 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
+#sign_type = RSA2
+## 当面付最大查询次数和查询间隔(毫秒)
+#max_query_retry = 5
+#query_duration = 5000
+#
+## 当面付最大撤销次数和撤销间隔(毫秒)
+#max_cancel_retry = 3
+#cancel_duration = 2000
+#
+## 交易保障线程第一次调度延迟和调度间隔(秒)
+#heartbeat_delay = 5
+#heartbeat_duration = 900

+ 25 - 0
kmall-manager/src/main/resources/log4j.properties

@@ -0,0 +1,25 @@
+log4j.rootLogger=INFO,stdout,file
+#控制台输出
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.Threshold=INFO
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO所有日志
+log4j.logger.file=info
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.File=../logs/junitTestInfo.log
+log4j.appender.file.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.file.append=true
+log4j.appender.file.Threshold=INFO
+log4j.appender.file.encoding=UTF-8
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#控制台输出所有SQL
+#便于调试  生产环境注释
+log4j.logger.com.kmall.framework.dao=DEBUG,sql
+log4j.appender.sql=org.apache.log4j.ConsoleAppender
+log4j.appender.sql.Target=System.out
+log4j.appender.sql.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql.layout.ConversionPattern=%m %n

+ 1 - 0
kmall-manager/src/main/resources/spring/spring-manager-context.xml

@@ -33,6 +33,7 @@
                 <value>classpath:conf/oms-merch.properties</value>
                 <value>classpath:conf/common.properties</value>
                 <value>classpath:conf/express-sf.properties</value>
+                <value>classpath:conf/alipay.properties</value>
             </list>
         </property>
         <property name="fileEncoding" value="UTF-8"/>