生成vx支付二维码2

简介: 生成vx支付二维码2

前端

// 根据订单id生成微信支付二维码
  asyncData({ params, error }) {
    return orderApi.createNative(params.pid).then(response => {
      return {
        payObj: response.data.data.map
      }
    })
  },

controller

@Autowired
    private PayLogService payLogService;
    //生成微信支付二维码的接口
    @GetMapping("/createNative/{orderNo}")
    public R createNative(@PathVariable String orderNo){
        //返回相关的一些信息,包含二维码的地址和其他信息
        Map map = payLogService.createNative(orderNo);
        return R.ok().data("map",map);
    }

service

@Autowired
    private OrderService orderService;
    @Override
    public Map createNative(String orderNo) {
        try {
            //根据订单id查询订单信息
            LambdaQueryWrapper<Order> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(Order::getOrderNo,orderNo);
            Order order = orderService.getOne(lambdaQueryWrapper);
            //设置参数
            HashMap m = new HashMap();
            m.put("appid",ConstantUtils.APPID);
            //partner
            m.put("mch_id", ConstantUtils.PARTNER);
            m.put("nonce_str", WXPayUtil.generateNonceStr());
            m.put("body", order.getCourseTitle());
            m.put("out_trade_no", orderNo);
            m.put("total_fee", order.getTotalFee().multiply(new BigDecimal("1")).longValue()+"");
            m.put("spbill_create_ip", "127.0.0.1");
            m.put("notify_url", ConstantUtils.NOTIFYURL);
            m.put("trade_type", "NATIVE");
            //2、HTTPClient来根据URL访问第三方接口并且传递参数
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
            //client设置参数
            client.setXmlParam(WXPayUtil.generateSignedXml(m, ConstantUtils.PARTNERKEY));
            client.setHttps(true);
            client.post();
            //3、返回第三方的数据
            String xml = client.getContent();
            Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
            //4、封装返回结果集
            Map map = new HashMap<>();
            map.put("out_trade_no", orderNo);
            map.put("course_id", order.getCourseId());
            map.put("total_fee", order.getTotalFee());
            map.put("result_code", resultMap.get("result_code"));   //返回二维码操作码
            map.put("code_url", resultMap.get("code_url"));         //返回二维码图片地址
            //微信支付二维码2小时过期,可采取2小时未支付取消订单
            //redisTemplate.opsForValue().set(orderNo, map, 120, TimeUnit.MINUTES);
            return map;
        }catch (Exception e){
            throw new GuliException(20001,"生成二维码失败");
        }
    }

此时前端会不停的每隔三秒向后端发送用户是否确认支付的请求,并且在axios的response中做校验

 mounted() {

// 在页面渲染之后执行
    // 每隔三秒,去查询一次支付状态
    this.timer1 = setInterval(() => {
      this.queryPayStatus(this.payObj.out_trade_no)
    }, 3000)
  },
    methods: {
    // 查询支付状态的方法
    queryPayStatus(out_trade_no) {
      orderApi.queryPayStatus(out_trade_no).then(response => {
        console.log(response)
        if (response.data.success) {
          // 如果支付成功,清除定时器
          clearInterval(this.timer1)
          this.$message({
            type: 'success',
            message: '支付成功!'
          })
          // 跳转到课程详情页面观看视频
          this.$router.push({ path: '/course/' + this.payObj.course_id })
        }
      })
    }
  }

response拦截器,如果返回code是28004则用户为登陆进行登陆跳转,如果code是25000则提示用户未支付等待用户支付,如果code是20000则表名后端校验用户已经付款成功,response拦截器放行,执行用户支付成功友好提示,跳转支付后的course页面

import axios from 'axios'
import cookie from 'js-cookie'
// 创建axios实例
const service = axios.create({
  baseURL: 'http://localhost:9001', // api的base_url
  timeout: 20000 // 请求超时时间
})
// http request 拦截器
service.interceptors.request.use(
  config => {
  // debugger
    if (cookie.get('guli_token')) {
      config.headers['token'] = cookie.get('guli_token')
    }
    return config
  },
  err => {
    return Promise.reject(err)
  })
// http response 拦截器
service.interceptors.response.use(
  response => {
    // debugger
    if (response.data.code === 28004) {
      console.log('response.data.resultCode是28004')
      // 返回 错误代码-1 清除ticket信息并跳转到登录页面
      // debugger
      window.location.href = '/login'
      return
    } else {
      if (response.data.code !== 20000) {
        // 25000:订单支付中,不做任何提示
        if (response.data.code !== 25000) {
          // Message({
          //   message: response.data.message || 'error',
          //   type: 'error',
          //   duration: 5 * 1000
          // })
          alert('订单未支付')
        }
      } else {
        return response
      }
    }
  },
  error => {
    return Promise.reject(error.response) // 返回接口返回的错误信息
  })

export default service

那么后端是如何进行校验的呢?可以看到当前端发来查询订单状态的订单id时,service业务层会带着订单id向微信支付官方接口发送http请求https://api.mch.weixin.qq.com/pay/orderquery,来获取当前订单的状态信息,订单当前在微信官方的状态信息map如下图

相关文章
|
7月前
|
存储 前端开发 JavaScript
【Uniapp】支付链转二维码
【Uniapp】支付链转二维码
|
6天前
|
前端开发
生成vx支付二维码
生成vx支付二维码
13 1
|
7月前
|
网络安全 开发工具 Android开发
微信刷脸支付插件
微信刷脸支付插件
96 0
|
10月前
uniapp实现微信扫二维码进行核销
uniapp实现微信扫二维码进行核销
220 0
|
存储 传感器 文字识别
二维码支付功能设计【系列文章,本章1】
扫一扫已经是我们生活中非常熟悉的功能,而扫一扫离不开二维码,那么二维码扫码原理是什么,如何实现的,如果企业要上自己的扫码功能如何实现? 本章将从二维码原理讲起。
375 0
二维码支付功能设计【系列文章,本章1】
|
XML 移动开发 JavaScript
【畅购商城】微信支付模块之微信支付二维码
【畅购商城】微信支付模块之微信支付二维码
154 0
【畅购商城】微信支付模块之微信支付二维码
|
XML 前端开发 Dubbo
微信支付的两种模式,扫码支付
微信支付的两种模式,扫码支付
846 0
|
XML 缓存 算法
微信二维码支付
微信扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信扫一扫完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
288 0
|
机器学习/深度学习
关于支付宝/微信免签实现个人支付
最近一直在了解关于个人支付的问题。由于之前一直想实现个人支付,但是目前微信和支付宝的支付接口都需要企业或个体户资质,导致没办法实现,无奈只能走向这个道路。 说是免签,实际上就是拿到收款金额来做些事情。
关于支付宝/微信免签实现个人支付
如何在微信中使用支付宝手机网站支付
目前微信已经拦截了所有在微信内调用支付宝支付的途径,故无法直接唤起支付宝。 但您可以借助点击右上角的通过浏览器打开的方式,来试着打开支付宝。  更多详见“快速接入”部分的微信公众平台无法使用支付宝收付款的解决方案。
627 0