Ver Fonte

Merge branch 'master' of hyq/kmall-pt into master

黄亚琴 há 6 anos atrás
pai
commit
779ba56618
23 ficheiros alterados com 420 adições e 24 exclusões
  1. 13 7
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java
  2. 1 1
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  3. 4 0
      kmall-admin/src/main/resources/conf/wx-mp.properties
  4. 1 1
      kmall-admin/src/main/resources/mybatis/mapper/OrderRefundDao.xml
  5. 4 0
      kmall-admin/src/main/resources/spring/spring-wx-pay.xml
  6. 54 0
      kmall-api/src/main/java/com/kmall/api/api/ApiPayController.java
  7. 5 3
      kmall-api/src/main/java/com/kmall/api/contants/Dict.java
  8. 10 0
      kmall-api/src/main/java/com/kmall/api/entity/MallOrderRefund.java
  9. 9 0
      kmall-api/src/main/java/com/kmall/api/entity/OrderVo.java
  10. 33 0
      kmall-api/src/main/java/com/kmall/api/service/ApiPayService.java
  11. 9 0
      kmall-api/src/main/java/com/kmall/api/service/pay/wxpay/WxPayProperties.java
  12. 7 0
      kmall-api/src/main/resources/mybatis/mapper/ApiMallOrderRefundMapper.xml
  13. 2 1
      kmall-api/src/main/resources/mybatis/mapper/ApiOrderMapper.xml
  14. 9 0
      kmall-common/src/main/java/com/kmall/common/service/pay/wxpay/CommonWxPayProperties.java
  15. 71 0
      kmall-common/src/main/java/com/kmall/common/utils/wechat/AESUtil.java
  16. 33 0
      kmall-common/src/main/java/com/kmall/common/utils/wechat/Base64Util.java
  17. 49 0
      kmall-common/src/main/java/com/kmall/common/utils/wechat/MD5Util.java
  18. 33 5
      kmall-common/src/main/java/com/kmall/common/utils/wechat/WechatRefundApiResult.java
  19. 59 0
      kmall-common/src/main/java/com/kmall/common/utils/wechat/WechatRefundResult.java
  20. 3 1
      kmall-common/src/main/java/com/kmall/common/utils/wechat/WechatUtil.java
  21. 1 1
      wx-mall/pages/ucenter/order/order.wxml
  22. 6 3
      wx-mall/pages/ucenter/orderDetail/orderDetail.js
  23. 4 1
      wx-mall/pages/ucenter/orderDetail/orderDetail.wxml

+ 13 - 7
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -6,6 +6,9 @@ import com.kmall.admin.entity.OrderExceptionRecordEntity;
 import com.kmall.admin.entity.OrderRefundEntity;
 import com.kmall.admin.service.*;
 import com.kmall.admin.entity.OrderProcessRecordEntity;
+import com.kmall.admin.service.OrderExceptionRecordService;
+import com.kmall.admin.service.OrderProcessRecordService;
+import com.kmall.admin.service.OrderService;
 import com.kmall.api.contants.Dict;
 import com.kmall.common.utils.PageUtils;
 import com.kmall.common.utils.Query;
@@ -204,24 +207,28 @@ public class OrderController {
     public Object cancel(Long orderId) {
         //
         OrderEntity orderInfo = orderService.queryObject(orderId);
-
-        if (null == orderInfo || orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem())
+        if (null == orderInfo) {
+            return R.error("订单不存在");
+        }
+        if (orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem())
                 || orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
             return R.error("订单已退款");
         }
 
         if (orderInfo.getOrderStatus() != 0) {
-            // todo
+            // todo 退款
 //          WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn().toString(),
-//          orderInfo.getActualPrice().doubleValue(), refundMoney.doubleValue());
+//                orderInfo.getActualPrice().doubleValue(), refundMoney.doubleValue());
             WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getMerchOrderSn().toString(),
                     0.01, 0.01);
-            if (!result.getResult_code().equals("SUCCESS")) {
+            if (result.getResult_code().equals("SUCCESS")) {
+                orderService.cancelOrder(orderInfo,result);
+            }else{
                 OrderRefundEntity mallOrderRefund = orderRefundService.queryObjectByOrderId(orderInfo.getId());
                 OrderRefundEntity orderRefund = new OrderRefundEntity();
                 orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));
                 orderRefund.setRefundMoney(BigDecimal.valueOf(orderInfo.getActualPrice().multiply(new BigDecimal(100)).doubleValue()));
-                orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_3.getItem()));
+                orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_4.getItem()));
                 orderRefund.setModTime(new Date());
                 if(mallOrderRefund !=null){
                     orderRefund.setId(mallOrderRefund.getId());
@@ -238,7 +245,6 @@ public class OrderController {
 
                 return R.error(result.getErr_code_des());
             }
-            orderService.cancelOrder(orderInfo,result);
         }
 
         return R.ok();

