123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- package com.miaxis.wx.service.impl;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.github.wxpay.sdk.WXPay;
- import com.github.wxpay.sdk.WXPayConfig;
- import com.github.wxpay.sdk.WXPayConstants;
- import com.github.wxpay.sdk.WXPayUtil;
- import com.miaxis.common.config.WxPayConfigImpl;
- import com.miaxis.common.config.WxpayConfig;
- import com.miaxis.common.core.domain.entity.UserInfo;
- import com.miaxis.common.exception.CustomException;
- import com.miaxis.common.utils.RSAUtils;
- import com.miaxis.common.utils.SecurityUtils;
- import com.miaxis.common.utils.XmlUtil;
- import com.miaxis.order.domain.OrderInfo;
- import com.miaxis.order.domain.OrderSplit;
- import com.miaxis.order.service.IOrderInfoService;
- import com.miaxis.order.service.IOrderSplitService;
- import com.miaxis.system.service.ISysConfigService;
- import com.miaxis.user.service.IUserInfoService;
- import com.miaxis.wx.domain.WxExtract;
- import com.miaxis.wx.domain.WxExtractBank;
- import com.miaxis.wx.domain.WxOrder;
- import com.miaxis.wx.dto.WxExtractBankDTO;
- import com.miaxis.wx.mapper.WxOrderMapper;
- import com.miaxis.wx.service.IWxExtractBankService;
- import com.miaxis.wx.service.IWxExtractService;
- import com.miaxis.wx.service.IWxOrderService;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.lang3.RandomStringUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import org.springframework.util.CollectionUtils;
- import javax.annotation.Resource;
- import java.util.List;
- import java.util.Map;
- import java.util.TreeMap;
- import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
- /**
- * 电影订单Service业务层处理
- *
- * @author miaxis
- * @date 2021-05-07
- */
- @Service
- @Slf4j
- public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> implements IWxOrderService {
- @Resource
- private WxOrderMapper wxOrderMapper;
- @Autowired
- private IWxExtractService wxExtractService;
- @Autowired
- private IOrderInfoService orderInfoService;
- @Autowired
- private IOrderSplitService orderSplitService;
- @Autowired
- private RSAUtils rsaUtils;
- @Autowired
- private WxpayConfig wxpayConfig;
- @Autowired
- private ISysConfigService configService;
- @Autowired
- private IUserInfoService userInfoService;
- @Autowired
- private IWxExtractBankService wxExtractBankService;
- @Value("${xcx.appId}")
- private String xcxAppid;
- @Value("${xcx.mchId}")
- private String mchId;
- @Override
- @Transactional
- public void wxAddFenZhang() throws Exception {
- String url = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
- String nonceStr = RandomStringUtils.randomAlphanumeric(32);
- //用于签名
- Map<String, String> sortMap = new TreeMap<String, String>();
- sortMap.put("mch_id", mchId);
- sortMap.put("appid", xcxAppid);
- sortMap.put("nonce_str", nonceStr);
- sortMap.put("sign_type", "HMAC-SHA256");
- Map<String, String> receiverMap = new TreeMap<String, String>();
- receiverMap.put("type", "PERSONAL_OPENID");
- receiverMap.put("account", "o7N3j5XxUrgOKE4ulP-HseFpBCiM");
- receiverMap.put("relation_type", "SERVICE_PROVIDER"); //合作合伙
- ObjectMapper objectMapper = new ObjectMapper();
- String receiverMapJson = objectMapper.writeValueAsString(receiverMap);
- sortMap.put("receiver", receiverMapJson);
- WXPayConfig config = new WxPayConfigImpl();
- String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.HMACSHA256);
- sortMap.put("sign", sign);
- WXPay pay = new WXPay(config);
- String xmlStr = pay.requestWithoutCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
- Map<String, String> resMap = XmlUtil.xmlToMap(xmlStr);
- if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
- throw new CustomException("微信添加分账出错");
- }
- System.out.println(xmlStr);
- }
- /**
- * @return
- * @throws Exception
- */
- @Override
- @Transactional
- public void wxProfitsharing(WxOrder wxOrder) throws Exception {
- String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
- String nonceStr = RandomStringUtils.randomAlphanumeric(32);
- //用于签名
- Map<String, String> sortMap = new TreeMap<String, String>();
- sortMap.put("mch_id", mchId);
- sortMap.put("appid", xcxAppid);
- sortMap.put("nonce_str", nonceStr);
- sortMap.put("sign_type", "HMAC-SHA256");
- sortMap.put("transaction_id", wxOrder.getTransactionId());
- String orderCode = getOrderCode(wxOrder.getUserId()); //商户分账单号
- sortMap.put("out_order_no", orderCode);
- //扣除手续费后
- double commission = wxOrder.getTotal() * 0.01;
- double total = wxOrder.getTotal() - commission;
- int amount = (int) Math.floor(total * 0.3);
- Map<String, Object> receiverMap = new TreeMap<String, Object>();
- receiverMap.put("type", "PERSONAL_OPENID");
- receiverMap.put("account", "o7N3j5XxUrgOKE4ulP-HseFpBCiM");
- receiverMap.put("amount", amount);
- receiverMap.put("description", "分到个人"); //合作合伙
- ObjectMapper objectMapper = new ObjectMapper();
- String receiverMapJson = objectMapper.writeValueAsString(receiverMap);
- sortMap.put("receivers", receiverMapJson);
- WXPayConfig config = new WxPayConfigImpl();
- String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.HMACSHA256);
- sortMap.put("sign", sign);
- WXPay pay = new WXPay(config);
- String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
- Map<String, String> resMap = XmlUtil.xmlToMap(xmlStr);
- if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
- throw new CustomException("微信分账出错");
- }
- //更新成交订单表
- OrderInfo orderInfo = orderInfoService.getByOutTradeNo(wxOrder.getOutTradeNo());
- orderInfo.setOutSplitNo(orderCode);
- orderInfoService.updateById(orderInfo);
- OrderSplit orderSplit = new OrderSplit();
- orderSplit.setOutSplitNo(orderCode);
- orderSplit.setAmount(amount);
- orderSplit.setOpenId("o7N3j5XxUrgOKE4ulP-HseFpBCiM");
- orderSplit.setDescription("分到个人");
- orderSplitService.save(orderSplit);
- }
- @Override
- public WxOrder getByOutTradeNo(String outTradeNo) {
- return wxOrderMapper.getByOutTradeNo(outTradeNo);
- }
- @Override
- @Transactional
- public String wxwithdrawal(Integer amount) throws Exception {
- UserInfo student = SecurityUtils.getLoginUser().getStudent();
- UserInfo dbUserInfo = userInfoService.getById(student.getId());
- // if (dbUserInfo.getProfitPrice() < amount){
- // throw new CustomException("提现金额不能大于可提现金额");
- // }
- Map<String, String> sortMap = new TreeMap<String, String>();
- sortMap.put("mch_appid", mchId);
- sortMap.put("mchid", wxpayConfig.getMerchantId());
- sortMap.put("nonce_str", RandomStringUtils.randomAlphanumeric(32));
- sortMap.put("partner_trade_no", getOrderCode(null));
- //sortMap.put("openid",student.getGzhOpenid());
- sortMap.put("check_name", "NO_CHECK");
- sortMap.put("amount", String.valueOf(amount));
- sortMap.put("desc", "用户提现");
- WXPayConfig config = new WxPayConfigImpl();
- String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.MD5);
- sortMap.put("sign", sign);
- WXPay pay = new WXPay(config);
- String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
- Map<String, String> resMap;
- String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
- resMap = XmlUtil.xmlToMap(xmlStr);
- if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
- throw new CustomException(resMap.get("return_msg"));
- }
- //新增提现记录
- WxExtract wxExtract = new WxExtract();
- //wxExtract.setOpenid(student.getGzhOpenid());
- wxExtract.setExtractPrice(amount);
- wxExtract.setPartnerTradeNo(resMap.get("partner_trade_no"));
- wxExtract.setStatus("1");
- wxExtractService.save(wxExtract);
- //更新余额
- // dbUserInfo.setProfitPrice(dbUserInfo.getProfitPrice()-amount);
- userInfoService.updateById(dbUserInfo);
- return resMap.get("return_msg");
- }
- @Override
- @Transactional
- public String wxwithbankdrawal(WxExtractBankDTO dto) throws Exception {
- UserInfo student = SecurityUtils.getLoginUser().getStudent();
- UserInfo dbUserInfo = userInfoService.getById(student.getId());
- // if (dbUserInfo.getProfitPrice() < dto.getAmount()){
- // throw new CustomException("提现金额不能大于可提现金额");
- // }
- Map<String, String> sortMap = new TreeMap<String, String>();
- sortMap.put("mch_id", wxpayConfig.getMerchantId());
- sortMap.put("nonce_str", RandomStringUtils.randomAlphanumeric(32));
- sortMap.put("partner_trade_no", getOrderCode(null));
- sortMap.put("amount", String.valueOf(dto.getAmount()));
- sortMap.put("desc", "用户银行卡提现");
- // 进行签名服务
- sortMap.put("enc_true_name", rsaUtils.encryptData(dto.getEncTrueName()));
- sortMap.put("enc_bank_no", rsaUtils.encryptData(dto.getEncBankNo()));
- sortMap.put("bank_code", dto.getBankCode().toString());
- WXPayConfig config = new WxPayConfigImpl();
- String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.MD5);
- sortMap.put("sign", sign);
- WXPay pay = new WXPay(config);
- String url = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank";
- Map<String, String> resMap;
- String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
- resMap = XmlUtil.xmlToMap(xmlStr);
- if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
- throw new CustomException(resMap.get("return_msg"));
- }
- //新增提现记录
- WxExtract wxExtract = new WxExtract();
- //wxExtract.setOpenid(student.getGzhOpenid());
- wxExtract.setExtractPrice(dto.getAmount());
- wxExtract.setPartnerTradeNo(resMap.get("partner_trade_no"));
- wxExtract.setStatus("1");
- wxExtractService.save(wxExtract);
- //如果此卡之前未存储,则加入到银行卡列表
- List<WxExtractBank> bankList = wxExtractBankService.list(new QueryWrapper<WxExtractBank>().eq("enc_bank_no", dto.getEncBankNo()));
- if (CollectionUtils.isEmpty(bankList)) {
- WxExtractBank wxExtractBank = new WxExtractBank();
- wxExtractBank.setBankCode(dto.getBankCode());
- wxExtractBank.setEncBankNo(dto.getEncBankNo());
- wxExtractBank.setEncTrueName(dto.getEncTrueName());
- //wxExtractBank.setOpenid(SecurityUtils.getLoginUser().getStudent().getGzhOpenid());
- wxExtractBankService.save(wxExtractBank);
- }
- //更新余额
- //dbUserInfo.setProfitPrice(dbUserInfo.getProfitPrice()-dto.getAmount());
- userInfoService.updateById(dbUserInfo);
- return resMap.get("return_msg");
- }
- }
|