liuzf 3 lat temu
rodzic
commit
8e1fead198

+ 53 - 15
ruoyi-admin/src/main/java/com/ruoyi/web/H5Api/api/H5PersonalController.java

@@ -1,24 +1,50 @@
 package com.ruoyi.web.H5Api.api;
 
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.annotation.RepeatSubmit;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.enums.OperatorType;
-import com.ruoyi.web.pcApi.domain.*;
-import com.ruoyi.web.pcApi.service.*;
-import org.apache.commons.collections.map.HashedMap;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import com.ruoyi.web.line.LinePay;
+import com.ruoyi.web.line.LinePayRefundAPOD;
+import com.ruoyi.web.pcApi.domain.TCommodityCoupon;
+import com.ruoyi.web.pcApi.domain.TCommodityManage;
+import com.ruoyi.web.pcApi.domain.TCustomerCollectionOrFootprint;
+import com.ruoyi.web.pcApi.domain.TCustomerCoupon;
+import com.ruoyi.web.pcApi.domain.TCustomerDistributionRecord;
+import com.ruoyi.web.pcApi.domain.TCustomerIntegralRecord;
+import com.ruoyi.web.pcApi.domain.TCustomerManage;
+import com.ruoyi.web.pcApi.domain.TCustomerNotice;
+import com.ruoyi.web.pcApi.domain.TOrderEvaluate;
+import com.ruoyi.web.pcApi.domain.TOrderManage;
+import com.ruoyi.web.pcApi.domain.TOrderManageTotal;
+import com.ruoyi.web.pcApi.service.ITCommodityCouponService;
+import com.ruoyi.web.pcApi.service.ITCommodityManageService;
+import com.ruoyi.web.pcApi.service.ITCustomerCollectionOrFootprintService;
+import com.ruoyi.web.pcApi.service.ITCustomerCouponService;
+import com.ruoyi.web.pcApi.service.ITCustomerDistributionRecordService;
+import com.ruoyi.web.pcApi.service.ITCustomerIntegralRecordService;
+import com.ruoyi.web.pcApi.service.ITCustomerManageService;
+import com.ruoyi.web.pcApi.service.ITCustomerNoticeService;
+import com.ruoyi.web.pcApi.service.ITOrderEvaluateService;
+import com.ruoyi.web.pcApi.service.ITOrderManageService;
+import com.ruoyi.web.pcApi.service.ITOrderManageTotalService;
 
 /**
  * h5端-个人中心api
@@ -53,7 +79,11 @@ public class H5PersonalController extends BaseController
     private ITCommodityCouponService commodityCouponService;
     @Autowired
     private ITCustomerIntegralRecordService customerIntegralRecordService;
-
+    @Autowired
+    private LinePay linePay;
+    @Autowired
+    private ITOrderManageTotalService orderManageTotalService;
+    
     /**
      *  完善用户信息
      * @return
@@ -183,7 +213,15 @@ public class H5PersonalController extends BaseController
 
         }
 
-
+        //
+        TOrderManageTotal totalManager = orderManageTotalService.selectTOrderManageTotalById(orderManage.getOrderTotalId());
+        //
+        LinePayRefundAPOD resp = linePay.payRefund(totalManager.getTransactionId(), orderManage.getOrderMoney().longValue());
+        
+        if ("0000".equals(resp.returnCode)) {
+        	AjaxResult.error("LINE PAY取引返金失敗しました。");
+        }
+        
         return AjaxResult.success(orderManageService.updateTOrderManage(TOrderManage.builder().id(id)
                 .status("99").returnDate(new Date()).build()));
     }

+ 2 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/line/LineConfig.java

@@ -19,5 +19,7 @@ public class LineConfig {
     public String callbankCancelUrl;
     @Value("${line.password}")
     public String password;
+    @Value("${line.refundUrl}")
+    public String refund;
 
 }

+ 71 - 47
ruoyi-admin/src/main/java/com/ruoyi/web/line/LinePay.java

@@ -92,6 +92,36 @@ public class LinePay  implements Serializable {
 		return sendBody;
 	}
 	
+	/**
+	 * set the header info
+	 * @param request
+	 * @throws URISyntaxException 
+	 */
+	private void setHeaderAndEntity(HttpPost request, String sendBody) throws URISyntaxException {
+		String nonce = UUID.randomUUID().toString();
+		request.setHeader("Content-Type", "application/json");
+		request.setHeader("X-LINE-ChannelId", lineConfig.channelId);
+		request.setHeader("X-LINE-Authorization-Nonce", nonce);
+		
+		StringBuffer message = new StringBuffer();
+		//channelSecret
+		message.append(lineConfig.channelSecret);
+		//path
+		message.append(request.getUri().getPath());
+		//body
+		message.append(sendBody);
+		//nonce
+		message.append(nonce);
+		
+		byte[] bytes = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_SHA_256, lineConfig.channelSecret.getBytes()).doFinal(message.toString().getBytes());
+		
+		byte[] byteArray = Base64.encodeBase64(bytes);
+		
+		request.setHeader("X-LINE-Authorization", new String(byteArray));
+		
+		request.setEntity(new StringEntity(sendBody, ContentType.APPLICATION_JSON));
+
+	}
 	/**
 	 * line pay 
 	 * @param orderManageTotal
@@ -103,35 +133,13 @@ public class LinePay  implements Serializable {
 		
 		ObjectMapper mapper = new ObjectMapper();
 	
-		String nonce = UUID.randomUUID().toString();
-		
 		LinePayAPOD response = null;
 		
 		try (CloseableHttpClient client = HttpClients.createDefault()) {
 
 			HttpPost request = new HttpPost(lineConfig.payUrl);
 	
-			request.setHeader("Content-Type", "application/json");
-			request.setHeader("X-LINE-ChannelId", lineConfig.channelId);
-			request.setHeader("X-LINE-Authorization-Nonce", nonce);
-			
-			StringBuffer message = new StringBuffer();
-			//channelSecret
-			message.append(lineConfig.channelSecret);
-			//path
-			message.append(request.getUri().getPath());
-			//body
-			message.append(mapper.writeValueAsString(sendBody));
-			//nonce
-			message.append(nonce);
-			
-			byte[] bytes = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_SHA_256, lineConfig.channelSecret.getBytes()).doFinal(message.toString().getBytes());
-			
-			byte[] byteArray = Base64.encodeBase64(bytes);
-			
-			request.setHeader("X-LINE-Authorization", new String(byteArray));
-			
-			request.setEntity(new StringEntity(mapper.writeValueAsString(sendBody), ContentType.APPLICATION_JSON));
+			setHeaderAndEntity(request, mapper.writeValueAsString(sendBody));
 			
 			response = client.execute(request, httpResponse ->
 		       mapper.readValue(EntityUtils.toString(httpResponse.getEntity()), LinePayAPOD.class));
@@ -158,9 +166,7 @@ public class LinePay  implements Serializable {
 		body.setAmount(total);
 		
 		ObjectMapper mapper = new ObjectMapper();
-		
-		String nonce = UUID.randomUUID().toString();
-		
+
 		MessageFormat form = new MessageFormat(lineConfig.confirmUrl);
 				
 		String formatStr = form.format(new Object[] {transactionId}); 
@@ -171,27 +177,7 @@ public class LinePay  implements Serializable {
 
 			HttpPost request = new HttpPost(formatStr);
 	
-			request.setHeader("Content-Type", "application/json");
-			request.setHeader("X-LINE-ChannelId", lineConfig.channelId);
-			request.setHeader("X-LINE-Authorization-Nonce", nonce);
-
-			StringBuffer message = new StringBuffer();
-			//channelSecret
-			message.append(lineConfig.channelSecret);
-			//path
-			message.append(request.getUri().getPath());
-			//body
-			message.append(mapper.writeValueAsString(body));
-			//nonce
-			message.append(nonce);
-			
-			byte[] bytes = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_SHA_256, lineConfig.channelSecret.getBytes()).doFinal(message.toString().getBytes());
-			
-			byte[] byteArray = Base64.encodeBase64(bytes);
-			
-			request.setHeader("X-LINE-Authorization", new String(byteArray));
-			
-			request.setEntity(new StringEntity(mapper.writeValueAsString(body), ContentType.APPLICATION_JSON));
+			setHeaderAndEntity(request, mapper.writeValueAsString(body));
 
 			response = client.execute(request, httpResponse ->
 		       mapper.readValue(EntityUtils.toString(httpResponse.getEntity()), LinePayConfirmAPOD.class));
@@ -205,4 +191,42 @@ public class LinePay  implements Serializable {
 		
 		return response;
 	}
+
+	/**
+	 * 決済完了(売上確定済み)された取引を返金します。
+	 * @param transactionId
+	 * @param refundAmount
+	 */
+	public LinePayRefundAPOD payRefund(String transactionId, Long refundAmount) {
+		//
+		RefundBody body = new RefundBody();
+		
+		body.setRefundAmount(refundAmount);
+		
+		ObjectMapper mapper = new ObjectMapper();
+
+		MessageFormat form = new MessageFormat(lineConfig.confirmUrl);
+				
+		String formatStr = form.format(new Object[] {transactionId}); 
+		
+		LinePayRefundAPOD response = null;
+		
+		try (CloseableHttpClient client = HttpClients.createDefault()) {
+
+			HttpPost request = new HttpPost(formatStr);
+	
+			setHeaderAndEntity(request, mapper.writeValueAsString(body));
+
+			response = client.execute(request, httpResponse ->
+		       mapper.readValue(EntityUtils.toString(httpResponse.getEntity()), LinePayRefundAPOD.class));
+
+			log.debug(mapper.writeValueAsString(response));
+			
+		} catch (IOException | URISyntaxException e) {
+			
+			log.error("line pay Refund API エラーが発生しました。", e);
+		}
+		
+		return response;
+	}
 }

