记得上下班打卡 | git大法好,push需谨慎

Commit 180280fe authored by jiangxiulong's avatar jiangxiulong

增加苹果支付调用接口;下单苹果支付不调用dragon;支付成功苹果支付不处理超时支付;payCode和setPayData将为空

parent 41e4a1e1
......@@ -94,7 +94,7 @@ public class GoblinNftOrderVo implements Serializable, Cloneable {
@ApiModelProperty(value = "订单类型 1购买订单 2兑换订单 3演出赠送订单")
private Integer orderType;
@ApiModelProperty(value = "支付类型 wepay微信 alipay阿里 douyinpay抖音 unionpay银联")
@ApiModelProperty(value = "支付类型 wepay微信 alipay阿里 douyinpay抖音 unionpay银联 applepay苹果支付")
private String payType;
@ApiModelProperty(value = "支付终端 app wap js applet")
......
......@@ -25,7 +25,7 @@ public class GoblinNftOrderPayParam {
@ApiModelProperty(position = 13, value = "商品券码")
private String storeVoucherCode;*/
@ApiModelProperty(position = 14, required = true, value = "支付方式", allowableValues = "alipay,wepay,douyinpay,unionpay")
@ApiModelProperty(position = 14, required = true, value = "支付方式", allowableValues = "alipay,wepay,douyinpay,unionpay,applepay")
@Pattern(regexp = LnsRegex.Valid.TRIPLE_PF_FOR_PAY, message = "支付方式无效")
@NotBlank(message = "支付方式不能为空")
private String payType;
......
......@@ -79,7 +79,7 @@ public class LnsRegex {
/**
* 支持的支付方式
*/
public static final String TRIPLE_PF_FOR_PAY = "\\b(alipay|wepay|douyinpay|unionpay)\\b";
public static final String TRIPLE_PF_FOR_PAY = "\\b(alipay|wepay|douyinpay|unionpay|applepay)\\b";
/* ======================================================================= | */
......
......@@ -141,7 +141,7 @@ public class GoblinNftOrder implements Serializable, Cloneable {
private Integer orderType;
/**
* 支付类型 wepay微信 alipay阿里 douyinpay抖音 unionpay银联
* 支付类型 wepay微信 alipay阿里 douyinpay抖音 unionpay银联 applepay苹果支付
*/
private String payType;
......
......@@ -158,7 +158,7 @@ CREATE TABLE goblin_nft_order
status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单状态 1待付款 2已付款 3未付款取消订单 4退款中 5已退款',
source VARCHAR(32) NOT NULL DEFAULT '' COMMENT '订单来源 app h5 applet',
order_type TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单类型 1购买订单 2兑换订单 3演出赠送订单',
pay_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付类型 wepay微信 alipay阿里 douyinpay抖音 unionpay银联',
pay_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付类型 wepay微信 alipay阿里 douyinpay抖音 unionpay银联 applepay苹果支付',
device_from VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付终端 app wap js applet',
version VARCHAR(32) NOT NULL DEFAULT '' COMMENT '版本号',
pay_countdown_minute TINYINT UNSIGNED DEFAULT 5 COMMENT '订单过期时间(分钟)',
......
package com.liquidnet.service.order.controller;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.order.service.impl.OrderApplePayServiceImpl;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
/**
* <p>
* 苹果支付相关 前端控制器
* </p>
*
* @author jiangxiulong
* @since 2022-04-07
*/
@Api(tags = "苹果-支付相关")
@RestController
@Validated
@RequestMapping("/apple")
public class OrderApplePayController {
@Autowired
private OrderApplePayServiceImpl applePayService;
@PostMapping("pay")
@ApiOperation("苹果支付成功通知")
@ApiResponse(code = 200, message = "接口返回对象参数")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "orderId", value = "订单ID", example = "1"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "type", value = "订单类型 NFT", example = "NFT"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "receiptData", value = "receipt-data", example = "M0WWAoL3nK5I1xF3OX2n9aHlQptG4NbuHbkYmD7cBsLT"),
})
public ResponseDto checkOrder(
@RequestParam("orderId") @NotBlank(message = "订单ID不能为空") String orderId,
@RequestParam("type") @NotBlank(message = "订单类型不能为空") @Pattern(regexp = "\\b(NFT)\\b", message = "订单类型无效") String type,
@RequestParam("receiptData") @NotBlank(message = "receiptData不能为空") String receiptData
) {
boolean isPay = applePayService.pay(orderId, type, receiptData);
if (isPay) {
return ResponseDto.success("支付成功");
} else {
return ResponseDto.failure("未获取到支付状态");
}
}
}
......@@ -345,47 +345,58 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
GoblinNftPayResultVo NftPayResultVo = GoblinNftPayResultVo.getNew();
NftPayResultVo.setOrderId(nftOrder.getOrderId());
String payCode;
String showUrl = payParam.getShowUrl().concat(nftOrder.getOrderCode());
String returnUrl = payParam.getReturnUrl().concat(nftOrder.getOrderCode());
if (nftOrder.getPriceActual().compareTo(BigDecimal.valueOf(0)) > 0) {// 调用支付
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("type", "NFT");
httpData.add("price", nftOrder.getPriceActual().toString());
// 测试0.01
// httpData.add("price","0.01");
httpData.add("name", nftOrder.getStoreName());
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(nftOrder.getSkuId());
httpData.add("detail", skuVo.getName());
httpData.add("orderCode", nftOrder.getOrderCode());
httpData.add("orderId", nftOrder.getOrderId());
httpData.add("clientIp", CurrentUtil.getCliIpAddr());
httpData.add("notifyUrl", synUrl);
httpData.add("createDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
httpData.add("expireTime", "5");
httpData.add("payType", nftOrder.getPayType());
httpData.add("deviceFrom", nftOrder.getDeviceFrom());
if (nftOrder.getDeviceFrom().equals("js") || nftOrder.getDeviceFrom().equals("applet")) {
httpData.add("openId", payParam.getOpenId());
if (nftOrder.getPayType().equals("applepay")) {
payCode = "";
NftPayResultVo.setCode(payCode);
NftPayResultVo.setOrderCode(nftOrder.getOrderCode());
NftPayResultVo.setPayData("");
NftPayResultVo.setPayType(nftOrder.getPayType());
NftPayResultVo.setPrice(nftOrder.getPriceActual());
NftPayResultVo.setShowUrl(showUrl);
NftPayResultVo.setReturnUrl(returnUrl);
} else {
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("type", "NFT");
httpData.add("price", nftOrder.getPriceActual().toString());
// 测试0.01
// httpData.add("price","0.01");
httpData.add("name", nftOrder.getStoreName());
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(nftOrder.getSkuId());
httpData.add("detail", skuVo.getName());
httpData.add("orderCode", nftOrder.getOrderCode());
httpData.add("orderId", nftOrder.getOrderId());
httpData.add("clientIp", CurrentUtil.getCliIpAddr());
httpData.add("notifyUrl", synUrl);
httpData.add("createDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
httpData.add("expireTime", "5");
httpData.add("payType", nftOrder.getPayType());
httpData.add("deviceFrom", nftOrder.getDeviceFrom());
if (nftOrder.getDeviceFrom().equals("js") || nftOrder.getDeviceFrom().equals("applet")) {
httpData.add("openId", payParam.getOpenId());
}
httpData.add("showUrl", showUrl);
httpData.add("returnUrl", returnUrl);
LinkedMultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
String returnData = HttpUtil.post(payUrl, httpData, header);
log.info("调用 DRAGON 结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
GoblinPayInnerResultVo dtoData = dto.getData();
payCode = dtoData.getCode();
NftPayResultVo.setCode(payCode);
NftPayResultVo.setOrderCode(nftOrder.getOrderCode());
NftPayResultVo.setPayData(dtoData.getPayData());
NftPayResultVo.setPayType(nftOrder.getPayType());
NftPayResultVo.setPrice(nftOrder.getPriceActual());
NftPayResultVo.setShowUrl(showUrl);
NftPayResultVo.setReturnUrl(returnUrl);
}
String showUrl = payParam.getShowUrl().concat(nftOrder.getOrderCode());
String returnUrl = payParam.getReturnUrl().concat(nftOrder.getOrderCode());
httpData.add("showUrl", showUrl);
httpData.add("returnUrl", returnUrl);
LinkedMultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
String returnData = HttpUtil.post(payUrl, httpData, header);
log.info("调用 DRAGON 结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
GoblinPayInnerResultVo dtoData = dto.getData();
payCode = dtoData.getCode();
NftPayResultVo.setCode(payCode);
NftPayResultVo.setOrderCode(dtoData.getOrderCode());
NftPayResultVo.setPayData(dtoData.getPayData());
NftPayResultVo.setPayType(nftOrder.getPayType());
NftPayResultVo.setPrice(nftOrder.getPriceActual());
NftPayResultVo.setShowUrl(showUrl);
NftPayResultVo.setReturnUrl(returnUrl);
} else {
isFree = true;
nftOrder.setPayType("FREE");
......@@ -581,6 +592,9 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
LocalDateTime now = LocalDateTime.now();
if (Objects.equals(orderVo.getStatus(), GoblinStatusConst.NftStatus.ORDER_STATUS_3.getValue())) {// 超时支付
log.info("Nft订单超时支付 param:[orderCode:{}]", orderCode);
if (syncOrderParam.getPaymentType().equals("APPLE_PAY")) { // 苹果支付不做处理
return "success";
}
// 处理为退款中
orderVo.setStatus(GoblinStatusConst.NftStatus.ORDER_STATUS_4.getValue());
orderVo.setUpdatedAt(now);
......
package com.liquidnet.service.order.service.impl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinPayInnerResultVo;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayCallbackParam;
import com.liquidnet.service.order.utils.GoblinNftOrderUtils;
import com.liquidnet.service.order.utils.GoblinRedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Service
@Slf4j
public class OrderApplePayServiceImpl {
@Autowired
GoblinRedisUtils goblinRedisUtils;
@Autowired
GoblinNftOrderUtils nftOrderUtils;
@Autowired
private GoblinNftOrderServiceImpl goblinNftOrderService;
@Value("${liquidnet.service.order.url-pay.pay}")
private String payUrl;
public boolean pay(String orderId, String type, String receiptData) {
log.info("苹果支付成功通知参数 [orderId:{},type:{},receiptData:{}]", orderId, type, receiptData);
GoblinNftOrderVo nftOrder = nftOrderUtils.getNftOrder(orderId);
if (null == nftOrder) {
log.info("未找到该订单 [orderId:{}]", orderId);
return false;
}
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("type", type);
httpData.add("price", nftOrder.getPriceActual().toString());
httpData.add("name", nftOrder.getStoreName());
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(nftOrder.getSkuId());
httpData.add("detail", skuVo.getName());
httpData.add("orderCode", nftOrder.getOrderCode());
httpData.add("orderId", nftOrder.getOrderId());
httpData.add("clientIp", CurrentUtil.getCliIpAddr());
httpData.add("notifyUrl", "");
httpData.add("createDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
httpData.add("expireTime", "5");
httpData.add("payType", nftOrder.getPayType());
httpData.add("deviceFrom", nftOrder.getDeviceFrom());
httpData.add("openId", "");
httpData.add("showUrl", "");
httpData.add("returnUrl", "");
httpData.add("receiptData", receiptData);
LinkedMultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
String returnData = HttpUtil.post(payUrl, httpData, header);
log.info("苹果支付调用DRAGON结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
GoblinPayInnerResultVo dtoData = dto.getData();
if (null == dtoData || dtoData.getStatus() == 0) {
return false;
} else {
// 支付成功
GoblinNftOrderPayCallbackParam NftOrderPayCallbackParam = GoblinNftOrderPayCallbackParam.getNew();
NftOrderPayCallbackParam.setCode(nftOrder.getPayCode());
NftOrderPayCallbackParam.setOrderCode(nftOrder.getOrderCode());
NftOrderPayCallbackParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
NftOrderPayCallbackParam.setPrice(nftOrder.getPriceActual());
NftOrderPayCallbackParam.setPaymentId("APPLE_PAYMENT_ID");// 这里应该是接口返回
NftOrderPayCallbackParam.setPaymentType("APPLE_PAY");// 这里应该是接口返回
NftOrderPayCallbackParam.setStatus(1);
if (type.equals("NFT")) {
String isSync = goblinNftOrderService.syncOrder(NftOrderPayCallbackParam);
if (!isSync.equals("success")) {
return false;
}
}
return true;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment