vue+laravel使用微信Natvite支付
Navite支付介绍
Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。适用于PC网站、实体店单品或订单、媒体广告支付等场景
1.先阅读微信支付接入前的准备文档 文档连接:Native支付接入前准备
2.php下载插件 composer require wechatpay/wechatpay
3.需要把证书文件下载下来用于签名验证。下载的签名文件有例如

4.需要用到的参数配置到env环境变量中 如下 
5.代码实现
获取支付二维码链接
/**
     * 微信二维码预支付
     * @param string $total 价格
     * @param string $outTradeNo 商户订单号
     * @param int $duration 二维码有效时长 单位:秒
     * @return array 返回二维码链接
     */
    public static function wxNativePrePay(string $total, string $outTradeNo, $duration = 180)
    {
        try {
            $config = Common::get_platform_payInfo();
            $time = \time();
            $time_expire = $time + $duration;
            $rfc3339_time = date(DATE_RFC3339, $time_expire);
            $total = intval(bcmul($total, 100));
            $payInfo = [
                'out_trade_no' => $outTradeNo,
                'appid' => $config['appId'],
                'description' => '支付维修费用',
                'total' => $total,
                'time_expire' => (string)$rfc3339_time,
            ];
            $instance = Common::wxPayObj();
            $resp = $instance
                ->chain('v3/pay/transactions/native')
                ->post(['json' => [
                    'mchid' => $config['merchantId'],
                    'out_trade_no' => $payInfo['out_trade_no'],
                    'time_expire' => $payInfo['time_expire'],
                    'appid' => $config['appId'],
                    'description' => $payInfo['description'],
                    'notify_url' => $config['notify_url'],
                    'amount' => [
                        'total' => $payInfo['total'],
                        'currency' => 'CNY'
                    ],
                ]]);
            $data = [];
            $data['code'] = (int)$resp->getStatusCode();
            $data['body'] = $resp->getBody();
            return $data;
        } catch (\Exception $exception) {
            if ($exception instanceof RequestException && $exception->hasResponse()) {
                $message = "错误回复:" + $exception->getResponse() + "错误码:" + $exception->getResponse()->getStatusCode();
                +"错误原因" + $exception->getResponse()->getReasonPhrase();
                Log::info($message);
            }
            return [];
        }
    }
common只使用的方法
public static function  get_platform_payInfo() {
        $data['merchantPrivateKeyFilePath'] = env('MERCHANT_FILE_PATH');
        $data['platformCertificateFilePath'] = env('PLATFORM_FILE_PATH');
        $data['merchantId'] = env('WX_MERCHANT_ID');
        $data['merchantCertificateSerial'] = env('CERTIFICATE_SERIAL');
        $data['appId'] = env('WX_APP_ID');
        $data['appSecret'] = env('WX_APP_SECRET');
        $data['notify_url'] = env('WX_NOTIFY_URL');
        $data['api_key'] = env('WX_API_KEY');
        return $data;
    }
    public static function wxPayObj()
    {
        try {
           $payInfo = self::get_platform_payInfo();
            // 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
            $merchantPrivateKeyInstance = Rsa::from($payInfo['merchantPrivateKeyFilePath'], Rsa::KEY_TYPE_PRIVATE);
            // 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
            $platformPublicKeyInstance = Rsa::from($payInfo['platformCertificateFilePath'], Rsa::KEY_TYPE_PUBLIC);
            // 从「微信支付平台证书」中获取「证书序列号」
            $platformCertificateSerial = PemUtil::parseCertificateSerialNo($payInfo['platformCertificateFilePath']);
            // 构造一个 APIv3 客户端实例
            $instance = Builder::factory([
                'mchid'      => $payInfo['merchantId'],
                'serial'     => $payInfo['merchantCertificateSerial'],
                'privateKey' => $merchantPrivateKeyInstance,
                'certs'      => [
                    $platformCertificateSerial => $platformPublicKeyInstance,
                ],
            ]);
            return $instance;
        } catch (\Exception $e) {
            Log::info("返回微信支付对象失败", $e);
            return false;
        }
    }