+ 1 - 1
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -74,7 +74,7 @@ public class OrderServiceImpl implements OrderService {
         if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_201.getItem())) {
             order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
         }
-        order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
+        order.setPayStatus(Integer.parseInt(Dict.payStatus.item_3.getItem()));
 
         // 判断是否有优惠券
         UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());

+ 4 - 0
kmall-admin/src/main/resources/conf/wx-mp.properties

@@ -29,6 +29,8 @@ wx.dev.userMessage=https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid
 wx.dev.uniformorder=https://api.mch.weixin.qq.com/pay/unifiedorder
 #退款地址
 wx.dev.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
+#退款回调地址
+wx.dev.refundNotifyUrl=http://qhdswl.f3322.net:9001/platform-framework/api/pay/refundNotify
 #退款查询地址
 wx.dev.refundqueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
 #微信查询订单状态
@@ -64,6 +66,8 @@ wx.prod.userMessage=https://api.weixin.qq.com/sns/userinfo?access_token=%s&openi
 wx.prod.uniformorder=https://api.mch.weixin.qq.com/pay/unifiedorder
 #退款地址
 wx.prod.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
+#退款回调地址
+wx.prod.refundNotifyUrl=http://qhdswl.f3322.net:9001/platform-framework/api/pay/refundNotify
 #退款查询地址
 wx.prod.refundqueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
 #微信查询订单状态

+ 1 - 1
kmall-admin/src/main/resources/mybatis/mapper/OrderRefundDao.xml

@@ -176,7 +176,7 @@
     </delete>
 
     <select id="queryObjectByOrderId" resultType="com.kmall.admin.entity.OrderRefundEntity">
-        select *
+        select * from mall_order_refund
         where order_id = #{orderId}
     </select>
 </mapper>

+ 4 - 0
kmall-admin/src/main/resources/spring/spring-wx-pay.xml

@@ -33,6 +33,7 @@
         <property name="refundqueryUrl" value="${wx.prod.refundqueryUrl}"/>
         <property name="orderquery" value="${wx.prod.orderquery}"/>
         <property name="spbillCreateIp" value="${wx.prod.spbillCreateIp}"/>
+        <property name="refundNotifyUrl" value="${wx.prod.refundNotifyUrl}"/>
     </bean>
 
     <bean id="wxPayDevProperties" class="com.kmall.api.service.pay.wxpay.WxPayDevProperties">
@@ -53,6 +54,7 @@
         <property name="refundqueryUrl" value="${wx.dev.refundqueryUrl}"/>
         <property name="orderquery" value="${wx.dev.orderquery}"/>
         <property name="spbillCreateIp" value="${wx.dev.spbillCreateIp}"/>
+        <property name="refundNotifyUrl" value="${wx.dev.refundNotifyUrl}"/>
     </bean>
 
 
@@ -74,6 +76,7 @@
         <property name="refundqueryUrl" value="${wx.prod.refundqueryUrl}"/>
         <property name="orderquery" value="${wx.prod.orderquery}"/>
         <property name="spbillCreateIp" value="${wx.prod.spbillCreateIp}"/>
+        <property name="refundNotifyUrl" value="${wx.prod.refundNotifyUrl}"/>
     </bean>
 
     <bean id="commonWxPayDevProperties" class="com.kmall.common.service.pay.wxpay.CommonWxPayDevProperties">
@@ -94,5 +97,6 @@
         <property name="refundqueryUrl" value="${wx.dev.refundqueryUrl}"/>
         <property name="orderquery" value="${wx.dev.orderquery}"/>
         <property name="spbillCreateIp" value="${wx.dev.spbillCreateIp}"/>
