Browse Source

查询富友支付订单状态

Yangzw 8 tháng trước cách đây
mục cha
commit
48f55f528d
12 tập tin đã thay đổi với 360 bổ sung267 xóa
  1. 29 48
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/AppTradeOrderController.java
  2. 12 2
      feifan-module-pay/feifan-module-pay-api/src/main/java/cn/newfeifan/mall/module/pay/enums/DictTypeConstants.java
  3. 1 16
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/controller/app/fuyouorder/NewPayOrderController.java
  4. 9 2
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/dal/dataobject/app/PayAppDO.java
  5. 5 8
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/dal/dataobject/order/PayOrderExtensionDO.java
  6. 8 7
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/client/CommonQueryClient.java
  7. 4 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/respVO/FuYouPaymentResponseVO.java
  8. 141 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/respVO/FuYouQueryPayOrderResponseVO.java
  9. 0 7
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/util/PostMethodCallback.java
  10. 0 149
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/util/Test.java
  11. 142 28
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/fuyouorder/FiYouPayOrderServiceImpl.java
  12. 9 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/fuyouorder/FuYouPayOrderService.java

+ 29 - 48
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/AppTradeOrderController.java

@@ -9,6 +9,7 @@ import cn.newfeifan.mall.module.pay.convert.order.PayOrderConvert;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
 import cn.newfeifan.mall.module.pay.dal.mysql.order.PayOrderMapper;
 import cn.newfeifan.mall.module.pay.enums.order.PayOrderStatusEnum;
+import cn.newfeifan.mall.module.pay.service.fuyouorder.FuYouPayOrderService;
 import cn.newfeifan.mall.module.pay.service.order.PayOrderService;
 import cn.newfeifan.mall.module.trade.controller.app.order.vo.*;
 import cn.newfeifan.mall.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO;
