NodeJS实现支付宝沙箱支付②③

文章目录

  • 前言
  • 版权声明
  • Alipay SDK 沙箱环境简介
  • Node环境要求
  • 沙箱环境配置
  • 下载所需模块
  • 准备前端静态页面以及Node服务器
  • 文件夹规范
  • AlipaySdk 配置准备
  • AlipaySdk 代码演示
  •    Alipay实例化 ~ alipay.sdk 文件
  •    AlipayForm ~ alipayForm文件
  •    AlipayFormStatus ~ alipayForm文件
  •    AlipayForm文件 ~ 完整代码
  • 使用沙箱
  • 效果演示
  • AlipaySdk API ~
  • 最后


                    ⡖⠒⠒⠒⠤⢄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸   ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡴⠊⠉⠳⡄⠀⢀⣀⣀⡀⠀⣸⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠰⠆⣿⡞⠉⠀⠀⠉⠲⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⢧⡀⣀⡴⠛⡇⠀⠈⠃⠀⠀⡗⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣱⠃⡴⠙⠢⠤⣀⠤⡾⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣇⡼⠁⠀⠀⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣸⢠⣉⣀⡴⠙⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡏⠀⠈⠁⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣀⠤⠚⣶⡀⢠⠄⡰⠃⣠⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⣠⠔⣋⣷⣠⡞⠀⠉⠙⠛⠋⢩⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀
⠀⡏⢴⠋⠁⠀⣸⠁⠀⠀⠀⠀⠀ ⠀⣹⢦⣶⡛⠳⣄⠀⠀⠀⠀⠀
⠀⠙⣌⠳⣄⠀⡇   不能   ⡏⠀⠀  ⠈⠳⡌⣦⠀⠀⠀⠀
⠀⠀⠈⢳⣈⣻⡇   白嫖 ⢰⣇⣀⡠⠴⢊⡡⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠳⢿⡇⠀⠀⠀⠀⠀⠀⢸⣻⣶⡶⠊⠁⠀⠀
⠀⠀⠀⠀⠀⢠⠟⠙⠓⠒⠒⠒⠒⢾⡛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⠏⠀⣸⠏⠉⠉⠳⣄⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⡰⠃⠀⡴⠃⠀⠀⠀⠀⠈⢦⡀⠈⠳⡄⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣸⠳⣤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠙⢄⡤⢯⡀⠀⠀⠀⠀⠀⠀
⠀⠐⡇⠸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡆⢳⠀⠀⠀⠀⠀⠀
⠀⠀⠹⡄⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠸⡆⠀⠀⠀⠀⠀
⠀⠀⠀⠹⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣧⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢹⡤⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠚⣆⠀⠀⠀⠀
⠀⠀⠀⡠⠊⠉⠉⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡎⠉⠀⠙⢦⡀⠀
⠀⠀⠾⠤⠤⠶⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠒⠲⠤⠽   

