Commit 741523ea authored by cy's avatar cy

支付,广告填加标题字段

parent 805089bc
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
<result column="image" property="image"/> <result column="image" property="image"/>
<result column="create_time" property="createTime"/> <result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/> <result column="update_time" property="updateTime"/>
<result column="title" property="title"/>
</resultMap> </resultMap>
<sql id="table"> <sql id="table">
...@@ -24,11 +25,11 @@ ...@@ -24,11 +25,11 @@
</sql> </sql>
<sql id="cols_exclude_id"> <sql id="cols_exclude_id">
company_name,status, website,is_have_image,type,image, create_time,update_time company_name,status, website,is_have_image,type,image, create_time,update_time,title
</sql> </sql>
<sql id="vals"> <sql id="vals">
#{companyName},#{status},#{website},#{isHaveImage},#{type},#{image},now(),now() #{companyName},#{status},#{website},#{isHaveImage},#{type},#{image},now(),now(),#{title}
</sql> </sql>
<sql id="updateCondition"> <sql id="updateCondition">
...@@ -38,6 +39,7 @@ ...@@ -38,6 +39,7 @@
<if test="isHaveImage != null">is_have_image =#{isHaveImage},</if> <if test="isHaveImage != null">is_have_image =#{isHaveImage},</if>
<if test="type != null">type =#{type},</if> <if test="type != null">type =#{type},</if>
<if test="image != null">image =#{image},</if> <if test="image != null">image =#{image},</if>
<if test="title != null">title =#{title},</if>
update_time =now() update_time =now()
</sql> </sql>
......
...@@ -71,6 +71,7 @@ ...@@ -71,6 +71,7 @@
<if test="userId != null"> <if test="userId != null">
user_id=#{userId} user_id=#{userId}
</if> </if>
and result=0
order by create_time desc order by create_time desc
limit #{startNum},#{endNum} limit #{startNum},#{endNum}
</where> </where>
...@@ -85,6 +86,7 @@ ...@@ -85,6 +86,7 @@
<if test="userId != null"> <if test="userId != null">
user_id=#{userId} user_id=#{userId}
</if> </if>
and result=0
</where> </where>
</select> </select>
......
...@@ -71,4 +71,10 @@ public class Banner implements Serializable { ...@@ -71,4 +71,10 @@ public class Banner implements Serializable {
*/ */
@ApiModelProperty(value = "更新时间",name = "updateTime") @ApiModelProperty(value = "更新时间",name = "updateTime")
private Date updateTime; private Date updateTime;
/**
* 标题
*/
@ApiModelProperty(value = "标题",name = "title")
private String title;
} }
...@@ -49,4 +49,10 @@ public class BannerDto { ...@@ -49,4 +49,10 @@ public class BannerDto {
*/ */
@ApiModelProperty(value = "更新时间",name = "updateTime") @ApiModelProperty(value = "更新时间",name = "updateTime")
private Date updateTime; private Date updateTime;
/**
* 标题
*/
@ApiModelProperty(value = "标题",name = "title")
private String title;
} }
...@@ -53,6 +53,12 @@ ...@@ -53,6 +53,12 @@
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
<version>3.6.0</version> <version>3.6.0</version>
</dependency> </dependency>
<!-- 微信支付 sdk -->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<dependency> <dependency>
<groupId>com.github.wechatpay-apiv3</groupId> <groupId>com.github.wechatpay-apiv3</groupId>
......
...@@ -6,6 +6,7 @@ import cn.wisenergy.model.dto.PayQueryDto; ...@@ -6,6 +6,7 @@ import cn.wisenergy.model.dto.PayQueryDto;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface AliPayService { public interface AliPayService {
...@@ -18,6 +19,15 @@ public interface AliPayService { ...@@ -18,6 +19,15 @@ public interface AliPayService {
*/ */
R<String> doPost(PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse); R<String> doPost(PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse);
/***
* 手机网页端支付宝支付接口
* @param payPageDto
* @param request
* @param httpResponse
* @return
*/
R<String> wapAliPay(PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse);
...@@ -34,5 +44,5 @@ public interface AliPayService { ...@@ -34,5 +44,5 @@ public interface AliPayService {
* @param request * @param request
* @return * @return
*/ */
R<String> aliPayCallBack(HttpServletResponse response, HttpServletRequest request); void aliPayCallBack(HttpServletResponse response, HttpServletRequest request) throws IOException, Exception;
} }
...@@ -2,6 +2,7 @@ package cn.wisenergy.service.app; ...@@ -2,6 +2,7 @@ package cn.wisenergy.service.app;
import cn.wisenergy.common.utils.R; import cn.wisenergy.common.utils.R;
import cn.wisenergy.model.dto.PayPageDto; import cn.wisenergy.model.dto.PayPageDto;
import com.fasterxml.jackson.core.JsonProcessingException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
...@@ -18,6 +19,9 @@ public interface TestWxPayService { ...@@ -18,6 +19,9 @@ public interface TestWxPayService {
*/ */
R<String> wxPay(PayPageDto payPageDto, HttpServletResponse response); R<String> wxPay(PayPageDto payPageDto, HttpServletResponse response);
R<String> h5WxPay(PayPageDto payPageDto,HttpServletRequest request, HttpServletResponse response) throws JsonProcessingException;
R<String> WxPayApplets(PayPageDto payPageDto,HttpServletRequest request, HttpServletResponse response) throws JsonProcessingException;
/*** /***
*测试-支付成功回调 *测试-支付成功回调
* @param request * @param request
......
...@@ -10,21 +10,32 @@ import cn.wisenergy.model.vo.AddLimitVo; ...@@ -10,21 +10,32 @@ import cn.wisenergy.model.vo.AddLimitVo;
import cn.wisenergy.service.app.AliPayService; import cn.wisenergy.service.app.AliPayService;
import cn.wisenergy.service.app.UserLimitService; import cn.wisenergy.service.app.UserLimitService;
import cn.wisenergy.service.common.Common; import cn.wisenergy.service.common.Common;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient; import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayResponse;
import com.alipay.api.DefaultAlipayClient; import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest; import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse; import com.alipay.api.response.AlipayTradePagePayResponse;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import springfox.documentation.schema.Entry;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Set;
@Slf4j @Slf4j
@Service @Service
...@@ -33,26 +44,45 @@ public class AliPayServiceImpl implements AliPayService { ...@@ -33,26 +44,45 @@ public class AliPayServiceImpl implements AliPayService {
@Autowired @Autowired
private UserLimitService userLimitService; private UserLimitService userLimitService;
@Autowired @Autowired
private PayRecordMapper payRecordMapper; private PayRecordMapper payRecordMapper;
//appid
@Value("${aliPay.APP_ID}")
private String APP_ID;
//公钥
@Value("${aliPay.ALIPAY_PUBLIC_KEY}")
private String ALIPAY_PUBLIC_KEY;
//密钥
@Value("${aliPay.PRIVATE_KEY}")
private String PRIVATE_KEY;
/***
* pc端支付宝支付
* @param payPageDto
* @param request
* @param httpResponse
* @return
*/
@Override @Override
public R<String> doPost(PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse) { public R<String> doPost(PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse) {
if (null == payPageDto || null == payPageDto.getTotal()) { if (null == payPageDto || null == payPageDto.getTotal()) {
return R.error("人参不能为空!"); return R.error("人参不能为空!");
} }
AlipayClient alipayClient = new DefaultAlipayClient(Common.PAY_URL_CS, Common.APP_ID_CS, Common.PRIVATE_KEY_CS, "json", "UTF-8", Common.ALIPAY_PUBLIC_KEY_CS, "RSA2"); AlipayClient alipayClient = new DefaultAlipayClient(Common.PAY_URL, APP_ID, PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
String tradeNo = "21" + System.currentTimeMillis(); String tradeNo = "21" + System.currentTimeMillis();
Double amount = 0.01;
//支付成功跳转地址
alipayRequest.setReturnUrl(Common.RETURN_URL_PC);
//支付回调地址
alipayRequest.setNotifyUrl(Common.NOTIFY_URL);
//alipayRequest.setNotifyUrl(" http://tcdwak.natappfree.cc/pay/aliPayCallBack.do");
//创建API对应的request
alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
//在公共参数中设置回跳和通知地址
alipayRequest.setNotifyUrl("http://x6kmrr.natappfree.cc/pay/aliPayCallBack.do");
alipayRequest.setBizContent("{" + alipayRequest.setBizContent("{" +
"\"out_trade_no\":\"" + tradeNo + "\"," + "\"out_trade_no\":\"" + tradeNo + "\"," +
"\"total_amount\":" + payPageDto.getTotal() + "," + "\"total_amount\":" + amount + "," +
"\"subject\":\"充值\"," + "\"subject\":\"充值\"," +
"\"body\":\"充值\"," + "\"body\":\"充值\"," +
"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"" + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"" +
...@@ -68,7 +98,7 @@ public class AliPayServiceImpl implements AliPayService { ...@@ -68,7 +98,7 @@ public class AliPayServiceImpl implements AliPayService {
httpResponse.getWriter().write(form); httpResponse.getWriter().write(form);
httpResponse.getWriter().flush(); httpResponse.getWriter().flush();
httpResponse.getWriter().close(); httpResponse.getWriter().close();
if(response.isSuccess()){ if (response.isSuccess()) {
System.out.println("调用成功"); System.out.println("调用成功");
//生成预支付订单,充值结果设为失败(result=1) //生成预支付订单,充值结果设为失败(result=1)
PayRecord payRecord = new PayRecord(); PayRecord payRecord = new PayRecord();
...@@ -78,73 +108,153 @@ public class AliPayServiceImpl implements AliPayService { ...@@ -78,73 +108,153 @@ public class AliPayServiceImpl implements AliPayService {
payRecord.setType(payPageDto.getPayType()); payRecord.setType(payPageDto.getPayType());
payRecord.setUserId(payPageDto.getUserId()); payRecord.setUserId(payPageDto.getUserId());
payRecordMapper.add(payRecord); payRecordMapper.add(payRecord);
return R.ok(0,form); return R.ok("0", form);
} else {
return R.error("调用失败");
}
} catch (Exception e) {
return R.ok(1, "调用失败");
}
}
/***
* 手机网页支付宝支付
* @param payPageDto
* @param request
* @param httpResponse
* @return
*/
@Override
public R<String> wapAliPay(PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse) {
if (null == payPageDto || null == payPageDto.getTotal()) {
return R.error("人参不能为空!");
}
AlipayClient alipayClient = new DefaultAlipayClient(Common.PAY_URL, APP_ID, PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
String tradeNo = "21" + System.currentTimeMillis();
Double amount = 0.01;
//支付成功跳转地址
alipayRequest.setReturnUrl(Common.RETURN_URL_WAP);
//支付后回调地址
alipayRequest.setNotifyUrl(Common.NOTIFY_URL);
alipayRequest.setBizContent("{" +
"\"out_trade_no\":\"" + tradeNo + "\"," +
"\"total_amount\":" + amount + "," +
"\"subject\":\"充值\"," +
"\"body\":\"充值\"," +
"\"product_code\":\"QUICK_WAP_WAY\"" +
"}");
String form = "";
//调用SDK生成表单
try {
AlipayResponse response = alipayClient.pageExecute(alipayRequest);
form = response.getBody();
System.out.println(form);
httpResponse.setContentType("text/html;charset=UTF-8");
//直接将完整的表单html输出到页面
httpResponse.getWriter().write(form);
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
if (response.isSuccess()) {
System.out.println("调用成功");
//生成预支付订单,充值结果设为失败(result=1)
PayRecord payRecord = new PayRecord();
payRecord.setMoney(payPageDto.getTotal());
payRecord.setResult(1);
payRecord.setTradeNo(tradeNo);
payRecord.setType(payPageDto.getPayType());
payRecord.setUserId(payPageDto.getUserId());
payRecordMapper.add(payRecord);
return R.ok("0", form);
} else { } else {
System.out.println("调用失败"); System.out.println("调用失败");
return R.error("调用失败"); return R.error("调用失败");
} }
} catch (Exception e) { } catch (Exception e) {
return R.ok(1,"调用失败"); return R.ok(1, "调用失败");
} }
} }
@Override @Override
public R<String> query(PayQueryDto payQueryDto) { public R<String> query(PayQueryDto payQueryDto) {
return null; return null;
} }
/***
* 支付后回调方法
* @param response
* @param request
* @throws Exception
*/
@Override @Override
public R<String> aliPayCallBack(HttpServletResponse response, HttpServletRequest request) { public void aliPayCallBack(HttpServletResponse response, HttpServletRequest request) throws Exception {
System.out.println("支付宝回调成功"); PrintWriter out = response.getWriter();
try { System.out.println("进入支付宝回调");
//获取支付宝POST过来反馈信息 //获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<String,String>(); Map<String, String> params = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中
Map requestParams = request.getParameterMap(); log.info("支付宝回调,{}", JSON.toJSONString(params));
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { // 验证
String name = (String) iter.next(); boolean flag = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET, "RSA2");
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
boolean flag = AlipaySignature.rsaCheckV1(params, Common.ALIPAY_PUBLIC_KEY_CS, CHARSET,"RSA2");
// 获取支付宝的通知返回参数 // 获取支付宝的通知返回参数
String order_no = request.getParameter("out_trade_no"); // 获取订单号 String order_no = request.getParameter("out_trade_no"); // 获取订单号
if (flag==true) {// 验证成功 String trade_status = request.getParameter("trade_status"); //获取订单状态
try{ // 验证成功
if (!flag || !"TRADE_SUCCESS".equals(trade_status)) {
out.print("failure");
return;
}
//返回成功后修改订单充值结果为0,保存查询次数 //返回成功后修改订单充值结果为0,保存查询次数
QueryWrapper<PayRecord> queryWrapper = new QueryWrapper<>(); QueryWrapper<PayRecord> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("trade_no",order_no); queryWrapper.eq("trade_no", order_no);
PayRecord payRecord = payRecordMapper.selectOne(queryWrapper); PayRecord payRecord = payRecordMapper.selectOne(queryWrapper);
AddLimitVo addLimitVo = new AddLimitVo(); AddLimitVo addLimitVo = new AddLimitVo();
addLimitVo.setTradeNo(order_no); addLimitVo.setTradeNo(order_no);
addLimitVo.setPayMoney(payRecord.getMoney()); addLimitVo.setPayMoney(payRecord.getMoney());
addLimitVo.setPayType(2); addLimitVo.setPayType(1);
addLimitVo.setUserId(payRecord.getUserId()); addLimitVo.setUserId(payRecord.getUserId());
if (payRecord.getResult() != 1) {
out.print("failure");
return;
}
R<Boolean> booleanR = userLimitService.addLimit(addLimitVo); R<Boolean> booleanR = userLimitService.addLimit(addLimitVo);
if (booleanR.getCode()==1) { if (booleanR.getCode() != 0) {
return R.error("用户查询次数添加失败"); out.print("failure");
return;
}
out.print("success");
} }
return R.ok(0,"充值成功");
}catch (Exception e)
{ /***
System.out.println("支付宝支付异常"); * 将request中的参数转换成Map
e.printStackTrace(); * @param request
return R.error("支付宝支付异常"); * @return
*/
private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
Map<String, String> retMap = new HashMap<String, String>();
Set<Map.Entry<String, String[]>> entries = request.getParameterMap().entrySet();
for (Map.Entry<String, String[]> entry : entries) {
String name = entry.getKey();
String[] values = entry.getValue();
int valLen = values.length;
if (valLen == 1) {
retMap.put(name, values[0]);
} else if (valLen > 1) {
StringBuilder sb = new StringBuilder();
for (String val : values) {
sb.append(",").append(val);
} }
retMap.put(name, sb.toString().substring(1));
} else {
retMap.put(name, "");
} }
response.getWriter().write("success");
return R.ok(0,"支付宝订单支付成功");
} catch (Exception e) {
e.printStackTrace();
return R.error("支付宝支付异常");
} }
return retMap;
} }
} }
package cn.wisenergy.service.app.impl; package cn.wisenergy.service.app.impl;
import cn.wisenergy.common.utils.Md5Util;
import cn.wisenergy.common.utils.R; import cn.wisenergy.common.utils.R;
import cn.wisenergy.mapper.PayRecordMapper; import cn.wisenergy.mapper.PayRecordMapper;
import cn.wisenergy.mapper.PriceMapper;
import cn.wisenergy.model.app.PayRecord; import cn.wisenergy.model.app.PayRecord;
import cn.wisenergy.model.dto.PayPageDto; import cn.wisenergy.model.dto.PayPageDto;
import cn.wisenergy.model.vo.AddLimitVo; import cn.wisenergy.model.vo.AddLimitVo;
import cn.wisenergy.service.app.TestWxPayService; import cn.wisenergy.service.app.TestWxPayService;
import cn.wisenergy.service.app.UserLimitService; import cn.wisenergy.service.app.UserLimitService;
import cn.wisenergy.service.util.MapToXmlUtils; import cn.wisenergy.service.util.MapToXmlUtils;
import cn.wisenergy.service.wxpay.WxCommon; import cn.wisenergy.service.util.WxPayUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.models.auth.In; import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import springfox.documentation.spring.web.json.Json;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -24,7 +23,7 @@ import javax.servlet.http.HttpServletResponse; ...@@ -24,7 +23,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.*; import java.io.*;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.text.DecimalFormat; import java.net.URLEncoder;
import java.util.*; import java.util.*;
...@@ -34,14 +33,16 @@ import java.util.*; ...@@ -34,14 +33,16 @@ import java.util.*;
@Service @Service
@Slf4j @Slf4j
public class TestWxPayServiceImpl implements TestWxPayService { public class TestWxPayServiceImpl implements TestWxPayService {
//统一下单接口链接
public static String basePath = "https://api.mch.weixin.qq.com/pay/unifiedorder"; public static String basePath = "https://api.mch.weixin.qq.com/pay/unifiedorder";
@Autowired @Autowired
private UserLimitService userLimitService; private UserLimitService userLimitService;
@Autowired @Autowired
private PayRecordMapper payRecordMapper; private PayRecordMapper payRecordMapper;
/*** /***
* 支付 * pc微信支付总流程
* @param payPageDto * @param payPageDto
* @param response * @param response
* @return * @return
...@@ -54,6 +55,20 @@ public class TestWxPayServiceImpl implements TestWxPayService { ...@@ -54,6 +55,20 @@ public class TestWxPayServiceImpl implements TestWxPayService {
ServletOutputStream sos = null; ServletOutputStream sos = null;
String tradeNo = "21" + System.currentTimeMillis(); String tradeNo = "21" + System.currentTimeMillis();
//生成预支付订单,充值结果设为失败(result=1) //生成预支付订单,充值结果设为失败(result=1)
try {
//生成【统一下单API】所需参数的接口
String orderInfo = WxPayUtil.createOrderInfo(payPageDto,tradeNo);
System.out.println(orderInfo);
//调用统一下单接口
Map<String, String> map = unifiedOrder(orderInfo);
String return_msg = map.get("return_msg");//返回信息
String return_code = map.get("return_code");//状态码
String result_code = map.get("result_code");//业务结果
String code_url = map.get("code_url");
System.out.println("return_msg:"+return_msg);
log.info("支付返回信息:"+return_msg,return_code);
if (null != map && "SUCCESS".equals(return_code) && "SUCCESS".equals(result_code)) {
PayRecord payRecord = new PayRecord(); PayRecord payRecord = new PayRecord();
payRecord.setMoney(payPageDto.getTotal()); payRecord.setMoney(payPageDto.getTotal());
payRecord.setResult(1); payRecord.setResult(1);
...@@ -61,10 +76,7 @@ public class TestWxPayServiceImpl implements TestWxPayService { ...@@ -61,10 +76,7 @@ public class TestWxPayServiceImpl implements TestWxPayService {
payRecord.setType(payPageDto.getPayType()); payRecord.setType(payPageDto.getPayType());
payRecord.setUserId(payPageDto.getUserId()); payRecord.setUserId(payPageDto.getUserId());
payRecordMapper.add(payRecord); payRecordMapper.add(payRecord);
try { }
String orderInfo = createOrderInfo(payPageDto,tradeNo);//生成【统一下单API】所需参数的接口
System.out.println(orderInfo);
String code_url = unifiedOrder(orderInfo);//调用统一下单接口
sos = response.getOutputStream(); sos = response.getOutputStream();
//QRCodeUtil.encode(code_url, sos);//调用生成二维码的方法 //QRCodeUtil.encode(code_url, sos);//调用生成二维码的方法
System.out.println("code_url:"+code_url); System.out.println("code_url:"+code_url);
...@@ -76,44 +88,117 @@ public class TestWxPayServiceImpl implements TestWxPayService { ...@@ -76,44 +88,117 @@ public class TestWxPayServiceImpl implements TestWxPayService {
} }
/*** /***
* 生成统一下单格式的订单,生成一个XML格式的字符串 * h5微信支付总流程
* @param payPageDto
* @param request
* @param response
* @return * @return
* @throws UnsupportedEncodingException * @throws JsonProcessingException
*/ */
public String createOrderInfo(PayPageDto payPageDto,String tradeNo) throws UnsupportedEncodingException { @Override
public R<String> h5WxPay(PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse response) {
if(null==payPageDto || null==payPageDto.getTotal()){
return R.error("入参不能为空");
}
ServletOutputStream sos = null;
String tradeNo = "21" + System.currentTimeMillis();
//生成预支付订单,充值结果设为失败(result=1)
try {
//生成【统一下单API】所需参数的接口
String orderInfo = WxPayUtil.createOrderInfoH5(payPageDto,tradeNo,request);
System.out.println(orderInfo);
//调用统一下单接口
Map<String, String> map = unifiedOrder(orderInfo);
String return_msg = map.get("return_msg");//返回信息
String return_code = map.get("return_code");//状态码
String result_code = map.get("result_code");//业务结果
String urlString = URLEncoder.encode("http://www.baidu.com", "GBK");
String mweb_url = map.get("mweb_url")+"&redirect_url="+urlString;
log.info("支付返回信息:",return_msg,"状态码:",return_code);
if (null != map && "SUCCESS".equals(return_code) && "SUCCESS".equals(result_code)) {
PayRecord payRecord = new PayRecord();
payRecord.setMoney(payPageDto.getTotal());
payRecord.setResult(1);
payRecord.setTradeNo(tradeNo);
payRecord.setType(payPageDto.getPayType());
payRecord.setUserId(payPageDto.getUserId());
payRecordMapper.add(payRecord);
}
System.out.println("mweb_url:"+mweb_url);
return R.ok("0",mweb_url);
} catch (Exception e) {
e.printStackTrace();
return R.error("获取mweb_url失败");
}
}
/***
* 小程序微信支付总流程
* @param payPageDto
* @param request
* @param response
* @return
* @throws JsonProcessingException
*/
@Override
public R<String> WxPayApplets(PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse response) {
if(null==payPageDto || null==payPageDto.getTotal()){
return R.error("入参不能为空");
}
//随机字符串
String nonce_str = RandomStringUtils.randomAlphanumeric(16); String nonce_str = RandomStringUtils.randomAlphanumeric(16);
String tradeNo = "21" + System.currentTimeMillis();
//生成预支付订单,充值结果设为失败(result=1)
try {
//生成【统一下单API】所需参数的接口
String orderInfo = WxPayUtil.createOrderInfoWx(payPageDto,tradeNo,request,nonce_str);
System.out.println(orderInfo);
//调用统一下单接口
Map<String, String> map = unifiedOrder(orderInfo);
String return_msg = map.get("return_msg");//返回信息
String return_code = map.get("return_code");//状态码
String result_code = map.get("result_code");//业务结果
SortedMap<String,String> parameters = new TreeMap<String,String>(); log.info("支付返回信息:",return_msg,"状态码:",return_code);
parameters.put("appid", WxCommon.APP_ID); if (null != map && "SUCCESS".equals(return_code) && "SUCCESS".equals(result_code)) {
parameters.put("mch_id", WxCommon.MCHID); PayRecord payRecord = new PayRecord();
parameters.put("body", "充值"); payRecord.setMoney(payPageDto.getTotal());
parameters.put("out_trade_no", tradeNo); payRecord.setResult(1);
parameters.put("nonce_str", nonce_str); payRecord.setTradeNo(tradeNo);
DecimalFormat df = new DecimalFormat("#"); payRecord.setType(payPageDto.getPayType());
parameters.put("total_fee", df.format((payPageDto.getTotal())*100)); payRecord.setUserId(payPageDto.getUserId());
parameters.put("notify_url",WxCommon.NOTIFY_URL); payRecordMapper.add(payRecord);
parameters.put("trade_type","NATIVE"); SortedMap<String,String> mapParams = new TreeMap<String,String>();
mapParams.put("return_code", return_code);
mapParams.put("return_msg", return_msg);
String prepay_id = map.get("prepay_id");//返回的预付单信息 小程序端使用
mapParams.put("nonceStr", nonce_str);
mapParams.put("package", "prepay_id=" + prepay_id);
Long timeStamp = new Date().getTime();
mapParams.put("timeStamp", timeStamp + "");//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误
String characterEncoding = "UTF-8"; String characterEncoding = "UTF-8";
String sign = createSign(characterEncoding,parameters); String paySign=WxPayUtil.createSign(characterEncoding,mapParams);
parameters.put("sign", sign);//签名 mapParams.put("paySign", paySign);
//将订单对象转为xml格式 mapParams.put("appid", "");
String s = null;
try {
return MapToXmlUtils.mapToXml(parameters);//maptoXml方法是微信sdk自带的方法 }
System.out.println("mweb_url:");
return R.ok("0");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return R.error("获取mweb_url失败");
} }
return new String(s.getBytes("UTF-8"));
} }
/*** /***
* 统一下单 * 微信统一下单
* @param info * @param info
* @return * @return
* @throws Exception * @throws Exception
*/ */
public String unifiedOrder(String info) throws Exception { public Map<String, String> unifiedOrder(String info) throws Exception {
HttpURLConnection conn = (HttpURLConnection) new URL(basePath).openConnection(); HttpURLConnection conn = (HttpURLConnection) new URL(basePath).openConnection();
//加入数据 //加入数据
conn.setRequestMethod("POST"); conn.setRequestMethod("POST");
...@@ -133,47 +218,13 @@ public class TestWxPayServiceImpl implements TestWxPayService { ...@@ -133,47 +218,13 @@ public class TestWxPayServiceImpl implements TestWxPayService {
sb.append(line); sb.append(line);
} }
Map<String, String> map = MapToXmlUtils.xmlToMap(sb.toString()); Map<String, String> map = MapToXmlUtils.xmlToMap(sb.toString());
//返回的部分字段 return map;
String return_msg = map.get("return_msg");//返回信息
String return_code = map.get("return_code");//状态码
String result_code = map.get("result_code");//业务结果
String code_url = map.get("code_url");
//根据微信文档return_code 和result_code都为SUCCESS的时候才会返回code_url
if (null != map && "SUCCESS".equals(return_code) && "SUCCESS".equals(result_code)) {
return code_url;
} else {
System.out.println(return_msg);
return null;
}
} }
/***
* 生成签名
* @param characterEncoding
* @param parameters
* @return
*/
public static String createSign(String characterEncoding, SortedMap<String,String> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + WxCommon.PRIVATE_KEY);
String sign = Md5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
System.out.println("签名:"+sign);
return sign;
}
/*** /***
* 支付成功回调 * 微信支付成功回调
* @param request * @param request
* @param response * @param response
* @return * @return
......
...@@ -124,7 +124,7 @@ public class UserLimitServiceImpl extends ServiceImpl<UserLimitMapper, UserLimit ...@@ -124,7 +124,7 @@ public class UserLimitServiceImpl extends ServiceImpl<UserLimitMapper, UserLimit
//增加用户总查询次数 //增加用户总查询次数
Integer total = userLimit.getTotalLimit() + price.getUseLimit(); Integer total = userLimit.getTotalLimit() + price.getUseLimit();
userLimit.setUseLimit(usableNumber); userLimit.setUsableLimit(usableNumber);
userLimit.setTotalLimit(total); userLimit.setTotalLimit(total);
//更新充值卡状态和用户查询次数及增加充值记录 //更新充值卡状态和用户查询次数及增加充值记录
......
...@@ -107,7 +107,7 @@ public class WxPayServiceImpl implements WxPayService { ...@@ -107,7 +107,7 @@ public class WxPayServiceImpl implements WxPayService {
String nonceStr = UUID.randomUUID().toString().replace("-", ""); String nonceStr = UUID.randomUUID().toString().replace("-", "");
String method = "POST"; String method = "POST";
String tradeNo = "21" + System.currentTimeMillis(); String tradeNo = "21" + System.currentTimeMillis();
HttpUrl httpurl = HttpUrl.parse(WxCommon.WX_PAY_URL); HttpUrl httpurl = HttpUrl.parse(WxCommon.WX_PAY_URL_pc);
//构造签名参数 //构造签名参数
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
...@@ -162,13 +162,13 @@ public class WxPayServiceImpl implements WxPayService { ...@@ -162,13 +162,13 @@ public class WxPayServiceImpl implements WxPayService {
@Override @Override
public R<String> wx_Pay(PayPageDto payPageDto) throws IOException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException, IllegalBlockSizeException { public R<String> wx_Pay(PayPageDto payPageDto) throws IOException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException, IllegalBlockSizeException {
HttpPost httpPost = new HttpPost(WxCommon.WX_PAY_URL); HttpPost httpPost = new HttpPost(WxCommon.WX_PAY_URL_pc);
long timestamp = System.currentTimeMillis() / 1000; long timestamp = System.currentTimeMillis() / 1000;
String nonceStr = UUID.randomUUID().toString().replace("-", ""); String nonceStr = UUID.randomUUID().toString().replace("-", "");
String method = "POST"; String method = "POST";
String tradeNo = "21" + System.currentTimeMillis(); String tradeNo = "21" + System.currentTimeMillis();
HttpUrl httpurl = HttpUrl.parse(WxCommon.WX_PAY_URL); HttpUrl httpurl = HttpUrl.parse(WxCommon.WX_PAY_URL_pc);
// 请求body参数 // 请求body参数
String reqdata = "{" String reqdata = "{"
......
...@@ -30,44 +30,36 @@ public class Common { ...@@ -30,44 +30,36 @@ public class Common {
public static final long SMS_TIMEOUT = 1200; public static final long SMS_TIMEOUT = 1200;
/** /**
* 支付宝支付app_id * 支付宝--app_id
*/ */
public static final String PAY_URL = "https://openapi.alipay.com/gateway.do"; public static final String PAY_URL = "https://openapi.alipay.com/gateway.do";
public static final String APP_ID = "2021002126609937";
/***
public static final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2cUDFyw7sLp" + * 支付宝--回调地址
"TpICDURNefRfzr7I7qO5Spq6HwdyFbVv5m6wVzt3fXYTcDrVUuzfbV7+rrXqnvk7LNOp10qPtUyHyZKO2jTBBcUK5H0RPNz" + */
"s1XInKaSTAznGH8dEAk6yQiwhSDpQzwoOq1Ool2MQocdkcBWwAMEcEUByIbJ4ABsrwXdmkgu2hDHR/GgLvarUp1zOXfZkaTK//L" +
"1GUI5uCI+/omcqMPDIOwd8DfcNr0TKlXfAEixp9eVuU/b09b7vW7O9Vh+w0gmy5FN+BWX/JaRRL1DhRqbHl7Sl4/oGu1yjfQA5U" + public static final String NOTIFY_URL = "http://111.203.232.171:8997/pay/aliPayCallBack.do";
"8jXBgd+QjwdUiAXVwPdESS/AUbPWE517eH5FtQIDAQAB";
/***
public static final String PRIVATE_KEY = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDAzZQsv" + * 支付宝--pc端支付成功跳转地址
"7wKd/01D8YPqrMcevfi0rS81H4NObDkF/Y37ii+/V1vlzODiTQajeCWOM42kijTSFHiietwx7PRa57GI/BzhRbs3MeK" + */
"fvOkFVhUHklfOb9vT9E/y9TE7oWmbQVJThcytXerJbC95LDchJtBxQula/wmp0pwgkwFHM5IxNbT1Oh9UWKBn6" + public static final String RETURN_URL_PC = "http://111.203.232.171:8999/wallet";
"OoOuHhgFhO19l9+X4hJtb/rjKl8/K4ULrlxPfrnX75tbJryBS1VnkxiWyHTara1WkRDIKmLRSrHeDG1hh1NKMOA" +
"5jc2sfNOEuMhsgC1FY9sxd/Ap3dBp3TP3drAYpshaweYQwK9PyQ8b/TYgccIclgsJJ0BxMtAgMBAAECggEAD6sl" + /***
"VZWnZHpn234SrIdE0xWzO33ALnBeZhjAJWlFGzqBmTPh+gWhrBjkYRwSmmK3b3vlUXZZIT3wIlQ4ataCKrwU+G" + * 支付宝--手机网页支付成功跳转地址
"5idJFkrf6vMjCB4yQq9lAtHJCyAqs/+VkhB2touJJeFELnHMONX4FMVj94lpm63pCuBz4lMIuGPgwfP46Lgiuy4" + */
"xOhcczcr3jwUmaVJvvDVtDJ477gsr/P/HhidCVwBE+vPovFmZ/cbI8ud31Ta2P7VFvrJKheL36GEJ1c1cHE7gcS" + public static final String RETURN_URL_WAP = "http://111.203.232.171:8999/#/history";
"P7KsuzXfQP/6KjqM6QhWHem0s0vOUaplPrPhEArhmfhjqukD/U2lBTHzmE7iUlmPHEQRbQdwJIk4SQKBgQDgjd" +
"+VxxJ8pYigvyDK+OiXwA8hKwMiQGhA1XexjBnf2rTEimBwMNU87lKmsgCRsv26DAiVyPqiA5R2nPL3N4Sk8k7f" +
"KD6gRBzC1/91XtI2HsljdGZemW1V/4D5o2Su9lmsPl3UV8U54izp5JzerXB+5sULpfKyKf5iVJtb+a7adwKBgQ" +
"DbzXJXGMGc052StU4CwKeKElhTdB8uYbeML2Em0bwh1jZXwD/s2X7m8LAkOB2xaKQqrxjipcArIeAylI7xeEx24" +
"MVDk3C3BnZaZoiuvvWr0caGQHE0JHvtpCrs2xoXm7wMNsVLjc345ssEQM0ytVXsx/PcA1WwwrBAQNFiH4fEewK" +
"BgQDKBbm+lYADViXKgMlu8mrHg8nYzEqgeROSKLrrqCDrLWduXxQOO1DM5ZjEUeaDLmZpCER9BXi/Y7sgz2kjk" +
"vYqM7lTuXBGXaEGhq9Ul/9FI4OJj4I934jnUtxlO2PsqMPaW62syV4uClbgAoZDLATGlrV2GlFziqZLLtUq9UI" +
"jVwKBgQCmZGSGYotO+TNz+CRSGR27fB+5LVLdfcPBL6zQAj31L4B79WFvH0bd9J6jDIgN4TVFyr9/9BIBlOdv4t5" +
"DFdpss8MhYOAW7aFy1ePqxUydAXTT9Ly9yFC4mWqVW1fpP0+fv2ajx3mBTtWpJpUwKe4eDVAh4bRg10EtouPe8B" +
"eLOQKBgQCwsHZbrfgm8qrAhhoqPkxHHUDcQVhWpcBrv49ghpPLTsEPrOnYsFMCKb0nJc2goJ" +
"BQIT4QMu62i1jOInaIZyrf/1H3WuWhjI3SjObHiz1a0rmuCrFMPCpnAVlIYJvmAyrGJIvSSLEN33mUZnq1z4REgjn0FlzS0FMOVDRVAeMm7w==";
/** /**
* 沙箱 --支付宝支付app_id * 沙箱 --支付宝
*/ */
public static final String APP_ID_CS = "2016101300675128"; public static final String APP_ID_CS = "2016101300675128";
public static final String PAY_URL_CS = "https://openapi.alipaydev.com/gateway.do";
public static final String ALIPAY_PUBLIC_KEY_CS = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQE" + public static final String ALIPAY_PUBLIC_KEY_CS = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQE" +
"AovyCboYeJzNSUjBJmMss2NHo4JgAnn+cqnEUZFEeIO0u1JDGsxE3NLYwU54fM8OQunf3S6RxzIjZ/9jAaUtu" + "AovyCboYeJzNSUjBJmMss2NHo4JgAnn+cqnEUZFEeIO0u1JDGsxE3NLYwU54fM8OQunf3S6RxzIjZ/9jAaUtu" +
"LjVmJBAa3ac5leHpm5LKWl0olKYER3qZTJQFgoRymfZHzVqqDoVsnFJScfsNR7XDD9bsFiHa9R+c+fI+pPapHK" + "LjVmJBAa3ac5leHpm5LKWl0olKYER3qZTJQFgoRymfZHzVqqDoVsnFJScfsNR7XDD9bsFiHa9R+c+fI+pPapHK" +
...@@ -95,5 +87,5 @@ public class Common { ...@@ -95,5 +87,5 @@ public class Common {
"TFmmjrgNNXMiqhVZBxVf+GwwHdI0Rz8OukagIHeCHdG6nwu2aW+B9NsDhusiXjwU1rb28l6KNHRZqQ74PVREYyU" + "TFmmjrgNNXMiqhVZBxVf+GwwHdI0Rz8OukagIHeCHdG6nwu2aW+B9NsDhusiXjwU1rb28l6KNHRZqQ74PVREYyU" +
"hTc2T2fobY0qmPBy2CIrO3gL4skn+ZZLHaUeK3sinQ="; "hTc2T2fobY0qmPBy2CIrO3gL4skn+ZZLHaUeK3sinQ=";
public static final String PAY_URL_CS = "https://openapi.alipaydev.com/gateway.do";
} }
...@@ -20,6 +20,7 @@ import org.springframework.stereotype.Component; ...@@ -20,6 +20,7 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -168,8 +169,10 @@ public class VolunteerManager { ...@@ -168,8 +169,10 @@ public class VolunteerManager {
QueryWrapper<PayRecord> queryWrapper = new QueryWrapper<>(); QueryWrapper<PayRecord> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("trade_no",payRecord.getTradeNo()); queryWrapper.eq("trade_no",payRecord.getTradeNo());
PayRecord byTradeNo = payRecordMapper.selectOne(queryWrapper); PayRecord byTradeNo = payRecordMapper.selectOne(queryWrapper);
payRecord.setId(byTradeNo.getId());
int pay =0; int pay =0;
if(null!=byTradeNo){ if(null!=byTradeNo){
payRecord.setUpdateTime(new Date());
pay = payRecordMapper.updateById(payRecord); pay = payRecordMapper.updateById(payRecord);
}else{ }else{
pay = payRecordMapper.add(payRecord); pay = payRecordMapper.add(payRecord);
......
package cn.wisenergy.service.util; package cn.wisenergy.service.util;
import cn.wisenergy.common.utils.Md5Util;
import cn.wisenergy.model.dto.PayPageDto; import cn.wisenergy.model.dto.PayPageDto;
import cn.wisenergy.service.httpClient.WechatPayHttpClientBuilder; import cn.wisenergy.service.httpClient.WechatPayHttpClientBuilder;
import cn.wisenergy.service.httpClient.auth.AutoUpdateCertificatesVerifier; import cn.wisenergy.service.httpClient.auth.AutoUpdateCertificatesVerifier;
...@@ -9,8 +10,9 @@ import cn.wisenergy.service.httpClient.auth.WechatPay2Credentials; ...@@ -9,8 +10,9 @@ import cn.wisenergy.service.httpClient.auth.WechatPay2Credentials;
import cn.wisenergy.service.httpClient.auth.WechatPay2Validator; import cn.wisenergy.service.httpClient.auth.WechatPay2Validator;
import cn.wisenergy.service.httpClient.util.PemUtil; import cn.wisenergy.service.httpClient.util.PemUtil;
import cn.wisenergy.service.wxpay.WxCommon; import cn.wisenergy.service.wxpay.WxCommon;
import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPost;
...@@ -19,7 +21,9 @@ import org.apache.http.entity.StringEntity; ...@@ -19,7 +21,9 @@ import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.junit.After; import org.junit.After;
import org.springframework.beans.factory.annotation.Value;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
...@@ -28,11 +32,17 @@ import java.security.NoSuchAlgorithmException; ...@@ -28,11 +32,17 @@ import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.SignatureException; import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException; import java.security.spec.InvalidKeySpecException;
import java.util.UUID; import java.text.DecimalFormat;
import java.util.*;
public class WxPayUtil { public class WxPayUtil {
@Value("${wxPay.APP_ID}")
private static String appid;
@Value("${wxPay.MCH_ID}")
private static String mchid;
@Value("${wxPay.PRIVATE_KEY}")
private static String key;
/** /**
* 商户号 * 商户号
*/ */
...@@ -80,13 +90,13 @@ public class WxPayUtil { ...@@ -80,13 +90,13 @@ public class WxPayUtil {
} }
public static void main(String[] args) throws IOException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException { public static void main(String[] args) throws IOException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException {
HttpPost httpPost = new HttpPost(WxCommon.WX_PAY_URL); HttpPost httpPost = new HttpPost(WxCommon.WX_PAY_URL_pc);
long timestamp = System.currentTimeMillis() / 1000; long timestamp = System.currentTimeMillis() / 1000;
String nonceStr = UUID.randomUUID().toString().replace("-", ""); String nonceStr = UUID.randomUUID().toString().replace("-", "");
String method = "POST"; String method = "POST";
String tradeNo = "21" + System.currentTimeMillis(); String tradeNo = "21" + System.currentTimeMillis();
HttpUrl httpurl = HttpUrl.parse(WxCommon.WX_PAY_URL); HttpUrl httpurl = HttpUrl.parse(WxCommon.WX_PAY_URL_pc);
// 请求body参数 // 请求body参数
String reqdata = "{" String reqdata = "{"
...@@ -169,4 +179,149 @@ public class WxPayUtil { ...@@ -169,4 +179,149 @@ public class WxPayUtil {
response.close(); response.close();
} }
} }
/***
* pc端生成统一下单格式的订单,生成一个XML格式的字符串
* @return
* @throws UnsupportedEncodingException
*/
public static String createOrderInfo(PayPageDto payPageDto,String tradeNo) throws UnsupportedEncodingException {
String nonce_str = RandomStringUtils.randomAlphanumeric(16);
SortedMap<String,String> parameters = new TreeMap<String,String>();
parameters.put("appid", WxCommon.APP_ID);
parameters.put("mchid", mchId);
parameters.put("body", "充值");
parameters.put("out_trade_no", tradeNo);
parameters.put("nonce_str", nonce_str);
DecimalFormat df = new DecimalFormat("#");
//parameters.put("total_fee", df.format(payPageDto.getTotal()*100));
parameters.put("total_fee", df.format(1));
parameters.put("notify_url",WxCommon.NOTIFY_URL);
parameters.put("trade_type","NATIVE");
String characterEncoding = "UTF-8";
String sign = createSign(characterEncoding,parameters);
parameters.put("sign", sign);//签名
//将订单对象转为xml格式
String s = null;
try {
return MapToXmlUtils.mapToXml(parameters);//maptoXml方法是微信sdk自带的方法
} catch (Exception e) {
e.printStackTrace();
}
return new String(s.getBytes("UTF-8"));
}
/***
* h5生成统一下单格式的订单,生成一个XML格式的字符串
* @return
* @throws UnsupportedEncodingException
*/
public static String createOrderInfoH5(PayPageDto payPageDto,String tradeNo,HttpServletRequest request) throws UnsupportedEncodingException, JsonProcessingException {
String nonce_str = RandomStringUtils.randomAlphanumeric(16);
String sceneInfo="{'h5_info':{'type':'WAP','wap_url': 'http://111.203.232.171:8999/','wap_name': '充值'}}";
String spbill_create_ip = getRealIp(request);
SortedMap<String,String> parameters = new TreeMap<String,String>();
parameters.put("appid", appid);
parameters.put("mchid", mchid);
parameters.put("body", "充值");
parameters.put("out_trade_no", tradeNo);
parameters.put("nonce_str", nonce_str);
DecimalFormat df = new DecimalFormat("#");
//parameters.put("total_fee", df.format(payPageDto.getTotal()*100));
parameters.put("total_fee", df.format(1));
parameters.put("notify_url",WxCommon.NOTIFY_URL);
parameters.put("trade_type","MWEB");
parameters.put("scene_info",sceneInfo);
parameters.put("spbill_create_ip",spbill_create_ip);
String characterEncoding = "UTF-8";
String sign = createSign(characterEncoding,parameters);
parameters.put("sign", sign);//签名
//将订单对象转为xml格式
String s = null;
try {
return MapToXmlUtils.mapToXml(parameters);//maptoXml方法是微信sdk自带的方法
} catch (Exception e) {
e.printStackTrace();
}
return new String(s.getBytes("UTF-8"));
}
/***
* 小程序生成统一下单格式的订单,生成一个XML格式的字符串
* @return
* @throws UnsupportedEncodingException
*/
public static String createOrderInfoWx(PayPageDto payPageDto,String tradeNo,HttpServletRequest request,String nonce_str) throws UnsupportedEncodingException, JsonProcessingException {
SortedMap<String,String> parameters = new TreeMap<String,String>();
parameters.put("appid", appid);
parameters.put("mchid", mchid);
parameters.put("body", "充值");
parameters.put("out_trade_no", tradeNo);
parameters.put("nonce_str", nonce_str);
DecimalFormat df = new DecimalFormat("#");
//parameters.put("total_fee", df.format(payPageDto.getTotal()*100));
parameters.put("total_fee", df.format(1));
parameters.put("notify_url",WxCommon.NOTIFY_URL);
parameters.put("trade_type","JSAPI");
String characterEncoding = "UTF-8";
String sign = createSign(characterEncoding,parameters);
parameters.put("sign", sign);//签名
//将订单对象转为xml格式
String s = null;
try {
return MapToXmlUtils.mapToXml(parameters);//maptoXml方法是微信sdk自带的方法
} catch (Exception e) {
e.printStackTrace();
}
return new String(s.getBytes("UTF-8"));
}
/***
* 生成签名
* @param characterEncoding
* @param parameters
* @return
*/
public static String createSign(String characterEncoding, SortedMap<String,String> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + WxCommon.PRIVATE_KEY);
String sign = Md5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
System.out.println("签名:"+sign);
return sign;
}
/**
* 获取真实ip地址 通过阿帕奇代理的也能获取到真实ip
* @param request
* @return
*/
public static String getRealIp(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
} }
...@@ -12,9 +12,9 @@ public class WxCommon { ...@@ -12,9 +12,9 @@ public class WxCommon {
public static final String MCHID = "1606042985"; public static final String MCHID = "1606042985";
public static final String NOTIFY_URL = "http://www.baodu.com"; public static final String NOTIFY_URL = "http://http://tcdwak.natappfree.cc/pay/wxPayCallBack.do";
public static final String WX_PAY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/native"; public static final String WX_PAY_URL_pc = "https://api.mch.weixin.qq.com/v3/pay/transactions/native";
public static final String WX_PAY_QUERY = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/"; public static final String WX_PAY_QUERY = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/";
......
...@@ -49,6 +49,8 @@ ...@@ -49,6 +49,8 @@
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" /> <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" /> <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" /> <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" /> <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" />
...@@ -162,6 +164,7 @@ ...@@ -162,6 +164,7 @@
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.62" level="project" /> <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.62" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.6.0" level="project" /> <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.6.0" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okio:okio:1.11.0" level="project" /> <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.11.0" level="project" />
<orderEntry type="library" name="Maven: com.github.wxpay:wxpay-sdk:0.0.3" level="project" />
<orderEntry type="library" name="Maven: com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.2.1" level="project" /> <orderEntry type="library" name="Maven: com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.2.1" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpmime:4.5.8" level="project" /> <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpmime:4.5.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" />
......
...@@ -12,6 +12,7 @@ import com.alipay.api.AlipayClient; ...@@ -12,6 +12,7 @@ import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient; import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeQueryRequest; import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeQueryResponse; import com.alipay.api.response.AlipayTradeQueryResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -54,14 +55,20 @@ public class PayController { ...@@ -54,14 +55,20 @@ public class PayController {
@ApiOperation(value = "PC支付宝-支付接口", notes = "PC支付宝-支付接口", httpMethod = "POST") @ApiOperation(value = "PC支付宝-支付接口", notes = "PC支付宝-支付接口", httpMethod = "POST")
@ApiImplicitParam(name = "payPageDto", value = "参数", dataType = "PayPageDto") @ApiImplicitParam(name = "payPageDto", value = "参数", dataType = "PayPageDto")
@PostMapping("/page") @PostMapping("/page")
//public R<String> doPost(@RequestBody PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse) { public R<String> doPost(@RequestBody PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse) {
public R<String> doPost(Integer userId,Integer payType,Integer total_amount, HttpServletRequest request, HttpServletResponse httpResponse) { /*public R<String> doPost(Integer userId,Integer payType,Integer total_amount, HttpServletRequest request, HttpServletResponse httpResponse) {
PayPageDto payPageDto = new PayPageDto(); PayPageDto payPageDto = new PayPageDto();
payPageDto.setTotal(total_amount); payPageDto.setTotal(total_amount);
payPageDto.setUserId(userId); payPageDto.setUserId(userId);
payPageDto.setPayType(payType); payPageDto.setPayType(payType);*/
return aliPayService.doPost(payPageDto,request,httpResponse); return aliPayService.doPost(payPageDto,request,httpResponse);
} }
@ApiOperation(value = "手机网页支付宝-支付接口", notes = "手机网页支付宝-支付接口", httpMethod = "POST")
@ApiImplicitParam(name = "payPageDto", value = "参数", dataType = "PayPageDto")
@PostMapping("/wapAliPay")
public R<String> wapAliPay(@RequestBody PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse) {
return aliPayService.wapAliPay(payPageDto,request,httpResponse);
}
@ApiOperation(value = "PC支付宝-交易查询", notes = "PC支付宝-交易查询", httpMethod = "POST") @ApiOperation(value = "PC支付宝-交易查询", notes = "PC支付宝-交易查询", httpMethod = "POST")
@ApiImplicitParam(name = "payQueryDto", value = "查询参数", dataType = "PayQueryDto") @ApiImplicitParam(name = "payQueryDto", value = "查询参数", dataType = "PayQueryDto")
...@@ -84,15 +91,15 @@ public class PayController { ...@@ -84,15 +91,15 @@ public class PayController {
*/ */
@ApiOperation(value = "支付回调", notes = "支付回调", httpMethod = "POST") @ApiOperation(value = "支付回调", notes = "支付回调", httpMethod = "POST")
@RequestMapping(value = "/aliPayCallBack.do") @RequestMapping(value = "/aliPayCallBack.do")
public R<String> aliPayCallBack(HttpServletResponse response, HttpServletRequest request) { public void aliPayCallBack(HttpServletResponse response, HttpServletRequest request) throws Exception {
return aliPayService.aliPayCallBack(response,request); aliPayService.aliPayCallBack(response, request);
} }
@ApiOperation(value = "微行支付-统一下单测试", notes = "微行支付-统一下单", httpMethod = "POST") @ApiOperation(value = "微行支付-统一下单测试", notes = "微行支付-统一下单", httpMethod = "POST")
@ApiImplicitParam(name = "payPageDto", value = "支付入参", dataType = "PayPageDto") @ApiImplicitParam(name = "payPageDto", value = "支付入参", dataType = "PayPageDto")
@PostMapping("/wxPayTest") @PostMapping("/wxPayTest")
public R<String> wxPayTest(@RequestBody PayPageDto payPageDto) throws AlipayApiException, UnsupportedEncodingException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, SignatureException { public R<String> wxPayTest(@RequestBody PayPageDto payPageDto) throws UnsupportedEncodingException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, SignatureException {
return wxPayService.wxPay(payPageDto); return wxPayService.wxPay(payPageDto);
} }
...@@ -100,18 +107,17 @@ public class PayController { ...@@ -100,18 +107,17 @@ public class PayController {
@ApiOperation(value = "微信支付-交易查询", notes = "微信支付-交易查询", httpMethod = "POST") @ApiOperation(value = "微信支付-交易查询", notes = "微信支付-交易查询", httpMethod = "POST")
@ApiImplicitParam(name = "payQueryDto", value = "查询参数", dataType = "PayQueryDto") @ApiImplicitParam(name = "payQueryDto", value = "查询参数", dataType = "PayQueryDto")
@PostMapping("/queryWx") @PostMapping("/queryWx")
public R<String> queryWx(@RequestBody PayQueryDto payQueryDto) throws AlipayApiException, InvalidKeySpecException, SignatureException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException { public R<String> queryWx(@RequestBody PayQueryDto payQueryDto) throws InvalidKeySpecException, SignatureException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
if (null == payQueryDto || StringUtils.isBlank(payQueryDto.getOutTradeNo())) { if (null == payQueryDto || StringUtils.isBlank(payQueryDto.getOutTradeNo())) {
return R.error("操作错误!"); return R.error("操作错误!");
} }
return wxPayService.queryWx(payQueryDto); return wxPayService.queryWx(payQueryDto);
} }
@ApiOperation(value = "测试-微行支付-统一下单", notes = "测试-微行支付-统一下单", httpMethod = "POST") @ApiOperation(value = "测试-微行支付-统一下单", notes = "测试-微行支付-统一下单", httpMethod = "POST")
@ApiImplicitParam(name = "payPageDto", value = "支付入参", dataType = "PayPageDto") @ApiImplicitParam(name = "payPageDto", value = "支付入参", dataType = "PayPageDto")
@PostMapping("/wx_Pay") @PostMapping("/wx_Pay")
public R<String> wx_Pay(@RequestBody PayPageDto payPageDto) throws AlipayApiException, IOException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, SignatureException, IllegalBlockSizeException { public R<String> wx_Pay(@RequestBody PayPageDto payPageDto) throws IOException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, SignatureException, IllegalBlockSizeException {
return wxPayService.wx_Pay(payPageDto); return wxPayService.wx_Pay(payPageDto);
} }
...@@ -122,6 +128,12 @@ public class PayController { ...@@ -122,6 +128,12 @@ public class PayController {
return testWxPayService.wxPay(payPageDto, response); return testWxPayService.wxPay(payPageDto, response);
} }
@ApiOperation(value = "h5微行支付-统一下单", notes = "h5微行支付-统一下单", httpMethod = "POST")
@ApiImplicitParam(name = "payPageDto", value = "支付入参", dataType = "PayPageDto")
@PostMapping("/h5WxPay")
public R<String> h5WxPay(@RequestBody PayPageDto payPageDto,HttpServletRequest request, HttpServletResponse response) throws JsonProcessingException {
return testWxPayService.h5WxPay(payPageDto,request, response);
}
/** /**
* 微信回调函数 * 微信回调函数
* 支付成功后微信服务器会调用此方法 * 支付成功后微信服务器会调用此方法
......
...@@ -69,3 +69,13 @@ jwt: ...@@ -69,3 +69,13 @@ jwt:
expire: 14400 expire: 14400
logging: logging:
config: classpath:logback-spring.xml config: classpath:logback-spring.xml
#支付宝支付appid、支付宝公钥、应用私钥
aliPay:
APP_ID: 2021002126609937
ALIPAY_PUBLIC_KEY: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2cUDFyw7sLpTpICDURNefRfzr7I7qO5Spq6HwdyFbVv5m6wVzt3fXYTcDrVUuzfbV7+rrXqnvk7LNOp10qPtUyHyZKO2jTBBcUK5H0RPNzs1XInKaSTAznGH8dEAk6yQiwhSDpQzwoOq1Ool2MQocdkcBWwAMEcEUByIbJ4ABsrwXdmkgu2hDHR/GgLvarUp1zOXfZkaTK//L1GUI5uCI+/omcqMPDIOwd8DfcNr0TKlXfAEixp9eVuU/b09b7vW7O9Vh+w0gmy5FN+BWX/JaRRL1DhRqbHl7Sl4/oGu1yjfQA5U8jXBgd+QjwdUiAXVwPdESS/AUbPWE517eH5FtQIDAQAB
PRIVATE_KEY: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCA9/p6UJH2kpTumbyRt/gdAOUnRJQ0VRQj/o0GtJ9ECweSIk6+8K81CAGcfmdeB6ZfteXZlKr9SGf3hkwuOz5oOJb5GAmKgv60T6zrBm5/MSVYhDY935eCYjFSj59w2120kvtWvq94Km3TkvAstrbSwBgpS4eutZ2qg1U4h5j6H3v+PB6RxyOsugarEYQ6TxCTr/CWHWU9G28yXSaQ66S3rsxl5aSpUCY+lUwIEVmZ9SyAa+g4FV3EfRitssiKMdCuli46YQ0/uxc59igCdgd4uxygswYgUGfP4HLQ5wEGPn7H4Q5IxSlxPvc60fYxgkRo9NMZgAljRohGdKP2u6jjAgMBAAECggEAGRakbljwHCRlvoi/qyU7qgC7k0j+/7MxSNNDAfPvK6Btp5ru8KwHmWxmS9g3KY6ZafMLtKj8HmuQdhF1DmVN/Z5MmEZ5zK0w+UiqncnRgwK/fhmyJ5Uwdxe8+o+f96dk8jTJmhVcMycl2Eu0Vy5wIE1oJdhgm7cO5dXIpUeTlcx09F3v2xx4lvmJTQvzPxgFYMbB7M8ijEQvkeXdBw7fAlA+izl8Paovgv6tu/dikImZZZgoHKZugZbz3orxpZWiIXzoB9SymBo+lWkeGMj55hlKV9sXTrf5pM6vd5JYmzfYoF/bcO7k4NJ0Elddz3EHe/0IX8M90rAH9WFSdLGseQKBgQDMkEPUfrWP/Z6nE76muUQE4y3OH0ckLacbCEI+RseVNqSKIs+TrzhQllvb/V/foeiv6SLBvmyWbO3AX+Gh9GuedLyRTct/K9o1J3Q4GAa8jGJeoi1uYPPAfqt3BMv05/i1jIvTePUrxp1NV7u0/i9QmV4R1it0+abs2Ro8Q3XqZwKBgQChZa3UBe4FbaTBWVToU4lW5KdEv93gm6iKQiHWI4yTXaJJlPOo8Hx9+/REeaxOIsaW6XZLyarNuh+cThTv4GLJKjogjcq9B1oNWgS6Z41CJZIkW/IFgjZvHh3n+SD3pTijA9y7usgu/R0OsVwrlAMyMvl7JdIMRYXFckRhb1v4JQKBgQC3+Ao4gZfRnjpfcd9k23rzlkfsdq6pN7FwGzZQAaGebNz/Kh1aaRuRRhfouW7OlTLJeTZ73UCU6/PJrbEi0Mk0YTHwz3DytsJwSUI47EqqqOoSx3FqMiEk/gZAbHzsjO5cf8CEd+St8Noo43z5Yhu1NainC+BbO+ZGXV0900GpgwKBgEEx2nK/5nLo5Fl55VNnkx23hV2/BzhYiE85AYQHnhxVAV4pvfcrFY6qfPRAFfsGDyQcsD1S/BzYJzazT7/J6v2JgituO0v6MUUdbLWDaMskdBEd1vikrapbBweSWd/PLL6kq8BlZcGdWuR5flrYEiZv8tjs4Rk16CBm1PpqykLFAoGASgkWQocPk0PYnEr1anXeiabc+/hMj4cZv3ynGv7NU9hUkZszMDKutG63y3nZ1QJPtfcF7xgTKpABfdIMCbAzKzDpd2znFg/bTxCV23GV6SNSWU+R8WC+30jw5o3W++wcILmd83L4IWLXUo6+GI0wqDBNOYG+nDLs1gWfBvX4UbI=
#微信支付appid、mchid、密钥
wxPay:
APP_ID: wx7d8f4502a2bfa865
MCH_ID: 1606042985
PRIVATE_KEY: efef4a06a1654e0f78d113377ea37aed
\ No newline at end of file
...@@ -51,6 +51,8 @@ ...@@ -51,6 +51,8 @@
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" /> <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" /> <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" /> <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" /> <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" />
...@@ -150,6 +152,7 @@ ...@@ -150,6 +152,7 @@
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.62" level="project" /> <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.62" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.6.0" level="project" /> <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.6.0" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okio:okio:1.11.0" level="project" /> <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.11.0" level="project" />
<orderEntry type="library" name="Maven: com.github.wxpay:wxpay-sdk:0.0.3" level="project" />
<orderEntry type="library" name="Maven: com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.2.1" level="project" /> <orderEntry type="library" name="Maven: com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.2.1" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpmime:4.5.8" level="project" /> <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpmime:4.5.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" />
......
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