- 微信小程序云开发连接mysql数据库,小程序云函数操作mysql数据库
小程序云开发的功能是越来越强大了,现在小程序云开发可以直接借助云函数来链接mysql数据,操作mysql数据库了,今天就来给大家讲一讲如何使用小程序云开发的云函数来操作mysql数据库。 首先要明确一点,就是小程序云开发的云函数是基于node.js的,所以我们使用node.js的mysql2模块可以直接来链接并操作mysql数据库,所以我们现在要做的就是怎么样在云函数里使用mysql2模块,并且借助这个模块类库来实现mysql数据库的链接。 老规矩,先看效果图 [图片] 我们这里要做的就是在云函数里链接mysql数据库,并返回链接的mysql数据库的版本号。mysql数据库都能成功链接了,后面对mysql的增删改查操作也就是小意思了。所以我们这里先成功的链接mysql数据库才是最重要的。 一,创建小程序并引入云开发 这里我不在做讲解,我之前有讲过小程序云开发的初始化创建,也有录视频讲解,不懂的同学可以移步去看下,云开发项目的创建视频 https://edu.csdn.net/course/play/9604/284440 这里有3点需要注意的 1,一定要在app.js里做云开发环境的初始化 [图片] 2,在project.config.json里配置云函数的目录 [图片] 3,一定要用自己注册的小程序的appid [图片] 二,创建云函数,名字就叫mysql吧。 在我们的cloud,右键创建云函数 [图片] 三,安装mysql2模块依赖 1,右键我们的mysql云函数,点击在终端中打开 [图片] 2,在终端中输入 npm install mysql2 [图片] 需要你电脑安装npm,如果没有安装,请自行百度,网上很多npm的安装教程的。 [图片] 等待我们的mysql2安装成功 四,编写mysql云函数链接mysql数据库 [图片] 完整的代码给大家贴出来 [代码]// 云函数入口文件 const cloud = require('wx-server-sdk') //引入mysql操作模块 const mysql = require('mysql2/promise') cloud.init() // 云函数入口函数 exports.main = async(event, context) => { //链接mysql数据库的test库,这里你可以链接你mysql中的任意库 try { const connection = await mysql.createConnection({ host: "你的服务器ip", database: "操作那个数据库", user: "mysql使用后名", password: "mysql密码" }) const [rows, fields] = await connection.execute('SELECT version();') return rows; } catch (err) { console.log("链接错误", err) return err } } [代码] 记得把上面的host,database,user,password 替换成你自己的。 五,上传并部署云函数 [图片] 部署成功 [图片] 这里有一点需要注意,就是你不能用云函数链接你本地mysql数据库,因为上传云函数以后,是上传到里微信服务器,没有办法调用到你本地mysql到,除非你设置下本地mysql可以被外界访问,或者使用你自己服务器上的mysql数据库。 [图片] 这样就可以成功的使用微信小程序链接我们的mysql数据库了。 到这里我们点用自己定义的mysql云函数,就可以成功的链接我们的mysql数据库了。 [图片] 是不是很简单。 更多关于云开发的知识,可以翻看我之前的文章,也可以看我录制的视频讲解 视频讲解 https://edu.csdn.net/course/detail/9604 有任何关于小程序的问题都可以加石头哥微信2501902696(备注小程序) 我们下一节给大家讲解使用小程序云开发实现邮件的发送功能。敬请期待。
2019-08-03 - 使用云函数+云调用,四步实现微信支付
微信支付是云开发原生支持的微信生态能力之一,开发者只需要简单调用相应的函数即可完成整套支付流程,安全又高效。部分优势包括: 无需关心证书、签名,支付流程简化;基于微信私有协议和私有链路,更加安全、高效;免运维,高可用性;按需扩容,弹性伸缩,按量计费,成本缩减;支持通过云函数接受支付回调,无需自建回调服务。流程对比:传统流程 vs 云开发[图片] 代码示例第 1 步:小程序调用云函数C 端用户发起支付流程后,小程序端调用云函数(此处假设云函数名为 [代码]makeOrder[代码]): // 小程序代码 wx.cloud.callFunction({ name: "makeOrder", data: { /* 开发者自定义参数 */ } }); 第 2 步:云函数生成订单,返回订单信息云函数 makeOrder 收到调用之后,使用微信服务端 SDK 提供的 API,无需证书和签名,可直接生成订单。 生成订单之后,利用 CloudPay.unifiedOrder() 统一下单接口,将订单信息返回给小程序。 CloudPay.unifiedOrder() 接口文档: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html // 云函数 makeOrder const cloud = require("wx-server-sdk"); cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }); exports.main = async (event, context) => { const res = await cloud.cloudPay.unifiedOrder({ body: "小秋TIT店-超市", outTradeNo: "1217752501201407033233368018", spbillCreateIp: "127.0.0.1", subMchId: "1900009231", totalFee: 1, envId: "test-f0b102", functionName: "payCallback" // 支付回调的函数名 }); return res; }; 第 3 步:小程序端发起支付小程序端收到云函数返回的订单信息后,发起支付: // 小程序代码 wx.cloud.callFunction({ name: "makeOrder", data: { /* 开发者自定义参数 */ }, success: (res) => { // 取得云函数返回的订单信息 const payment = res.result.payment; // 调起微信客户端支付 wx.requestPayment({ ...payment, success(res) { /* 成功回调 */ }, fail(res) { /* 失败回调 */ } }); } }); 第 4 步:使用云函数接收支付回调,完成支付流程用户完成付款之后,微信后台将会调用指定的云函数(此处假设名为 payCallback),传入的参数中会带有订单信息。 开发者可以在此云函数中,实现自己的发货、完成订单的逻辑。 // 云函数 payCallback exports.main = async (event, context) => { const { return_code, // 状态码 appid, // 小程序 AppID mch_id, // 微信支付的商户号 device_info, // 微信支付分配的终端设备号 openid, // 用户在商户appid下的唯一标识 trade_type, // 交易类型:JSAPI、NATIVE、APP bank_type // 银行类型 // ...... // 更多参数请参考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8 } = event; /* 开发者自己的逻辑 */ // 向微信后台返回成功,否则微信后台将会重复调用此函数 return { errcode: 0 }; }; 相关文档:云函数文档: https://docs.cloudbase.net/cloud-function/introduce.html 云调用文档: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html wx-server-sdk 文档: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/Cloud.html CloudPay.unifiedOrder() 接口文档: https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html
2021-07-08 - 微信支付用云函数实现notify_url
没有自己的服务器,怎么用云函数来接收微信支付成功异步通知呢。 步骤如下: (因论坛审核机制,就不上图片了,否则可能触发人工审核) 打开小程序开发工具; 1、云控制台中,点击:设置--环境设置--充值与账单; 此时会跳到腾讯云; 2、点击:账号中心--访问管理; 此时会跳到腾讯云控制台; 3、在左上角点击:云产品--找到:云开发CloudBase; 此时出现小程序的云环境列表 4、选择某个云环境; 5、点击:访问服务; 6、新建一个HTTP访问服务;将一个公网域名URL与一个云函数关联; 比如云函数名:pay_notify与https://<http访问服务的默认域名>/pay_notify关联。 7、在统一下单里,将notify_url设为:https://<http访问服务的默认域名或自定义域名>/pay_notify 此时,可以在pay_notify中处理来自微信支付的异步通知了; 那这个云函数的入口参数是什么样的呢?接口文档: https://cloud.tencent.com/document/product/876/41776 8、固定IP的配置:可以在此处腾讯云中配置,也可以在小程序开发工具的云控制台配置:某云函数--配置--高级设置--固定IP。 9、pay_notify的代码实例:以微信支付V2为例。 const cloud = require('wx-server-sdk') const xml2js = require('xml2js') const crypto = require('crypto') const config = require('./config.js') const key = config.key cloud.init({env: cloud.DYNAMIC_CURRENT_ENV}) const db = cloud.database() const _ = db.command const col = db.collection('payments') exports.main = async event => { let xml = Buffer.from(event.body, 'base64').toString() let payment = await parseXML(xml) if(signVerify(payment)){}else return 'denied' await onPayment(payment) //业务处理 return `` } 至此,不用服务器,通过云函数,就实现了微信支付notify_url的全部功能。
2021-04-28 - 同一个小程序多个收款帐户的问题
现我司为某大型国有企业开发一面对普通消费者的在线小程序应用,该企业在某省各地市均有分公司,当地的消费者微信支付的费用需要直接进当地分公司的对公帐户(各分公司财务独立核算),这在微信支付中该如何实现? 未找到相关的多帐户支付的相关内容。谢谢!
2020-01-22 - WebSocket net::ERR_CONNECTION_TIMED_OUT
appservice?t=1533630357896:1032 WebSocket connection to 'wss://36.41.188.53/mqtt' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT 我在微信小程序中是用mqtt协议,通过nginx代理监听443端口,在本地测试通过,但是在连接服务器是报上述异常,可以ping通ip,telnet也可以连接服务器也正常,MQ使用的是emqttd,恳请各位大佬指点。 // pages/connect/connect.js var app = getApp(); var MQTT = require("../../utils/paho-mqtt.js"); Page({ /** * 页面的初始数据 */ data: { server_addr: '36.41.188.53', user_name: "test", user_psw: ['1','2','3','4','5','6','7','8','9'], error_message: '', switch_checked: false, btn_loading: false }, server_addr_input: function(e) { //console.log(e); this.setData({ server_addr: e.detail.value }); }, user_name_input: function(e) { //console.log(e); this.setData({ user_name: e.detail.value }); }, user_psw_input: function(e) { //console.log(e); this.setData({ user_psw: e.detail.value }); }, switch_change: function(e) { //console.log(e); this.setData({ switch_checked: e.detail.value }); }, btn_connect: function() { //查看输入是否为空,设置错误信息 if (this.data.server_addr == '' || this.data.server_addr == null) { this.setData({ error_message: "server address can not be empty!" }); return; } if (this.data.switch_checked) { if (this.data.user_name == null || this.data.user_name == '') { this.setData({ error_message: "user name can not be empty!" }); return; } if (this.data.user_psw == null || this.data.user_psw == '') { this.setData({ error_message: "user password can not be empty!" }); return; } } //reset error message if (this.data.error_message) { this.setData({ error_message: '' }); } //在按钮上显示加载标志 this.setData({ btn_loading: true }); var client = new MQTT.Client("ws://" + this.data.server_addr + "/mqtt", "mqttjs" + Math.random().toString(36).substr(2)); var that = this; //connect to MQTT broker var connectOptions = { timeout: 10, useSSL: true, cleanSession: true, keepAliveInterval: 30, reconnect: true, userName: "test", password: "123456789", onSuccess: function() { console.log('connected'); app.globalData.mqtt_client = client; client.onMessageArrived = function(msg) { if (app.globalData.messages != null) { app.globalData.messages = [{ topic: msg.topic, humidity: msg.payloadString.toString().substr(6, 2), temperature: msg.payloadString.toString().substr(15, 2), doorLock: msg.payloadString.toString().substr(24, 1), socket: msg.payloadString.toString().substr(32, 1), }].concat(app.globalData.messages); } } client.onConnectionLost = function(responseObject) { if (typeof app.globalData.onConnectionLost === 'function') { return app.globalData.onConnectionLost(responseObject); } if (responseObject.errorCode !== 0) { console.log("onConnectionLost:" + responseObject.errorMessage); } } //去除按钮上的加载标志 that.setData({ btn_loading: false }); wx.switchTab({ url: '../subscribe/subscribe', }); }, onFailure: function(option) { console.log(option); //去除按钮上的加载标志 that.setData({ btn_loading: false }); wx.showModal({ //title: msg.destinationName, content: option.errorMessage }); } }; if (this.data.switch_checked) { connectOptions.userName = this.data.user_name; connectOptions.password = this.data.user_psw; } client.connect( ); }, /** * 生命周期函数--监听页面加载 */ onLoad: function(options) { }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function() { }, /** * 生命周期函数--监听页面显示 */ onShow: function() { if (app.globalData.mqtt_client != null) { wx.reLaunch({ url: '../subscribe/subscribe', }); return; } } })
2018-08-07