|
@@ -6,13 +6,12 @@ import com.caimei365.order.components.OrderCommonService;
|
|
|
import com.caimei365.order.components.ProductService;
|
|
|
import com.caimei365.order.components.WeChatService;
|
|
|
import com.caimei365.order.mapper.BaseMapper;
|
|
|
-import com.caimei365.order.mapper.PayOrderMapper;
|
|
|
import com.caimei365.order.mapper.OrderCommonMapper;
|
|
|
+import com.caimei365.order.mapper.PayOrderMapper;
|
|
|
import com.caimei365.order.model.ResponseJson;
|
|
|
import com.caimei365.order.model.bo.PayParamBo;
|
|
|
import com.caimei365.order.model.dto.PayDto;
|
|
|
import com.caimei365.order.model.dto.PayLinkDto;
|
|
|
-import com.caimei365.order.model.dto.SecondPayDto;
|
|
|
import com.caimei365.order.model.enums.OrderStatus;
|
|
|
import com.caimei365.order.model.po.*;
|
|
|
import com.caimei365.order.model.vo.*;
|
|
@@ -35,7 +34,6 @@ import org.springframework.stereotype.Service;
|
|
|
import javax.annotation.Resource;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.IOException;
|
|
|
-import java.math.BigDecimal;
|
|
|
import java.security.NoSuchAlgorithmException;
|
|
|
import java.security.spec.InvalidKeySpecException;
|
|
|
import java.text.SimpleDateFormat;
|
|
@@ -72,8 +70,6 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
private String linkPage;
|
|
|
@Value("${pay.notify-url}")
|
|
|
private String notifyUrl;
|
|
|
- @Value("${pay.second-notify-url}")
|
|
|
- private String secondHandUrl;
|
|
|
|
|
|
/**
|
|
|
* 订单支付前效验付款规则
|
|
@@ -867,246 +863,6 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|
|
return ResponseJson.success(result);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 二手发布微信线上支付
|
|
|
- *
|
|
|
- * @param secondPayDto {
|
|
|
- * productId 二手发布商品id
|
|
|
- * returnUrl 页面回调地址
|
|
|
- * code 微信小程序code
|
|
|
- * state 微信公众号state参数
|
|
|
- * }
|
|
|
- * @param headers
|
|
|
- */
|
|
|
- @Override
|
|
|
- public ResponseJson<JSONObject> paySecondByWeChat(SecondPayDto secondPayDto, HttpHeaders headers) {
|
|
|
- PayParamBo payParam = new PayParamBo();
|
|
|
- // payDto -> payParam
|
|
|
- BeanUtils.copyProperties(secondPayDto, payParam);
|
|
|
- // 微信线上支付
|
|
|
- payParam.setPayWay("WEIXIN");
|
|
|
- String openId = null;
|
|
|
- if (null == payParam.getState()) {
|
|
|
- // 小程序微信授权获取登录信息
|
|
|
- ResponseJson<Map<String, Object>> appletsInfo = weChatService.getInfoMapByApplets(payParam.getCode(), headers, 1);
|
|
|
- if (appletsInfo.getCode() == -1) {
|
|
|
- return ResponseJson.error(appletsInfo.getMsg(), null);
|
|
|
- }
|
|
|
- Map<String, Object> infoData = appletsInfo.getData();
|
|
|
- openId = (String) infoData.get(WeChatService.Keys.OPEN_ID);
|
|
|
- if (StringUtils.isEmpty(openId)) {
|
|
|
- return ResponseJson.error("微信小程序获取openId失败!", null);
|
|
|
- }
|
|
|
- //小程序微信快捷支付
|
|
|
- payParam.setPayType("MINIAPP_WEIXIN");
|
|
|
- } else {
|
|
|
- try {
|
|
|
- // 微信公众号,通过code获取微信用户信息
|
|
|
- Map<String, Object> map = weChatService.getInfoMapByWeb(payParam.getCode(), "crm");
|
|
|
- openId = (String) map.get(WeChatService.Keys.OPEN_ID);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("try-catch:",e);
|
|
|
- }
|
|
|
- if (StringUtils.isEmpty(openId)) {
|
|
|
- return ResponseJson.error("微信公众号获取openId失败!", null);
|
|
|
- }
|
|
|
- //pc微信扫码支付,微信公众号支付
|
|
|
- payParam.setPayType("JSAPI_WEIXIN");
|
|
|
- }
|
|
|
- payParam.setOpenId(openId);
|
|
|
- // 二手发布默认100元
|
|
|
- payParam.setPayAmount(10000);
|
|
|
- payParam.setNotifyUrl(secondHandUrl);
|
|
|
- log.info("【二手发布微信支付】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>获取openId:" + openId);
|
|
|
- return toPaySecond(payParam, headers);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 二手发布支付宝线上支付
|
|
|
- *
|
|
|
- * @param secondPayDto {
|
|
|
- * productId 二手发布商品id
|
|
|
- * returnUrl 页面回调地址
|
|
|
- * }
|
|
|
- * @param headers
|
|
|
- */
|
|
|
- @Override
|
|
|
- public ResponseJson<JSONObject> paySecondByAlipay(SecondPayDto secondPayDto, HttpHeaders headers) {
|
|
|
- PayParamBo payParam = new PayParamBo();
|
|
|
- // payDto -> payParam
|
|
|
- BeanUtils.copyProperties(secondPayDto, payParam);
|
|
|
- //支付宝支付
|
|
|
- payParam.setPayWay("ALIPAY");
|
|
|
- payParam.setPayType("ALIPAY_H5");
|
|
|
- // 二手发布默认100元
|
|
|
- payParam.setPayAmount(10000);
|
|
|
- payParam.setNotifyUrl(secondHandUrl);
|
|
|
- log.info("【二手发布支付宝支付】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>productId:" + payParam.getProductId());
|
|
|
- return toPaySecond(payParam, headers);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 二手发布银联线上支付
|
|
|
- *
|
|
|
- * @param secondPayDto {
|
|
|
- * productId 二手发布商品id
|
|
|
- * returnUrl 页面回调地址
|
|
|
- * bankCode 银行编码(银联支付使用)
|
|
|
- * userType 用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
|
|
|
- * }
|
|
|
- * @param headers
|
|
|
- */
|
|
|
- @Override
|
|
|
- public ResponseJson<JSONObject> paySecondByUnionPay(SecondPayDto secondPayDto, HttpHeaders headers) {
|
|
|
- PayParamBo payParam = new PayParamBo();
|
|
|
- // payDto -> payParam
|
|
|
- BeanUtils.copyProperties(secondPayDto, payParam);
|
|
|
- //支付宝支付
|
|
|
- payParam.setPayWay("UNIONPAY");
|
|
|
- payParam.setPayType("GATEWAY_UNIONPAY");
|
|
|
- // 二手发布默认100元
|
|
|
- payParam.setPayAmount(10000);
|
|
|
- payParam.setNotifyUrl(secondHandUrl);
|
|
|
- log.info("【二手发布银联支付】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>productId:" + payParam.getProductId());
|
|
|
- return toPaySecond(payParam, headers);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 二手发布支付
|
|
|
- */
|
|
|
- private ResponseJson<JSONObject> toPaySecond(PayParamBo payParam, HttpHeaders headers) {
|
|
|
- // 定义支付请求结果
|
|
|
- JSONObject result = null;
|
|
|
- try {
|
|
|
- // 时间戳
|
|
|
- long time = System.currentTimeMillis() / 1000;
|
|
|
- // 用户IP地址
|
|
|
- String userIp = headers.getFirst("X-CLIENT-IP");
|
|
|
- JSONObject json = new JSONObject();
|
|
|
- json.put("merAccount", PayUtil.merAccount);
|
|
|
- json.put("merNo", PayUtil.merNo);
|
|
|
- json.put("time", time);
|
|
|
- //支付金额
|
|
|
- json.put("amount", payParam.getPayAmount());
|
|
|
- json.put("payWay", payParam.getPayWay());
|
|
|
- json.put("payType", payParam.getPayType());
|
|
|
- json.put("userIp", userIp);
|
|
|
- json.put("returnUrl", payParam.getReturnUrl());
|
|
|
- json.put("notifyUrl", payParam.getNotifyUrl());
|
|
|
- if (StringUtils.isNotBlank(payParam.getBankCode())) {
|
|
|
- json.put("bankCode", payParam.getBankCode());
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(payParam.getUserType())) {
|
|
|
- json.put("userType", payParam.getUserType());
|
|
|
- }
|
|
|
- if (StringUtils.isNotBlank(payParam.getOpenId())) {
|
|
|
- json.put("openId", payParam.getOpenId());
|
|
|
- }
|
|
|
- String environment = "";
|
|
|
- if (payParam.getNotifyUrl().contains("18002")) {
|
|
|
- environment = "DEV";
|
|
|
- } else if (payParam.getNotifyUrl().contains("core-b")) {
|
|
|
- environment = "BETA";
|
|
|
- }
|
|
|
- // 商户订单号
|
|
|
- String orderId = payParam.getProductId() + "T" + time + environment;
|
|
|
- json.put("orderId", orderId);
|
|
|
- //商品名称
|
|
|
- String product = "采美订单" + orderId;
|
|
|
- json.put("product", product);
|
|
|
- String attach = payParam.getProductId() + "," + payParam.getPayType();
|
|
|
- json.put("attach", attach);
|
|
|
- // 二手发布默认100元,默认私账
|
|
|
- List<Map<String, String>> list = new ArrayList<>();
|
|
|
- Map<String, String> map = new HashMap<>(3);
|
|
|
- map.put("subUserNo", PayUtil.privateAccountNo);
|
|
|
- map.put("splitBillType", "1");
|
|
|
- map.put("splitBillValue", "1");
|
|
|
- list.add(map);
|
|
|
- String splitBillDetail = JSONObject.toJSONString(list);
|
|
|
- json.put("splitBillDetail", splitBillDetail);
|
|
|
- String sign = PayUtil.getPaySign(json, PayUtil.merKey);
|
|
|
- json.put("sign", sign);
|
|
|
- // 私钥加密
|
|
|
- String data = RSAUtil.privateEncrypt(json.toJSONString(), PayUtil.merKey);
|
|
|
- // 提交
|
|
|
- result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/order/v1", PayUtil.merAccount, data);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("错误信息", e);
|
|
|
- return ResponseJson.error("支付失败!", null);
|
|
|
- }
|
|
|
- String code = result.getString("code");
|
|
|
- if (!"000000".equals(code)) {
|
|
|
- String msg = result.getString("msg");
|
|
|
- log.info("第三方支付失败>>>>>>>msg:" + msg);
|
|
|
- return ResponseJson.error(msg, null);
|
|
|
- }
|
|
|
- // 保存二手发布分账参数
|
|
|
- SplitAccountPo splitAccount = new SplitAccountPo();
|
|
|
- splitAccount.setOrderId(payParam.getOrderId());
|
|
|
- splitAccount.setProductId(payParam.getProductId());
|
|
|
- // 二手交易供应商
|
|
|
- splitAccount.setShopId(1252);
|
|
|
- splitAccount.setProductType(4);
|
|
|
- splitAccount.setType(2);
|
|
|
- if ("UNIONPAY".equals(payParam.getPayWay())) {
|
|
|
- splitAccount.setSplitAccount(92.00);
|
|
|
- } else {
|
|
|
- splitAccount.setSplitAccount(99.62);
|
|
|
- }
|
|
|
- JSONObject data = result.getJSONObject("data");
|
|
|
- splitAccount.setMbOrderId(data.getString("mbOrderId"));
|
|
|
- splitAccount.setOrderRequestNo(data.getString("orderId"));
|
|
|
- splitAccount.setPayStatus(0);
|
|
|
- // 保存分账详情
|
|
|
- payOrderMapper.insertSplitAccount(splitAccount);
|
|
|
-
|
|
|
- return ResponseJson.success(result);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 二手发布支付回调
|
|
|
- *
|
|
|
- * @param data
|
|
|
- */
|
|
|
- @Override
|
|
|
- public String paymentSecondCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException {
|
|
|
- log.info("******************** 二手发布支付异步回调 start *******************");
|
|
|
- // 公钥解密
|
|
|
- JSONObject json = PayUtil.publicKeyDecrypt(data, PayUtil.publicKey);
|
|
|
- log.info("公钥解密>>>>>>" + json);
|
|
|
- // 公钥验签
|
|
|
- String signaa = json.getString("sign");
|
|
|
- json.remove("sign");
|
|
|
- String signbb = PayUtil.getPaySign(json, PayUtil.publicKey);
|
|
|
- if (!signaa.equals(signbb)) {
|
|
|
- return "验签失败";
|
|
|
- }
|
|
|
- // 订单状态
|
|
|
- String orderStatus = json.getString("orderStatus");
|
|
|
- // 平台唯一流水号
|
|
|
- String mbOrderId = json.getString("mbOrderId");
|
|
|
- // 附加数据,下单时若有传输则原样返回,下单时为空,则不返回该数据
|
|
|
- String attach = json.getString("attach");
|
|
|
- // 订单金额,以元为单位
|
|
|
- BigDecimal amount = json.getBigDecimal("amount");
|
|
|
- log.info("订单状态>>>>>>" + orderStatus);
|
|
|
- if ("FAILED".equals(orderStatus)) {
|
|
|
- return "支付失败";
|
|
|
- }
|
|
|
- String[] split = attach.split(",");
|
|
|
- // 订单id
|
|
|
- Integer productId = Integer.valueOf(split[0]);
|
|
|
- // 支付类型
|
|
|
- String payType = split[1];
|
|
|
- double payAmount = amount.doubleValue();
|
|
|
- String payFormData = json.toJSONString();
|
|
|
- payOrderMapper.updateSeconHandDetail(productId, payType, payAmount, payFormData);
|
|
|
- //修改分账付款状态
|
|
|
- payOrderMapper.updateSplitAccountByPay(mbOrderId);
|
|
|
- return "SUCCESS";
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 延时分账
|
|
|
*
|