前言

  1. Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与```PHP、Java、Python、.NET、Ruby等后端语言平起平坐。
  2. Nodejs是基于V8引擎,V8是Google发布的开源JavaScript引擎,本身就是用于Chrome浏览器的JS解释,但是Node之父 Ryan Dahl在这里插入图片描述把这V8搬到了服务器上,用于做服务器的软件。

版权声明

在这里插入图片描述

Copyright © [SYFStrive],未经许可,禁止转载 ~~~

Alipay SDK 沙箱环境简介

沙箱环境 : 是协助开发者进行功能测试,模拟了开放平台产品的主要功能,逻辑。可用于在产品上线前进行功能测试。

Node环境要求

Node.js 8 以上版本

沙箱环境配置

官方 : https://openhome.alipay.com/

配置步骤 :使用支付宝登录 👉 进入我的控制台 👉 下方的开发工具推荐 点击沙箱 👉 沙箱应用 启动公钥模式 👉 获取公钥和私钥 网关地址

下载所需模块

npm install koa

npm install koa-router

npm install alipay-sdk

npm install koa koa-router alipay-sdk

准备前端静态页面以及Node服务器

  • 静态页面
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="https://cdn.jsdelivr.net/npm/axios@1.1.2/dist/axios.min.js"></script><title>支付宝沙箱支付</title>
</head><body><button>支付宝</button>
</body>
<script>const but = document.querySelector('button')but.addEventListener('click', () => {axios({method: 'get',url: 'http://127.0.0.1:8000/payment'}).then(reason => {console.log(reason.data);})})
</script></html>
  • Node服务器
const koa = require("koa");
const app = new koa();//实例
const koaRouter = require('koa-router')
const router = new koaRouter()router.get("/payment", (ctx, next) => {ctx.set('Access-Control-Allow-Origin', '*')ctx.set('Access-Control-Allow-Methods', "OPTIONS, GET, PUT, POST, DELETE")ctx.body = ({code: 200})next()
})app.use(router.routes(), router.allowedMethods())
app.listen(8000, function () {console.log("HTTP服务已启动");
})

文件夹规范

在这里插入图片描述
在这里插入图片描述

AlipaySdk 配置准备

初始化 SDK 准备参数 👇

  • 公钥证书模式(推荐): appId、应用私钥、应用公钥证书文件、支付宝公钥证书文件、支付宝证书文件
  • 公钥模式:appId、应用私钥、应用公钥、支付宝公钥

AlipaySdk 代码演示

   Alipay实例化 ~ alipay.sdk 文件

  • 封装配置方法
const AlipaySdk = require('alipay-sdk').default
const fs = require('fs')
// 普通公钥模式
const alipaySdk = new AlipaySdk({appId: '2021000122664484', //开放平台上创建应用时生成的 appIdsignType: 'RSA2',//签名算法,默认 RSA2gateway: 'https://openapi.alipaydev.com/gateway.do',//支付宝网关地址privateKey: fs.readFileSync('private-key.pem', 'ascii'),//应用私钥alipayPublicKey: fs.readFileSync('alipay-public-key.pem', 'ascii'),//支付宝公钥
});// 证书模式
// const alipaySdk = new AlipaySdk({
//   appId: '2021000122664484',
//   privateKey: fs.readFileSync('private-key.pem', 'ascii'),
//   // 传入支付宝根证书、支付宝公钥证书和应用公钥证书。
//   alipayRootCertPath: path.join(__dirname, 'alipayRootCert.crt'),
//   alipayPublicCertPath: path.join(__dirname, 'alipayCertPublicKey_RSA2.crt'),
//   appCertPath: path.join(__dirname, 'appCertPublicKey.crt'),
// });
module.exports = alipaySdk

   AlipayForm ~ alipayForm文件

//参数 商品订单 商品名称 商品详细 商品价格
const AlipayForm = (orderNumber, goodsName, goodsDetail, price) => {return new Promise((resolve, reject) => {// 创建支付宝需要的表单表 对接支付宝const formData = new AlipayFormData();formData['setMethod']('get');// 支付成功回调地址,必须为可以直接访问的地址,不能带参数formData['addField']('returnUrl', 'http://localhost:9999/#/paysuccess');// 然后就是需要的订单参数formData['addField']('bizContent', {outTradeNo: orderNumber, // 商户订单号,64个字符以内、可包含字母、数字、下划线,且不能重复productCode: 'FAST_INSTANT_TRADE_PAY', // 销售产品码,与支付宝签约的产品码名称,仅支持FAST_INSTANT_TRADE_PAYtotalAmount: `${price}`, // 订单总金额,单位为元,精确到小数点后两位subject: goodsName, // 订单标题body: goodsDetail, // 订单描述});// 业务处理// result 为可以跳转到支付链接的 url//'alipay.trade.page.pay' 统一收单下单并支付页面接口//{} api 请求的参数(包含“公共请求参数”和“业务参数”)alipaySdk.exec('alipay.trade.page.pay',{},{formData: formData},).then(reason => {resolve({message: '支付成功❗',code: 200,data: reason,ok: true})}, err => {resolve({message: '支付失败❗',code: 404,data: {},ok: false})})})
}

   AlipayFormStatus ~ alipayForm文件

//参数 订单号 交易号
const AlipayFormStatus = (out_trade_no, trade_no) => {return new Promise((resolve, reject) => {// 创建支付宝需要的表单表 对接支付宝const formData = new AlipayFormData();formData.setMethod('get');// 然后就是需要的订单参数formData.addField('bizContent', {out_trade_no,trade_no,});alipaySdk.exec('alipay.trade.query',{},{formData: formData},).then(result => {axios({url: result,method: 'get'}).then(reason => {let saveData = reason.data['alipay_trade_query_response']if (saveData.code === '10000') {switch (saveData['trade_status']) {case 'WAIT_BUYER_PAY':resolve({message: '通知不会返回,不能申请修改',code: 199,data: '支付宝有交易记录,没付款',ok: true})break;case 'TRADE_FINISHED':resolve({message: '交易结束,不可退款',code: 200,data: '交易完成',ok: true})break;case 'TRADE_SUCCESS':resolve({message: '高级即时到帐状态下',code: 201,data: '交易完成',ok: true})break;case 'TRADE_CLOSED':resolve({message: '默认通知不返回,可申请修改(条件需开通高级即时到帐功能,且非常需要退款的同步)。出现该情况在开通高级即时到帐时的人工操作退款时、买家没付款系统自动或卖家手动关闭了该笔交易',code: 202,data: '交易关闭',ok: true})break;default:resolve({message: '交易不存在❗',code: 404,data: {},ok: false})break;}} else {resolve({message: '交易不存在❗',code: 404,data: {},ok: false})}}, err => {resolve({message: '交易不存在❗',code: 404,data: {},ok: false})})}, err => {resolve({message: '交易不存在❗',code: 404,data: {},ok: false})})})
}

   AlipayForm文件 ~ 完整代码

const alipaySdk = require('./alipay.sdk')
const AlipayFormData = require('alipay-sdk/lib/form').default
const axios = require('axios')//参数 商品订单 商品名称 商品详细 商品价格
const AlipayForm = (outTradeNo, goodsName, goodsDetail, price) => {return new Promise((resolve, reject) => {// 创建支付宝需要的表单表 对接支付宝const formData = new AlipayFormData();formData['setMethod']('get');// 支付成功回调地址,必须为可以直接访问的地址,不能带参数formData['addField']('returnUrl', 'http://127.0.0.1:3005/#/paysuccess');// 然后就是需要的订单参数formData['addField']('bizContent', {outTradeNo: outTradeNo, // 商户订单号,64个字符以内、可包含字母、数字、下划线,且不能重复productCode: 'FAST_INSTANT_TRADE_PAY', // 销售产品码,与支付宝签约的产品码名称,仅支持FAST_INSTANT_TRADE_PAYtotalAmount: `${price}`, // 订单总金额,单位为元,精确到小数点后两位subject: goodsName, // 订单标题body: goodsDetail, // 订单描述});// 业务处理// result 为可以跳转到支付链接的 url//'alipay.trade.page.pay' 统一收单下单并支付页面接口//{} api 请求的参数(包含“公共请求参数”和“业务参数”)alipaySdk.exec('alipay.trade.page.pay',{},{ formData: formData },).then(reason => {resolve({message: '支付成功❗',code: 200,data: reason,ok: true})}, err => {resolve({message: '支付失败❗',code: 404,data: {},ok: false})})})
}//参数 订单号 交易号
const AlipayFormStatus = (out_trade_no, trade_no) => {return new Promise((resolve, reject) => {// 创建支付宝需要的表单表 对接支付宝const formData = new AlipayFormData();formData.setMethod('get');// 然后就是需要的订单参数formData.addField('bizContent', {out_trade_no,trade_no,});alipaySdk.exec('alipay.trade.query',{},{ formData: formData },).then(result => {axios({url: result,method: 'get'}).then(reason => {let saveData = reason.data['alipay_trade_query_response']if (saveData.code === '10000') {switch (saveData['trade_status']) {case 'WAIT_BUYER_PAY':resolve({message: '通知不会返回,不能申请修改',code: 199,data: '支付宝有交易记录,没付款',ok: true})break;case 'TRADE_FINISHED':resolve({message: '交易结束,不可退款',code: 200,data: '交易完成',ok: true})break;case 'TRADE_SUCCESS':resolve({message: '高级即时到帐状态下',code: 201,data: '交易完成',ok: true})break;case 'TRADE_CLOSED':resolve({message: '默认通知不返回,可申请修改(条件需开通高级即时到帐功能,且非常需要退款的同步)。出现该情况在开通高级即时到帐时的人工操作退款时、买家没付款系统自动或卖家手动关闭了该笔交易',code: 202,data: '交易关闭',ok: true})break;default:resolve({message: '交易不存在❗',code: 404,data: {},ok: false})break;}} else {resolve({message: '交易不存在❗',code: 404,data: {},ok: false})}}, err => {resolve({message: '交易不存在❗',code: 404,data: {},ok: false})})}, err => {resolve({message: '交易不存在❗',code: 404,data: {},ok: false})})})
}module.exports = {AlipayForm,AlipayFormStatus
}

使用沙箱

在这里插入图片描述

在这里插入图片描述

效果演示

请添加图片描述

AlipaySdk API ~

  • new AlipaySdk(config)
参数类型描述
ParamTypeDescription
ConfigAlipaySdkConfig初始化 SDK 配置
  • AlipaySdkConfig
参数说明类型必须
appId应用IDstring
privateKey应用私钥字符串string
signType签名种类“RSA2”|“RSA”
alipayPublicKey支付宝公钥(需要对返回值做验签时候必填)string
gateway网关string
timeout网关超时时间(单位毫秒,默认 5s)number
camelcase是否把网关返回的下划线 key 转换为驼峰写法boolean
keyType指定private key类型, 默认: PKCS1, PKCS8: PRIVATE KEY, PKCS1: RSA PRIVATE KEY“PKCS1”|“PKCS8”
appCertPath应用公钥证书文件路径string
appCertContent应用公钥证书文件内容string|Buffer
appCertSn应用公钥证书snstring
alipayRootCertPath支付宝根证书文件路径string
alipayRootCertContent支付宝根证书文件内容string|Buffer
alipayRootCertSn支付宝根证书snstring 否
alipayPublicCertPath支付宝公钥证书文件路径string
alipayPublicCertContent支付宝公钥证书文件内容string|Buffer
alipayCertSn支付宝公钥证书sn string
encryptKeyAES密钥,调用AES加解密相关接口时需要string
wsServiceUrl服务器地址string
  • AlipaySdk.sdkExec(method, params) ⇒ string

作用 : 生成请求字符串,用于客户端进行调用 ~ Returns: string - 请求字符串

ParamTypeDescription
methodstring方法名
paramsIRequestParams请求参数
params.bizContentobject业务请求参数
  • AlipaySdk.pageExec(method, params) ⇒ string

作用 :生成网站接口请求链接或表单 ~ Returns: string - 请求链接或表单 HTML

ParamTypeDescription
methodstring方法名
paramsIRequestParams请求参数
params.bizContentobject业务请求参数
params.methodstring后续进行请求的方法。如为 GET,即返回 http 链接;如为 POST,则生成表单 html
  • AlipaySdk.exec(method, params, option) ⇒ Promise.<(AlipaySdkCommonResult|string)>

作用 :执行请求,调用支付宝服务端

Returns: Promise.<(AlipaySdkCommonResult|string)> - 请求执行结果

ParamTypeDescription
methodstring调用接口方法名,比如 alipay.ebpp.bill.add
paramsIRequestParams请求参数
params.bizContentobject业务请求参数
optionIRequestOption选项
option.validateSignBoolean是否验签
args.logobject可选日志记录对象
  • AlipaySdkCommonResult

作用 : 响应结果

参数说明类型必须
code响应码。10000 表示成功,其余详见 https://opendocs.alipay.com/common/02km9fstring
msg响应讯息。Success 表示成功。string
sub_code错误代号string
sub_msg错误辅助信息string
  • IRequestParams

作用 :请求参数

参数说明类型必须
bizContent业务请求参数object
needEncrypt自动AES加解密boolean
  • AlipaySdk.checkNotifySign(postData, raw)

作用 :通知验签 ~ Returns: Boolean - 是否验签成功

ParamTypeDescription
postDataJSON服务端的消息内容
rawBoolean是否使用 raw 内容而非 decode 内容验签

最后

以上是个人学习Node的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PhaseNet论文阅读总结

PhaseNet论文阅读总结 PhaseNet: a deep-neural-network-based seismic arrival-time pickingmethod 背景 地震监测和定位是地震学的基础 地震目录的质量主要取决于到达时间测量的数量和精度相位拾取一般都是网络分析员来执行但是地震仪越来越多&#xff0c;数据流增加&#…

C++模拟实现位图和布隆过滤器(哈希)

目录 前言引入&#xff1a; 一、位图 1.1 位图概念 1.2 位图的实现 1.3 位图的应用 二、布隆过滤器 2.1 哈希的弊端 2.2 布隆过滤器概念 2.3 布隆过滤器的插入 2.4 布隆过滤器的查找 2.5 布隆过滤器的删除 2.6 布隆过滤器的模拟实现 2.7 布隆过滤器优缺点 三、…

Python实现将pdf,docx,xls,doc,wps,zip,xlsx,ofd链接下载并将文件保存到本地

前言 本文是该专栏的第31篇,后面会持续分享python的各种干货知识,值得关注。 在工作上,尤其是在处理爬虫项目中,会遇到这样的需求。访问某个网页或者在采集某个页面的时候,正文部分含有docx,或pdf,或xls,或doc,或wps,或ofd,或xlsx,或zip等链接。需要你使用python自…

公司私服Maven踩坑,项目配置都OK但是包就是下载不下来【已解决】

我的问题是公司的私服Maven下载不下来&#xff0c;因为公司保密协议&#xff0c;这里用阿里云为例&#xff01; 具体的至少参考&#xff1a;(32条消息) 这篇博文只讲MirrorOf_Java软件工程师的博客-CSDN博客 1&#xff1a;Java的Maven爆红了就找到资源库&#xff0c;然后把对于…

linux driver probe deferral 机制

1. 背景介绍 在偶然的一次实验中(具体是pinctrl实验)&#xff0c;我发现有些平台的pincontroller驱动起得很晚&#xff0c;而pinctrl client驱动却起得很早&#xff0c;在设备驱动模型中probe之前又会进行管脚复用的相关设置&#xff0c;按照常理来讲&#xff0c;这就产生了某…

Sa-Token + SpringBoot 实现登录鉴权

1. 技术选型 今天最近在做登录、授权的功能,一开始考虑到的是spring boot + spring security,但spring security太重,而我们是轻量级的项目,所以,spring security不适合我们。 而后考虑spring boot + shiro,但shiro自带的aop会影响spring boot的aop,所以,shiro也不适…

【代码随想录 | Leetcode | 第五天】链表 | 移除链表元素 | 设计链表

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来移除链表元素和设计链表的分享✨ 目录 前言203. 移除链表元素707. 设计链表总结 203. 移除链表元素 ✨题目链接点这里 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所…

【kubernetes系列】Kubernetes之配置dashboard安装使用

概述 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息&#xff0c;也可以创建或者修改 Kub…

10.6.5 【Linux】分区命令: split

如果你有文件太大&#xff0c;导致一些携带式设备无法复制的问题&#xff0c;split可以将一个大文件&#xff0c;依据文件大小或行数来分区&#xff0c;可以将大文件分区成为小文件&#xff0c;快速有效。 将文件分区的话&#xff0c;使用-b size来将一个分区的文件限制其大小&…

java模拟MQTT客户端发送消息及EMQX配置

EMQX配置 登录地址 首先打开EMQX的管理界面&#xff0c;界面的地址如下&#xff0c; http://192.168.1.110:18083/ 规则是IP就是MQTT的IP&#xff0c;端口是固定的18083&#xff0c;输入该地址后&#xff0c;展示界面如下&#xff1a; 然后输入用户名和密码&#xff0c;用户…

python_day7_画图

json数据与python字典的相互转换 import json列表&#xff0c;其中每个元素均为一个字典 data [{"name": "张三", "age": 10},{"name": "李四", "age": 13},{"name": "jay", "age&qu…

科技云报道:数字化转型完成后,制造业如何走向“数智”时代?

科技云报道原创。 随着我国数字化转型行动的深入推进和智能制造工程的大力实施&#xff0c;制造业正朝着“数智”时代迈进&#xff0c;生成式AI被视为推动制造业智能化发展的关键驱动力。 据预测&#xff0c;到2027年&#xff0c;将有30%的制造业采用生成式AI来提升产品研发效…