|
@@ -17,6 +17,7 @@ import com.ijpay.core.kit.PayKit;
|
|
import com.ijpay.core.kit.WxPayKit;
|
|
import com.ijpay.core.kit.WxPayKit;
|
|
import com.ijpay.core.utils.DateTimeZoneUtil;
|
|
import com.ijpay.core.utils.DateTimeZoneUtil;
|
|
import com.ijpay.wxpay.WxPayApi;
|
|
import com.ijpay.wxpay.WxPayApi;
|
|
|
|
+import com.ijpay.wxpay.WxPayApiConfigKit;
|
|
import com.ijpay.wxpay.enums.WxDomainEnum;
|
|
import com.ijpay.wxpay.enums.WxDomainEnum;
|
|
import com.ijpay.wxpay.enums.v3.BasePayApiEnum;
|
|
import com.ijpay.wxpay.enums.v3.BasePayApiEnum;
|
|
import com.ijpay.wxpay.enums.v3.CertAlgorithmTypeEnum;
|
|
import com.ijpay.wxpay.enums.v3.CertAlgorithmTypeEnum;
|
|
@@ -25,6 +26,8 @@ import com.ijpay.wxpay.model.v3.*;
|
|
import com.ylx.common.config.WxPayConfig;
|
|
import com.ylx.common.config.WxPayConfig;
|
|
import com.ylx.common.core.domain.R;
|
|
import com.ylx.common.core.domain.R;
|
|
import com.ylx.massage.domain.TRecharge;
|
|
import com.ylx.massage.domain.TRecharge;
|
|
|
|
+import com.ylx.massage.enums.BillTypeEnum;
|
|
|
|
+import com.ylx.massage.service.TOrderService;
|
|
import com.ylx.massage.service.TRechargeService;
|
|
import com.ylx.massage.service.TRechargeService;
|
|
import io.swagger.annotations.Api;
|
|
import io.swagger.annotations.Api;
|
|
import io.swagger.annotations.ApiOperation;
|
|
import io.swagger.annotations.ApiOperation;
|
|
@@ -39,10 +42,7 @@ import java.io.ByteArrayInputStream;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.security.cert.X509Certificate;
|
|
import java.security.cert.X509Certificate;
|
|
-import java.util.Collections;
|
|
|
|
-import java.util.HashMap;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
import static com.ylx.common.constant.HttpStatus.SUCCESS;
|
|
import static com.ylx.common.constant.HttpStatus.SUCCESS;
|
|
|
|
|
|
@@ -64,6 +64,9 @@ public class PayController {
|
|
@Resource
|
|
@Resource
|
|
private TRechargeService rechargeService;
|
|
private TRechargeService rechargeService;
|
|
|
|
|
|
|
|
+ @Resource
|
|
|
|
+ private TOrderService orderService;
|
|
|
|
+
|
|
String serialNo;
|
|
String serialNo;
|
|
String platSerialNo;
|
|
String platSerialNo;
|
|
|
|
|
|
@@ -74,10 +77,10 @@ public class PayController {
|
|
@ApiOperation("AIPV3微信支付充值")
|
|
@ApiOperation("AIPV3微信支付充值")
|
|
public R createUnifiedOrder(@RequestBody TRecharge recharge) throws Exception {
|
|
public R createUnifiedOrder(@RequestBody TRecharge recharge) throws Exception {
|
|
TRecharge rechargeResp = rechargeService.recharge(recharge);
|
|
TRecharge rechargeResp = rechargeService.recharge(recharge);
|
|
- return getStringR(rechargeResp.getRechargeNo(),recharge.getdMoney(), recharge.getcOpenId(),"充值");
|
|
|
|
|
|
+ return rechargeService.getPay(rechargeResp.getRechargeNo(),recharge.getdMoney(), recharge.getcOpenId(),BillTypeEnum.RECHARGE.getInfo(), BillTypeEnum.RECHARGE.getCode().toString());
|
|
}
|
|
}
|
|
|
|
|
|
- public R<String> getStringR(String setOutTradeNo, BigDecimal amount, String openId,String description) throws Exception {
|
|
|
|
|
|
+ public R<String> getPay(String setOutTradeNo, BigDecimal amount, String openId,String description) throws Exception {
|
|
String timeExpire = DateTimeZoneUtil.dateToTimeZone(System.currentTimeMillis() + 1000 * 60 * 3);
|
|
String timeExpire = DateTimeZoneUtil.dateToTimeZone(System.currentTimeMillis() + 1000 * 60 * 3);
|
|
UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel()
|
|
UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel()
|
|
.setAppid(wxPayProperties.getAppId())
|
|
.setAppid(wxPayProperties.getAppId())
|
|
@@ -178,7 +181,12 @@ public class PayController {
|
|
map.put("message", "SUCCESS");
|
|
map.put("message", "SUCCESS");
|
|
// 处理业务逻辑
|
|
// 处理业务逻辑
|
|
JSONObject jsonObject = new JSONObject(plainText);
|
|
JSONObject jsonObject = new JSONObject(plainText);
|
|
- TRecharge outTradeNo = rechargeService.increaseAmount(jsonObject.get("out_trade_no").toString());
|
|
|
|
|
|
+ if (jsonObject.get("attach").equals(BillTypeEnum.WX_PAY.getCode().toString())) {
|
|
|
|
+ // 订单支付成功
|
|
|
|
+ orderService.payNotifyOrder(jsonObject.get("out_trade_no").toString());
|
|
|
|
+ }else{
|
|
|
|
+ TRecharge outTradeNo = rechargeService.increaseAmount(jsonObject.get("out_trade_no").toString());
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
response.setStatus(500);
|
|
response.setStatus(500);
|
|
map.put("code", "ERROR");
|
|
map.put("code", "ERROR");
|
|
@@ -327,6 +335,100 @@ public class PayController {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @RequestMapping("/refund")
|
|
|
|
+ @ResponseBody
|
|
|
|
+ public String refund(@RequestParam(required = false) String transactionId, @RequestParam(required = false) String outTradeNo) {
|
|
|
|
+ try {
|
|
|
|
+ String outRefundNo = "wrj2024051101";
|
|
|
|
+ outTradeNo = "RECHAR2024050800001";
|
|
|
|
+ log.info("商户退款单号: {}", outRefundNo);
|
|
|
|
+
|
|
|
|
+ //退款商品
|
|
|
|
+ List<RefundGoodsDetail> list = new ArrayList<>();
|
|
|
|
+ RefundGoodsDetail refundGoodsDetail = new RefundGoodsDetail()
|
|
|
|
+ //商户侧商品编码
|
|
|
|
+ .setMerchant_goods_id("123")
|
|
|
|
+ //商品名称
|
|
|
|
+ .setGoods_name("IJPay 测试")
|
|
|
|
+ //商品单价
|
|
|
|
+ .setUnit_price(1)
|
|
|
|
+ //商品退款金额
|
|
|
|
+ .setRefund_amount(1)
|
|
|
|
+ //商品退货数量
|
|
|
|
+ .setRefund_quantity(1);
|
|
|
|
+ list.add(refundGoodsDetail);
|
|
|
|
+
|
|
|
|
+ RefundModel refundModel = new RefundModel()
|
|
|
|
+ //商户退款单号
|
|
|
|
+ .setOut_refund_no(outRefundNo)
|
|
|
|
+ //退款原因
|
|
|
|
+ .setReason("IJPay 测试退款")
|
|
|
|
+ //回调地址
|
|
|
|
+ .setNotify_url(wxPayProperties.getRefundNotify())
|
|
|
|
+ //金额信息
|
|
|
|
+ .setAmount(new RefundAmount().setRefund(1).setTotal(1).setCurrency("CNY"))
|
|
|
|
+ //退款商品
|
|
|
|
+ .setGoods_detail(list);
|
|
|
|
+
|
|
|
|
+ //商户订单号
|
|
|
|
+ if (StrUtil.isNotEmpty(transactionId)) {
|
|
|
|
+ refundModel.setTransaction_id(transactionId);
|
|
|
|
+ }
|
|
|
|
+ if (StrUtil.isNotEmpty(outTradeNo)) {
|
|
|
|
+ refundModel.setOut_trade_no(outTradeNo);
|
|
|
|
+ }
|
|
|
|
+ log.info("退款参数 {}", JSONUtil.toJsonStr(refundModel));
|
|
|
|
+ IJPayHttpResponse response = WxPayApi.v3(
|
|
|
|
+ RequestMethodEnum.POST,
|
|
|
|
+ WxDomainEnum.CHINA.toString(),
|
|
|
|
+ BasePayApiEnum.REFUND.toString(),
|
|
|
|
+ wxPayProperties.getMchId(),
|
|
|
|
+ getSerialNumber(),
|
|
|
|
+ null,
|
|
|
|
+ wxPayProperties.getCertKeyPath(),
|
|
|
|
+ JSONUtil.toJsonStr(refundModel)
|
|
|
|
+ );
|
|
|
|
+ // 根据证书序列号查询对应的证书来验证签名结果
|
|
|
|
+ boolean verifySignature = WxPayKit.verifySignature(response, wxPayProperties.getPlatFormPath());
|
|
|
|
+ log.info("verifySignature: {}", verifySignature);
|
|
|
|
+ log.info("退款响应 {}", response);
|
|
|
|
+
|
|
|
|
+ if (verifySignature) {
|
|
|
|
+ return response.getBody();
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("系统异常", e);
|
|
|
|
+ return e.getMessage();
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 退款通知
|
|
|
|
+ */
|
|
|
|
+ @RequestMapping(value = "/refundNotify", method = {RequestMethod.POST, RequestMethod.GET})
|
|
|
|
+ @ResponseBody
|
|
|
|
+ @ApiOperation("微信退款回调接口")
|
|
|
|
+ public String refundNotify(HttpServletRequest request) {
|
|
|
|
+ String xmlMsg = HttpKit.readData(request);
|
|
|
|
+ log.info("退款通知=" + xmlMsg);
|
|
|
|
+ Map<String, String> params = WxPayKit.xmlToMap(xmlMsg);
|
|
|
|
+
|
|
|
|
+ String returnCode = params.get("return_code");
|
|
|
|
+ // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
|
|
|
|
+ if (WxPayKit.codeIsOk(returnCode)) {
|
|
|
|
+ String reqInfo = params.get("req_info");
|
|
|
|
+ String decryptData = WxPayKit.decryptData(reqInfo, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey());
|
|
|
|
+ log.info("退款通知解密后的数据=" + decryptData);
|
|
|
|
+ // 更新订单信息
|
|
|
|
+ // 发送通知等
|
|
|
|
+ Map<String, String> xml = new HashMap<String, String>(2);
|
|
|
|
+ xml.put("return_code", "SUCCESS");
|
|
|
|
+ xml.put("return_msg", "OK");
|
|
|
|
+ return WxPayKit.toXml(xml);
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
|
|