+        <property name="refundNotifyUrl" value="${wx.dev.refundNotifyUrl}"/>
     </bean>
 </beans>

+ 54 - 0
kmall-api/src/main/java/com/kmall/api/api/ApiPayController.java

@@ -11,7 +11,9 @@ import com.kmall.api.util.ApiBaseAction;
 import com.kmall.common.utils.CharUtil;
 import com.kmall.common.utils.MapUtils;
 import com.kmall.common.utils.XmlUtil;
+import com.kmall.common.utils.wechat.AESUtil;
 import com.kmall.common.utils.wechat.WechatRefundApiResult;
+import com.kmall.common.utils.wechat.WechatRefundResult;
 import com.kmall.common.utils.wechat.WechatUtil;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -304,6 +306,58 @@ public class ApiPayController extends ApiBaseAction {
 
 
     /**
+     * 微信订单退款回调接口
+     *
+     * @return
+     */
+    @IgnoreAuth
+    @RequestMapping(value = "/refundNotify", produces = "text/html;charset=UTF-8")
+    @ResponseBody
+    public void refundNotify(HttpServletRequest request, HttpServletResponse response) {
+        logger.error("refundNotify start");
+        try {
+            request.setCharacterEncoding("UTF-8");
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("text/html;charset=UTF-8");
+            response.setHeader("Access-Control-Allow-Origin", "*");
+            InputStream in = request.getInputStream();
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            byte[] buffer = new byte[1024];
+            int len = 0;
+            while ((len = in.read(buffer)) != -1) {
+                out.write(buffer, 0, len);
+            }
+            out.close();
+            in.close();
+            String reponseXml = new String(out.toByteArray(), "utf-8");//xml数据
+            logger.error("reponseXml:" + reponseXml);
+            WechatRefundResult result = (WechatRefundResult) XmlUtil.xmlStrToBean(reponseXml, WechatRefundResult.class);
+
+            if (result.getReturn_code().equalsIgnoreCase("FAIL")) {
+                logger.error("退款失败");
+                response.getWriter().write(setXml("SUCCESS", "OK"));
+                response.getWriter().close();
+            }else {
+                String req_info = result.getReq_info();//加密信息
+                String aesResult = AESUtil.decryptData(req_info);
+                System.out.println(aesResult);
+                WechatRefundApiResult refundApiResult = (WechatRefundApiResult) XmlUtil.xmlStrToBean(aesResult, WechatRefundApiResult.class);
+
+                logger.error("订单" + refundApiResult.getOut_trade_no() + "退款成功");
+                // 业务处理
+                apiPayService.refundNotify(refundApiResult);
+                response.getWriter().write(setXml("SUCCESS", "OK"));
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return;
+        }
+    }
+
+
+
+    /**
      * 订单退款请求
      */
     @IgnoreAuth

+ 5 - 3
kmall-api/src/main/java/com/kmall/api/contants/Dict.java

@@ -374,12 +374,13 @@ public class Dict {
     }
 
     /**
-     * 付款状态 支付状态;0 未付款;1 付款中;2 已付款;4 退款
+     * 付款状态 支付状态;0 未付款;1 付款中;2 已付款;3 退款中;4 退款
      */
     public enum payStatus {
         item_0("0", "未付款"),
         item_1("1", "付款中"),
         item_2("2", "已付款"),
+        item_3("3", "退款中"),
         item_4("4", "退款");
 
         private String item;
@@ -475,12 +476,13 @@ public class Dict {
     }
 
     /**
-     *  退款状态 1 申请中 2 退款成功 3 已拒绝
+     *  退款状态 1 申请中 2 退款成功 3 已拒绝  4 微信退款失败
      */
     public enum RefundStatus {
         item_1("1", "申请中"),
         item_2("2", "退款成功"),
-        item_3("3", "已拒绝");
+        item_3("3", "已拒绝"),
+        item_4("4", "微信退款失败");
 
         private String item;
         private String itemName;

+ 10 - 0
kmall-api/src/main/java/com/kmall/api/entity/MallOrderRefund.java

@@ -92,6 +92,16 @@ public class MallOrderRefund implements Serializable {
      */
     private Date tstm;
 
+    private String refundRecvAccout;
+
+    public String getRefundRecvAccout() {
+        return refundRecvAccout;
+    }
+
+    public void setRefundRecvAccout(String refundRecvAccout) {
+        this.refundRecvAccout = refundRecvAccout;
+    }
+
     /**
      * 设置:主键
      */

+ 9 - 0
kmall-api/src/main/java/com/kmall/api/entity/OrderVo.java

@@ -165,6 +165,15 @@ public class OrderVo implements Serializable {
 
     private String refundStatus;
 
+    private String approvalRemark;
+
+    public String getApprovalRemark() {
+        return approvalRemark;
+    }
+
+    public void setApprovalRemark(String approvalRemark) {
+        this.approvalRemark = approvalRemark;
+    }
 
     public void setRefundStatus(String refundStatus) {
         this.refundStatus = refundStatus;

+ 33 - 0
kmall-api/src/main/java/com/kmall/api/service/ApiPayService.java

@@ -269,4 +269,37 @@ public class ApiPayService {
             }
         }*/
     }
+
+
+    @Transactional
+    public void refundNotify(WechatRefundApiResult refundApiResult) {
+        String success_time = refundApiResult.getSuccess_time();
+        String out_trade_no = refundApiResult.getOut_trade_no();//商户订单号
+        // 业务处理
+        List<OrderVo> orderVoList = orderService.queryObjectByMerchOrderSn(out_trade_no);
+        Date successTime = DateUtils.convertStringToDate(success_time,DateUtils.DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS);
+        if(orderVoList != null && orderVoList.size()>0) {
+            for(OrderVo orderInfo:orderVoList) {
+                if(orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_201.getItem())
+                        || orderInfo.getOrder_status() == Integer.parseInt(Dict.orderStatus.item_401.getItem())){
+                    MallOrderRefund mallOrderRefund = mallOrderRefundMapper.queryObjectByOrderSn(orderInfo.getOrder_sn());
+                    MallOrderRefund orderRefund = new MallOrderRefund();
+                    if(mallOrderRefund != null){
+                        orderRefund.setRefundTime(successTime);//退款成功时间
+                        orderRefund.setOutRefundNo(refundApiResult.getOut_refund_no());
+                        orderRefund.setRefundId(refundApiResult.getRefund_id());
+                        orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(refundApiResult.getRefund_fee())));
+                        orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));
+                        orderRefund.setRefundRecvAccout(refundApiResult.getRefund_recv_accout());
+                        orderRefund.setId(mallOrderRefund.getId());
+                    }
+                    orderInfo.setPay_status(Integer.parseInt(Dict.payStatus.item_4.getItem()));
+                    orderInfo.setOrder_status(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
+                    orderService.update(orderInfo);
+                    mallOrderRefundMapper.update(mallOrderRefund);//更新订单退款信息
+                }
+            }
+        }
+    }
+
 }

