Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

tomatozq 5 rokov pred
rodič
commit
2934f93694

+ 2 - 0
picc-common/src/main/java/com/jpsoft/picc/modules/base/dao/TransactionRecordDAO.java

@@ -15,4 +15,6 @@ public interface TransactionRecordDAO {
 	int delete(String id);
 	List<TransactionRecord> list();
 	List<TransactionRecord> search(Map<String, Object> searchParams, List<Sort> sortList);
+
+    TransactionRecord getByOrderNo(String orderNo);
 }

+ 2 - 0
picc-common/src/main/java/com/jpsoft/picc/modules/base/service/TransactionRecordService.java

@@ -14,4 +14,6 @@ public interface TransactionRecordService {
 	int delete(String id);
 	List<TransactionRecord> list();
 	Page<TransactionRecord> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, List<Sort> sortList);
+
+	TransactionRecord getByOrderNo(String orderNo);
 }

+ 11 - 6
picc-common/src/main/java/com/jpsoft/picc/modules/base/service/impl/TransactionRecordServiceImpl.java

@@ -29,14 +29,14 @@ public class TransactionRecordServiceImpl implements TransactionRecordService {
 	public int insert(TransactionRecord model) {
 		// TODO Auto-generated method stub
 		//model.setId(UUID.randomUUID().toString());
-		
+
 		return transactionRecordDAO.insert(model);
 	}
 
 	@Override
 	public int update(TransactionRecord model) {
 		// TODO Auto-generated method stub
-		return transactionRecordDAO.update(model);		
+		return transactionRecordDAO.update(model);
 	}
 
 	@Override
@@ -49,22 +49,27 @@ public class TransactionRecordServiceImpl implements TransactionRecordService {
 	public boolean exist(String id) {
 		// TODO Auto-generated method stub
 		int count = transactionRecordDAO.exist(id);
-		
+
 		return count > 0 ? true : false;
 	}
-	
+
 	@Override
 	public List<TransactionRecord> list() {
 		// TODO Auto-generated method stub
 		return transactionRecordDAO.list();
 	}
-		
+
 	@Override
 	public Page<TransactionRecord> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,List<Sort> sortList) {
         Page<TransactionRecord> page = PageHelper.startPage(pageNumber,pageSize).doSelectPage(()->{
             transactionRecordDAO.search(searchParams,sortList);
         });
-        
+
         return page;
 	}
+
+	@Override
+	public TransactionRecord getByOrderNo(String orderNo) {
+		return transactionRecordDAO.getByOrderNo(orderNo);
+	}
 }

+ 41 - 0
picc-common/src/main/java/com/jpsoft/picc/modules/common/utils/MD5Util.java

