文章目录
- 支付回调接口
- 通过Ngrok进行内网穿透步骤
- 1. 根据邮箱注册一个账号
- 2. 获取隧道id
- 3.下载Ngrok客户端
- 4. 双击这个 Sunny-Ngrok启动工具.bat 文件
- 5. 填写你的 隧道id 回车
- 6.客户端启动成功
- 7. 所以你的notify_url对应的value需要改为内网穿透的地址为
- 8.支付成功之后微信平台会发来消息
- 1. 创建一个控制器定义回调接口 里面有微信返回的xml文件,通过WXPUtil.xmltoMap()转换为Map
- 2. 支付成功更新订单状态
- 3. 返回信息给微信支付接口,否则微信将以不同的频率进行请求你。
支付回调接口
支付回调: 用户支付成功之后,微信平台向我们指定接口发送请求传递订单状态数据的过程。
根据 notify_url参数,wechat会给我们指定的value路径,返回相关订单信息。微信会向自己的ip(https://ip:8080/pay/success)地址发送请求
公网ip: 直接连入到互联网中的ip
同一个交换机下面的ip地址可以相互发现
一般我们可以看到公网ip,但是公网看不到我们的ip,我们的项目是运行在本地的计算机上面,微信支付平台没有办法访问我们的内网ip的。
微信怎么访问我们的回调接口?
通过Ngrock为我们进行内网穿透,首次认证关注微信公众号,付费2元
通过Ngrok进行内网穿透步骤
1. 根据邮箱注册一个账号
2. 获取隧道id
获取隧道id: 182810384749
3.下载Ngrok客户端
4. 双击这个 Sunny-Ngrok启动工具.bat 文件
5. 填写你的 隧道id 回车
6.客户端启动成功
相当于访问url: http://monkey.free.idcfengye.com 就是访问 我们的 localhost:8080
7. 所以你的notify_url对应的value需要改为内网穿透的地址为
http://monkey.free.idcfengye.com/pay/success
8.支付成功之后微信平台会发来消息
需要给微信支付平台进行响应,如果没有响应会一起给你请求,频率会慢慢降低。
@PostMapping("/add/{cids}")
public ResultVO add(@PathVariable("cids") List<Integer> cids,
@RequestBody Orders orders){
ResultVO resultVO=null;
// 测试用的OrderId
try {
Map<String, String> orderInfo = orderService.addOrder(cids, orders);
String orderId=orderInfo.get("orderId");
// 订单快照创建成功,申请支付链接
HashMap<String,String> data=new HashMap<>();
// 设置当前订单信息
data.put("body",orderInfo.get("productNames")); //商品描述
data.put("out_trade_no", orderId.substring(0,30));//使用当前用户订单编号作为当前支付交易的交易编号
data.put("fee_type","CNY"); //支付币种
data.put("total_fee", orders.getTotalAmount() +""); //支付金额
data.put("trade_type","NATIVE");//交易类型
// 必填选项 用于设置支付完成时的回调方法接口
data.put("notify_url","/pay/success");
WXPay wxPay=new WXPay(new MyPayConfig());
Map<String, String> resp = wxPay.unifiedOrder(data);
// 把微信支付平台生成的链接获取到
orderInfo.put("payUrl",resp.get("code_url"));
resultVO=new ResultVO(ResultStatus.OK,"提交订单成功!",orderInfo);
System.out.println(resp);
// code_url -> weixin://wxpay/bizpayurl?pr=Iv5Fsq6zz
} catch (SQLException e) {
resultVO= new ResultVO(ResultStatus.NO,"下单失败",null);
} catch (Exception e) {
e.printStackTrace();
}
return resultVO;
}
1. 创建一个控制器定义回调接口 里面有微信返回的xml文件,通过WXPUtil.xmltoMap()转换为Map
package com.qfedu.fmmall.controller;
import com.github.wxpay.sdk.WXPayUtil;
import com.qfedu.fmmall.service.OrderService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/pay")
@Api(value = "微信支付接口",tags = "微信支付回调接口测试")
public class PayController {
@Autowired
private OrderService orderService;
@RequestMapping("/success")
public String success(HttpServletRequest request) throws Exception {
System.out.println("支付成功-------------------------------------------------");
// 通过request的输入流接收微信支付平台传递过来的数据
ServletInputStream inputStream = request.getInputStream();
byte[] bs = new byte[1024];
int len = -1;
StringBuilder stringBuilder = new StringBuilder();
while ((len = inputStream.read(bs)) != -1){
stringBuilder.append(new String(bs,0,len));
}
String s = stringBuilder.toString();
//可以看到微信支付平台传递过来的是xml文件
System.out.println(s);
Map<String, String> map = WXPayUtil.xmlToMap(s);
if (map != null && "success".equalsIgnoreCase(map.get("result_code")) ) {
//支付成功
// 2.根据微信支付返回的订单编号 修改订单状态为“待发货/已支付”
// 3.响应微信支付平台,使用微信不用继续请求
//2.
String orderid = map.get("out_trade_no");
System.out.println("orderid:---------------------"+orderid);
int i = orderService.updateOrderStatus(orderid, "2");
if(i > 0){
//3.
Map<String, String> map1 = new HashMap<>(16);
map.put("result_code","success");
map.put("return_msg","OK");
map.put("appid",map.get("appid"));
map.put("return_code","success");
return WXPayUtil.mapToXml(map1);
}
}
//支付失败
return null;
}
}
2. 支付成功更新订单状态
3. 返回信息给微信支付接口,否则微信将以不同的频率进行请求你。
Map<String, String> map1 = new HashMap<>(16);
map.put("result_code","success");
map.put("return_msg","OK");
map.put("appid",map.get("appid"));
map.put("return_code","success");
return WXPayUtil.mapToXml(map1);