+ 9 - 0
kmall-api/src/main/java/com/kmall/api/service/pay/wxpay/WxPayProperties.java

@@ -29,6 +29,15 @@ public class WxPayProperties implements Serializable {
     private String refundqueryUrl;
     private String orderquery;
     private String spbillCreateIp;
+    private String refundNotifyUrl;
+
+    public String getRefundNotifyUrl() {
+        return refundNotifyUrl;
+    }
+
+    public void setRefundNotifyUrl(String refundNotifyUrl) {
+        this.refundNotifyUrl = refundNotifyUrl;
+    }
 
     public String getAppId() {
         return appId;

+ 7 - 0
kmall-api/src/main/resources/mybatis/mapper/ApiMallOrderRefundMapper.xml

@@ -23,6 +23,7 @@
     <result property="moderSn" column="moder_sn"/>
     <result property="modTime" column="mod_time"/>
     <result property="tstm" column="tstm"/>
+    <result property="refundRecvAccout" column="refund_recv_accout"/>
   </resultMap>
 
   <select id="queryObject" resultType="com.kmall.api.entity.MallOrderRefund">
@@ -38,6 +39,7 @@
     `refund_money`,
     `refund_status`,
     `refund_reason`,
+    `refund_recv_accout`,
     `approver`,
     `approval_time`,
     `approval_remark`,
@@ -63,6 +65,7 @@
     `refund_money`,
     `refund_status`,
     `refund_reason`,
+    `refund_recv_accout`,
     `approver`,
     `approval_time`,
     `approval_remark`,
@@ -88,6 +91,7 @@
     `refund_money`,
     `refund_status`,
     `refund_reason`,
+    `refund_recv_accout`,
     `approver`,
     `approval_time`,
     `approval_remark`,
@@ -134,6 +138,7 @@
     `refund_money`,
     `refund_status`,
     `refund_reason`,
+    `refund_recv_accout`,
     `approver`,
     `approval_time`,
     `approval_remark`,
@@ -153,6 +158,7 @@
     #{refundMoney},
     #{refundStatus},
     #{refundReason},
+    #{refundRecvAccout},
     #{approver},
     #{approvalTime},
     #{approvalRemark},
@@ -176,6 +182,7 @@
       <if test="refundMoney != null">`refund_money` = #{refundMoney}, </if>
       <if test="refundStatus != null">`refund_status` = #{refundStatus}, </if>
       <if test="refundReason != null">`refund_reason` = #{refundReason}, </if>
+      <if test="refundRecvAccout != null">`refund_recv_accout` = #{refundRecvAccout}, </if>
       <if test="approver != null">`approver` = #{approver}, </if>
       <if test="approvalTime != null">`approval_time` = #{approvalTime}, </if>
       <if test="approvalRemark != null">`approval_remark` = #{approvalRemark}, </if>

+ 2 - 1
kmall-api/src/main/resources/mybatis/mapper/ApiOrderMapper.xml

@@ -67,6 +67,7 @@
         <result column="store_name" property="storeName" jdbcType="VARCHAR" />
         <result property="isRefundStatus" column="isRefundStatus"/>
         <result property="refundStatus" column="refund_status"/>
+        <result property="approvalRemark" column="approval_remark"/>
     </resultMap>
 
     <select id="queryObject" resultMap="orderMap">
@@ -84,7 +85,7 @@
     </select>
 
     <select id="queryList" resultMap="orderMap">
-        select a.*,b.latitude,b.longitude,s.store_name,f.refund_status
+        select a.*,b.latitude,b.longitude,s.store_name,f.refund_status,f.approval_remark
         from mall_order a
         left join mall_address b on a.address_id = b.id
         left join mall_store s on a.store_id = s.id

+ 9 - 0
kmall-common/src/main/java/com/kmall/common/service/pay/wxpay/CommonWxPayProperties.java

@@ -29,6 +29,15 @@ public class CommonWxPayProperties implements Serializable {
     private String refundqueryUrl;
     private String orderquery;
     private String spbillCreateIp;
+    private String refundNotifyUrl;
+
+    public String getRefundNotifyUrl() {
+        return refundNotifyUrl;
+    }
+
+    public void setRefundNotifyUrl(String refundNotifyUrl) {
+        this.refundNotifyUrl = refundNotifyUrl;
+    }
 
     public String getAppId() {
         return appId;

+ 71 - 0
kmall-common/src/main/java/com/kmall/common/utils/wechat/AESUtil.java

@@ -0,0 +1,71 @@
+package com.kmall.common.utils.wechat;
+
+import com.kmall.common.service.pay.wxpay.CommonWxPayPropertiesBuilder;
+import com.kmall.common.utils.XmlUtil;
+
+import java.security.Security;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+/**
+ * @author huangyaqin
+ * @version 1.0
+ * 2018-11-01 14:42
+ */
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+
+public class AESUtil {
+
+    /**
+     * 密钥算法
+     */
+    private static final String ALGORITHM = "AES";
+    /**
+     * 加解密算法/工作模式/填充方式
+     */
+    private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS5Padding";
+    /**
+     * 生成key
+     */
+//    private static SecretKeySpec key = new SecretKeySpec(MD5Util.MD5Encode("U5XYsGSLMhhNFDBUWfgPGLsF3rG7GTXq", "UTF-8").toLowerCase().getBytes(), ALGORITHM);
+
+    private static SecretKeySpec key = new SecretKeySpec(MD5Util.MD5Encode(CommonWxPayPropertiesBuilder.instance().getPaySignKey(), "UTF-8").toLowerCase().getBytes(), ALGORITHM);
+
+    /**
+     * AES加密
+     *
+     * @param data
+     * @return
+     * @throws Exception
+     */
+    public static String encryptData(String data) throws Exception {
+        // 创建密码器
+        Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
+        // 初始化
+        cipher.init(Cipher.ENCRYPT_MODE, key);
+        return Base64Util.encode(cipher.doFinal(data.getBytes()));
+    }
+
+    /**
+     * AES解密
+     *
+     * @param base64Data
+     * @return
+     * @throws Exception
+     */
+    public static String decryptData(String base64Data) throws Exception {
+        Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING);
+        cipher.init(Cipher.DECRYPT_MODE, key);
+        return new String(cipher.doFinal(Base64Util.decode(base64Data)));
+    }
+
+    public static void main(String[] args) throws Exception {
+        String A = "h9k5zhC2Fmjf9v/zWCmc1WIHzEJmpvEhFswYUcvsJGHVAQjgBUl0tnGkKvFY+0vxW1lviCEw14pia5EW1+SyT+DCFGjDe+w+Tj9ZVRploWmcmzz+pb6GJOKoICQQagzbqDTvEFMjmy9OZNbiDgx9061cMu6jPHRu/pQXvCPxQ6vSvbTdHop8AbnizmHRb9lKj4lP3q8Ah0O7Kja0kPgwsn1d9Y+RHTOZJgGC4Mm3oCAq0c8Ar8yxA97epVhc5VYSSyEcKem87IJke2nUVMYMQskMo1cCqGgTKTrmG7OMcmvBIMrdVh5FxWVvAkIzCbRo85oaUDj0uSc7ulyVLCO9KDYl0QHd7AoreY5AcRkfJTWG2i90rXXE2nQ7l3hFmOEAvLR7v4Q6mM85KQOxDpw9IS4lGXTPcKtDjYPsU1Vyt/SidvUZjzmDr4bpmRpcTtgY7Sg4FfCE908Q5+u3IrtYIBstid9WJ4yH1nsG3ADj722E6FezJF8cEaT8n7SITIaCBrxFbCrEUf56oV0puoKGljTlCuV9AH1WB1aUckaK/ix7Ua6xgY/MOAAgomV8ptKaU9MUlL3C1oVOlUXQKxJyqxtjBJTkBr9am9F7hizFW69fO0tiw8LEt8MkAOvgFrLq7XM8eNocO3++ZjsWL9CEkhm7taQnrl34IBi2wqBfjzV/mGqt56q83Aji0mD8/XkMpt7V1ZhD8hb9FnCs6dueWyLgOA+71I2ckBJsUN2JKGJE/N8+SHFfFMoyTOTcH/sWYBAt313j4i1D93WzMyGv9dy82lgHl9Q/yXwMQBVqI1ORQ/aVJWqJaf+pgyOp6uWolgyFsDrMg3Wio1Cav6qXTcZDbdzMP0/I5nUSp94+JZQQv52S6EP56r6FdN3s9NFCOVgkxGr+097AxKSh4S6BD9TlBZUfg/tKVp19/0cjurquqq510nrEwWEefIaSrtRdE519py/Q9wPbk4fDQ1iujq+fEKkqt0AuQ+ErDfkXAAPjCyLXpMD3XIv3tyqyDmk75j5BUZdrVCUk4sy4Tz1lVxpSw9F1u6eCMOVKUilJNc4=";
+        String B = AESUtil.decryptData(A);
+        WechatRefundApiResult refundApiResult = (WechatRefundApiResult) XmlUtil.xmlStrToBean(B, WechatRefundApiResult.class);
+        System.out.println(B);
+        System.out.println(refundApiResult);
+    }
+
+}

+ 33 - 0
kmall-common/src/main/java/com/kmall/common/utils/wechat/Base64Util.java

@@ -0,0 +1,33 @@
+package com.kmall.common.utils.wechat;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang.StringUtils;
+/**
+ * @author huangyaqin
+ * @version 1.0
+ * 2018-11-01 14:47
+ */
+
+
+public class Base64Util {
+
+    /**
+     * 编码字符串
+     * @param str
+     * @return
+     */
+    public static String encode(byte[] str){
+        if(str == null) return "";
+        return Base64.encodeBase64String(str);
+    }
+
+    /**
+     * 解码字符串
+     * @param str
+     * @return
+     */
+    public static byte[] decode(String str){
+        if(StringUtils.isEmpty(str)) return null;
+        return Base64.decodeBase64(str);
+    }
+}

+ 49 - 0
kmall-common/src/main/java/com/kmall/common/utils/wechat/MD5Util.java

@@ -0,0 +1,49 @@
+package com.kmall.common.utils.wechat;
+
+import java.security.MessageDigest;
+/**
+ * MD5加密工具
+ *
+ * @author huangyaqin
+ * @version 1.0
+ * 2018-11-01 14:56
+ */
+public class MD5Util {
+
+    private static String byteArrayToHexString(byte b[]) {
+        StringBuffer resultSb = new StringBuffer();
+        for (int i = 0; i < b.length; i++)
+            resultSb.append(byteToHexString(b[i]));
+
+        return resultSb.toString();
+    }
+
+    private static String byteToHexString(byte b) {
+        int n = b;
+        if (n < 0)
+            n += 256;
+        int d1 = n / 16;
+        int d2 = n % 16;
+        return hexDigits[d1] + hexDigits[d2];
+    }
+
+    public static String MD5Encode(String origin, String charsetname) {
+        String resultString = null;
+        try {
+            resultString = new String(origin);
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            if (charsetname == null || "".equals(charsetname))
+                resultString = byteArrayToHexString(md.digest(resultString
+                        .getBytes()));
+            else
+                resultString = byteArrayToHexString(md.digest(resultString
+                        .getBytes(charsetname)));
+        } catch (Exception exception) {
+        }
+        return resultString;
+    }
+
+    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
+            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
+
+}

+ 33 - 5
kmall-common/src/main/java/com/kmall/common/utils/wechat/WechatRefundApiResult.java

@@ -17,16 +17,44 @@ public class WechatRefundApiResult {
 	private String out_refund_no;
 	private String refund_id;
 	private String refund_channel;
-	private String refund_fee;
-	private String settlement_refund_fee;
-	private String total_fee;
-	private String settlement_total_fee;
+	private String refund_fee;//申请退款金额
+	private String settlement_refund_fee;//退款金额
+	private String total_fee;//订单金额
+	private String settlement_total_fee;//应结订单金额
 	private String fee_type;
 	private String cash_fee;
 	private String cash_refund_fee;
-	private String refund_status;
+	private String refund_status;//退款状态
 	private String time_end;
 
+	private String refund_account;//退款资金来源
+	private String refund_recv_accout;//退款入账账户
+	private String success_time;//退款成功时间
+
+	public String getRefund_account() {
+		return refund_account;
+	}
+
+	public void setRefund_account(String refund_account) {
+		this.refund_account = refund_account;
+	}
+
+	public String getRefund_recv_accout() {
+		return refund_recv_accout;
+	}
+
+	public void setRefund_recv_accout(String refund_recv_accout) {
+		this.refund_recv_accout = refund_recv_accout;
+	}
+
+	public String getSuccess_time() {
+		return success_time;
+	}
+
+	public void setSuccess_time(String success_time) {
+		this.success_time = success_time;
+	}
+
 	public String getTime_end() {
 		return time_end;
 	}

+ 59 - 0
kmall-common/src/main/java/com/kmall/common/utils/wechat/WechatRefundResult.java

@@ -0,0 +1,59 @@
+package com.kmall.common.utils.wechat;
+
+public class WechatRefundResult {
+	private String return_code;
+	private String return_msg;
+
+	private String appid;
+	private String mch_id;
+	private String req_info;
+	private String nonce_str;
+
+	public String getReturn_code() {
+		return return_code;
+	}
+
+	public void setReturn_code(String return_code) {
+		this.return_code = return_code;
+	}
+
+	public String getReturn_msg() {
+		return return_msg;
+	}
+
+	public void setReturn_msg(String return_msg) {
+		this.return_msg = return_msg;
+	}
+
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	public String getMch_id() {
+		return mch_id;
+	}
+
+	public void setMch_id(String mch_id) {
+		this.mch_id = mch_id;
+	}
+
+	public String getReq_info() {
+		return req_info;
+	}
+
+	public void setReq_info(String req_info) {
+		this.req_info = req_info;
+	}
+
+	public String getNonce_str() {
+		return nonce_str;
+	}
+
+	public void setNonce_str(String nonce_str) {
+		this.nonce_str = nonce_str;
+	}
+}

+ 3 - 1
kmall-common/src/main/java/com/kmall/common/utils/wechat/WechatUtil.java

@@ -95,6 +95,8 @@ public class WechatUtil {
         params.put("total_fee", bdOrderMoney.multiply(new BigDecimal(100)).intValue());//订单总金额,单位为分,只能为整数
         params.put("refund_fee", bdRefundMoney.multiply(new BigDecimal(100)).intValue());//退款总金额,订单总金额,单位为分,只能为整数
         params.put("op_user_id", CommonWxPayPropertiesBuilder.instance().getMchId());//操作员帐号, 默认为商户号
+        params.put("notify_url", CommonWxPayPropertiesBuilder.instance().getRefundNotifyUrl());
+
         //签名前必须要参数全部写在前面
         params.put("sign", arraySign(params, CommonWxPayPropertiesBuilder.instance().getPaySignKey()));//签名
         return params;
@@ -146,7 +148,7 @@ public class WechatUtil {
      * @param
      * @return
      */
-    public Map<String, Object> wxRefundquery(String out_trade_no, String out_refund_no) {
+    public static Map<String, Object> wxRefundquery(String out_trade_no, String out_refund_no) {
         Map<Object, Object> params = new HashMap<Object, Object>();
         params.put("appid", CommonWxPayPropertiesBuilder.instance().getAppId());//微信分配的公众账号ID(企业号corpid即为此appId)
         params.put("mch_id", CommonWxPayPropertiesBuilder.instance().getMchId());//微信支付分配的商户号

+ 1 - 1
wx-mall/pages/ucenter/order/order.wxml

@@ -37,7 +37,7 @@
           </navigator>
         </view>
         <view class="list-cell-bd">
-          <navigator url="../orderDetail/orderDetail?id={{item.id}}&&tabIndex={{tabIndex}}&&isRefundStatus={{item.isRefundStatus}}">
+          <navigator url="../orderDetail/orderDetail?id={{item.id}}&&tabIndex={{tabIndex}}&&isRefundStatus={{item.isRefundStatus}}&&refundStatus={{item.refundStatus}}&&approvalRemark={{item.approvalRemark}}">
             <view class="order-details">
               <view class="order-details-cell" wx:if="{{ index < 4 }}" wx:for="{{item.goodsList}}" wx:for-item="cell" wx:key="{{index}}">
                 <text class="name">{{cell.goods_name}}</text>

+ 6 - 3
wx-mall/pages/ucenter/orderDetail/orderDetail.js

@@ -13,7 +13,9 @@ Page({
     refundInfo: {},
     createTime: '',
     refundTime:'',
-    isRefundStatus: ''//true :申请中; false :已退款
+    isRefundStatus: '',//true :申请中; false :已退款
+    refundStatus:'',
+    approvalRemark:''
   },
   onLoad: function (options) {
     // 页面初始化 options为页面跳转所带来的参数
@@ -21,9 +23,10 @@ Page({
     that.setData({
       orderId: options.id,
       tabIndex: options.tabIndex,
-      isRefundStatus: options.isRefundStatus
+      isRefundStatus: options.isRefundStatus,
+      refundStatus: options.refundStatus,
+      approvalRemark: options.approvalRemark
     });
-    console.log(that.data.isRefundStatus);
   },
   getOrderDetail() {
     let that = this;

+ 4 - 1
wx-mall/pages/ucenter/orderDetail/orderDetail.wxml

@@ -12,7 +12,7 @@
       </view>
     </view>
     <view>
-      <view class="list-cell" wx:if="{{orderInfo.order_status==101 || orderInfo.order_status==201 || orderInfo.order_status==300}}">
+      <view class="list-cell">
         <view class="list-cell-bd">
           <view class="list-label week3">
             {{orderInfo.order_status==101?"您的订单已取消":""}}
@@ -20,6 +20,9 @@
             {{orderInfo.order_status==300?"您的订单已发货":""}}   
             {{orderInfo.order_status==401 || orderInfo.order_status==402?"您的订单已退款":""}}
           </view>
+          <view class="list-label week3" wx:if="{{orderInfo.order_status==201 && refundStatus == 3}}">
+            您的退款申请订单已被拒绝,拒绝原因:{{approvalRemark}}
+          </view>
           
         </view>
       </view>