快速实现免费的个人免签收款功能(不写一行代码)

最近一直在研究使用冰狐智能辅助的“自动构建”功能在不编程的情况如何实现各种好玩的东东,由于自己利用业余时间开发的小工具需要用到收款功能,于是自然想到用“自动构建”试下,看是否可以搞定,先说结论:完美实现,亲测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页面「微服务」/「数据查询服务」,新建下列数据查询服务,并将相应的配置参数粘贴进去并保存。

  1. 新建服务,服务描述填写“查询价格”,选择”query_price”脚本,函数名不填
    1. 选择“查询参数”/“参数源码”按钮,将如下参数源码粘贴进去并确认修改
      [{
      	"name": "支付类型",
      	"id": "query_type",
      	"type": "select",
      	"defaultValue": "微信:1,支付宝:2",
      	"description": ""
      }]
    2. 选择“列”/“列源码”按钮,将如下列源码粘贴进去并确认修改
      [{
      	"name": "支付类型",
      	"id": "payType"
      }, {
      	"name": "价格",
      	"id": "price"
      }, {
      	"name": "设备ID",
      	"id": "deviceId"
      }, {
      	"name": "二维码",
      	"id": "qrCode"
      }]
    3. 选择“数据操作”/“操作源码”按钮,将如下操作源码粘贴进去并确认修改
      [{
      	"name": "删除",
      	"id": "delete",
      	"scriptId": "5",
      	"scriptName": "common",
      	"functionName": "deletePrice"
      }]
  2. 新建服务,服务描述填写“查询订单”,选择”query_order”脚本,函数名不填
    1. 选择“查询参数”/“参数源码”按钮,将如下参数源码粘贴进去并确认修改
      [{
      	"name": "设备",
      	"id": "deviceId",
      	"type": "select",
      	"defaultValue": "{\"scriptName\":\"common\",\"functionName\":\"getDevice\", \"params\":[true]}\t",
      	"description": ""
      }]
    2. 选择“列”/“列源码”按钮,将如下列源码粘贴进去并确认修改
      [{
      	"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"
      }]
    3. 选择“数据操作”/“操作源码”按钮,将如下操作源码粘贴进去并确认修改
      [{
      	"name": "删除",
      	"id": "delete",
      	"scriptId": "5",
      	"scriptName": "common",
      	"functionName": "deleteOrder"
      }]

测试

测试下支付效果

1.上传收款二维码

 打开web页面「微服务」/「数据录入服务」,找到“上传价格”服务,然后点击“执行”,在弹出的对话框中填入价格、收款二维码图片等信息(注意:选择图片后一定要点击上传按钮),最后点击“执行”(注意,这里最好直接截屏收款二维码,不要把二维码图扣下来

2.检查收款二维码是否上传成功

打开web页面「微服务」/「数据查询服务」,找到“查询价格”服务,然后点击“查询“按钮即可查询已经上传的收款二维码,检查确认收款二维码是否上传完成

3.启动移动端APP

打开手机端「冰狐智能辅助」APP,点击“点击这里启动设备”启动设备。

4.用postman模拟第三方后端服务调用接口生成订单

  1. 获取accessToken,参考文档
     
  2. 调用接口生成订单,参考文档

5.检查订单是否生成成功

调用后就生成了对应的支付订单,可在「微服务」/「数据查询服务」,“订单查询”服务中,点击“查询”按钮查询订单。

6.支付

用其他微信向收款微信支付对应的费用(注意这里金额必须和第4步生成订单的价格一样)。

7.检查订单是否支付成功

在「微服务」/「数据查询服务」,“订单查询”服务中,点击“查询”按钮查询订单,看刚才的订单是否显示支付成功。

总结

本文介绍了一种基于「冰狐智能辅助」平台,免费的、不需编写代码的个人免签收款方案和具体实现细节。有任何问题,欢迎评论区给我留言,感谢!

  • 12
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值