@@ -0,0 +1,41 @@
+package com.jpsoft.picc.modules.common.utils;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2020-2-11 12:32
+ */
+public class MD5Util {
+
+
+        public static String getMD5(String source) {
+            return getMD5(source.getBytes());
+        }
+
+        public static String getMD5(byte[] source) {
+            String s = null;
+            char hexDigits[] = {       // 用来将字节转换成 16 进制表示的字符
+                    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+            try {
+                java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
+                md.update(source);
+                byte tmp[] = md.digest();          // MD5 的计算结果是一个 128 位的长整数,
+                // 用字节表示就是 16 个字节
+                char str[] = new char[16 * 2];   // 每个字节用 16 进制表示的话,使用两个字符,
+                // 所以表示成 16 进制需要 32 个字符
+                int k = 0;                                // 表示转换结果中对应的字符位置
+                for (int i = 0; i < 16; i++) {          // 从第一个字节开始,对 MD5 的每一个字节
+                    // 转换成 16 进制字符的转换
+                    byte byte0 = tmp[i];                 // 取第 i 个字节
+                    str[k++] = hexDigits[byte0 >>> 4 & 0xf];  // 取字节中高 4 位的数字转换,
+                    // >>> 为逻辑右移,将符号位一起右移
+                    str[k++] = hexDigits[byte0 & 0xf];            // 取字节中低 4 位的数字转换
+                }
+
+                s = new String(str);                                 // 换后的结果转换为字符串
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            return s;
+        }
+}

+ 87 - 0
picc-common/src/main/java/com/jpsoft/picc/modules/common/utils/SignUtil.java

@@ -0,0 +1,87 @@
+package com.jpsoft.picc.modules.common.utils;
+
+
+
+
+
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2020-2-11 10:22
+ */
+public class SignUtil {
+
+    /**
+     * 创建签名
+     * @return
+     */
+    public static String createSign(HashMap<String,Object> paramMap, String key){
+
+        SortedMap<String,Object> sortMap = new TreeMap<String,Object>(paramMap);
+
+        String sign = "";
+
+        for (Map.Entry<String, Object> entry : sortMap.entrySet()) {
+            if (entry.getValue() == null || "".equals(entry.getValue().toString())){
+                sign += entry.getKey() + "=|";
+            }else {
+                sign += entry.getKey() + "=" + entry.getValue() + "|";
+            }
+        }
+
+        sign += key;
+
+        String md5_sign = "";
+
+        try {
+            md5_sign = MD5Util.getMD5(sign.getBytes("utf-8"));
+        } catch (UnsupportedEncodingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+
+        return md5_sign;
+
+    }
+
+    /**
+     * 验证签名
+     * @return
+     */
+    public static boolean validateSign(HashMap<String,Object> paramMap,String key,String sign){
+
+        SortedMap<String,Object> sortMap = new TreeMap<String,Object>(paramMap);
+
+        String validate_sign = "";
+
+        for (Map.Entry<String, Object> entry : sortMap.entrySet()) {
+            validate_sign += entry.getKey() + "=" + entry.getValue() + "|";
+        }
+
+        validate_sign += key;
+
+        String md5_sign = "";
+
+        try {
+            md5_sign = MD5Util.getMD5(validate_sign.getBytes("utf-8"));
+        } catch (UnsupportedEncodingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        System.out.println(">>>>>>>>>>sign>>>>" + sign);
+        System.out.println(">>>>>>>>>>>md5_sign>>>>" + md5_sign);
+
+        if(md5_sign.equals(sign)){
+            return true;
+        }else{
+            return false;
+        }
+    }
+}

+ 6 - 2
picc-common/src/main/resources/mapper/base/TransactionRecord.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- namespace必须指向DAO接口 -->
 <mapper namespace="com.jpsoft.picc.modules.base.dao.TransactionRecordDAO">
@@ -91,7 +91,7 @@
 	where id_=#{id}
 	</update>
 	<select id="get" parameterType="string" resultMap="TransactionRecordMap">
-		select 
+		select
 id_,company_id,transaction_number,amount_,order_no,payment_status,buy_type,payment_time,create_by,create_time,update_by,update_time,del_flag		from base_transaction_record where id_=#{0}
 	</select>
 	<select id="exist" parameterType="string" resultType="int">
@@ -113,4 +113,8 @@ id_,company_id,transaction_number,amount_,order_no,payment_status,buy_type,payme
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
+
+	<select id="getByOrderNo" resultMap="TransactionRecordMap">
+		select * from base_transaction_record where order_no = #{0}
+	</select>
 </mapper>

+ 170 - 0
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/pay/controller/Pay.java

@@ -0,0 +1,170 @@
+package com.jpsoft.picc.modules.pay.controller;
+
+import cn.hutool.json.JSONObject;
+import com.jpsoft.picc.modules.base.entity.TransactionRecord;
+import com.jpsoft.picc.modules.base.service.CompanyService;
+import com.jpsoft.picc.modules.base.service.TransactionRecordService;
+import com.jpsoft.picc.modules.common.dto.MessageResult;
+import com.jpsoft.picc.modules.common.utils.SignUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2020-2-11 12:37
+ */
+
+@Controller
+@RequestMapping("/pay")
+@Api("支付")
+public class Pay {
+
+    @Value("${notifyBackUrl}")
+    private String notifyBackUrl;
+
+    @Value("${synchroBackUrl}")
+    private String synchroBackUrl;
+
+    @Value("${jpcloudUrl}")
+    private String jpcloudUrl;
+
+    @Value("${sellerSerialNumber}")
+    private String sellerSerialNumber;
+
+    @Autowired
+    private TransactionRecordService transactionRecordService;
+
+    @Autowired
+    private CompanyService companyService;
+
+
+    @ResponseBody
+    @ApiOperation(value="支付")
+    @ApiImplicitParam(name = "id",value = "流水号id", required = true)
+    @RequestMapping(value="/paySubmit/{id}")
+    public MessageResult paySubmit(HttpServletRequest request, @PathVariable("id") String id){
+
+        //TODO 买家串号获取修改
+        TransactionRecord transactionRecord = transactionRecordService.get(id);
+
+     //   AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
+      //  Company company = companyService.findBy(principal.getName());
+
+
+
+        HashMap<String,Object> paramMap = new HashMap<String,Object>();
+        paramMap.put("orderNo", transactionRecord.getOrderNo());
+        paramMap.put("orderName", "PICC");
+        paramMap.put("freezeTime", transactionRecord.getCreateTime().getTime()/1000);
+        paramMap.put("unfreezeTime", transactionRecord.getCreateTime().getTime()/1000);
+        paramMap.put("orderAmount", transactionRecord.getAmount());
+        paramMap.put("code", "0008");
+        paramMap.put("buyerSerialNumber", "000101000178");//取登录用户的ID
+        paramMap.put("sellerSerialNumber", sellerSerialNumber);
+        paramMap.put("notifyBackUrl", notifyBackUrl);
+        paramMap.put("synchroBackUrl", synchroBackUrl);
+        String sign = SignUtil.createSign(paramMap, "1234567890");
+        paramMap.put("sign", sign);
+
+        String param = "";
+
+        for (Map.Entry<String, Object> map : paramMap.entrySet()) {
+            param += map.getKey() + "=" + map.getValue() + "&";
+        }
+
+        if(StringUtils.isNotBlank(param)){
+            param = param.substring(0,param.length()-1);
+        }
+        String returnUrl=jpcloudUrl+"?"+param;
+        MessageResult msgResult = new MessageResult<>();
+        msgResult.setData(returnUrl);
+        msgResult.setResult(true);
+
+
+        return msgResult;
+    }
+
+    @RequestMapping(value = "/orderNotifyBack")
+    @ResponseBody
+    public  MessageResult<?> orderNotifyBack(HttpServletRequest req,String payTime,String payType,String orderNo,String sign) {
+        HashMap<String, Object> retMap = new HashMap<String, Object>();
+
+        String status = "success";
+        String message = "订单支付成功";
+        JSONObject body = new JSONObject();
+        System.out.println("payTime>>>" + payTime + "paymentType>>>" + payType + ">>>>orderNo>>" + orderNo + "sign>>>" + sign);
+        if(StringUtils.isNotBlank(payType) && StringUtils.isNotBlank(orderNo)){
+
+            HashMap<String,Object> signMap = new HashMap<String,Object>();
+
+            Map<String,String[]> paramMap = req.getParameterMap();
+
+            for (Map.Entry<String, String[]> map : paramMap.entrySet()) {
+                if(!"sign".equals(map.getKey())){
+                    signMap.put(map.getKey(), map.getValue()[0]);
+                }
+            }
+      //      String signKey = ReadPropertiesUtils.getProperty("thirdInfo", "signKey");
+            boolean result = SignUtil.validateSign(signMap,"1234567890",sign);
+
+            if(result){
+                TransactionRecord transactionRecord = transactionRecordService.getByOrderNo(orderNo);
+                if(transactionRecord != null && transactionRecord.getPaymentStatus() != "20"){
+                    transactionRecord.setPaymentStatus("20");
+                    transactionRecord.setPaymentTime(new Date());
+                    transactionRecord.setBuyType(payType);
+                    transactionRecordService.update(transactionRecord);
+
+                    body.put("orderNo", orderNo);
+                    body.put("backStatus", "回调成功");
+                    body.put("backTime", new Date().getTime()/1000);
+                }else if(transactionRecord == null){
+                    message = "订单不存在";
+                    status = "fail";
+                }else if("20".equals(transactionRecord.getPaymentStatus())){
+                    message = "订单已支付";
+                    status = "fail";
+                }
+            }else{
+                message = "签名不正确";
+                status = "fail";
+            }
+
+        }else{
+            message = "订单号不存在";
+            status = "fail";
+        }
+        retMap.put("status", status);
+        retMap.put("message", message);
+        retMap.put("body", body);
+        MessageResult msgResult = new MessageResult<>();
+        msgResult.setData(retMap);
+        msgResult.setResult(true);
+
+        return msgResult;
+    }
+
+    @GetMapping(value="/paySuccess")
+    @ApiOperation(value="返回前端")
+    public String paySuccess(){
+        return "redirect:/portal/";
+    }
+
+
+
+}

+ 6 - 1
picc-enterprise-server/src/main/resources/application.yml

@@ -83,4 +83,9 @@ oss:
   endpoint: http://oss-cn-hangzhou.aliyuncs.com
   bucketName: wzzgh2out
   urlPrefix: http://vod.wzgh.org
-  objectPre: picc
+  objectPre: picc
+
+notifyBackUrl: http://18891j25i6.iok.la:40309/picc-enterprise-server/pay/orderNotifyBack
+synchroBackUrl: http://18891j25i6.iok.la:40309/picc-enterprise-server/pay/paySuccess
+jpcloudUrl: http://gyxm.jing-zhou.gov.cn/jp-cloud-api/payment/tradingOrderPayPc
+sellerSerialNumber: '000001000020'