pom.xml
<!--wxPay-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
aoolication.yml
pay:
wxpay:
gzhId: ***
appId: ***
mchID: ***
appSecret: ***
paternerKEY: ***
port: 8899
RestPayController.java
package com.ruoyi.api.wechat;
import com.github.wxpay.sdk.WXPayUtil;
import com.google.common.collect.Maps;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.framework.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
@Api(tags = "微信支付相关接口")
@RestController
@RequestMapping("/rest/pay")
@Slf4j
public class RestPayController extends BaseController {
@Value("${pay.wxpay.appId}")
public String APPID;
@Value("${pay.wxpay.appSecret}")
public String APPSECRET;
@Value("${pay.wxpay.mchID}")
public String MCHID;
@Value("${pay.wxpay.paternerKEY}")
public String PATERNERKEY;
@ApiOperation(value = "微信支付订单", notes = "所有参数必填")
@ApiImplicitParams({
@ApiImplicitParam(name = "orderNumber", value = "订单编号"),
@ApiImplicitParam(name = "openId", value = "微信openId"),
@ApiImplicitParam(name = "money", value = "订单金额")
})
@GetMapping("/orders")
@ResponseBody
public Map<String, String> orders(String orderNumber,String openId, String money, HttpServletRequest request, HttpServletResponse response) {
if (StringUtils.isBlank(orderNumber)||Objects.isNull(openId)|| StringUtils.isBlank(money)) {
Map<String, String> errorMap = Maps.newHashMap();
errorMap.put("301","必填参数为空");
return errorMap;
}
try {
log.info("进入支付接口了");
log.info("openId==" + openId + "====money==" + money);
Map<String, String> paraMap = new HashMap<String, String>();
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();
}
if (ip.indexOf(",") != -1) {
String[] ips = ip.split(",");
ip = ips[0].trim();
}
paraMap.put("appid", APPID);
paraMap.put("body", "纯情小店铺-薯条");
paraMap.put("mch_id", MCHID);
paraMap.put("nonce_str", WXPayUtil.generateNonceStr());
paraMap.put("openid", openId);
paraMap.put("out_trade_no",UUID.randomUUID().toString().replaceAll("-", ""));
paraMap.put("spbill_create_ip", ip);
paraMap.put("total_fee", money);
paraMap.put("trade_type", "JSAPI");
paraMap.put("notify_url", "用户支付完成后,你想微信调你的哪个接口");
String sign = WXPayUtil.generateSignature(paraMap, PATERNERKEY);
paraMap.put("sign", sign);
String xml = WXPayUtil.mapToXml(paraMap);
String unifiedorder_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
System.out.println("xml为:" + xml);
String xmlStr = HttpUtils.httpsRequest(unifiedorder_url, "POST", xml);
System.out.println("xmlStr为:" + xmlStr);
String prepay_id = "";
if (xmlStr.indexOf("SUCCESS") != -1) {
Map<String, String> map = WXPayUtil.xmlToMap(xmlStr);
prepay_id = (String) map.get("prepay_id");
}
Map<String, String> payMap = new HashMap<String, String>();
payMap.put("appId", APPID);
payMap.put("timeStamp", new Timestamp(System.currentTimeMillis()) + "");
payMap.put("nonceStr", WXPayUtil.generateNonceStr());
payMap.put("signType", "MD5");
payMap.put("package", "prepay_id=" + prepay_id);
String paySign = WXPayUtil.generateSignature(payMap, PATERNERKEY);
payMap.put("paySign", paySign);
return payMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@RequestMapping("/notify")
public String callBack(HttpServletRequest request, HttpServletResponse response) {
InputStream is = null;
try {
is = request.getInputStream();
String xml = InputStream2String(is);
Map<String, String> notifyMap = WXPayUtil.xmlToMap(xml);
System.out.println("微信返回给回调函数的信息为:" + xml);
if (notifyMap.get("result_code").equals("SUCCESS")) {
String ordersSn = notifyMap.get("out_trade_no");
String amountpaid = notifyMap.get("total_fee");
BigDecimal amountPay = (new BigDecimal(amountpaid).divide(new BigDecimal("100"))).setScale(2);
System.out.println("===notify===回调方法已经被调!!!");
}
response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
public static String InputStream2String(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
baos.close();
is.close();
byte[] lens = baos.toByteArray();
String result = new String(lens, "UTF-8");
return result;
}
}