@@ -28,6 +29,7 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -67,54 +69,44 @@ public class AppTradeOrderController {
     @Resource
     private PayOrderService payOrderService;
 
+    @Resource
+    private FuYouPayOrderService fuYouPayOrderService;
 
-    @GetMapping("/getPayOrderByStatus")
-    @Operation(summary = "获得支付订单")
+    @GetMapping("/getPayOrderByStatus2")
+    @Operation(summary = "获得支付订单2")
     @Parameter(name = "id", description = "支付订单编号", required = true, example = "1024")
-    public CommonResult<PayOrderRespVO> getPayOrderByStatus(@RequestParam("id") Long id) {
-        log.info("getPayOrderByStatus:=========id:{}",id);
+    public CommonResult<PayOrderRespVO> getPayOrderByStatus2(@RequestParam("id") Long id) {
+        log.info("getPayOrderByStatus2:=========id:{}",id);
         PayOrderDO oldPayOrderDO = payOrderMapper.selectById(id);
-        log.info("getPayOrderByStatus:oldPayOrderDO===========:{}",oldPayOrderDO);
+        log.info("getPayOrderByStatus2:oldPayOrderDO===========:{}",oldPayOrderDO);
         PayOrderDO newPayOrderDO = payOrderService.getOrderByStatus(oldPayOrderDO);
 
-        CommonResult<PayOrderRespVO> success = success(PayOrderConvert.INSTANCE.convert(newPayOrderDO));
-
-//        boolean test = true;
-//        if(true)
-        //如果在上一行代码,把支付订单状态从“待支付”,改为“已支付”,则证明订单支付成功,则改trade_order表状态为待发货,并且分配积分
-        if(oldPayOrderDO.getStatus().equals(PayOrderStatusEnum.WAITING.getStatus())
-                &&
-                newPayOrderDO.getStatus().equals(PayOrderStatusEnum.SUCCESS.getStatus())
-        )
-        {
-            //只有支付订单id参数payOrderId是有用的。
-            List list = tradeOrderUpdateService.updateOrderPaid(id);
-            Object jfObj = list.get(0);
-            Object sjObj = list.get(1);
-
-            Long jf = (Long)jfObj;//待确权积分
-            Double sj = (Double)sjObj;//待确权身价
-
-            success.getData().setJf(jf);
-            success.getData().setSj(sj);
-        }
-
-        return success;
+        return getPayOrderRespVOCommonResult(id, newPayOrderDO, oldPayOrderDO);
     }
 
-    @GetMapping("/getPayOrderByStatus2")
+    @GetMapping("/getPayOrderByStatus3")
     @Operation(summary = "获得支付订单2")
     @Parameter(name = "id", description = "支付订单编号", required = true, example = "1024")
-    public CommonResult<PayOrderRespVO> getPayOrderByStatus2(@RequestParam("id") Long id) {
+    public CommonResult<PayOrderRespVO> getPayOrderByStatus3(@RequestParam("id") Long id) {
+        log.info("getPayOrderByStatus3:=========id:{}",id);
+        return null;
+    }
+
+    @PostMapping("/getFuYouPayOrderByStatus")
+    @Operation(summary = "查询富友支付订单状态")
+    public CommonResult<PayOrderRespVO> getFuYouPayOrderByStatus(@RequestParam("id") Long id) {
         log.info("getPayOrderByStatus2:=========id:{}",id);
         PayOrderDO oldPayOrderDO = payOrderMapper.selectById(id);
-        log.info("getPayOrderByStatus2:oldPayOrderDO===========:{}",oldPayOrderDO);
-        PayOrderDO newPayOrderDO = payOrderService.getOrderByStatus(oldPayOrderDO);
 
+        PayOrderDO newPayOrderDO = fuYouPayOrderService.getPayOrderByStatus(oldPayOrderDO);
+
+        return getPayOrderRespVOCommonResult(id, newPayOrderDO, oldPayOrderDO);
+    }
+
+    @NotNull
+    private CommonResult<PayOrderRespVO> getPayOrderRespVOCommonResult(Long id, PayOrderDO newPayOrderDO, PayOrderDO oldPayOrderDO) {
         CommonResult<PayOrderRespVO> success = success(PayOrderConvert.INSTANCE.convert(newPayOrderDO));
 
-//        boolean test = true;
-//        if(true)
         //如果在上一行代码,把支付订单状态从“待支付”,改为“已支付”,则证明订单支付成功,则改trade_order表状态为待发货,并且分配积分
         if(oldPayOrderDO.getStatus().equals(PayOrderStatusEnum.WAITING.getStatus())
                 &&
@@ -137,21 +129,12 @@ public class AppTradeOrderController {
         return success;
     }
 
-    @GetMapping("/getPayOrderByStatus3")
-    @Operation(summary = "获得支付订单2")
-    @Parameter(name = "id", description = "支付订单编号", required = true, example = "1024")
-    public CommonResult<PayOrderRespVO> getPayOrderByStatus3(@RequestParam("id") Long id) {
-        log.info("getPayOrderByStatus3:=========id:{}",id);
-        return null;
-    }
-
-
 
     /**
      * add by Ben
      * 待支付订单,点支付时的新增方法
-     * @param tradeOrderId
-     * @return
+     * @param tradeOrderId 订单id
+     * @return 支付订单
      */
     @GetMapping("/getPayOrder")
     @Operation(summary = "获得待支付列表的待支付订单")
@@ -160,9 +143,7 @@ public class AppTradeOrderController {
 
         PayOrderDO payOrder = tradeOrderUpdateService.getPayOrder(tradeOrderId);
 
-        CommonResult<PayOrderRespVO> rs =
-                success(PayOrderConvert.INSTANCE.convert(payOrder));
-        return rs;
+        return success(PayOrderConvert.INSTANCE.convert(payOrder));
     }
 
     @GetMapping("/settlement")

+ 12 - 2
feifan-module-pay/feifan-module-pay-api/src/main/java/cn/newfeifan/mall/module/pay/enums/DictTypeConstants.java

@@ -18,14 +18,24 @@ public interface DictTypeConstants {
     // 富友支付的商户私钥
     String privateKey = "b58ef4203dbe11ef3effcedc419c26ae";
 
+    // 查询富友支付订单状态为支付成功
+    String transStatus = "SUCCESS";
+
+    // 查询富友支付订单响应码为支功
+    String resultCode = "000000";
+
     // 富友支付的商户号
     String mchnt_cd = "0006420F7357129";
 
-    public static final String FUYOU_TRADE_ORDER_NO_PREFIX = "16103-";
+    String term_id = "88888888";
+
+    String term_ip = "192.168.8.8";
+
+    String FUYOU_TRADE_ORDER_NO_PREFIX = "16103-";
 
     String ORDER_NO_PREFIX = "P";
 
 
-    public static final String TRADE_NO = "trade_no:";
+    String TRADE_NO = "trade_no:";
 
 }

+ 1 - 16
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/controller/app/fuyouorder/NewPayOrderController.java

@@ -1,25 +1,18 @@
 package cn.newfeifan.mall.module.pay.controller.app.fuyouorder;
 
-import cn.newfeifan.mall.framework.common.exception.ErrorCode;
 import cn.newfeifan.mall.framework.common.pojo.CommonResult;
-import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderRespVO;
 import cn.newfeifan.mall.module.pay.fuiou.reqvo.SubmitOrderRequestVO;
 import cn.newfeifan.mall.module.pay.fuiou.respVO.FuYouPaymentResponseVO;
-import cn.newfeifan.mall.module.pay.fuiou.util.FuiouHttpPoster;
-import cn.newfeifan.mall.module.pay.fuiou.util.MD5;
-import cn.newfeifan.mall.module.pay.fuiou.util.Test;
 import cn.newfeifan.mall.module.pay.service.fuyouorder.FuYouPayOrderService;
-import com.alibaba.fastjson.JSON;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.httpclient.HttpClient;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 
-import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+
 import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "用户 APP - 富有支付订单")
@@ -52,14 +45,6 @@ public class NewPayOrderController {
         return success("success");
     }
 
-    @PostMapping("/getPayOrderByStatus")
-    @Operation(summary = "富友支付订单回调")
-    public CommonResult<PayOrderRespVO> getPayOrderByStatus(@RequestParam("id") Long id) {
-
-
-        return null;
-    }
-
     @PostMapping("/afterSale")
     @Operation(summary = "向富友申请退款")
     public CommonResult<String> afterSaleFuYouPayOrder(Long afterSaleId) {

+ 9 - 2
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/dal/dataobject/app/PayAppDO.java

@@ -11,7 +11,6 @@ import lombok.*;
  * 支付应用 DO
  * 一个商户下,可能会有多个支付应用。例如说,京东有京东商城、京东到家等等
  * 不过一般来说,一个商户,只有一个应用哈~
- *
  * 即 PayMerchantDO : PayAppDO = 1 : n
  *
  * @author 非繁源码
@@ -37,7 +36,6 @@ public class PayAppDO extends BaseDO {
     private String name;
     /**
      * 状态
-     *
      * 枚举 {@link CommonStatusEnum}
      */
     private Integer status;
@@ -59,4 +57,13 @@ public class PayAppDO extends BaseDO {
      */
     private String transferNotifyUrl;
 
+    /**
+     * 富友支付结果的回调地址
+     */
+    private String fuyouOrderNotifyUrl;
+    /**
+     * 富友退款结果的回调地址
+     */
+    private String fuyouRefundNotifyUrl;
+
 }

+ 5 - 8
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/dal/dataobject/order/PayOrderExtensionDO.java

@@ -14,7 +14,6 @@ import java.util.Map;
 
 /**
  * 支付订单拓展 DO
- *
  * 每次调用支付渠道,都会生成一条对应记录
  *
  * @author 非繁源码
@@ -35,23 +34,19 @@ public class PayOrderExtensionDO extends BaseDO {
     private Long id;
     /**
      * 外部订单号,根据规则生成
-     *
      * 调用支付渠道时,使用该字段作为对接的订单号:
      * 1. 微信支付:对应 <a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml">JSAPI 支付</a> 的 out_trade_no 字段
      * 2. 支付宝支付:对应 <a href="https://opendocs.alipay.com/open/270/105898">电脑网站支付</a> 的 out_trade_no 字段
-     *
      * 例如说,P202110132239124200055
      */
     private String no;
     /**
      * 订单号
-     *
      * 关联 {@link PayOrderDO#getId()}
      */
     private Long orderId;
     /**
      * 渠道编号
-     *
      * 关联 {@link PayChannelDO#getId()}
      */
     private Long channelId;
@@ -65,13 +60,11 @@ public class PayOrderExtensionDO extends BaseDO {
     private String userIp;
     /**
      * 支付状态
-     *
      * 枚举 {@link PayOrderStatusEnum}
      */
     private Integer status;
     /**
      * 支付渠道的额外参数
-     *
      * 参见 <a href="https://www.pingxx.com/api/支付渠道%20extra%20参数说明.html">参数说明</>
      */
     @TableField(typeHandler = JacksonTypeHandler.class)
@@ -88,9 +81,13 @@ public class PayOrderExtensionDO extends BaseDO {
 
     /**
      * 支付渠道的同步/异步通知的内容
-     *
      * 对应 {@link PayOrderRespDTO#getRawData()}
      */
     private String channelNotifyData;
 
+    /**
+     * 支付渠道的响应体
+     */
+    private String channelResponse;
+
 }

+ 8 - 7
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/client/CommonQueryClient.java

@@ -5,6 +5,8 @@ import cn.newfeifan.mall.module.pay.fuiou.reqdata.CommonQueryDataReq;
 import cn.newfeifan.mall.module.pay.fuiou.util.FuiouHttpPoster;
 import cn.newfeifan.mall.module.pay.fuiou.util.MD5;
 
+import static cn.newfeifan.mall.module.pay.enums.DictTypeConstants.*;
+
 /**
  * 2.3 订单查询接口
  * @author user
@@ -12,21 +14,20 @@ import cn.newfeifan.mall.module.pay.fuiou.util.MD5;
  */
 public class CommonQueryClient {
 	
-	public static String mchnt_key = "4e092f20607e11e71d2214ad47a356fa";
 	public static void main(String[] args) throws Exception {
 		FuiouHttpPoster http = new FuiouHttpPoster();
 		http.setCharset("utf-8");
-		http.setUrl("http://192.168.8.45:45002/aggregatePay/commonQuery");
+		http.setUrl("https://aipay.fuioupay.com/aggregatePay/commonQuery");
 		CommonQueryDataReq req=new CommonQueryDataReq();
 		req.setVersion("1.0");
-		req.setMchnt_cd("0002900F0370586");
+		req.setMchnt_cd(mchnt_cd);
 		req.setRandom_str("201707041112123456");
-		req.setOrder_type("WECHAT");
-		req.setMchnt_order_no("100000000000004");
-		req.setTerm_id("ab123456");
+		req.setOrder_type("JSAPI");
+		req.setMchnt_order_no("16103-202407112111001");
+		req.setTerm_id("88888888");
 		String data = MD5.MD5Encode(req.getMchnt_cd() + "|" + req.getOrder_type() + "|" + 
 				req.getMchnt_order_no() + "|" + req.getTerm_id() + "|" + req.getRandom_str() + "|" + 
-				req.getVersion() + "|" + mchnt_key);
+				req.getVersion() + "|" + privateKey);
 		req.setSign(data);
 		String res = http.newPost(JSON.toJSONString(req));
 		System.out.println("====resp====\n");

+ 4 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/respVO/FuYouPaymentResponseVO.java

@@ -1,8 +1,12 @@
 package cn.newfeifan.mall.module.pay.fuiou.respVO;
 
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
 import lombok.Data;
 
+@Schema(description = "管理后台 - 富友支付订单提交 Response")
 @Data
+@Builder
 public class FuYouPaymentResponseVO {
     /**
      * 响应代码

+ 141 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/respVO/FuYouQueryPayOrderResponseVO.java

@@ -0,0 +1,141 @@
+package cn.newfeifan.mall.module.pay.fuiou.respVO;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 查询富友支付订单 Response")
+@Data
+@Builder
+public class FuYouQueryPayOrderResponseVO {
+    /**
+     * 000000 成功,其他详细参见错误列表
+     */
+    private String result_code;
+
+    /**
+     * 代码描述
+     */
+    private String result_msg;
+
+    /**
+     * 富友分配的商户号
+     */
+    private String mchnt_cd;
+
+    /**
+     * 终端号
+     */
+    private String term_id;
+
+    /**
+     * 随机字符串,用于保证交易请求的唯一性。
+     */
+    private String random_str;
+
+    /**
+     * 订单类型,用于区分不同类型的订单。
+     */
+    private String order_type;
+
+    /**
+     * 订单金额,交易的总金额。
+     */
+    private String order_amt;
+
+    /**
+     * 买家在渠道账号
+     */
+    private String buyer_id;
+
+    /**
+     * 渠道交易流水号
+     */
+    private String transaction_id;
+
+    /**
+     * 额外信息,用于传递附加的业务数据。
+     */
+    private String addn_inf;
+
+    /**
+     * 富友清算日
+     */
+    private String reserved_fy_settle_dt;
+
+    /**
+     * 商户系统内部的订单号
+     */
+    private String mchnt_order_no;
+
+    /**
+     * 交易状态,表示交易的当前状态。
+     */
+    private String trans_stat;
+
+    /**
+     * 优惠金额
+     */
+    private String reserved_coupon_fee;
+
+    /**
+     * 买家在渠道登录账号
+     */
+    private String reserved_buyer_logon_id;
+
+    /**
+     * 支付宝交易资金渠道,详细渠道
+     */
+    private String reserved_fund_bill_list;
+
+    /**
+     * 富友系统内部追踪号
+     */
+    private String reserved_fy_trace_no;
+
+    /**
+     * 银行返回的交易号
+     */
+    private String reserved_channel_order_id;
+
+    /**
+     * 富友的POS终端号,如果不是用的富友的POS终端请忽略
+     */
+    private String reserved_fy_term_id;
+
+    /**
+     * 1:表示信用卡或者花呗
+     * 0:表示其他(非信用方式)
+     * 不填,表示未知
+     */
+    private String reserved_is_credit;
+
+    /**
+     * 付款方式
+     */
+    private String reserved_bank_type;
+
+    /**
+     * 支付完成时间
+     */
+    private String reserved_txn_fin_ts;
+
+    /**
+     * 以分为单位的整数
+     * 只有成功交易才会返回
+     * 如果使用了商户免充值优惠券,该值为订单金额-商户免充值
+     * 如果没有使用商户免充值,该值等于订单金额
+     */
+    private String reserved_settlement_amt;
+
+    /**
+     * 微信营销详情
+     */
+    private String reserved_promotion_detail;
+
+    /**
+     * 签名,用于验证交易请求或响应的完整性。
+     */
+    private String sign;
+
+}

+ 0 - 7
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/util/PostMethodCallback.java

@@ -1,7 +0,0 @@
-package cn.newfeifan.mall.module.pay.fuiou.util;
-
-import org.apache.commons.httpclient.methods.PostMethod;
-
-public interface PostMethodCallback {
-    public void doInPostMethod(PostMethod postMethod);
-}

+ 0 - 149
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/fuiou/util/Test.java

@@ -1,149 +0,0 @@
-/**
- *
- */
-package cn.newfeifan.mall.module.pay.fuiou.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-
-import lombok.Setter;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.StringRequestEntity;
-import org.apache.commons.httpclient.params.HttpMethodParams;
-import org.apache.commons.httpclient.protocol.Protocol;
-
-
-/**
- * @author Administrator
- *
- */
-@Setter
-public class Test {
-
-    public Test() {
-    }
-
-    private String url;
-
-    private String charset;
-
-    public Test(String url, String charset) {
-        super();
-        this.url = url;
-        this.charset = charset;
-    }
-
-    public Test(String url) {
-        super();
-        this.url = url;
-        this.charset = Charset.defaultCharset().name();
-    }
-
-
-
-    public String newPost(final String body) throws Exception {
-        return post(new PostMethodCallback() {
-
-            @Override
-            public void doInPostMethod(PostMethod postMethod) {
-
-                try {
-                    postMethod.setRequestEntity(new StringRequestEntity(body,"application/json","UTF-8"));
-                } catch (UnsupportedEncodingException e) {
-                    e.printStackTrace();
-                }
-            }
-        });
-    }
-
-
-
-    /**
-     * 使用http协议发送xmltext到url
-     //	 *
-     //	 * @param url
-     //	 *            将要发送的地址
-     //	 * @param xmltext
-     //	 *            将要发送的内容
-     //	 * @return http返回码
-     //	 * @throws LoanException
-     //	 * @throws Exception
-     */
-    private String post(PostMethodCallback callback) throws Exception {
-        PostMethod xmlpost = null;
-        HttpClient httpclient = new HttpClient();
-        try {
-            // https设置
-            if (url.indexOf("https://") != -1) {
-                // 创建SSL连接
-                @SuppressWarnings("deprecation")
-                Protocol myhttps = new Protocol("https",
-                        new MySSLSocketFactory(), 443);
-                Protocol.registerProtocol("https", myhttps);
-            }
-            httpclient.getHttpConnectionManager().getParams().setConnectionTimeout(60 * 1000);
-            httpclient.getHttpConnectionManager().getParams().setSoTimeout(60 * 1000);
-            xmlpost = new PostMethod(url);
-            httpclient.getParams().setParameter(
-                    HttpMethodParams.HTTP_CONTENT_CHARSET, charset);
-            httpclient.getParams().setContentCharset(charset);
-            // xmlpost.setRequestHeader("content-type", "text/xml; charset=" +
-            // charset);
-
-            // 内部回调,发送数据,设置参数用
-            callback.doInPostMethod(xmlpost);
-            // 执行请求
-            httpclient.executeMethod(xmlpost);
-
-            // 获取返回信息
-            InputStream ips = xmlpost.getResponseBodyAsStream();
-            List<Byte> byteList = new ArrayList<Byte>();
-
-            int is = 0;
-            while ((is = ips.read()) != -1)
-                byteList.add((byte) is);
-
-            byte[] allb = new byte[byteList.size()];
-            for (int j = 0; j < byteList.size(); j++)
-                allb[j] = byteList.get(j);
-            String responseString = new String(allb, charset);
-            // LogWriter.debug(this, "HTTP返回码=" + responseStatCode);
-            System.out.println("应答数据=" + responseString);
-
-            if (url.indexOf("https://") != -1)
-                Protocol.unregisterProtocol("https");
-            return responseString;
-        } catch (IOException ex2) {
-            ex2.printStackTrace();
-            System.out.println("报文发送到[" + url + "]失败:" + ex2.getMessage());
-            throw new Exception("报文发送异常");
-        } catch (Exception ex) {
-            ex.printStackTrace();
-            System.out.println("报文发送到[" + url + "]失败:" + ex.getMessage());
-            throw new Exception("报文发送异常");
-        } finally {
-            try {
-                if(xmlpost != null)
-                    xmlpost.releaseConnection();
-                if(httpclient != null)
-                    httpclient.getHttpConnectionManager().closeIdleConnections(0);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    /**
-     * PostMethod回调处理
-     *
-     */
-//    public interface PostMethodCallback {
-//        public void doInPostMethod(PostMethod postMethod);
-//    }
-
-}

+ 142 - 28
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/fuyouorder/FiYouPayOrderServiceImpl.java

@@ -2,15 +2,21 @@ package cn.newfeifan.mall.module.pay.service.fuyouorder;
 
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateUtil;
+import cn.newfeifan.mall.framework.common.exception.ErrorCode;
 import cn.newfeifan.mall.framework.pay.core.client.PayClient;
+import cn.newfeifan.mall.module.pay.dal.dataobject.app.PayAppDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.channel.PayChannelDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderExtensionDO;
 import cn.newfeifan.mall.module.pay.dal.mysql.order.PayOrderExtensionMapper;
+import cn.newfeifan.mall.module.pay.dal.mysql.order.PayOrderMapper;
 import cn.newfeifan.mall.module.pay.enums.order.PayOrderStatusEnum;
+import cn.newfeifan.mall.module.pay.fuiou.reqdata.CommonQueryDataReq;
+import cn.newfeifan.mall.module.pay.fuiou.reqdata.WxPreCreateDataReq;
 import cn.newfeifan.mall.module.pay.fuiou.reqvo.SubmitOrderRequestVO;
 import cn.newfeifan.mall.module.pay.fuiou.respVO.FuYouPayOrderSubmitRespVO;
 import cn.newfeifan.mall.module.pay.fuiou.respVO.FuYouPaymentResponseVO;
+import cn.newfeifan.mall.module.pay.fuiou.respVO.FuYouQueryPayOrderResponseVO;
 import cn.newfeifan.mall.module.pay.service.app.PayAppService;
 import cn.newfeifan.mall.module.pay.service.channel.PayChannelService;
 import cn.newfeifan.mall.module.pay.service.order.PayOrderService;
@@ -30,8 +36,11 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 
+import java.lang.reflect.Field;
 import java.time.Duration;
 import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.framework.common.util.servlet.ServletUtils.getClientIP;
@@ -61,13 +70,21 @@ public class FiYouPayOrderServiceImpl implements FuYouPayOrderService {
     @Resource
     private PayChannelService channelService;
 
+    @Resource
+    private PayOrderMapper orderMapper;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String submitOrder(SubmitOrderRequestVO requestVO) {
 
+
         // 1.1 获得 PayOrderDO ,并校验其是否存在
         PayOrderDO payOrder = payOrderService.validateOrderCanSubmit(requestVO.getId());
+
+        PayAppDO app = appService.validPayApp(payOrder.getAppId());
+
         payOrder.setPayOrderNo(generate(FUYOU_TRADE_ORDER_NO_PREFIX));
+        payOrder.setNotifyUrl(app.getFuyouOrderNotifyUrl());
         payOrderService.updatePayOrder(payOrder);
 
         // 1.32 校验支付渠道是否有效
@@ -83,13 +100,12 @@ public class FiYouPayOrderServiceImpl implements FuYouPayOrderService {
                 .no(no)
                 .status(PayOrderStatusEnum.WAITING.getStatus())
                 .build();
-        orderExtensionMapper.insert(orderExtension);
 
         FuiouHttpPoster http = new FuiouHttpPoster();
         http.setCharset("utf-8");
         http.setUrl("https://aipay.fuioupay.com/aggregatePay/wxPreCreate");
-        requestVO.getReq().setTerm_id("88888888");
-        requestVO.getReq().setTerm_ip("192.168.8.8");
+        requestVO.getReq().setTerm_id(term_id);
+        requestVO.getReq().setTerm_ip(term_ip);
         requestVO.getReq().setRandom_str(DateUtils.getCurrentDate("yyyyMMddHHmmss")
                 + "568974");
         requestVO.getReq().setMchnt_cd(mchnt_cd);
@@ -98,27 +114,31 @@ public class FiYouPayOrderServiceImpl implements FuYouPayOrderService {
         requestVO.getReq().setSub_appid(appid);
         requestVO.getReq().setMchnt_order_no(payOrder.getPayOrderNo());//不能重复
         requestVO.getReq().setTxn_begin_ts(DateUtils.getCurrentDate("yyyyMMddHHmmss"));
-        requestVO.getReq().setNotify_url("https://letcgo.com/fuYou/pay/order/notify");
+        requestVO.getReq().setNotify_url(app.getFuyouOrderNotifyUrl());
         requestVO.getReq().setVersion("1.0");
-        StringBuilder sb = new StringBuilder();
-        sb.append(requestVO.getReq().getMchnt_cd().trim()).append("|")
-                .append(requestVO.getReq().getTrade_type().trim()).append("|")
-                .append(requestVO.getReq().getOrder_amt().trim()).append("|")
-                .append(requestVO.getReq().getMchnt_order_no().trim()).append("|")
-                .append(requestVO.getReq().getTxn_begin_ts()).append("|")
-                .append(requestVO.getReq().getGoods_des()).append("|")
-                .append(requestVO.getReq().getTerm_id()).append("|")
-                .append(requestVO.getReq().getTerm_ip()).append("|")
-                .append(requestVO.getReq().getNotify_url()).append("|")
-                .append(requestVO.getReq().getRandom_str()).append("|")
-                .append(requestVO.getReq().getVersion()).append("|")
-                .append(privateKey);
-        requestVO.getReq().setSign(MD5.MD5Encode(sb.toString()));
-        String res = null;
-            log.info("向富友发起微信支付请求 == 请求体:{}", JSON.toJSONString(requestVO.getReq()));
+        String sb = requestVO.getReq().getMchnt_cd().trim() + "|" +
+                requestVO.getReq().getTrade_type().trim() + "|" +
+                requestVO.getReq().getOrder_amt().trim() + "|" +
+                requestVO.getReq().getMchnt_order_no().trim() + "|" +
+                requestVO.getReq().getTxn_begin_ts() + "|" +
+                requestVO.getReq().getGoods_des() + "|" +
+                requestVO.getReq().getTerm_id() + "|" +
+                requestVO.getReq().getTerm_ip() + "|" +
+                requestVO.getReq().getNotify_url() + "|" +
+                requestVO.getReq().getRandom_str() + "|" +
+                requestVO.getReq().getVersion() + "|" +
+                privateKey;
+        requestVO.getReq().setSign(MD5.MD5Encode(sb));
+
+        orderExtension.setChannelExtras(convertToMap(requestVO.getReq()));
+
+        String res;
+        log.info("向富友发起微信支付请求 == 请求体:{}", JSON.toJSONString(requestVO.getReq()));
         try {
             res = http.newPost(JSON.toJSONString(requestVO.getReq()));
 
+            orderExtension.setChannelResponse(res);
+            orderExtensionMapper.insert(orderExtension);
             log.info("向富友发起微信支付请求 == 响应体:{}", res);
             // 解析返回结果,获取参数
             ObjectMapper mapper = new ObjectMapper();
@@ -142,6 +162,34 @@ public class FiYouPayOrderServiceImpl implements FuYouPayOrderService {
         }
     }
 
+    /**
+     * 将对象转成Map
+     *
+     * @param req 支付请求对象
+     * @return Map
+     */
+    private static Map<String, String> convertToMap(WxPreCreateDataReq req) {
+        Map<String, String> orderMap = new HashMap<>();
+        Class<?> orderClass = req.getClass();
+        Field[] fields = orderClass.getDeclaredFields();
+
+        try {
+            for (Field field : fields) {
+                field.setAccessible(true); // 设置可以访问私有字段
+                String fieldName = field.getName();
+                Object value = field.get(req); // 获取字段的值
+                if (value != null) {
+                    orderMap.put(fieldName, value.toString());
+                }
+            }
+        } catch (IllegalAccessException e) {
+            ErrorCode ERROR = new ErrorCode(1_007_901_006, "存储类型转换失败");
+            throw exception(ERROR);
+        }
+
+        return orderMap;
+    }
+
     private PayChannelDO validateChannelCanSubmit(Long appId, String channelCode) {
         // 校验 App
         appService.validPayApp(appId);
@@ -170,16 +218,82 @@ public class FiYouPayOrderServiceImpl implements FuYouPayOrderService {
 
     }
 
+    @Override
+    public PayOrderDO getPayOrderByStatus(PayOrderDO payOrderDO) {
+        // 如果订单状态为待支付,则向富友查询订单状态
+        if (payOrderDO.getStatus().equals(PayOrderStatusEnum.WAITING.getStatus())) {
+            //修改程序,当微信支付回调的时候再次向富友请求查询pay订单的支付状态
+            log.info("============支付完成查询:支付订单ID号{}", payOrderDO.getId());
+            log.info("============支付完成查询:支付订单详情{}", payOrderDO);
+            PayOrderExtensionDO payOrderExtensionDO = orderExtensionMapper.selectByPayId(payOrderDO.getId());
+
+            // 修改订单状态
+            updateOrderStatus(payOrderExtensionDO,payOrderDO);
+        }
+
+
+        return orderMapper.selectById(payOrderDO.getId());
+    }
+
     /**
-     * 生成随机字符串
+     * 向富友查询支付订单状态
+     *
+     * @param payOrderExtensionDO 支付订单扩展信息
+     * @param payOrderDO          支付订单信息
      */
-    private static String generateRandomString(int length) {
-        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < length; i++) {
-            int index = (int) (characters.length() * Math.random());
-            sb.append(characters.charAt(index));
+    private void updateOrderStatus(PayOrderExtensionDO payOrderExtensionDO, PayOrderDO payOrderDO) {
+
+        FuiouHttpPoster http = new FuiouHttpPoster();
+        http.setCharset("utf-8");
+        http.setUrl("https://aipay.fuioupay.com/aggregatePay/commonQuery");
+        CommonQueryDataReq req = new CommonQueryDataReq();
+        req.setVersion("1.0");
+        req.setMchnt_cd(mchnt_cd);
+        req.setRandom_str(DateUtils.getCurrentDate("yyyyMMddHHmmss")
+                + "568974");
+        req.setOrder_type(payOrderExtensionDO.getChannelCode());
+        req.setMchnt_order_no(payOrderDO.getPayOrderNo());
+        req.setTerm_id(term_id);
+        String data = MD5.MD5Encode(req.getMchnt_cd() + "|" + req.getOrder_type() + "|" +
+                req.getMchnt_order_no() + "|" + req.getTerm_id() + "|" + req.getRandom_str() + "|" +
+                req.getVersion() + "|" + privateKey);
+        req.setSign(data);
+
+        String res;
+        try {
+            res = http.newPost(JSON.toJSONString(req));
+
+            ObjectMapper mapper = new ObjectMapper();
+            FuYouQueryPayOrderResponseVO resp = mapper.readValue(res, FuYouQueryPayOrderResponseVO.class);
+
+            // 当响应结果为000000且交易状态为SUCCESS时才是支付成功
+            if (resp.getResult_code().equals(resultCode) && resp.getTrans_stat().equals(transStatus)) {
+                // 修改订单扩展信息
+                payOrderExtensionDO.setStatus(PayOrderStatusEnum.SUCCESS.getStatus());
+
+                // 修改订单信息
+                payOrderDO.setStatus(PayOrderStatusEnum.SUCCESS.getStatus());
+                payOrderDO.setExtensionId(payOrderExtensionDO.getId());
+                payOrderDO.setNo(payOrderExtensionDO.getNo());
+                payOrderDO.setChannelOrderNo(resp.getTransaction_id());
+                payOrderDO.setChannelUserId(resp.getBuyer_id());
+                payOrderDO.setChannelId(payOrderExtensionDO.getChannelId());
+                payOrderDO.setChannelCode(payOrderExtensionDO.getChannelCode());
+
+                payOrderService.updatePayOrder(payOrderDO);
+            } else {
+                // 否则支付失败, 记录错误信息
+                payOrderExtensionDO.setChannelErrorCode(resp.getResult_code());
+                payOrderExtensionDO.setChannelErrorMsg(resp.getResult_msg());
+
+            }
+            payOrderExtensionDO.setChannelNotifyData(res);
+            orderExtensionMapper.updateById(payOrderExtensionDO);
+
+        } catch (Exception e) {
+            ErrorCode ERROR = new ErrorCode(1_007_901_006, "查询支付订单失败");
+            throw exception(ERROR);
         }
-        return sb.toString();
     }
+
 }

+ 9 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/fuyouorder/FuYouPayOrderService.java

@@ -1,5 +1,6 @@
 package cn.newfeifan.mall.module.pay.service.fuyouorder;
 
+import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
 import cn.newfeifan.mall.module.pay.fuiou.reqvo.SubmitOrderRequestVO;
 
 import javax.validation.Valid;
@@ -24,4 +25,12 @@ public interface FuYouPayOrderService {
      * @param afterSaleId 售后编号
      */
     void afterSale(Long afterSaleId);
+
+    /**
+     * 获得支付订单
+     *
+     * @param payOrderDO 支付订单
+     * @return 支付订单
+     */
+    PayOrderDO getPayOrderByStatus(PayOrderDO payOrderDO);
 }