1.调用微信小程序统一下单,生成预支付交易单,代码:
//我一般喜欢在Controller层写商品的信息,因为同时可以把参数带过去
public WechatPayDTO getPrePayInfo(HttpServletRequest request,double amount,String openId,String channelId){
SysUserDTO currentUser = this.getCurrentUser(request);
Map<String, String> data = new HashMap<>();
String orderNo = CodeUtils.getUniqueCode("0"); //时间
data.put(WechatPayConstantField.APP_ID, ConstantAboutWechat.APP_ID); appid
data.put(WechatPayConstantField.BODY, "商品信息");
data.put(WechatPayConstantField.MCH_ID, ConstantAboutWechat.MCH_ID); // 商户号
data.put(WechatPayConstantField.OPENID, openId); // openId
data.put(WechatPayConstantField.OUT_TRADE_NO, orderNo);商户订单号
data.put(WechatPayConstantField.SPBILL_CREATE_IP, request.getRemoteAddr());终端IP
data.put(WechatPayConstantField.TOTAL_FEE, MoneyUtil.changeY2F(amount) + ""); //标价金额
data.put(WechatPayConstantField.TRADE_TYPE, "JSAPI"); //交易类型
data.put(WechatPayConstantField.NOTIFY_URL, "回调地址");// 通知地址 这个需要去配置,你的
Map<String,String> resultMap = null;
logger.info("支付金额:-------------------" + amount);
try {
resultMap = payFunction.getPrePayInfo(data);
logger.info(resultMap.toString());
}catch (Exception e) {
logger.error("生成微信预支付订单失败",e);
throw new BusinessException(ExceptionCodeConstants.SYSTEM_WECHAT_PAY_ERROR);
}
//根据返回的信息进行业务处理,如:存储数据到订单里面
//用个实体类保存返回的信息,如:
WechatPayDTO wechatPay = new WechatPayDTO();
wechatPay.setAppId((String)resultMap.get("appId"));
wechatPay.setNonceStr((String)resultMap.get("nonceStr"));
wechatPay.setTimeStamp((String)resultMap.get("timeStamp"));
wechatPay.setSignType((String)resultMap.get("signType"));
wechatPay.setPaySign((String)resultMap.get("paySign"));
wechatPay.setPrepayId((String)resultMap.get("prepayId"));
wechatPay.setOrderNumber(orderNo);
//再把这些信息生成一个预支付的订单,存储数据库
//返回给前端,让前端拿到信息去支付
return wechatPay;
}
public Map<String,String> getPrePayInfo(Map<String, String> data) throws Exception {
String unifiedorderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // 微信统一下单URL
//这里是生成随机字符串 工具类下面提供
String nonceStr