From 8392493854d03fbcc8df911c3f5e7b1430579853 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Tue, 23 Aug 2022 17:24:40 +0800
Subject: [PATCH] 20220822

---
 src/main/java/cc/mrbird/febs/pay/util/HttpRespons.java                          |  181 +++++++++++++++
 src/main/java/cc/mrbird/febs/pay/service/impl/UnipayServiceImpl.java            |  134 +++++++++++
 src/main/java/cc/mrbird/febs/pay/service/UnipayService.java                     |   10 
 src/test/java/cc/mrbird/febs/ProfitTest.java                                    |   17 +
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java |   46 +++
 src/main/java/cc/mrbird/febs/pay/model/UnipayDto.java                           |   29 ++
 pom.xml                                                                         |    6 
 src/main/java/cc/mrbird/febs/pay/util/HttpRequester.java                        |  204 +++++++++++++++++
 src/main/java/cc/mrbird/febs/pay/controller/UnipayController.java               |   36 +-
 9 files changed, 643 insertions(+), 20 deletions(-)

diff --git a/pom.xml b/pom.xml
index cef71ae..2b6819d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,6 +29,12 @@
 
     <dependencies>
         <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.0</version>
+        </dependency>
+
+        <dependency>
             <groupId>com.aliyun.oss</groupId>
             <artifactId>aliyun-sdk-oss</artifactId>
             <version>${aliyun-oss.version}</version>
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
index baf7cbb..1deb5c2 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -1,5 +1,6 @@
 package cc.mrbird.febs.mall.service.impl;
 
+import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.enumerates.*;
 import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.AppContants;
@@ -16,18 +17,23 @@
 import cc.mrbird.febs.mall.vo.OrderDetailVo;
 import cc.mrbird.febs.mall.vo.OrderListVo;
 import cc.mrbird.febs.mall.vo.OrderRefundVo;
+import cc.mrbird.febs.pay.model.UnipayDto;
 import cc.mrbird.febs.pay.service.IPayService;
+import cc.mrbird.febs.pay.service.UnipayService;
 import cc.mrbird.febs.rabbit.producter.AgentProducer;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.SecureUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -61,6 +67,7 @@
     private final AgentProducer agentProducer;
     private final IPayService payService;
     private final IMallAchieveService mallAchieveService;
+    private final UnipayService unipayService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -198,6 +205,13 @@
         this.baseMapper.updateById(orderInfo);
     }
 
