注意事项
- 需要自己注册账号,【这里不提供,如果没有的那就没有办法实现这个功能】
- 微信只有正式版,所以大家在支付的时候要注意看支付金额
支付业务流程:
第一步【导入依赖】
<!-- 微信支付sdk V2需要的依赖-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
第二步【下载微信SDK和DEMO】
微信开发者文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
第三步【注册和配置natapp】
-
这些配置操作实在是不要太简单了,实在不会的百度或者留言
-
任何白嫖的人,送你一句话:不喜欢可以不用,但是不要诋毁别人的成果!!!
这里配置端口一般是后端项目的端口【如果使用了Nginx就使用Nginx端口,否则就Tomcat、Jetty端口】
首页点击客户端下载导航就是下面这个页面:
第四步【配置VX信息】
将wxpay包拷贝到项目当中,划红线的自己写的配置写,在下面有
public class MyVXConfig extends WXPayConfig{
private String appId = "填写自己的appId";
private String mchId = "填写自己的mchId";
private String key = "填写自己的key";
@Override
String getAppID() {
return this.appId;
}
@Override
String getMchID() {
return this.mchId;
}
@Override
String getKey() {
return this.key;
}
@Override
InputStream getCertStream() {
return null;
}
@Override
IWXPayDomain getWXPayDomain() {
return new IWXPayDomain() {
@Override
public void report(String domain, long elapsedTimeMillis, Exception ex) {
}
//这里写的并不严谨,有想法的小伙伴可以自己编写配置
@Override
public DomainInfo getDomain(WXPayConfig config) {
return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);
}
};
}
}
第五步【双击打开natpp.exe,类似一个命令窗口】
输入指令启动:
natapp -authtoken=XXXXXXXX ====》》》粘贴复制的token
以下就是natapp启动状态【注意只要网重新连了就需要改异步回调】,每次支付完后下面就会输出代理的接口
第六步【编写Controller】
/**
* 发起微信下单,生成二维码 连接返回给前端
* @param orderNo 下单编号
* @param req
* @param resp
* @return 返回订单信息和二维码连接
* @throws Exception
*/
@GetMapping("/wxpay/createqccode/{orderNo}")
@ResponseBody
public Dto createqccode(@PathVariable String orderNo,
HttpServletRequest req,
HttpServletResponse resp) throws Exception {
WXPay wxpay = new WXPay(new MyVXConfig());
ItripHotelOrder orderInfo = orderService.queryOrderInfo(orderNo);
Map<String, String> data = new HashMap<String, String>();
// 商品描述
data.put("body", orderInfo.getHotelName());
// 商户订单号
data.put("out_trade_no", orderInfo.getOrderNo());
// 标价金额
data.put("total_fee", "1");
// 终端IP:调用微信支付API的机器IP
data.put("spbill_create_ip", "127.0.0.1");
// 异步通知 url 这里需要使用natapp内网穿透
data.put("notify_url", "http://u2pjmk.natappfree.cc/trade/api/vxNotify");
// 交易类型:此处指定为扫码支付
data.put("trade_type", "NATIVE");
Map<String, String> res = wxpay.unifiedOrder(data);
String returnCode = res.get("return_code");
if (SUCCESS.equals(returnCode)) {
Map<String, Object> da = new HashMap<>();
System.out.println("链接:res.get(\"code_url\") = " + res.get("code_url"));
da.put("codeUrl", res.get("code_url"));
da.put("payAmount", orderInfo.getPayAmount());
da.put("count", orderInfo.getCount());
da.put("hotelName", orderInfo.getHotelName());
da.put("roomId", orderInfo.getRoomId());
return DtoUtil.returnDataSuccess(da);
} else {
return DtoUtil.returnFail("50001", res.get("return_msg"));
}
}
/**
* 微信支付异步回调
* @param request
* @param response
* @throws Exception
*/
@PostMapping("/vxNotify")
public void vxNotify(HttpServletRequest request,HttpServletResponse response) throws Exception {
//将订单修改为支付成功为2, 支付方式为payType为1 修改实时库存表
String s = IOUtils.toString(request.getInputStream());
Map<String, String> toMap = WXPayUtil.xmlToMap(s);
//订单号
String orderNo = toMap.get("out_trade_no");
//微信交易号
String tradeNo = toMap.get("transaction_id");
orderService.updateOrderStatusANDtempStore(orderNo, tradeNo);
Map<String,String> result = new HashMap<>();
if(toMap.get("return_code").equals(SUCCESS)){
result.put("return_code",SUCCESS);
result.put("return_msg","OK");
} else {
result.put("return_code","FAIL");
result.put("return_msg","支付失败");
}
PrintWriter writer = response.getWriter();
writer.print(WXPayUtil.mapToXml(result));
}