最近一直在研究使用冰狐智能辅助的“自动构建”功能在不编程的情况如何实现各种好玩的东东,由于自己利用业余时间开发的小工具需要用到收款功能,于是自然想到用“自动构建”试下,看是否可以搞定,先说结论:完美实现,亲测100%有效,最关键的是不需要写一行代码,哈哈哈,不会编程的也会搞,现分享给大家,有任何问题大家直接在评论区给我留言哈!
业务流程
1.开发者上传收款二维码到平台
2.用户发起支付请求
3.平台返回对应的收款二维码
4.用户扫描二维码支付
5.平台通知用户支付完成
6.商家自动发货
基于冰狐智能辅助实现个人收款
1.搭建移动端APP
移动端APP主要用于截获收款信息,并通知服务支付信息(注意移动端的手机必须登录收款微信,且打开微信的通知功能,否则无法实现自动收款)。移动端通过冰狐智能辅助的「自动构建」功能来搭建,不需要编写一行代码。
- 下载「冰狐智能辅助」APP并安装,安装完成后请登录。登录时请按提示打开所有权限,具体下载地址和详细安装配置过程请参考这里。请严格按照教程完成所有步骤。
- 打开web页面「移动端」/「自动构建」,新建一个名为“个人支付”的自动构建,然后点击“配置源码”按钮,把如下配置源码粘贴进去并保存(注意在粘贴后一定要去掉csdn在末尾添加的版权信息,后面所有的粘贴都要去掉多余的版权信息)。
{
"type": "root",
"children": [{
"type": "declareVar",
"var": [{
"name": "temp",
"type": "normal",
"initType": "null",
"initValue": "null"
}, {
"name": "ret",
"type": "normal",
"initType": "null",
"initValue": "null"
}, {
"name": "view",
"type": "normal",
"initType": "null",
"initValue": "null"
}, {
"name": "viewContainer",
"type": "normal",
"initType": "null",
"initValue": "null"
}, {
"name": "item",
"type": "normal",
"initType": "null",
"initValue": "null"
}, {
"name": "index",
"type": "normal",
"initType": "null",
"initValue": "null"
}, {
"name": "data",
"type": "normal",
"initType": "string",
"initValue": ""
}]
}, {
"type": "enterApp",
"desc": "启动APP",
"debug": false,
"packageName": "",
"findTag": "",
"autoExit": false,
"wait": "1000",
"failed": "",
"maxStep": "30"
}, {
"type": "loop",
"desc": "循环处理",
"class": "4",
"debug": false,
"children": [{
"type": "sleep",
"desc": "延时",
"debug": false,
"minTime": "1000",
"maxTime": "1000"
}]
}, {
"type": "notification",
"desc": "通知处理",
"debug": false,
"dealItems": [{
"key": "微信支付",
"value": {
"type": "group",
"desc": "模块组",
"debug": false,
"children": [{
"type": "callFunction",
"desc": "获取价格",
"class": 1,
"debug": false,
"target": "item",
"name": "fetchNumber",
"params": [],
"fetchResultIndex": "-1"
}, {
"type": "callMicroService",
"desc": "通知微服务",
"debug": false,
"name": "pay_notify",
"params": ["const-rsUUID", "integer-1", "var-ret"]
}, {
"type": "toast",
"desc": "弹出框",
"debug": false,
"textList": ["string-支付结果:", "var-ret"],
"x": "-1",
"y": "-1",
"duration": "1000"
}]
}
}]
}],
"desc": "根模块",
"debug": false
}
- 点击“个人支付”自动构建的“编译”按钮
- 打开web页面「移动端」/「我的设备」,找到刚才登录的手机,然后点击“编辑”按钮,修改“默认脚本”为上面新建的“个人支付”脚本。
- 打开web页面「移动端」/「我的设备」,找到刚才登录的手机,然后点击“编辑”按钮,再点击“切换模式”按钮,使设备处于调试模式。点击这里查看详细开启调试模式教程
2.创建微服务-微服务脚本
微服务脚本用于完成后端所有支付相关逻辑。
打开web页面「微服务」/「微服务脚本」新建下列脚本,并将对应的JS源码粘贴进去并保存
- pay_notify,用于处理支付信息,并通知开发者支付结果
function main(uuid, type, price) { var ret = false; console.log('uuid:' + uuid + ' type:' + type + ' price:' + price); price = parseInt(price*100); var key = uuid + price; var orderId = cacheGet(key); if (orderId) { console.log('匹配到价格,可以通知了:' + orderId); var data = dbQuery('order', '*', ['id=' + orderId]); if (data && data.length == 1) { console.log('order data:' + data); var item = data[0]; // 通知 调用者 var bodyParams = {outTradeNo: item.outTradeNo, openId: item.userId, payType: type, price: item.price / 100.0, realPrice: item.realPrice / 100.0}; var result = 2; var postResult = httpPost(item.notifyUrl, bodyParams); console.log('postResult:' + postResult); if (postResult && postResult.length > 0) { if (postResult.status == 200 || postResult.status == 302) { var d = JSON.parse(postResult.data); if (null!=d) { if (d.state == 1) { result = 1; } else { result = -1; } } } } // change status ret = dbUpdate('order', ['status=' + result], ['id=' + orderId]); if (!ret) { console.log('更新状态失败'); } console.log('order:' + orderId + ' result:' + result); cacheRemove(key); } } else { console.log('invalidate price:' + price); } return ret; }
- add_price,用于上传支付二维码
function main(payType, price, deviceId, file) { var ret = false; console.log('price:' + price + ' payType:' + payType + ' deviceId:' + deviceId); console.log('price typeof:' + typeof price); price = parseInt(price*100); var qrCode = qrDecode(file.inputStream); console.log('qrCode:' + qrCode); if (qrCode != '') { var qRet = dbQuery('price', 'count(id) as count', [`userId='${rsOpenId}'`, `price=${price}`, `payType=${payType}`, `deviceId='${deviceId}'`]); console.log('qRet:' + qRet); if (qRet[0].count > 0) { ret = dbUpdate('price', [`qrCode='${qrCode}'`], [`price=${price}`, `payType=${payType}`, `deviceId='${deviceId}'`]); } else { var iRet = dbInsert('price', {userId:rsOpenId, price:price, payType:payType, deviceId:deviceId, qrCode:qrCode}); ret = iRet > 0; } } console.log('uRet:' + ret); return ret; }
- query_price,用于查询价格
function main(fetchCountOnly, conditions, startIndex, itemCount) { console.log('fetchCountOnly:' + fetchCountOnly + ' conditions:' + conditions + ' startIndex:' + startIndex + ' itemCount:' + itemCount); var jsonConditions = JSON.parse(conditions); var params = [`userId='${rsOpenId}'`]; for (var item of jsonConditions) { console.log('item:' + item); if (item.name == 'query_type') { var type = parseInt(item.value); if (type > 0) { params.push('payType=' + type); } } } console.log('params:' + params); if (fetchCountOnly) { var qRet = dbQuery('price', 'count(id) as count', params); console.log('qRet:' + qRet); return qRet[0].count; } else { var qRet = dbQuery('price', '*', params, '', startIndex, itemCount); for (var item of qRet) { item.price /= 100.0; if (item.payType == 1) { item.payType = '微信'; } else { item.payType = '支付宝'; } } console.log('qRet:' + qRet); return qRet; } }
- query_order,用于查询支付订单
function main(fetchCountOnly, conditions, startIndex, itemCount) { console.log('fetchCountOnly:' + fetchCountOnly + ' conditions:' + conditions + ' startIndex:' + startIndex + ' itemCount:' + itemCount); var jsonConditions = JSON.parse(conditions); var params = []; for (var item of jsonConditions) { console.log('item:' + item); var deviceId = item.value; if (item.name == 'deviceId' && deviceId != '') { params.push(`deviceId='${deviceId}'`); } } console.log('params:' + params); if (fetchCountOnly) { var qRet = dbQuery('order', 'count(id) as count', params); console.log('qRet:' + qRet); return qRet[0].count; } else { var qRet = dbQuery('order', '*', params, 'order by time desc', startIndex, itemCount); for (var item of qRet) { item.price /= 100.0; item.realPrice /= 100.0; if (item.payType == 1) { item.payType = '微信'; } else { item.payType = '支付宝'; } if (item.status == 0) { item.status = '等待支付'; } else if (item.status == 1) { item.status = '交易完成'; } else if (item.status == 2) { item.status = '通知失败'; } else if (item.status == -1) { item.status = '订单过期'; } var datetime = new Date(); console.log('item.time:' + item.time); datetime.setTime(item.time); var year = datetime.getYear(); var month = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime.getMonth() + 1; var date = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate(); var hour = datetime.getHours()< 10 ? "0" + datetime.getHours() : datetime.getHours(); var minute = datetime.getMinutes()< 10 ? "0" + datetime.getMinutes() : datetime.getMinutes(); var second = datetime.getSeconds()< 10 ? "0" + datetime.getSeconds() : datetime.getSeconds(); var t = year + "-" + month + "-" + date+" "+hour+":"+minute+":"+second; console.log('time:' + t); item.time = t; } console.log('qRet:' + qRet); return qRet; } }
- unified_order,用于开发者请求支付,返回支付二维码
function main(callerOpenId, payType, price, outTradeNo, notifyUrl, timeout = 120000) { console.log(`price:${price} payType:${payType} outTradeNo:${outTradeNo} notifyUrl:${notifyUrl} timeout:${timeout}`); price = parseInt(price*100); var ret = null, qrImage = '', realPrice = price; var maxCount = 5, i = 0, anyRet = null, findAny = false; while (i < maxCount) { realPrice = price - i; console.log('price:' + price + ' realPrice:' + realPrice); var qRet = dbQuery('price', '*', [`userId='${rsOpenId}'`, `payType=${payType}`, `price=${realPrice}`]); if (qRet.length <= 0) { if (!findAny) { anyRet = dbQuery('price', '*', [`userId='${rsOpenId}'`, `payType=${payType}`, 'price=0']); findAny = true; } qRet = anyRet; } console.log('qRet:' + qRet); if (qRet.length > 0) { for (var item of qRet) { var key = item.deviceId + realPrice; console.log('key:' + key); var cache = cacheGet(key); if (null == cache) { lock('malloc_price'); cache = cacheGet(key); if (null == cache) { // 可以分配了 ret = dbInsert('order', { userId: callerOpenId, price: price, realPrice: realPrice, outTradeNo: outTradeNo, deviceId: item.deviceId, qrCode: item.qrCode, notifyUrl: notifyUrl }); console.log('insert ret:' + ret); } if (null != ret) { var image = qrEncode(item.qrCode); console.log('image' + image); console.log('type image' + typeof image); qrImage = base64Encode(image); console.log('qrImage:' + qrImage); cachePut(key, ret, 60000); } unlock('malloc_price'); if (null != ret) { break; } } } } if (null != ret) { break; } ++i; } if (null == ret) { console.log('unified failed'); } else { console.log('unified success:' + ret); return {callerOpenId: callerOpenId, payType: payType, price: price, realPrice: realPrice, qrImageData: qrImage, timeout: timeout}; } console.log('end'); return {}; }
- common,一些通用的函数
function deletePrice(item) { console.log('item:' + item); var id = item.id; var qRet = dbDelete('price', [`id=${id}`]); console.log('qRet:' + qRet); return qRet; } function deleteOrder(item) { console.log('item:' + item); var id = item.id; var qRet = dbDelete('order', [`id=${id}`]); console.log('qRet:' + qRet); return qRet; } function getDevice(includeAll=false) { console.log('rsOpenId:' + rsOpenId); var list = deviceList(rsOpenId); var result = []; if (includeAll) { result.push({name: '全部', value: ''}); } for (var item of list) { result.push({name: item.name, value: item.uuid}); } console.log('device: list' + result); return result; }
3.创建微服务-移动端接口
移动端接口用于「冰狐智能辅助」APP调用,主要用于手机端通知后端微服务支付相关信息
打开web页面「微服务」/「移动端接口」,新建名为“pay_notify”的接口,选择“pay_notify”脚本。
4.创建微服务-服务端接口
服务端接口用于第三方服务调用「冰狐智能辅助」的后端功能,这里主要用于开发者在自己的后端服务中调用生成订单的接口。
打开web页面「微服务」/「服务端接口」,新建名为”unified_order”的接口,选择“unified_order”脚本。
5.创建微服务-数据库
数据库用于存放收款二维码和订单信息。打开web页面「微服务」/「数据库」,新建下列数据库并选择“模式” / “列源码”按钮,将相关的源码粘贴进去并确认修改。
- price,用于存放收款二维码
[{ "type": "tinyint", "name": "payType", "default": "1", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }, { "name": "unsigned", "value": false, "description": "无符号" }] }, { "type": "varchar(45)", "name": "deviceId", "default": "''", "options": [{ "name": "not null", "value": true, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }] }, { "type": "varchar(128)", "name": "qrCode", "default": "''", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }] }, { "type": "int", "name": "price", "default": "0", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }, { "name": "unsigned", "value": false, "description": "无符号" }] }, { "type": "varchar(45)", "name": "userId", "default": "''", "options": [{ "name": "not null", "value": true, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }] }]
- order,用于存放订单信息
[{ "type": "char(45)", "name": "userId", "default": "''", "options": [{ "name": "not null", "value": true, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }] }, { "type": "char(45)", "name": "deviceId", "default": "''", "options": [{ "name": "not null", "value": true, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }] }, { "type": "char(128)", "name": "outTradeNo", "default": "''", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }] }, { "type": "tinyint", "name": "payType", "default": "1", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }, { "name": "unsigned", "value": false, "description": "无符号" }] }, { "type": "int", "name": "price", "default": "", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }, { "name": "unsigned", "value": false, "description": "无符号" }] }, { "type": "int", "name": "realPrice", "default": "", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }, { "name": "unsigned", "value": false, "description": "无符号" }] }, { "type": "char(128)", "name": "notifyUrl", "default": "''", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }] }, { "type": "char(128)", "name": "qrCode", "default": "''", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }] }, { "type": "tinyint", "name": "status", "default": "0", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }, { "name": "unsigned", "value": false, "description": "无符号" }] }, { "type": "timestamp", "name": "time", "default": "CURRENT_TIMESTAMP", "options": [{ "name": "not null", "value": false, "description": "不为空" }, { "name": "unique", "value": false, "description": "不重复" }] }]
6.创建微服务-数据录入服务
用于开发者上传收款二维码
打开web页面「微服务」/「数据录入服务」,新建一个服务,服务描述填写“上传价格”,选择”add_price”脚本,函数名不填。
点击“参数”/“参数源码”按钮,将如下参数源码粘贴进去并确认修改
[{
"name": "支付类型",
"id": "payType",
"type": "select",
"defaultValue": "微信:1,支付宝:2",
"description": ""
}, {
"name": "价格",
"id": "price",
"type": "float",
"defaultValue": "",
"description": ""
}, {
"name": "设备",
"id": "deviceId",
"type": "select",
"defaultValue": "{\"scriptName\":\"common\",\"functionName\":\"getDevice\"}",
"description": ""
}, {
"name": "二维码图片",
"id": "file",
"type": "file",
"defaultValue": "",
"description": ""
}]
7.创建微服务-数据查询服务
数据查询服务可以用于查询开发者上传的收款二维码和订单信息
打开web页面「微服务」/「数据查询服务」,新建下列数据查询服务,并将相应的配置参数粘贴进去并保存。
- 新建服务,服务描述填写“查询价格”,选择”query_price”脚本,函数名不填
- 选择“查询参数”/“参数源码”按钮,将如下参数源码粘贴进去并确认修改
[{ "name": "支付类型", "id": "query_type", "type": "select", "defaultValue": "微信:1,支付宝:2", "description": "" }]
- 选择“列”/“列源码”按钮,将如下列源码粘贴进去并确认修改
[{ "name": "支付类型", "id": "payType" }, { "name": "价格", "id": "price" }, { "name": "设备ID", "id": "deviceId" }, { "name": "二维码", "id": "qrCode" }]
- 选择“数据操作”/“操作源码”按钮,将如下操作源码粘贴进去并确认修改
[{ "name": "删除", "id": "delete", "scriptId": "5", "scriptName": "common", "functionName": "deletePrice" }]
- 选择“查询参数”/“参数源码”按钮,将如下参数源码粘贴进去并确认修改
- 新建服务,服务描述填写“查询订单”,选择”query_order”脚本,函数名不填
- 选择“查询参数”/“参数源码”按钮,将如下参数源码粘贴进去并确认修改
[{ "name": "设备", "id": "deviceId", "type": "select", "defaultValue": "{\"scriptName\":\"common\",\"functionName\":\"getDevice\", \"params\":[true]}\t", "description": "" }]
- 选择“列”/“列源码”按钮,将如下列源码粘贴进去并确认修改
[{ "name": "设备", "id": "deviceId" }, { "name": "用户id", "id": "userId" }, { "name": "交易NO", "id": "outTradeNo" }, { "name": "支付类型", "id": "payType" }, { "name": "价格", "id": "price" }, { "name": "支付价格", "id": "realPrice" }, { "name": "状态", "id": "status" }, { "name": "时间", "id": "time" }]
- 选择“数据操作”/“操作源码”按钮,将如下操作源码粘贴进去并确认修改
[{ "name": "删除", "id": "delete", "scriptId": "5", "scriptName": "common", "functionName": "deleteOrder" }]
- 选择“查询参数”/“参数源码”按钮,将如下参数源码粘贴进去并确认修改
测试
测试下支付效果
1.上传收款二维码
打开web页面「微服务」/「数据录入服务」,找到“上传价格”服务,然后点击“执行”,在弹出的对话框中填入价格、收款二维码图片等信息(注意:选择图片后一定要点击上传按钮),最后点击“执行”(注意,这里最好直接截屏收款二维码,不要把二维码图扣下来)
2.检查收款二维码是否上传成功
打开web页面「微服务」/「数据查询服务」,找到“查询价格”服务,然后点击“查询“按钮即可查询已经上传的收款二维码,检查确认收款二维码是否上传完成
3.启动移动端APP
打开手机端「冰狐智能辅助」APP,点击“点击这里启动设备”启动设备。
4.用postman模拟第三方后端服务调用接口生成订单
5.检查订单是否生成成功
调用后就生成了对应的支付订单,可在「微服务」/「数据查询服务」,“订单查询”服务中,点击“查询”按钮查询订单。
6.支付
用其他微信向收款微信支付对应的费用(注意这里金额必须和第4步生成订单的价格一样)。
7.检查订单是否支付成功
在「微服务」/「数据查询服务」,“订单查询”服务中,点击“查询”按钮查询订单,看刚才的订单是否显示支付成功。
总结
本文介绍了一种基于「冰狐智能辅助」平台,免费的、不需编写代码的个人免签收款方案和具体实现细节。有任何问题,欢迎评论区给我留言,感谢!