+    public static void main(String[] args) {
+        String unipayStr = "{\"r1_MerchantNo\":\"888118000001971\",\"rd_Pic\":\"\",\"r6_FrpCode\":\"ALIPAY_H5\",\"r7_TrxNo\":\"100222082332490699\",\"r0_Version\":\"1.0\",\"r3_Amount\":\"0.01\",\"r4_Cur\":\"1\",\"r2_OrderNo\":\"2022082212510288174\",\"rb_CodeMsg\":\"\",\"hmac\":\"1659BB77DEDDF9956EA4D6DF227C3B14\",\"ra_Code\":100,\"rc_Result\":\"<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title></title></head><body><script type='text/javascript'>location.href='https://qr.alipay.com/bax019737vbdwoisxcdp00a2';</script></body></html>\"}";
+        JSONObject jsonObject = JSONUtil.parseObj(unipayStr);
+        String r7_trxNo = (String) jsonObject.get("r7_TrxNo");
+        System.out.println(r7_trxNo);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Map<String, Object> payOrder(PayOrderDto payOrderDto) {
@@ -212,6 +226,7 @@
         }
 
         String payResultStr = "";
+        String rcResult = "";
         switch (payOrderDto.getType()) {
             case "1":
 //                orderInfo.setPayOrderNo(payOrderDto.getPayOrderNo());
@@ -220,12 +235,32 @@
                 agentProducer.sendOrderReturn(orderInfo.getId());
                 break;
             case "2":
-                if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) {
-                    payResultStr = orderInfo.getPayOrderNo();
-                } else {
-                    payResultStr = payService.aliPay(orderInfo);
+//                if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) {
+//                    payResultStr = orderInfo.getPayOrderNo();
+//                } else {
+//                    payResultStr = payService.aliPay(orderInfo);
+//                }
+                UnipayDto unipayDto = new UnipayDto();
+//                unipayDto.setAmount(new BigDecimal("0.01"));
+                unipayDto.setAmount(orderInfo.getAmount());
+                unipayDto.setFrpCode("ALIPAY_H5");
+                unipayDto.setTradeMerchantNo("777180800385820");
+                unipayDto.setOrderNo(orderInfo.getOrderNo());
+                List<MallOrderItem> items = orderInfo.getItems();
+                if(CollUtil.isEmpty(items)){
+                    unipayDto.setProductName("商品");
+                }else{
+                    unipayDto.setProductName(items.get(0).getGoodsName());
                 }
-
+                String unipayStr = unipayService.unipay(unipayDto);
+                if("fail" == unipayStr){
+                    throw new FebsException("支付失败");
+                }else{
+                    JSONUtil.parseObj(unipayStr);
+                    JSONObject jsonObject = JSONUtil.parseObj(unipayStr);
+                    payResultStr = (String) jsonObject.get("r7_TrxNo");
+                    rcResult = (String) jsonObject.get("rc_Result");
+                }
                 orderInfo.setPayOrderNo(payResultStr);
                 orderInfo.setPayMethod("支付宝支付");
                 agentProducer.sendOrderReturn(orderInfo.getId());
@@ -303,6 +338,7 @@
         map.put("orderInfo", payResultStr);
         map.put("orderNo", orderInfo.getOrderNo());
         map.put("orderId", orderInfo.getId());
+        map.put("rcResult", rcResult);
 
         return map;
     }
diff --git a/src/main/java/cc/mrbird/febs/pay/controller/UnipayController.java b/src/main/java/cc/mrbird/febs/pay/controller/UnipayController.java
index 5d9a08d..af48ea8 100644
--- a/src/main/java/cc/mrbird/febs/pay/controller/UnipayController.java
+++ b/src/main/java/cc/mrbird/febs/pay/controller/UnipayController.java
@@ -9,6 +9,7 @@
 import cc.mrbird.febs.pay.model.UniPayCallBackDto;
 import cc.mrbird.febs.rabbit.producter.AgentProducer;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -51,22 +52,27 @@
         log.info("进入汇聚支付回调"+orderNo+";"+orderAmount+";"+payTradeNo+";"+callBackState);
         if("100".equals(callBackState) && StrUtil.isNotBlank(orderNo)){
             MallOrderInfo orderInfo = orderInfoMapper.selectByOrderNo(orderNo);
-            BigDecimal amount = orderInfo.getAmount();
-//            if(amount.compareTo(orderAmount) == 0){
-                MallMember member = memberService.getById(orderInfo.getMemberId());
-                if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
-                    member.setLevel(AgentLevelEnum.FIRST_LEVEL.name());
-                    memberService.updateById(member);
+            if(ObjectUtil.isNotEmpty(orderInfo)){
+                Integer status = orderInfo.getStatus();
+                if(OrderStatusEnum.WAIT_PAY.getValue() == status){
+//              BigDecimal amount = orderInfo.getAmount();
+//              if(amount.compareTo(orderAmount) == 0){
+                    MallMember member = memberService.getById(orderInfo.getMemberId());
+                    if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
+                        member.setLevel(AgentLevelEnum.FIRST_LEVEL.name());
+                        memberService.updateById(member);
+                    }
+
+                    orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
+                    orderInfo.setPayResult("1");
+                    orderInfo.setPayTime(new Date());
+                    orderInfo.setPayTradeNo(payTradeNo);
+                    orderInfoMapper.updateById(orderInfo);
+
+                    agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId());
+//              }
                 }
-
-                orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
-                orderInfo.setPayResult("1");
-                orderInfo.setPayTime(new Date());
-                orderInfo.setPayTradeNo(payTradeNo);
-                orderInfoMapper.updateById(orderInfo);
-
-                agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId());
-//            }
+            }
         }
         return "success";
     }
