|
|
|
@ -2,21 +2,10 @@ package com.qniao.dam.application.service.paymentchannelorder.processor.wechat; |
|
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
import cn.hutool.json.JSONUtil; |
|
|
|
import com.alibaba.fastjson.JSON; |
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; |
|
|
|
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; |
|
|
|
import com.github.binarywang.wxpay.config.WxPayConfig; |
|
|
|
import com.github.binarywang.wxpay.constant.WxPayConstants; |
|
|
|
import com.github.binarywang.wxpay.exception.WxPayException; |
|
|
|
import com.github.binarywang.wxpay.service.WxPayService; |
|
|
|
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; |
|
|
|
import com.github.binarywang.wxpay.util.SignUtils; |
|
|
|
import com.qniao.dam.api.command.paymentchannelorder.user.request.ThirdPartyField; |
|
|
|
import com.qniao.dam.application.service.paymentchannelorder.processor.IChannelPayService; |
|
|
|
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.utils.WXPayV3Util; |
|
|
|
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.vobj.ChannelPaymentField; |
|
|
|
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.vobj.WeChatPaymentBasic; |
|
|
|
import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; |
|
|
|
import com.qniao.dau.application.UecServerApplicationService; |
|
|
|
import com.qniao.dau.application.request.GetWechatSessionDto; |
|
|
|
@ -28,9 +17,6 @@ import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
import javax.annotation.Resource; |
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
@ -109,122 +95,4 @@ public class WeChatPayProcessor extends IChannelPayService { |
|
|
|
throw new BizException("发起微信预支付失败"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public WxPayConfig getWxPayConfig(String appId) { |
|
|
|
WxPayConfig wxPayConfig = new WxPayConfig(); |
|
|
|
wxPayConfig.setMchId(mchId); |
|
|
|
wxPayConfig.setMchKey(v3Key); |
|
|
|
wxPayConfig.setAppId(appId); |
|
|
|
wxPayConfig.setTradeType("JSAPI"); |
|
|
|
wxPayConfig.setNotifyUrl(notifyUrl); |
|
|
|
return wxPayConfig; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 构建微信统一下单请求数据 |
|
|
|
* |
|
|
|
* @param paymentChannelOrder |
|
|
|
* @param wxPayConfig |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public WxPayUnifiedOrderRequest buildUnifiedOrderRequest(PaymentChannelOrder paymentChannelOrder, WxPayConfig |
|
|
|
wxPayConfig, String openId) { |
|
|
|
// 微信统一下单请求对象 |
|
|
|
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); |
|
|
|
request.setBody(paymentChannelOrder.getComment()); |
|
|
|
request.setOutTradeNo(paymentChannelOrder.getId().toString()); |
|
|
|
request.setTotalFee(paymentChannelOrder.getAmount().multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_UP).intValue()); |
|
|
|
request.setSpbillCreateIp("127.0.0.1"); |
|
|
|
//todo 是否需要记在渠道支付单中 |
|
|
|
request.setTimeExpire(LocalDateTime.now().plusMinutes(30L).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); |
|
|
|
request.setNotifyUrl(wxPayConfig.getNotifyUrl()); |
|
|
|
request.setTradeType(wxPayConfig.getTradeType()); |
|
|
|
if (request.getTradeType().equals("JSAPI")) { |
|
|
|
request.setOpenid(openId); |
|
|
|
} |
|
|
|
return request; |
|
|
|
} |
|
|
|
|
|
|
|
private WeChatPaymentBasic getWeChatPaymentBasic(WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest, WxPayConfig |
|
|
|
wxPayConfig) { |
|
|
|
WxPayService wxPayService = new WxPayServiceImpl(); |
|
|
|
wxPayService.setConfig(wxPayConfig); |
|
|
|
WxPayUnifiedOrderResult wxPayUnifiedOrderResult = null; |
|
|
|
try { |
|
|
|
String timestamp = String.valueOf(System.currentTimeMillis() / 1000); |
|
|
|
String nonceStr = String.valueOf(System.currentTimeMillis()); |
|
|
|
log.info("发起微信支付参数 配置:{},参数: {}", wxPayUnifiedOrderRequest, wxPayConfig); |
|
|
|
wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest); |
|
|
|
WeChatPaymentBasic weChatPaymentBasic = new WeChatPaymentBasic(); |
|
|
|
if (wxPayConfig.getTradeType().equals("JSAPI")) { |
|
|
|
log.info("微信预支付返回结果:{}", wxPayUnifiedOrderResult); |
|
|
|
weChatPaymentBasic.setAppId(wxPayUnifiedOrderResult.getAppid()); |
|
|
|
weChatPaymentBasic.setNonceStr(nonceStr); |
|
|
|
weChatPaymentBasic.setTimeStamp(timestamp); |
|
|
|
weChatPaymentBasic.setPackages("prepay_id=" + wxPayUnifiedOrderResult.getPrepayId()); |
|
|
|
weChatPaymentBasic.setSignType(WxPayConstants.SignType.MD5); |
|
|
|
weChatPaymentBasic.setPaySign(sign(weChatPaymentBasic, wxPayConfig)); |
|
|
|
log.info("微信预支付调起参数:{}", weChatPaymentBasic); |
|
|
|
} else if (wxPayConfig.getTradeType().equals("APP")) { |
|
|
|
log.info("微信预支付返回结果:{}", wxPayUnifiedOrderResult); |
|
|
|
String packageValue = "Sign=WXPay"; |
|
|
|
weChatPaymentBasic.setSign(appSign(wxPayUnifiedOrderResult.getPrepayId(), |
|
|
|
wxPayConfig.getMchId(), |
|
|
|
timestamp, |
|
|
|
nonceStr, |
|
|
|
wxPayConfig.getAppId(), |
|
|
|
packageValue, |
|
|
|
wxPayConfig)); |
|
|
|
weChatPaymentBasic.setPrepayid(wxPayUnifiedOrderResult.getPrepayId()); |
|
|
|
weChatPaymentBasic.setPartnerid(wxPayConfig.getMchId()); |
|
|
|
weChatPaymentBasic.setAppId(wxPayUnifiedOrderResult.getAppid()); |
|
|
|
weChatPaymentBasic.setPackages(packageValue); |
|
|
|
weChatPaymentBasic.setTimeStamp(timestamp); |
|
|
|
weChatPaymentBasic.setNonceStr(nonceStr); |
|
|
|
log.info("微信预支付调起参数:{}", weChatPaymentBasic); |
|
|
|
} |
|
|
|
return weChatPaymentBasic; |
|
|
|
} catch (WxPayException e) { |
|
|
|
log.info(e.getMessage()); |
|
|
|
throw new BizException("发起微信预支付异常"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String sign(WeChatPaymentBasic weChatPaymentBasicVo, WxPayConfig wxPayConfig) { |
|
|
|
Map<String, String> payInfo = new HashMap<>(); |
|
|
|
payInfo.put("appId", weChatPaymentBasicVo.getAppId()); |
|
|
|
payInfo.put("timeStamp", weChatPaymentBasicVo.getTimeStamp()); |
|
|
|
payInfo.put("nonceStr", weChatPaymentBasicVo.getNonceStr()); |
|
|
|
payInfo.put("package", weChatPaymentBasicVo.getPackages()); |
|
|
|
payInfo.put("signType", WxPayConstants.SignType.MD5); |
|
|
|
return SignUtils.createSign(payInfo, wxPayConfig.getSignType(), wxPayConfig.getMchKey(), null); |
|
|
|
} |
|
|
|
|
|
|
|
private String appSign(String prepayid, String partnerid, String timestamp, String noncestr, String |
|
|
|
appid, String packageValue, WxPayConfig wxPayConfig) { |
|
|
|
Map<String, String> configMap = new HashMap<>(); |
|
|
|
configMap.put("prepayid", prepayid); |
|
|
|
configMap.put("partnerid", partnerid); |
|
|
|
configMap.put("package", packageValue); |
|
|
|
configMap.put("timestamp", timestamp); |
|
|
|
configMap.put("noncestr", noncestr); |
|
|
|
configMap.put("appid", appid); |
|
|
|
return SignUtils.createSign(configMap, wxPayConfig.getSignType(), wxPayConfig.getMchKey(), null); |
|
|
|
} |
|
|
|
|
|
|
|
private Map<String, String> transformToMap(WeChatPaymentBasic weChatPaymentBasic) { |
|
|
|
Map<String, String> map = new HashMap<>(); |
|
|
|
map.put(ChannelPaymentField.APPID, weChatPaymentBasic.getAppId()); |
|
|
|
map.put(ChannelPaymentField.TIMESTAMP, weChatPaymentBasic.getTimeStamp()); |
|
|
|
map.put(ChannelPaymentField.NONCE_STR, weChatPaymentBasic.getNonceStr()); |
|
|
|
map.put(ChannelPaymentField.PACKAGES, weChatPaymentBasic.getPackages()); |
|
|
|
map.put(ChannelPaymentField.SIGN_TYPE, weChatPaymentBasic.getSignType()); |
|
|
|
map.put(ChannelPaymentField.PAY_SIGN, weChatPaymentBasic.getPaySign()); |
|
|
|
map.put(ChannelPaymentField.PRE_PAY_ID, weChatPaymentBasic.getPrepayid()); |
|
|
|
map.put(ChannelPaymentField.PARTNER_ID, weChatPaymentBasic.getPartnerid()); |
|
|
|
map.put(ChannelPaymentField.SIGN, weChatPaymentBasic.getSign()); |
|
|
|
return map; |
|
|
|
} |
|
|
|
} |