+ 24 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/line/LinePayRefundAPOD.java

@@ -0,0 +1,24 @@
+package com.ruoyi.web.line;
+
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class LinePayRefundAPOD {
+	public final String returnCode;
+    public final String returnMessage;
+	public final RefundInfo info;
+	public final Map<String, String> errorDetailMap;
+    public LinePayRefundAPOD(@JsonProperty("returnCode") String returnCode,
+                @JsonProperty("returnMessage") String returnMessage,
+                @JsonProperty("info") RefundInfo info,
+                @JsonProperty("errorDetailMap") Map<String, String> errorDetailMap) {
+        this.returnCode = returnCode;
+        this.returnMessage = returnMessage;
+        this.info = info;
+        this.errorDetailMap = errorDetailMap;
+    }
+
+}

+ 21 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/line/RefundBody.java

@@ -0,0 +1,21 @@
+package com.ruoyi.web.line;
+
+import java.io.Serializable;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+@Data
+@Getter
+@Setter
+public class RefundBody implements Serializable {
+	
+    private static final long serialVersionUID = 1L;
+
+	/**
+	 * total amount
+	 */
+	private long refundAmount;
+
+}

+ 15 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/line/RefundInfo.java

@@ -0,0 +1,15 @@
+package com.ruoyi.web.line;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class RefundInfo {
+	public final String refundTransactionId;
+	public final String refundTransactionDate;
+
+	public RefundInfo(@JsonProperty("refundTransactionId") String refundTransactionId,
+            @JsonProperty("refundTransactionDate") String refundTransactionDate) {
+		this.refundTransactionId = refundTransactionId;
+		this.refundTransactionDate = refundTransactionDate;
+	}
+}
+

+ 1 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -146,5 +146,6 @@ line:
   password: PiswoFEo823DeiL
   payUrl: https://api-pay.line.me/v3/payments/request
   confirmUrl: https://api-pay.line.me/v3/payments/{0}/confirm
+  refundUrl: https://api-pay.line.me/v3/payments/{0}/refund
   callbankConfirmUrl: https://liff.line.me/1657344394-LBE9V9k9/linePayConfirm
   callbankCancelUrl: https://liff.line.me/1657344394-LBE9V9k9/linePayCancel