diff --git a/src/main/java/cc/mrbird/febs/pay/model/UnipayDto.java b/src/main/java/cc/mrbird/febs/pay/model/UnipayDto.java
new file mode 100644
index 0000000..d6bbfa6
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/model/UnipayDto.java
@@ -0,0 +1,29 @@
+package cc.mrbird.febs.pay.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "UnipayDto", description = "汇聚支付接收参数类")
+public class UnipayDto {
+
+    @ApiModelProperty(value = "订单编号", example = "123")
+    private String orderNo;
+
+    @ApiModelProperty(value = "订单金额", example = "123")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "商品名称", example = "123")
+    private String productName;
+
+    @ApiModelProperty(value = "交易类型", example = "123")
+    private String frpCode;
+
+    @ApiModelProperty(value = "报备商户号", example = "123")
+    private String tradeMerchantNo;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/service/UnipayService.java b/src/main/java/cc/mrbird/febs/pay/service/UnipayService.java
new file mode 100644
index 0000000..0069323
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/service/UnipayService.java
@@ -0,0 +1,10 @@
+package cc.mrbird.febs.pay.service;
+
+import cc.mrbird.febs.pay.model.UnipayDto;
+import com.sun.org.apache.xpath.internal.operations.Bool;
+
+public interface UnipayService {
+
+    String unipay(UnipayDto unipayDto);
+
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/UnipayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/UnipayServiceImpl.java
new file mode 100644
index 0000000..0aad1b6
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/UnipayServiceImpl.java
@@ -0,0 +1,134 @@
+package cc.mrbird.febs.pay.service.impl;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.pay.model.UnipayDto;
+import cc.mrbird.febs.pay.service.UnipayService;
+import cc.mrbird.febs.pay.util.HttpRequester;
+import cc.mrbird.febs.pay.util.HttpRespons;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.util.*;
+
+@Slf4j
+@Service
+public class UnipayServiceImpl implements UnipayService {
+
+    public static final String notifyUrl = "http://47.111.90.145:8800/api/unipay/unipayCallBack";
+
+    @Override
+    @Transactional
+    public String unipay(UnipayDto unipayDto) {
+        String key = "2e95f6a3e11e47fa8a4386d6aefe1735";/** md5密钥商户后台-商户中心-商户设置-密钥管理获取 必填!*/
+        Map<String, String> map = new HashMap<String, String>();
+        map.put("p0_Version", "1.0");/** 版本号 */
+        map.put("p1_MerchantNo", "888118000001971");/** 商户编号 */
+        map.put("p2_OrderNo", unipayDto.getOrderNo()); /**商户订单号*/
+        map.put("p3_Amount", unipayDto.getAmount().toString());/**订单金额*/
+        map.put("p4_Cur", "1"); /**交易币种 */
+        map.put("p5_ProductName", unipayDto.getProductName()); /** 商品名称 */
+        map.put("p9_NotifyUrl", notifyUrl); /** 服务器异步通知地址 */
+        map.put("q1_FrpCode", unipayDto.getFrpCode()); /** 交易类型*/
+        map.put("qa_TradeMerchantNo",unipayDto.getTradeMerchantNo()); /** 777开头的报备商户号   必填!*/
+        map.put("q7_AppId", "wx42ce0fbc27965fe9"); /** 777开头的报备商户号   必填!*/
+
+        String Strmap = createLinkStringByGet(map);
+        // 签名
+        String sign = "";
+        sign = SignByMD5(Strmap, key);
+        map.put("hmac", sign);/** 签名数据 */
+        System.out.println("发送:" + JSON.toJSONString(map).toString());
+
+        // post请求参数内容
+        HttpRequester hr = new HttpRequester();
+        HttpRespons HP = null;
+        try {
+            HP = hr.sendPost("https://www.joinpay.com/trade/uniPayApi.action", map);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("接收返回参数:" + HP.getContent());
+        Boolean result = false;
+        try {
+            result = nosign(HP.getContent(), key);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if(result){
+            return HP.getContent();
+        }else{
+            return "fail";
+        }
+    }
+
+
+    //参数的拼接整理
+    private String createLinkStringByGet(Map<String, String> params){
+        // TODO Auto-generated method stub
+        List<String> keys = new ArrayList<String>(params.keySet());
+        Collections.sort(keys);
+        String str1 ="";
+        for(int i=0;i<keys.size();i++) {
+            String key = keys.get(i);
+
+            Object value = params.get(key);//(String) 强制类型转换
+            if(value instanceof Integer) {
+                value = (Integer)value;
+            }
+            if(i==keys.size()-1) {
+
+                str1 = str1+value.toString();
+            }else {
+
+                str1 = str1+value;
+            }
+        }
+        System.out.println("整理"+str1);
+        return str1;
+    }
+
+    /**
+     * MD5签名
+     *
+     * @param requestSign 请求签名串
+     * @param merchantKey 商户秘钥
+     */
+    private String SignByMD5(String requestSign, String merchantKey) {
+
+        String reqHmac = "";
+        try {
+            reqHmac = DigestUtils.md5Hex(requestSign + merchantKey).toUpperCase();
+        } catch (Exception e) {}
+
+        return reqHmac;
+    }
+
+    /**
+     * 验证返回参数
+     * @param hp
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    private boolean nosign(String hp, String key){
+        System.out.println("接收到:" + hp);
+        JSONObject myJson = JSONObject.parseObject(hp);
+        Map m = myJson;
+
+        // 返回hmac
+        String returnHmac = (String) m.remove("hmac");
+        System.out.println(m.toString());
+        String Strmap = createLinkStringByGet(m);
+
+        // 返回参数组装hmac
+        String hmac1 = SignByMD5(Strmap, key);
+        return hmac1.equalsIgnoreCase(returnHmac);
+
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/util/HttpRequester.java b/src/main/java/cc/mrbird/febs/pay/util/HttpRequester.java
new file mode 100644
index 0000000..4356812
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/util/HttpRequester.java
@@ -0,0 +1,204 @@
+package cc.mrbird.febs.pay.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.Vector;
+
+public class HttpRequester {
+	private String defaultContentEncoding;  
+	   
+    public HttpRequester() {  
+        this.defaultContentEncoding = Charset.defaultCharset().name();  
+    }  
+	
+    /** 
+     * 发送POST请求 
+     *  
+     * @param urlString 
+     *            URL地址 
+     * @return 响应对象 
+     * @throws IOException 
+     */  
+    public HttpRespons sendPost(String urlString) throws IOException {  
+        return this.send(urlString, "POST", null, null);  
+    }  
+   
+    /** 
+     * 发送POST请求 
+     *  
+     * @param urlString 
+     *            URL地址 
+     * @param params 
+     *            参数集合 
+     * @return 响应对象 
+     * @throws IOException 
+     */  
+    public HttpRespons sendPost(String urlString, Map<String, String> params)  
+            throws IOException {  
+    	
+    	for(String key : params.keySet()) {
+			if(params.get(key)!=null&&!"".equals(params.get(key))) {
+				params.put(key, (String)URLEncoder.encode(params.get(key),"utf-8")) ;//(String) 强制类型转换
+			}
+    	}
+    	
+
+    	
+        return this.send(urlString, "POST", params, null);  
+    }  
+   
+    /** 
+     * 发送POST请求 
+     *  
+     * @param urlString 
+     *            URL地址 
+     * @param params 
+     *            参数集合 
+     * @param propertys 
+     *            请求属性 
+     * @return 响应对象 
+     * @throws IOException 
+     */  
+    public HttpRespons sendPost(String urlString, Map<String, String> params,  
+            Map<String, String> propertys) throws IOException {  
+        return this.send(urlString, "POST", params, propertys);  
+    }  
+   
+    /** 
+     * 发送HTTP请求 
+     *  
+     * @param urlString 
+     * @return 响映对象 
+     * @throws IOException 
+     */  
+    private HttpRespons send(String urlString, String method,  
+            Map<String, String> parameters, Map<String, String> propertys)  
+            throws IOException {  
+        HttpURLConnection urlConnection = null;  
+   
+        if (method.equalsIgnoreCase("GET") && parameters != null) {  
+            StringBuffer param = new StringBuffer();  
+            int i = 0;  
+            for (String key : parameters.keySet()) {  
+                if (i == 0)  
+                    param.append("?");  
+                else  
+                    param.append("&");  
+                param.append(key).append("=").append(parameters.get(key));  
+                i++;  
+            }  
+            urlString += param;  
+        }  
+        URL url = new URL(urlString);  
+        urlConnection = (HttpURLConnection) url.openConnection();  
+   
+        urlConnection.setRequestMethod(method);  
+        urlConnection.setDoOutput(true);  
+        urlConnection.setDoInput(true);  
+        urlConnection.setUseCaches(false);  
+   
+        if (propertys != null)  
+            for (String key : propertys.keySet()) {  
+                urlConnection.addRequestProperty(key, propertys.get(key));  
+            }  
+   
+        if (method.equalsIgnoreCase("POST") && parameters != null) {  
+            StringBuffer param = new StringBuffer();  
+            for (String key : parameters.keySet()) {  
+                param.append("&");  
+                param.append(key).append("=").append(parameters.get(key));  
+            }  
+            urlConnection.getOutputStream().write(param.toString().getBytes());  
+            urlConnection.getOutputStream().flush();  
+            urlConnection.getOutputStream().close();  
+        }  
+   
+        return this.makeContent(urlString, urlConnection);  
+    }  
+   
+    /** 
+     * 得到响应对象 
+     *  
+     * @param urlConnection 
+     * @return 响应对象 
+     * @throws IOException 
+     */  
+    private HttpRespons makeContent(String urlString,  
+            HttpURLConnection urlConnection) throws IOException {  
+        HttpRespons httpResponser = new HttpRespons();  
+        try {  
+            InputStream in = urlConnection.getInputStream();  
+            BufferedReader bufferedReader = new BufferedReader(  
+                    new InputStreamReader(in));  
+            httpResponser.contentCollection = new Vector<String>();  
+            StringBuffer temp = new StringBuffer();  
+            String line = bufferedReader.readLine();  
+            while (line != null) {  
+                httpResponser.contentCollection.add(line);  
+                temp.append(line).append("\r\n");  
+                line = bufferedReader.readLine();  
+            }  
+            bufferedReader.close();  
+   
+            String ecod = urlConnection.getContentEncoding();  
+            if (ecod == null)  
+                ecod = this.defaultContentEncoding;  
+   
+            httpResponser.urlString = urlString;  
+   
+            httpResponser.defaultPort = urlConnection.getURL().getDefaultPort();  
+            httpResponser.file = urlConnection.getURL().getFile();  
+            httpResponser.host = urlConnection.getURL().getHost();  
+            httpResponser.path = urlConnection.getURL().getPath();  
+            httpResponser.port = urlConnection.getURL().getPort();  
+            httpResponser.protocol = urlConnection.getURL().getProtocol();  
+            httpResponser.query = urlConnection.getURL().getQuery();  
+            httpResponser.ref = urlConnection.getURL().getRef();  
+            httpResponser.userInfo = urlConnection.getURL().getUserInfo();  
+   
+            httpResponser.content = new String(temp.toString().getBytes(), ecod);  
+            httpResponser.contentEncoding = ecod;  
+            httpResponser.code = urlConnection.getResponseCode();  
+            httpResponser.message = urlConnection.getResponseMessage();  
+            httpResponser.contentType = urlConnection.getContentType();  
+            httpResponser.method = urlConnection.getRequestMethod();  
+            httpResponser.connectTimeout = urlConnection.getConnectTimeout();  
+            httpResponser.readTimeout = urlConnection.getReadTimeout();  
+   
+            return httpResponser;  
+        } catch (IOException e) {  
+            throw e;  
+        } finally {  
+            if (urlConnection != null)  
+                urlConnection.disconnect();  
+        }  
+    }  
+   
+    /** 
+     * 默认的响应字符集 
+     */  
+    public String getDefaultContentEncoding() {  
+        return this.defaultContentEncoding;  
+    }  
+   
+    /** 
+     * 设置默认的响应字符集 
+     */  
+    public void setDefaultContentEncoding(String defaultContentEncoding) {  
+        this.defaultContentEncoding = defaultContentEncoding;  
+    }  
+
+}
+       
+       
+       
+       
+       
+
diff --git a/src/main/java/cc/mrbird/febs/pay/util/HttpRespons.java b/src/main/java/cc/mrbird/febs/pay/util/HttpRespons.java
new file mode 100644
index 0000000..c028768
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/util/HttpRespons.java
@@ -0,0 +1,181 @@
+package cc.mrbird.febs.pay.util;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.RequestEntity;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Vector;
+
+
+public class HttpRespons {
+	  String urlString;     
+      
+	    int defaultPort;     
+	      
+	    String file;     
+	      
+	    String host;     
+	      
+	    String path;     
+	      
+	    int port;     
+	      
+	    String protocol;     
+	      
+	    String query;     
+	      
+	    String ref;     
+	      
+	    String userInfo;     
+	      
+	    String contentEncoding;     
+	      
+	    String content;     
+	      
+	    String contentType;     
+	      
+	    int code;     
+	      
+	    String message;     
+	      
+	    String method;     
+	      
+	    int connectTimeout;     
+	      
+	    int readTimeout;     
+	      
+	    Vector<String> contentCollection;     
+	      
+	    public String getContent() {     
+	        return content;     
+	    }     
+	      
+	    public String getContentType() {     
+	        return contentType;     
+	    }     
+	      
+	    public int getCode() {     
+	        return code;     
+	    }     
+	      
+	    public String getMessage() {     
+	        return message;     
+	    }     
+	      
+	    public Vector<String> getContentCollection() {     
+	        return contentCollection;     
+	    }     
+	      
+	    public String getContentEncoding() {     
+	        return contentEncoding;     
+	    }     
+	      
+	    public String getMethod() {     
+	        return method;     
+	    }     
+	      
+	    public int getConnectTimeout() {     
+	        return connectTimeout;     
+	    }     
+	      
+	    public int getReadTimeout() {     
+	        return readTimeout;     
+	    }     
+	      
+	    public String getUrlString() {     
+	        return urlString;     
+	    }     
+	      
+	    public int getDefaultPort() {     
+	        return defaultPort;     
+	    }     
+	      
+	    public String getFile() {     
+	        return file;     
+	    }     
+	      
+	    public String getHost() {     
+	        return host;     
+	    }     
+	      
+	    public String getPath() {     
+	        return path;     
+	    }     
+	      
+	    public int getPort() {     
+	        return port;     
+	    }     
+	      
+	    public String getProtocol() {     
+	        return protocol;     
+	    }     
+	      
+	    public String getQuery() {     
+	        return query;     
+	    }     
+	      
+	    public String getRef() {     
+	        return ref;     
+	    }     
+	      
+	    public String getUserInfo() {     
+	        return userInfo;     
+	    } 
+	    
+	    
+	    public static String post(String params,String requestUrl) throws IOException {  
+	        // TODO Auto-generated method stub  
+//	        try {       
+	           //HttpRequester request = new HttpRequester();  
+	           // request.setDefaultContentEncoding("utf-8"); 	
+	            byte[] requestBytes = params.getBytes("utf-8"); // 将参数转为二进制流
+	                   HttpClient httpClient = new HttpClient(); // 客户端实例化
+	                   PostMethod postMethod = new PostMethod(requestUrl);
+	                   //设置请求头Authorization
+//	                   postMethod.setRequestHeader("Authorization", "Basic " + authorization);
+	                   // 设置请求头  Content-Type
+	                   postMethod.setRequestHeader("Content-Type", "application/json");
+	                   InputStream inputStream = new ByteArrayInputStream(requestBytes, 0,requestBytes.length);
+	                   RequestEntity requestEntity = new InputStreamRequestEntity(inputStream,
+	                             requestBytes.length, "application/json; charset=utf-8"); // 请求体
+	                   postMethod.setRequestEntity(requestEntity);
+	                   httpClient.executeMethod(postMethod);// 执行请求
+	                   InputStream soapResponseStream = postMethod.getResponseBodyAsStream();// 获取返回的流
+	                   byte[] datas = null;
+	                    try {
+	                        datas = readInputStream(soapResponseStream);// 从输入流中读取数据
+	                    } catch (Exception e) {
+	                        e.printStackTrace();
+	                     }
+	                    String result = new String(datas, "UTF-8");// 将二进制流转为String
+	                     // 打印返回结果
+	                     // System.out.println(result);
+	             
+	                     return result;   
+	    }  
+	    
+	    
+	    /**
+	          * 从输入流中读取数据
+	          * 
+	          * @param inStream
+	          * @return
+	          * @throws Exception
+	    */
+	    public static byte[] readInputStream(InputStream inStream) throws Exception {
+	    	         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+	    	         byte[] buffer = new byte[1024];
+	    	         int len = 0;
+	    	         while ((len = inStream.read(buffer)) != -1) {
+	    	            outStream.write(buffer, 0, len);
+	    	         }
+	    	         byte[] data = outStream.toByteArray();
+	    	         outStream.close();
+	    	         inStream.close();
+	    	        return data;
+	    	     }
+}
diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java
index 21a7b3d..816d535 100644
--- a/src/test/java/cc/mrbird/febs/ProfitTest.java
+++ b/src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -7,6 +7,8 @@
 import cc.mrbird.febs.mall.service.IAgentService;
 import cc.mrbird.febs.mall.service.IMallAchieveService;
 import cc.mrbird.febs.mall.service.IMemberProfitService;
+import cc.mrbird.febs.pay.model.UnipayDto;
+import cc.mrbird.febs.pay.service.UnipayService;
 import cc.mrbird.febs.rabbit.consumer.AgentConsumer;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -113,4 +115,19 @@
 
         mallAchieveService.add(83L);
     }
+
+
+    @Autowired
+    private UnipayService unipayService;
+    @Test
+    public void unipay(){
+        UnipayDto unipayDto = new UnipayDto();
+        unipayDto.setAmount(new BigDecimal("0.01"));
+        unipayDto.setFrpCode("ALIPAY_H5");
+        unipayDto.setTradeMerchantNo("777180800385820");
+//        unipayDto.setFrpCode("WEIXIN_APP3");
+        unipayDto.setOrderNo("2022082316415386395");
+        unipayDto.setProductName("洗护套装");
+        unipayService.unipay(unipayDto);
+    }
 }

--
Gitblit v1.9.1