#摘要
在官方的微信小店全開(kāi)放前開(kāi)源一波
療效演示
集成云開(kāi)發(fā)
舊項(xiàng)目是非基于云開(kāi)發(fā)的,構(gòu)建cloud文件夾,并在文件中配置,構(gòu)建用戶(hù)登入的云函數(shù)并上傳到微信小程序云中
構(gòu)建云函數(shù)文件夾,并在..json配置為云函數(shù)目錄
文檔詳見(jiàn):[
](
)
構(gòu)建頁(yè)面文件夾,,將舊小程序項(xiàng)目的pages文件夾一并移入該文件夾中,并配置在..json中,{…“”:“/”…}
開(kāi)通云開(kāi)發(fā)
創(chuàng)建數(shù)據(jù)表
分別創(chuàng)建
店面表、分類(lèi)表、商品表Food、訂單表Order、地址表、用戶(hù)表_User
如何構(gòu)建用戶(hù)表
用戶(hù)表是不是須要自己創(chuàng)建,不存在類(lèi)似于Bmob、這些云儲(chǔ)存那樣默認(rèn)存在_User表
數(shù)據(jù)表的特點(diǎn)當(dāng)數(shù)據(jù)是從小程序端創(chuàng)建數(shù)據(jù)的,天然就帶有數(shù)組添加數(shù)據(jù)必須保證數(shù)據(jù)表早已存在,不存在就創(chuàng)建集合這跟之前用過(guò)的Bmob、一類(lèi)的云儲(chǔ)存不同,前者碰到引用不存在集合是會(huì)手動(dòng)創(chuàng)建集合的創(chuàng)建云函數(shù)
寫(xiě)完云函數(shù)本地調(diào)試完畢后,要將遠(yuǎn)程的也更新一下
上傳增量更新
本地調(diào)試
假如沒(méi)有安裝依賴(lài)的,要切換到云函數(shù)目錄,運(yùn)行npm安裝它
表數(shù)據(jù)的權(quán)限問(wèn)題
如果沒(méi)權(quán)限,.get懇求數(shù)據(jù),得到的數(shù)據(jù)是空白的,而不是報(bào)錯(cuò)無(wú)權(quán)限
這么就是權(quán)限沒(méi)有,默認(rèn)是僅創(chuàng)建人可讀可寫(xiě)
更改文檔也是一樣,準(zhǔn)備更改店面資料,但從返回信息看是更改成功,實(shí)則數(shù)據(jù)未改成功過(guò),這是就自定義權(quán)限,read/write都設(shè)置為true了。
更改權(quán)限可以按如下形式更改
數(shù)據(jù)的增刪改查
引入constdb=wx.cloud.()后,就是一系列關(guān)鍵字,get/doc/add//這種了
看下邊這個(gè)分類(lèi)表的操作
/*
*
* 關(guān)注訂閱號(hào)【huangxiujie85】,第一時(shí)間收到教程推送
*
* @author 黃秀杰
*/
const db = wx.cloud.database()
const { showModal } = require('../../utils/utils')
Page({
onLoad: function(options) {
// 管理員認(rèn)證
getApp().auth()
if (options.objectId) {
// 緩存數(shù)據(jù)
this.setData({
isEdit: true,
objectId: options.objectId
})
// 請(qǐng)求待編輯的分類(lèi)對(duì)象
db.collection('Category')
.doc(options.objectId)
.get()
.then(res => {
this.setData({
category: res.data
})
})
}
},
add: function(e) {
var form = e.detail.value
if (form.title == '') {
wx.showModal({
title: '請(qǐng)?zhí)顚?xiě)分類(lèi)名稱(chēng)',
showCancel: false
})
return
}
form.priority = Number.parseInt(form.priority)
// 添加或者修改分類(lèi)
// 修改模式
if (this.data.isEdit) {
const category = this.data.category
db.collection('Category')
.doc(category._id)
.update({
data: form
})
.then(res => {
console.log(res)
showModal()
})
} else {
db.collection('Category')
.add({
data: form
})
.then(res => {
console.log(res)
showModal()
})
}
},
showModal() {
// 操作成功提示并返回上一頁(yè)
wx.showModal({
title: this.data.isEdit ? '修改成功' : '添加成功',
showCancel: false,
success: () => {
wx.navigateBack()
}
})
},
delete: function() {
// 確認(rèn)刪除對(duì)話(huà)框
wx.showModal({
title: '確認(rèn)刪除',
success: res => {
if (res.confirm) {
const category = this.data.category
db.collection('Category')
.doc(category._id)
.remove()
.then(res => {
console.log(res)
wx.showToast({
title: '刪除成功'
})
wx.navigateBack()
})
}
}
})
}
})
表關(guān)聯(lián)
商品表關(guān)聯(lián)分類(lèi)表
做聯(lián)表查詢(xún)時(shí),報(bào)錯(cuò)
:-|:
Error::-|:
版本要求:wx--sdk1.3.0或以上不支持在小程序端使用
好坑,提示是權(quán)限問(wèn)題,發(fā)覺(jué)是原本就不支持,聯(lián)表查詢(xún)下,還要在云上寫(xiě)
老老實(shí)實(shí)地寫(xiě)云函數(shù)吧
// 云函數(shù)入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
const result = await db.collection('Food')
.aggregate()
.lookup({
from: 'Category',
localField: 'category',
foreignField: '_id',
as: 'categories'
})
.end()
// .orderBy('priority', 'asc')
// .get()
console.log(result)
return result.list
}
這樣能夠使用.().作聯(lián)表查詢(xún)了
圖片上傳
圖片上傳重點(diǎn)是取出,它可以直接形參給的src屬性就是渲染到頁(yè)面上了,微信一家就是如此好說(shuō)話(huà)
chooseImage() {
wx.chooseImage({
count: 1, // 默認(rèn)9
sizeType: ['compressed'], // 可以指定是原圖還是壓縮圖,默認(rèn)二者都有
sourceType: ['album', 'camera'], // 可以指定來(lái)源是相冊(cè)還是相機(jī),默認(rèn)二者都有
success: res => {
const tempFilePaths = res.tempFilePaths
const file = tempFilePaths[0]
const name = utils.random_filename(file) //上傳的圖片的別名,建議可以用日期命名
console.log(name)
wx.cloud.uploadFile({
cloudPath: name,
filePath: file, // 文件路徑
}).then(res => {
console.log(res)
const fileId = res.fileID
// 將文件id保存到數(shù)據(jù)庫(kù)表中
db.collection('Seller').doc(this.data.seller._id)
.update({
data: {
logo_url: fileId
}
}).then(() => {
wx.showToast({
title: '上傳成功'
})
// 渲染本地頭像
this.setData({
new_logo: fileId
})
}, err => {
console.log(err)
wx.showToast({
title: '上傳失敗'
})
})
})
}
})
}
微信支付
優(yōu)點(diǎn),都不用開(kāi)啟前端服務(wù),有點(diǎn)要調(diào)試發(fā)覺(jué)前端都還沒(méi)怎樣就跑上去了,這些覺(jué)得之前沒(méi)有的,很不習(xí)慣
調(diào)用簡(jiǎn)單
不用提供小程序的appid支付的32位key,這種都在開(kāi)發(fā)工具設(shè)置中綁定好了的,惟一提供的是商戶(hù)的mchId就可以
由于本地?zé)o法得到微信支付的通知反彈,在原先魔改路由,配花生殼域名,遠(yuǎn)程到服務(wù)器寫(xiě)代碼,這都經(jīng)歷過(guò),為的就是讓反彈被通知到微信支付的消息。
子商戶(hù)號(hào),不曉得從何而至,我這兒就是傳的自己申請(qǐng)到的商戶(hù)號(hào)
傳統(tǒng)寫(xiě)支付要用的mchidkey為何這兒不須要,只要綁定就好
綁定微信支付商戶(hù)
如右圖先添加商戶(hù)號(hào)添加
添加后微信會(huì)發(fā)來(lái)通知
按提示開(kāi)通就好
假如不綁定外賣(mài)小程序開(kāi)發(fā),將報(bào)“理關(guān)系不存在”的錯(cuò)誤
配置成功后,云函數(shù)中發(fā)起統(tǒng)一下單
// 云函數(shù)入口文件
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
console.log('請(qǐng)求中')
console.log(cloud.getWXContext().ENV)
let { orderId, amount, body } = event
const wxContext = cloud.getWXContext()
const res = await cloud.cloudPay.unifiedOrder({
body: body,
outTradeNo: orderId,
spbillCreateIp: '127.0.0.1',
subMchId: '1447716902',
totalFee: amount,
envId: 'dinner-cloud',
functionName: 'pay_cb'
})
return res.payment
}
這兒:'’指的就是支付成功后,微信支付那側(cè)給我的反彈信息,前面我們就用它來(lái)更新我們的訂單狀態(tài)
正常返回支付要用的參數(shù)了
里面的對(duì)象里的就是小程序端調(diào)用支付時(shí)要用到的參數(shù)
配合以下小程序端的代碼,才能喚醒支付讓用戶(hù)付款了
const { result: payData } = res
wx.requestPayment({
timeStamp: payData.timeStamp,
nonceStr: payData.nonceStr,
package: payData.package,
signType: 'MD5',
paySign: payData.paySign,
success: res => {
console.log('支付成功', res)
wx.showModal({
title: '支付成功',
showCancel: false,
success: () => {
// 跳轉(zhuǎn)訂單詳情頁(yè)
wx.navigateTo({
url: '/order/detail/detail?objectId=' + order._id
})
}
})
},
...
微信支付反彈
微信統(tǒng)一下單里一個(gè)反彈函數(shù),它是一個(gè)云函數(shù),也就用到了云函數(shù)調(diào)用云函數(shù)了
接出來(lái)就實(shí)現(xiàn)這個(gè)反彈函數(shù)
// 云函數(shù)入口文件
const cloud = require('wx-server-sdk')
cloud.init({
// API 調(diào)用都保持和云函數(shù)當(dāng)前所在環(huán)境一致
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
console.log('支付回調(diào)')
console.log(event)
console.log(cloud.getWXContext().ENV)
const orderId = event.outTradeNo
const resultCode = event.resultCode
if (resultCode === 'SUCCESS') {
const res = await db
.collection('Order')
.doc(orderId)
.update({
data: {
status: 1
}
})
console.log(res)
return { errcode: 0 }
}
}
為了更好地調(diào)試微信支付給我的反彈信息,可以步入云函數(shù)面板,日志標(biāo)簽頁(yè),哪里給把我們?cè)坪瘮?shù).log()復(fù)印結(jié)果顯示下來(lái),如右圖
使用第三方庫(kù)實(shí)現(xiàn)
這個(gè)是通用解決方案,不用原生的云開(kāi)發(fā)微信支付,自己寫(xiě)node.js前端就是如此干的
//云開(kāi)發(fā)實(shí)現(xiàn)支付
const cloud = require('wx-server-sdk')
cloud.init()
//1,引入支付的三方依賴(lài)
const tenpay = require('tenpay')
//2,配置支付信息
const config = {
appid: 'wx6f3d3xxx20b1678f', //
mchid: '1447716902', //
partnerKey: '21f0ce9b272ecfbaxxxf83994c438f39', //
notify_url: 'https://mp.weixin.qq.com', //支付回調(diào)網(wǎng)址,這里可以先隨意填一個(gè)網(wǎng)址
spbill_create_ip: '127.0.0.1'
}
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
let { orderId, amount, body } = event
//3,初始化支付
const api = tenpay.init(config)
let result = await api.getPayParams({
out_trade_no: orderId,
body: body,
total_fee: amount, //訂單金額(分),
openid: wxContext.OPENID //付款用戶(hù)的openid
})
return result
}
缺點(diǎn)是難以反彈通知支付結(jié)果:‘’,由于我們沒(méi)有自己的前端服務(wù)器,也就無(wú)法提示這個(gè)url了,最多就是在后端協(xié)程訂單就支付狀態(tài)從而改自己的訂單的狀態(tài)了。
總結(jié)
云開(kāi)發(fā)體驗(yàn)出來(lái),優(yōu)點(diǎn)自毋須多說(shuō),微信登陸與支付原生支持,調(diào)用與調(diào)試都很便捷,非常是不用啟本地服務(wù)開(kāi)發(fā)外賣(mài)小程序開(kāi)發(fā),真的好用;最大的不足就是小程序端不支持聯(lián)表查詢(xún),必須寫(xiě)云函數(shù)被小程序調(diào)用,期盼盡快能像Bmob、一類(lèi)的云儲(chǔ)存那樣得到支持。
源碼下載
[
](
免責(zé)聲明:部分文章信息來(lái)源于網(wǎng)絡(luò)以及網(wǎng)友投稿,本站只負(fù)責(zé)對(duì)文章進(jìn)行整理、排版、編輯,出于傳遞更多信息之目的,并不意味著贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,如本站文章和轉(zhuǎn)稿涉及版權(quán)等問(wèn)題,請(qǐng)作者在及時(shí)聯(lián)系本站,我們會(huì)盡快為您處理。
- 鄉(xiāng)村小鎮(zhèn)外賣(mài)騎手的故事:互聯(lián)網(wǎng)快車(chē)下的新生活與兼職收入
- 掃碼點(diǎn)餐成電子時(shí)代新常態(tài),消費(fèi)者體驗(yàn)與隱私保護(hù)需平衡
- 了解外賣(mài)平臺(tái)發(fā)展前景后,作者發(fā)表看法,技術(shù)推動(dòng)平臺(tái)升級(jí)
- 同城活動(dòng)報(bào)名系統(tǒng):連接你我,開(kāi)啟無(wú)限可能
- 校園外賣(mài)_配送系統(tǒng):打造本地智慧生活服務(wù)的專(zhuān)業(yè) SaaS 系統(tǒng)
- 外賣(mài)小程序開(kāi)發(fā)攻略:從需求明確到平臺(tái)選擇,全方位指南
熱門(mén)資訊
- 美團(tuán)外賣(mài)的抽成規(guī)則 餓了么抽點(diǎn)比例是多少
- 外賣(mài)好評(píng)30字有哪些 常見(jiàn)的外賣(mài)評(píng)語(yǔ)大全
- 木屋燒烤價(jià)目表一覽 微信外賣(mài)訂餐系統(tǒng)推薦
- 海底撈排隊(duì)取號(hào)微信是多少 海底撈是怎么預(yù)約排隊(duì)
- 如何通過(guò)微信掃碼支付找到支付人微信號(hào)?看這里!
- 胡桃里消費(fèi)人均大概是多少錢(qián) 二維碼掃碼點(diǎn)餐系統(tǒng)哪個(gè)好用
- 美團(tuán)外賣(mài)怎么點(diǎn)兩份?步驟及注意事項(xiàng)!!
- 肯德基優(yōu)惠券怎么獲得 肯德基微信外賣(mài)怎么點(diǎn)
- 連鎖收銀系統(tǒng)對(duì)連鎖門(mén)店運(yùn)營(yíng)會(huì)有怎么樣的影響?
- 微信公眾號(hào)點(diǎn)餐是怎么實(shí)現(xiàn) 餐飲商家怎么制作外賣(mài)訂餐系統(tǒng)