- 业务介绍:根据产品金额生成二维码来进行微信扫码支付
- html页
<script type="text/javascript" src="//static.runoob.com/assets/qrcode/qrcode.min.js"></script>
<body>
<div id="qrcode"></div>
<script>
var qrcode = new QRCode(document.getElementById("qrcode"));
qrcode.makeCode(data.data.code_url);
<script>
</body>
- Controller
@RestController
@CrossOrigin
@RequestMapping("/pay")
public class PayController {
@PostMapping("/createPay")
public BusiResult createPayOrder(@RequestBody PayVo payvo){
Map res = WXPayPubUtil.createNative(payvo.getOrderId(),
payvo.getFee(),
payvo.getExpirTime());
System.out.println(res);
return BusiResult.success(res);
}
@PostMapping("/queryPayStatus")
public BusiResult queryPayStatus(@RequestBody OrderTable payVo){
Map res = WXPayPubUtil.queryPayStatus(payVo.getOrderNumber());
System.out.println(res);
return BusiResult.success(res);
}
@RequestMapping("/wxNotify")
public void notify(HttpServletRequest request, HttpServletResponse response) throws Exception {
InputStream inputStream = request.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuffer sb = new StringBuffer();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
in.close();
inputStream.close();
String strXml = sb.toString();
Map<String, String> map = WXPayUtil.xmlToMap(strXml);
System.out.println(map);
String outTradeNo = map.get("out_trade_no");
String totalFee = map.get("total_fee");
String appId = map.get("appid");
String mchId = map.get("mch_id");
String transactionId = map.get("transaction_id");
String resultCode = map.get("result_code");
String attach = map.get("attach");
Boolean juge = WXPayPubUtil.callbackPay(response,strXml,map);
if (juge) {
}
}
}
- 实体类
@Data
public class PayVo {
private String orderId;
private Integer fee;
private Integer expirTime;
}
- 实现类
public class WXPayPubUtil {
private static final String APP_ID = "" ;
private static final String PARTNER = "" ;
private static final String PARTNER_KEY = "";
private static final String PAY_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
private static final String QRY_URL = "https://api.mch.weixin.qq.com/pay/orderquery";
public static Map createNative(String out_trade_no, Integer total_fee ,String docunt, Integer expireTimeMin) {
Map<String, String> param = new HashMap();
param.put("appid", APP_ID);
param.put("mch_id", PARTNER);
param.put("nonce_str", WXPayUtil.generateNonceStr());
param.put("body", "");
param.put("out_trade_no", out_trade_no);
param.put("total_fee", String.valueOf(total_fee));
param.put("spbill_create_ip", "127.0.0.1");
param.put("notify_url", "http://www.xxx.com:xxxx/pay/wxNotify");
param.put("trade_type", "NATIVE");
Date date = new Date();
long time = date.getTime();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String timeStart = simpleDateFormat.format(time);
String timeEnd = simpleDateFormat.format(time + expireTimeMin * 60000);
param.put("time_start", timeStart);
param.put("time_expire", timeEnd);
try {
String xmlParam = WXPayUtil.generateSignedXml(param, PARTNER_KEY);
HttpUtil client = new HttpUtil(PAY_URL);
client.setHttps(true);
client.setXmlParam(xmlParam);
client.post();
String result = client.getContent();
Map<String, String> resultMap = WXPayUtil.xmlToMap(result);
System.out.println(resultMap);
Map<String, String> map = new HashMap<>();
map.put("code_url", resultMap.get("code_url"));
map.put("total_fee", String.valueOf(total_fee));
map.put("out_trade_no", out_trade_no);
return map;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static Map queryPayStatus(String out_trade_no) {
Map param = new HashMap();
param.put("appid", APP_ID);
param.put("mch_id", PARTNER);
param.put("sub_mch_id",SUB_PARTNER);
param.put("out_trade_no", out_trade_no);
param.put("nonce_str", WXPayUtil.generateNonceStr());
try {
String xmlParam = WXPayUtil.generateSignedXml(param, PARTNER_KEY);
HttpUtil client = new HttpUtil(QRY_URL);
client.setHttps(true);
client.setXmlParam(xmlParam);
client.post();
String result = client.getContent();
Map<String, String> map = WXPayUtil.xmlToMap(result);
return map;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@SneakyThrows
public static Boolean callbackPay (HttpServletResponse response,String strXml,Map<String, String> map){
boolean juge = false;
boolean signatureValid = WXPayUtil.isSignatureValid(strXml, PARTNER_KEY);
PrintWriter writer = response.getWriter();
if (signatureValid) {
if ("SUCCESS".equals(map.get("result_code"))) {
String noticeStr = setXML("SUCCESS", "");
writer.write(noticeStr);
writer.flush();
juge = true;
}
} else {
String noticeStr = setXML("FAIL", "");
writer.write(noticeStr);
writer.flush();
}
return juge;
}
private static String setXML(String return_code, String return_msg) {
return "<xml><return_code><![CDATA[" + return_code + "]]></return_code><return_msg><![CDATA[" + return_msg + "]]></return_msg></xml>";
}
}
- pom配置
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>