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

news2024/11/15 19:36:33

文章目录

      • 支付回调接口
      • 通过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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分面中添加直线

简介 这篇也是分享最近统计建模中所绘制的一副图形。总体而言和前面的几篇&#xff1a;xxx 类似。都是从“数据导入”到“基于分面的可视化”。但是本文的小技巧是&#xff0c;在不同的分面中添加直线。最后得到的图形如下&#xff1a; 注意&#xff1a;本文数据和代码在公众号…

交易所通用质押式回购

一、专业术语 逆回购&#xff1a;指资金融出方将资金融给资金融入方&#xff0c;收取有价证券作为质押&#xff0c;并在未来收回本息&#xff0c;并解除有价证券质押的交易行为。 债券通用质押式回购交易&#xff1a;&#xff08;简称“通用回购”&#xff09;是指资金融入方…

划分成绩ABCD

已知成绩等级划分为{“A”:[90~100],"B":[80~89],"c":[60~79],"D":[0~59]} 1、随机生成20个整数&#xff0c;范围0-100 2、按等级归类&#xff0c;输出成绩等级列表字典如下&#xff1a; {A: [96, 96, 97, 97, 100, 100], B: [86], C: [71, 7…

Python学习基础笔记二十二——生成器

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值&#xff0c;但是yield又不同于return&#xff0c;return的执行意味着程序的结束&#xff0c;调用生成器函数不会得到返回的具体的值&#xff0c;而是得到一个可迭代的对象。每一次获取这个可迭代对…

微机原理与接口技术:数模转换和模数转换 详细笔记

文章目录1.数模转换1.1.数模转换原理1.1.1.权电阻D/A转换器1.1.2.R-2R T型电阻网络D/A转换器1.1.3.补充 D/A转换器的主要技术指标1.2.D/A转换芯片——DAC08321.2.1.引脚介绍1.2.2.工作方式直通输入方式单缓冲方式双缓冲方式2.模数转换2.1.信号变换中的采样、量化和编码2.1.1.采…

『NLP学习笔记』TextCNN文本分类原理及Pytorch实现

TextCNN文本分类原理及Pytorch实现 文章目录一. TextCNN网络结构1.1. CNN在文本分类上得应用1.2. 回顾CNN以及Pytorch解析1.2.1. CNN特点1.2.2. 一维卷积Conv1d1.2.3. 二维卷积 Conv2d1.2.3. 三维卷积 Conv3d1.2.4. 池化(pooling)操作1.2.4. nn.BatchNorm操作1.3. nn.ModuleLi…

大数据之数据的压缩与存储

文章目录前言一、Hive的压缩方式&#xff08;一&#xff09; 概念&#xff08;二&#xff09; 简介&#xff08;三&#xff09; 数据分层的压缩方式选择&#xff08;四&#xff09;开启Map输出阶段压缩&#xff08;五&#xff09;开启Reduce输出阶段压缩二、 Hive的数据存储格式…

再有人问你kafka 把这篇扔给他(建议收藏)

前言 最近重新读起kafka的内容&#xff0c;看到kafka官网文档里&#xff0c;有专门一栏讲kafka的设计&#xff0c;觉得很受益。我们常常会知道这个中间件是什么&#xff0c;是什么机制&#xff0c;这次想换个角度来聊&#xff0c;它在设计消息系统的时候&#xff0c;都做了哪些…

火山引擎虚拟数字人技术与应用

导读&#xff1a;火山引擎正在打造完善的虚拟数字人技术和应用体系&#xff0c;那么火山引擎是如何定义虚拟数字人的呢&#xff1f;火山引擎 2D 虚拟数字人和 3D 数字人采用了怎样先进的技术&#xff1f;火山引擎数字人有哪些应用和前景展望&#xff1f;今天我们就来一起探秘火…

【Transformer】Transformer理论知识

Transformer目录Transformer介绍Seq2seq结构Encoder结构Decoder结构Autoregressive Decoder&#xff08;AT&#xff09;&#xff1a;Encoder和Decoder对比和联系Cross attention&#xff1a;Non-autoregressive Decoder&#xff08;NAT&#xff09;&#xff1a;训练Seq2seq Mod…

基于ssm高校档案管理系统源码

档案管理作为企事业单位管理工作的基础&#xff0c;档案是企事业单位建设信息系统的重要组成部分&#xff0c;档案是提高企事业单位工作质量和工作效率的必要条件&#xff0c;甚至是维护历史真实面貌的一项重要工作。 1、档案信息数字化能够提供档案信息方便快捷的服务方式。 数…

量化风控的贷前实操课—详解的规则调优

风控全流程涉及贷前风控、贷中监控、贷后催收&#xff0c;每个模块都环环相扣&#xff0c;互相关联。而作为其中最关键模块的贷前风控&#xff0c;几乎是整个风控模块中最重要的部分&#xff0c;现金贷等互金产品重贷前、信用卡重贷中。 贷前风控是可以说整个防控中的第一道防线…

简单的CNN实现——MNIST手写数字识别

0.概述 此文章不涉及复杂的理论知识&#xff0c;仅仅只是利用PyTorch组建一个简单的CNN去实现MNIST的手写数字识别&#xff0c;用好的效果去激发学习CNN的好奇心&#xff0c;并且以后以此为基础&#xff0c;去进行一些改造。&#xff08;前提是把基础代码看明白&#xff09; 本…

java计算机毕业设计ssm社团管理系统0gl2e(附源码、数据库)

java计算机毕业设计ssm社团管理系统0gl2e&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

Android Room的使用详解

Android Room的使用详解 一&#xff1a;Room的基本介绍 Room 是 Android 架构组件的一部分&#xff0c;Room 持久性库在 SQLite上提供了一个抽象层&#xff0c;以便在充分利用 SQLite 的强大功能的同时&#xff0c;能够流畅地访问数据库。具体来说&#xff0c;Room 具有以下优…

【Linux Kernel 6.1 代码剖析】- 进程管理概论

目录 进程与线程的概念&#xff08;内核线程和用户线程&#xff09; 进程的3种基本状态 引入挂起后的7种基本状态 Linux 内核6.1 - 进程的8种详细状态 进程控制块 PCB SMP 架构 进程与线程的概念&#xff08;内核线程和用户线程&#xff09; 进程是正在运行的程序实体&a…

基于java+ssm+vue+mysql的旅游管理系统

项目介绍 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多企业的之中&#xff0c;随之就产生了“旅游信息管理系统”&#xff0c;这样就让旅游信息管理系统更加方便简单。 对于本旅游信息管理系统的设计来说&…

QDir(目录)

QDir 类提供对目录结构及其内容的访问&#xff0c;QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统&#xff0c;它也可以用来访问Qt的资源系统。 Qt使用“/”作为通用目录分隔符&#xff0c;就像URL中的“/”用作路径分隔符一样。如果您始终使用“/”作为…

2022年大一学生实训作业【基于HTML+CSS制作中华传统文化传统美德网站 (6页面)】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【YOLOv7/YOLOv5系列算法改进NO.47】改进激活函数为GELU

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列…