微信支付回调,内网穿透详细过程

Posted 有时间指导毕业设计SmallMonkey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信支付回调,内网穿透详细过程相关的知识,希望对你有一定的参考价值。

文章目录

支付回调接口

支付回调: 用户支付成功之后,微信平台向我们指定接口发送请求传递订单状态数据的过程。

根据 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);

以上是关于微信支付回调,内网穿透详细过程的主要内容,如果未能解决你的问题,请参考以下文章

支付宝支付&内网穿透

安利一款 内网穿透软件 适用于 微信回调

微信支付APIv3

微信支付APIv3

Mac内网穿透(ngrok)

Java支付宝沙箱环境支付,SDK接口远程调试内网穿透