前端vue DEMO
需要用的的插件 qrcode
点击查看代码
<template>
  <div class="center">
    <el-button type="primary" @click="toWxPrePay">支付</el-button>
    <el-dialog title="支付" :visible.sync="payVisible" width="30%">
      <div class="qrcode_box">
        <canvas id="canvas" ref="qrcodeCanvas" class="qrcode"></canvas>
        <div style="color: #409EFF">请使用微信支付</div>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {wxPayInfo} from "@/api/teacher";
import QRCode from "qrcode";
import {wxTransactions} from "@/api/wxAccounts";
export default {
  name: "add",
  data() {
    return {
      payVisible: false,
      codeUrl: '',
      outTradeNo: '',
      intervalId: null,
    }
  },
  destroyed() {
    this.stopPolling()
  },
  methods: {
    toWxPrePay() {
      let total = "0.01" //这里是要付的价格
      wxPayInfo({
        userId: localStorage.getItem("ID"),
        teacherId: 1,
        total: total
      }).then(res => {
        this.codeUrl = res.data['code_url']
        this.outTradeNo = res.data['out_trade_no']
        this.payVisible = true
        this.$nextTick(() => {
          const canvas = document.getElementById('canvas')
          console.log("这是收到的coderUrl", this.codeUrl)
          var text = this.codeUrl
          const ctx = canvas.getContext('2d')
          QRCode.toCanvas(canvas, text, error => {
            if (error) console.log(error)
          })
          this.startPolling()
        })
      })
    },
    startPolling() {
      this.intervalId = setInterval(this.interPaymentWx, 2000); //每两秒更新一次
    },
    stopPolling() {
      if (this.intervalId) clearInterval(this.intervalId)
    },
    //查询订单状态
    interPaymentWx() {
      wxTransactions({
        out_trade_no: this.outTradeNo
      }).then(res => {
        let trade_state = res.data['trade_state']
        if (trade_state === 'SUCCESS') {
          this.$message({
            message: '支付成功',
            type: 'success'
          })
         this.payVisible = false
          this.stopPolling()
        }
      })
    },
  }
}
</script>
<style scoped lang="scss">
.qrcode_box {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  width: 100%;
  .qrcode {
    width: 270px !important;
    height: 270px !important;
  }
}
</style>
vue+laravel使用微信Natvite支付的更多相关文章
- Vue2中实现微信分享支付功能
		Vue2中实现微信分享支付功能 近期做了一个微信公众号前后分离项目,前端采用Vue2开发,后端SpringBoot,今天迫不及待的来给大家分享一下这次在开发中遇到的一些坑以及解决办法. 在这里,一些 ... 
- 微信JSAPI支付
		最近在微信H5页面内集成微信JSAPI支付,遇到不少问题,现将集成步骤及遇到的问题记录如下: 1.官方下载SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api ... 
- 微信app支付  ci框架做的
		/** * 组合微信app支付 获得prepayid * @param int $order_num */ private function _wxpay_reques ... 
- 微信JSApi支付~集成到MVC环境后的最后一个坑(网上没有这种解决方案)
		返回目录 大叔第一人 之前写了关于微信的坑<微信JSApi支付~坑和如何填坑>,今天将微信的jsapi支付封装到了MVC环境里,当然也出现了一些新的坑,如支付参数应该是Json对象而不是J ... 
- 微信JSApi支付~订单号和微信交易号
		返回目录 谈谈transactionId和out_trade_no 前一篇微信JSApi支付~坑和如何填坑文章反映不错,所以又写了个后篇,呵呵. 每个第三方在线支付系统中都会有至少两类订单号,其一为支 ... 
