当前位置:首页 > 后端开发 > 正文内容

vue+laravel运用微信Natvite付出

邻居的猫1个月前 (12-09)后端开发721

Native付出是指商户体系按微信付出协议生成付出二维码,用户再用微信“扫一扫”完结付出的形式。适用于PC网站、实体店单品或订单、媒体广告付出等场景
1.先阅览微信付出接入前的预备文档 文档衔接:Native付出接入前预备
2.php下载插件 composer require wechatpay/wechatpay
3.需求把证书文件下载下来用于签名验证。下载的签名文件有例如
image
4.需求用到的参数装备到env环境变量中 如下 image

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>

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=186

标签: php
分享给朋友:

“vue+laravel运用微信Natvite付出” 的相关文章

python能做什么,Python的广泛应用与无限可能

Python 是一种高级编程语言,因其简单易学、功能强大而广受欢迎。以下是 Python 能做的一些主要事情:1. Web 开发:Python 有许多流行的 Web 框架,如 Django 和 Flask,可以用来创建网站和 Web 应用程序。2. 数据分析:Python 有许多强大的库,如 Pan...

delphi为什么没人用了,Delphi为何逐渐淡出开发者视野?

Delphi 是一种编程语言和集成开发环境(IDE),由 Borland(现在的 Embarcadero Technologies)开发,主要面向 Windows 平台。它在 1990 年代和 2000 年代初期非常流行,尤其是在桌面应用开发领域。随着时间的推移,Delphi 的使用逐渐减少,原因可...

python机器学习,从基础到实践

python机器学习,从基础到实践

当然可以,机器学习是Python编程中的一个重要领域,它涉及到使用算法从数据中学习,以便做出预测或决策。Python有许多流行的库和框架,如scikitlearn、TensorFlow和PyTorch,可以用于机器学习。如果你对机器学习感兴趣,我可以帮助你学习基础知识,包括数据预处理、特征工程、模型...

java开源项目,助力开发者高效编程的利器

java开源项目,助力开发者高效编程的利器

1. JavaGuide 提供了丰富的Java开源项目资源,包括框架、工具和教程等,灵感来源于 awesomejava 项目。你可以访问以下链接了解 2. CSDN 上有多篇文章介绍了基于Spring Boot的优质Java开源项目,涵盖了电商、微服务、支付、秒杀、博客、管理后台等多个...

java6,回顾与展望

java6,回顾与展望

Java 6(也称为Java SE 6)是Java编程语言的一个版本,由Sun Microsystems(现为Oracle Corporation)于2006年12月11日发布。Java 6引入了许多新特性和改进,包括但不限于:1. 脚本语言支持:Java 6支持使用脚本语言(如JavaScript...

rust是什么意思,什么是Rust?

rust是什么意思,什么是Rust?

Rust 是一种系统级编程语言,由 Mozilla 研究院开发。它的设计目标是提供内存安全、并发性、实用性以及零成本抽象。Rust 旨在解决 C 等语言中常见的内存安全问题和性能问题。Rust 语言的特点包括:1. 内存安全:Rust 通过所有权系统和生命周期检查来确保内存安全,避免了悬垂指针和...