支付回调: 用户支付成功之后,微信平台向我们指定接口发送请求传递订单状态数据的过程。
根据 notify_url参数,wechat会给我们指定的value路径,返回相关订单信息。微信会向自己的ip(https://ip:8080/pay/success)地址发送请求
公网ip: 直接连入到互联网中的ip
同一个交换机下面的ip地址可以相互发现
一般我们可以看到公网ip,但是公网看不到我们的ip,我们的项目是运行在本地的计算机上面,微信支付平台没有办法访问我们的内网ip的。
微信怎么访问我们的回调接口?
通过Ngrock为我们进行内网穿透,首次认证关注微信公众号,付费2元

获取隧道id: 182810384749


相当于访问url: http://monkey.free.idcfengye.com 就是访问 我们的 localhost:8080
http://monkey.free.idcfengye.com/pay/success
需要给微信支付平台进行响应,如果没有响应会一起给你请求,频率会慢慢降低。
@PostMapping("/add/{cids}")public ResultVO add(@PathVariable("cids") List cids,@RequestBody Orders orders){ResultVO resultVO=null;// 测试用的OrderIdtry {Map orderInfo = orderService.addOrder(cids, orders);String orderId=orderInfo.get("orderId");// 订单快照创建成功,申请支付链接HashMap 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 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;}
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 {@Autowiredprivate 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 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 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;}
}
Map 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);
上一篇:c<8>指针