- 微信JSApi支付~坑和如何填坑
		返回目录 微信一直用着不爽,这几天研究它的jsapi支付,即在微信内打开H5页面,完成支付的过程,在这个过程中,你将会遇到各种各样的问题,而大叔将把这些问题的解决方法写一下,希望可以给你带来帮助! 一 ... 
- iOS开发笔记14:微博/微信登录与分享、微信/支付宝支付
		产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK S ... 
- Mate7微信指纹支付来了 比Touch ID整合微信早一点
		之前我们聊过微信将推指纹支付 "指付通"会与Touch ID整合吗这个话题,现在有国内厂商率先支持微信指纹支付,体验一下美国用户使用Apple Pay搭配Touch ID来实现便捷 ... 
- .net 微信APP支付接口的开发流程以及坑
		流程 申请APP的微信支付 申请成功之后得到APPID 商户号 以及自己设置商户号的支付密码 这时就可以开发接口了 微信APP支付API:https://pay.weixin.qq.com/wiki/ ... 
- 微信JSAPI支付(比较详细) 关于getRrandWCPayRequest:fail_invalid appid 错误
		原文:微信JSAPI支付(比较详细) 关于getRrandWCPayRequest:fail_invalid appid 错误 首先微信支付需注册 微信公从平台开发 和 微信支付商户平台 关于4个密 ... 
随机推荐
- JMESPath 使用
			最近在学习使用 AWS CLI,经常要用到 query 功能.AWS CLI 使用的查询语法是 JMESPath,因此特地在这里记录常用的 JMESPath 语法. JMESPath 是一种查询语言, ... 
- 随机读取数组中n个元素
			需求 随机不重复的显示一系列图片 分析 可使用Math.random(),其作用是返回介于 0(包含) ~ 1(不包含) 之间的一个随机数.先获取到图片路径,将图片路径放入数组中,再随机从数组中读取n ... 
- CTC联结时间分类算法: 连接主义时间分类: 用递归神经网络标记未分割序列数据《Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks》(语音、文本识别、RNN端到端训练序列数据的方法)
			11月6号例会汇报. 糊弄的看了一个算法-CTC算法,没有汇报论文,因为没看论文(我导知道后,应该会锤死我...) 当然,汇报完之后,被我导腾讯会议通过网线批了我一顿,PPT做的太烂了!字太多,听不到 ... 
- CSS & JS Effect – Section Design Waves
			介绍 Section Waves 长这样 左边是没有 waves, 右边是加了 waves. 它的作用就是点缀. 让画面有一点 "Design" 的感觉. 参考 You ... 
- RxJS 系列 – Observable to Subject (Hot, Cold, Warm, connectable, share)
			前言 前两篇介绍了 Observable 和 Subject.它们有一个重大区别当 multiple subscribe 的时候. Observable 每一次 subscribe 都会调用初始化方法 ... 
- vue3 3.3.4
			https://cn.vuejs.org/guide/introduction.html#what-is-vue 简介 import { createApp } from 'vue' createAp ... 
- Java!!冲
			开始学习Java!!! 
- 还在苦于密码太弱?教你3招用Linux生成高强度密码
			各位好啊,我是会编程的蜗牛,作为java开发者,我们平常肯定会接触Linux操作系统,其实除了一般的部署应用外,它还可以帮助我们生成密码.解决我们平常自己想各种复杂密码的烦恼,以后我会讲一讲如何安全地 ... 
- Docker安装(安装Docker-CE)(三)
			现版本安装Docker已经非常简单了,有很多种方式,而自17年开始,Docker分为Docker-CE(社区版).Docker-EE(企业版),另外Docker-IO是较早的版本,通常用的都是Dock ... 
- K8S基本组件梳理
			Master组件 apiserver:对资源对象进行curd操作,例如pod和server:将所有的状态储存到etcd中. schedule:监控未调度的pod,根据pod的资源需求.资源可用性和其他 ... 
