efront 3.21.2 → 3.21.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pay/alipay-callback.jsp +23 -0
- package/apps/pay/alipay.ico +0 -0
- package/apps/pay/alipay.jsp +99 -0
- package/apps/pay/alipay_test.html +3 -0
- package/apps/pay/alipay_test.js +16 -0
- package/coms/basic/BigNumber.js +184 -0
- package/coms/basic/BigNumber_test.js +51 -0
- package/coms/basic/cross_.js +14 -7
- package/coms/basic/submit_.js +19 -0
- package/coms/basic/valid.js +21 -0
- package/coms/frame/payment.html +34 -0
- package/coms/frame/payment.js +48 -0
- package/coms/frame/payment.less +35 -0
- package/coms/zimoli/data.js +1 -1
- package/coms/zimoli/render.js +49 -55
- package/coms/zimoli/zimoli.js +1 -1
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/coms/zimoli/BigNumber.js +0 -216
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script serverside>
|
|
2
|
+
// ?charset=utf-8&out_trade_no=alipay-2021120305080870&method=alipay.trade.page.pay.return&total_amount=1.01&sign=egtaa%2BmHp4JDDJL%2FeUc0Cw3E6WIJVBJL%2BWwRo2ntz824dxHY4xK0LTLgE2Pqoq8nqgBntZfLMgHvGjEq7GII0dlbX45JSe7eucgnhvyXXdQClkQLfAD0vGDEBcHylk6LkDumMwBqR12VX%2F%2FBCOlPdXx1fxzImZRwz6N72k6lmViPgrYdD17O%2Bhkg2fsN4kvMHPreIicChEfkNGtYCXZJm8iCYn3MyT4EMh0Yy2ppoW8yLHJ%2Bp4iVtJLkGCiAhYxij1eu5BveFk9aeyhEqDmAv0UoushtB6ZE2t%2BiXPvunnvM8cWUiXIJ6NRf87OLjkDSzdhkc5VTRVgPwv3KjGhSYw%3D%3D&trade_no=2021120322001426351454501632&auth_app_id=2021002143612677&version=1.0&app_id=2021002143612677&sign_type=RSA2&seller_id=2088702544831143×tamp=2021-12-03+10%3A31%3A57
|
|
3
|
+
var query = parseURL(req.url).query;
|
|
4
|
+
var params = await _runtask("alipay-verify", query);
|
|
5
|
+
var id = params.out_trade_no;
|
|
6
|
+
|
|
7
|
+
var data = await _runtask("couchdb", "get", `alipay-log/${id}`);
|
|
8
|
+
await _runtask("couchdb", "put", `alipay-log/${id}?_rev=${data._rev}`, extend(data, {
|
|
9
|
+
alipay_trade_no: params.trade_no,
|
|
10
|
+
seller_id: params.seller_id,
|
|
11
|
+
return_amount: params.total_amount,
|
|
12
|
+
return_time: new Date().toISOString(),
|
|
13
|
+
}));
|
|
14
|
+
context.id = params.out_trade_no;
|
|
15
|
+
</script>
|
|
16
|
+
<script>
|
|
17
|
+
var id =<% JSON.stringify(context.id || null) %>;
|
|
18
|
+
if (id) parent.postMessage(id);
|
|
19
|
+
</script>
|
|
20
|
+
<script serverside>
|
|
21
|
+
if(context.id)return `<body style="color:green">支付完成</body>`;
|
|
22
|
+
else return `<body style="color:red">支付失败</body>`
|
|
23
|
+
</script>
|
|
Binary file
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<script serverside>
|
|
2
|
+
var error_codes = `ACQ.SYSTEM_ERROR 接口返回错误 请立即调用查询订单API,查询当前订单的状态,并根据订单状态决定下一步的操作
|
|
3
|
+
ACQ.INVALID_PARAMETER 参数无效 检查请求参数,修改后重新发起请求
|
|
4
|
+
ACQ.ACCESS_FORBIDDEN 无权限使用接口 联系支付宝小二签约
|
|
5
|
+
ACQ.EXIST_FORBIDDEN_WORD 订单信息中包含违禁词 修改订单信息后,重新发起请求
|
|
6
|
+
ACQ.PARTNER_ERROR 应用APP_ID填写错误 联系支付宝小二,确认APP_ID的状态
|
|
7
|
+
ACQ.TOTAL_FEE_EXCEED 订单总金额超过限额 修改订单金额再发起请求
|
|
8
|
+
ACQ.CONTEXT_INCONSISTENT 交易信息被篡改 更换商家订单号后,重新发起请求
|
|
9
|
+
ACQ.TRADE_HAS_SUCCESS 交易已被支付 确认该笔交易信息是否为当前买家的,如果是则认为交易付款成功,如果不是则更换商家订单号后,重新发起请求
|
|
10
|
+
ACQ.TRADE_HAS_CLOSE 交易已经关闭 更换商家订单号后,重新发起请求
|
|
11
|
+
ACQ.BUYER_SELLER_EQUAL 买卖家不能相同 更换买家重新付款
|
|
12
|
+
ACQ.TRADE_BUYER_NOT_MATCH 交易买家不匹配 更换商家订单号后,重新发起请求
|
|
13
|
+
ACQ.BUYER_ENABLE_STATUS_FORBID 买家状态非法 用户联系支付宝小二,确认买家状态为什么非法
|
|
14
|
+
ACQ.BUYER_PAYMENT_AMOUNT_DAY_LIMIT_ERROR 买家付款日限额超限 更换买家进行支付
|
|
15
|
+
ACQ.BEYOND_PAY_RESTRICTION 商户收款额度超限 联系支付宝小二提高限额
|
|
16
|
+
ACQ.BEYOND_PER_RECEIPT_RESTRICTION 商户收款金额超过月限额 联系支付宝小二提高限额
|
|
17
|
+
ACQ.BUYER_PAYMENT_AMOUNT_MONTH_LIMIT_ERROR 买家付款月额度超限 让买家更换账号后,重新付款或者更换其它付款方式
|
|
18
|
+
ACQ.SELLER_BEEN_BLOCKED 商家账号被冻结 联系支付宝小二,解冻账号
|
|
19
|
+
ACQ.ERROR_BUYER_CERTIFY_LEVEL_LIMIT 买家未通过人行认证 让用户联系支付宝小二并更换其它付款方式
|
|
20
|
+
ACQ.INVALID_STORE_ID 商户门店编号无效 检查传入的门店编号是否符合规则
|
|
21
|
+
ACQ.APPLY_PC_MERCHANT_CODE_ERROR 申请二维码失败 请确认同样的订单号不能重复多次申请二维码,如有问题请联系支付宝小二处理
|
|
22
|
+
ACQ.SECONDARY_MERCHANT_STATUS_ERROR 商户状态异常 请联系对应的服务商咨询
|
|
23
|
+
ACQ.BEYOND_PER_RECEIPT_DAY_RESTRICTION 订单金额超过当日累计限额 联系支付宝小二提高限额(联系电话:95188)
|
|
24
|
+
ACQ.BEYOND_PER_RECEIPT_SINGLE_RESTRICTION 订单金额超过单笔限额 联系支付宝小二提高限额(联系电话:95188)
|
|
25
|
+
ACQ.TRADE_SETTLE_ERROR 交易结算异常 请检查传入的结算项信息是否正确,如果正确请联系支付宝小二
|
|
26
|
+
ACQ.SECONDARY_MERCHANT_ID_INVALID 二级商户不存在 请检查传入的二级商户编号是否正确
|
|
27
|
+
ACQ.SECONDARY_MERCHANT_ISV_PUNISH_INDIRECT 商户状态异常 请联系对应的服务商咨询
|
|
28
|
+
ACQ.SELLER_NOT_EXIST 卖家不存在 确认卖家信息是否传递正确
|
|
29
|
+
ACQ.SECONDARY_MERCHANT_ALIPAY_ACCOUNT_INVALID 二级商户账户异常 确认传入的二级商户结算账户是否与进件时设置的结算账户一致,如果一致可联系支付宝小二确认是否商户的账号信息有变更
|
|
30
|
+
ACQ.INVALID_RECEIVE_ACCOUNT 收款账户不支持 确认seller_id信息是否传递正确,如正确请确认seller_id是否在签约中设置了收款权限
|
|
31
|
+
ACQ.SECONDARY_MERCHANT_ID_BLANK 二级商户编号错误 请检查是否正确传入二级商户编号
|
|
32
|
+
ACQ.NOW_TIME_AFTER_EXPIRE_TIME_ERROR 当前时间已超过允许支付的时间 请检查传入的支付超时时间是否正确
|
|
33
|
+
ACQ.SECONDARY_MERCHANT_NOT_MATCH 二级商户信息不匹配 请检查传入的二级商户编号是否正确
|
|
34
|
+
ACQ.BUYER_NOT_EXIST 买家不存在 确认买家账号信息传递是否正确,如果正确可联系支付宝小二,确认买家账号是否已经注销
|
|
35
|
+
ACQ.SUB_GOODS_SIZE_MAX_COUNT 子商品明细超长 请检查子商品明细是否超过了150条
|
|
36
|
+
ACQ.DEFAULT_SETTLE_RULE_NOT_EXIST 默认结算条款不存在 请确认二级商户进件是已经设置了默认结算账户
|
|
37
|
+
ACQ.MERCHANT_PERM_RECEIPT_SUSPEND_LIMIT 商户暂停收款 联系支付宝小二处理(联系电话:95188)
|
|
38
|
+
ACQ.MERCHANT_PERM_RECEIPT_SINGLE_LIMIT 超过单笔收款限额 联系支付宝小二处理(联系电话:95188)
|
|
39
|
+
ACQ.MERCHANT_PERM_RECEIPT_DAY_LIMIT 超过单日累计收款额度 联系支付宝小二处理(联系电话:95188)`.split(/[\r\n]+/).map(s => {
|
|
40
|
+
var [code, error, info] = s.split('\t');
|
|
41
|
+
return { code, error, info };
|
|
42
|
+
});
|
|
43
|
+
function createId() {
|
|
44
|
+
var d = new Date();
|
|
45
|
+
var id = "00000000" + String(+d % 86400000 ^ (process.pid & 0xfff) << 12 ^ process.pid >> 12);
|
|
46
|
+
id = id.slice(-8);
|
|
47
|
+
return [d.getFullYear(), d.getMonth() + 1, d.getDate(), id].map(pad).join('');
|
|
48
|
+
}
|
|
49
|
+
function pad(a) {
|
|
50
|
+
if (a < 10) return "0" + a;
|
|
51
|
+
return a;
|
|
52
|
+
}
|
|
53
|
+
var now = new Date();
|
|
54
|
+
function createStamp(now) {
|
|
55
|
+
var d = now;
|
|
56
|
+
return [d.getFullYear(), d.getMonth() + 1, d.getDate()].map(pad).join("-") +
|
|
57
|
+
" " + [d.getHours(), d.getMinutes(), d.getSeconds()].map(pad).join(":");
|
|
58
|
+
}
|
|
59
|
+
var amount = request.id;
|
|
60
|
+
if (!/^(\d+)(\.\d+)?$/.test(amount)) amount = encode62.timedecode(request.id);
|
|
61
|
+
var [amount, subject = '网页扫码支付'] = amount.split(',');
|
|
62
|
+
if (!+amount) return forbidden("参数异常");
|
|
63
|
+
var biz_content = {
|
|
64
|
+
out_trade_no: "alipay-" + createId(),
|
|
65
|
+
product_code: 'FAST_INSTANT_TRADE_PAY',
|
|
66
|
+
total_amount: amount,
|
|
67
|
+
qr_pay_mode: 4,
|
|
68
|
+
qrcode_width: 256,
|
|
69
|
+
subject: subject,
|
|
70
|
+
body: subject,
|
|
71
|
+
};
|
|
72
|
+
var params = {
|
|
73
|
+
timestamp: createStamp(now),
|
|
74
|
+
method: "alipay.trade.page.pay",
|
|
75
|
+
app_id: "2021002143612677",
|
|
76
|
+
sign_type: "RSA2",
|
|
77
|
+
version: "1.0",
|
|
78
|
+
charset: "utf-8",
|
|
79
|
+
return_url: `${req.protocol}//${req.headers.host}${req.url.replace(/[\.\:][\s\S]*$/, '')}-callback`,
|
|
80
|
+
biz_content: JSON.stringify(biz_content)
|
|
81
|
+
};
|
|
82
|
+
await _runtask("alipay-sign", params);
|
|
83
|
+
|
|
84
|
+
var log = await _runtask("couchdb", "put", "alipay-log/" + biz_content.out_trade_no, {
|
|
85
|
+
_id: biz_content.out_trade_no,
|
|
86
|
+
total_amount: biz_content.total_amount,
|
|
87
|
+
qr_pay_mode: biz_content.qr_pay_mode,
|
|
88
|
+
qrcode_width: biz_content.qrcode_width,
|
|
89
|
+
subject: biz_content.subject,
|
|
90
|
+
body: biz_content.body,
|
|
91
|
+
timestamp: params.timestamp,
|
|
92
|
+
create_time: now.toISOString(),
|
|
93
|
+
return_url: biz_content.return_url
|
|
94
|
+
});
|
|
95
|
+
res.writeHead(302, {
|
|
96
|
+
Location: "https://openapi.alipay.com/gateway.do?" + serialize(params)
|
|
97
|
+
});
|
|
98
|
+
res.end();
|
|
99
|
+
</script>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
var pay = frame$payment([
|
|
2
|
+
{
|
|
3
|
+
url: './alipay:',
|
|
4
|
+
name: '支付宝',
|
|
5
|
+
icon: 'alipay.ico',
|
|
6
|
+
cost(price) {
|
|
7
|
+
return BigNumber.prd((0.6036218 + 0.204081632) / 100, price);
|
|
8
|
+
},
|
|
9
|
+
}
|
|
10
|
+
], 1.00, '支付宝支付测试');
|
|
11
|
+
popup(pay, true);
|
|
12
|
+
console.log(pay)
|
|
13
|
+
care(pay, 'payment', function (a) {
|
|
14
|
+
remove(pay);
|
|
15
|
+
document.write("支付完成:" + a);
|
|
16
|
+
});
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
var trim = function (a) {
|
|
2
|
+
return String(a).replace(/[\s\,]/g, '').replace(/^\+/, '').replace(/[mni]$/i, '');
|
|
3
|
+
};
|
|
4
|
+
var prepare = function (a) {
|
|
5
|
+
a = trim(a);
|
|
6
|
+
var neg = /^\-/.test(a);
|
|
7
|
+
if (neg) a = a.slice(1);
|
|
8
|
+
var [s1, s2 = ''] = a.split('.');
|
|
9
|
+
s2 = s2.replace(/0+$/, '');
|
|
10
|
+
return [neg, s1, s2];
|
|
11
|
+
};
|
|
12
|
+
var repeat = String.prototype.repeat || function (n) {
|
|
13
|
+
return new Array(n + 1).join(this);
|
|
14
|
+
};
|
|
15
|
+
var repeat0 = function (n) {
|
|
16
|
+
return repeat.call('0', n);
|
|
17
|
+
};
|
|
18
|
+
var split = function (s, n) {
|
|
19
|
+
var r = [];
|
|
20
|
+
var end = s.length;
|
|
21
|
+
while (end > n) {
|
|
22
|
+
r.push(s.slice(end - n, end));
|
|
23
|
+
end -= n;
|
|
24
|
+
}
|
|
25
|
+
r.push(s.slice(0, end));
|
|
26
|
+
return r;
|
|
27
|
+
};
|
|
28
|
+
var fixme = function (neg, res, nl) {
|
|
29
|
+
if (nl > 0) res = res.slice(0, res.length - nl) + "." + res.slice(res.length - nl).replace(/0+$/, '');
|
|
30
|
+
res = res.replace(/^0+(?!\.)/, '');
|
|
31
|
+
if (/^\./.test(res)) res = '0' + res;
|
|
32
|
+
if (neg) res = '-' + res;
|
|
33
|
+
return res.replace(/\.$/, '');
|
|
34
|
+
};
|
|
35
|
+
var fixde = function (numstr, fractionDigits, compare) {
|
|
36
|
+
var [neg, s1, s2] = prepare(numstr);
|
|
37
|
+
var frag = +s2.charAt(fractionDigits) > compare;
|
|
38
|
+
if (!frag && compare === 0) {
|
|
39
|
+
frag = s2.length > fractionDigits;
|
|
40
|
+
}
|
|
41
|
+
if (s2.length < fractionDigits) {
|
|
42
|
+
s2 += repeat0(fractionDigits - s2.length);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
s2 = s2.slice(0, fractionDigits);
|
|
46
|
+
}
|
|
47
|
+
var res = s1 + s2;
|
|
48
|
+
if (frag) {
|
|
49
|
+
res = BigNumber.add(res, 1);
|
|
50
|
+
}
|
|
51
|
+
if (fractionDigits > 0) res = res.slice(0, res.length - fractionDigits) + '.' + res.slice(res.length - fractionDigits);
|
|
52
|
+
if (/^\./.test(res)) res = "0" + res;
|
|
53
|
+
if (neg) res = '-' + res;
|
|
54
|
+
return res;
|
|
55
|
+
};
|
|
56
|
+
class BigNumber {
|
|
57
|
+
constructor(value) {
|
|
58
|
+
if (!this || this.constructor !== BigNumber) {
|
|
59
|
+
return new BigNumber(value);
|
|
60
|
+
}
|
|
61
|
+
this.value = value;
|
|
62
|
+
}
|
|
63
|
+
toString() {
|
|
64
|
+
return this.value;
|
|
65
|
+
};
|
|
66
|
+
add(bignumber) {
|
|
67
|
+
return new BigNumber(BigNumber.add(this.value, bignumber));
|
|
68
|
+
};
|
|
69
|
+
static round(numstr) {
|
|
70
|
+
return fixde(numstr, 0, 4);
|
|
71
|
+
}
|
|
72
|
+
static ceil(numstr) {
|
|
73
|
+
return fixde(numstr, 0, 0);
|
|
74
|
+
}
|
|
75
|
+
static floor(numstr) {
|
|
76
|
+
return fixde(numstr, 0, 9);
|
|
77
|
+
}
|
|
78
|
+
static fix(numstr, fractionDigits) {
|
|
79
|
+
fractionDigits = +fractionDigits || 0;
|
|
80
|
+
if (fractionDigits < 0 || fractionDigits > 100) {
|
|
81
|
+
throw new Error("小数位数只能是0和100之间的数字");
|
|
82
|
+
}
|
|
83
|
+
return fixde(numstr, fractionDigits, 4);
|
|
84
|
+
}
|
|
85
|
+
static add(numstr1, numstr2) {
|
|
86
|
+
var [neg1, s11, s12] = prepare(numstr1)
|
|
87
|
+
var [neg2, s21, s22] = prepare(numstr2)
|
|
88
|
+
var nl = 0;
|
|
89
|
+
if (s12.length < s22.length) {
|
|
90
|
+
nl = s22.length;
|
|
91
|
+
s12 += repeat0(nl - s12.length);
|
|
92
|
+
}
|
|
93
|
+
else if (s22.length < s12.length) {
|
|
94
|
+
nl = s12.length;
|
|
95
|
+
s22 += repeat0(nl - s22.length);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
nl = s12.length;
|
|
99
|
+
}
|
|
100
|
+
if (s11.length < s21.length) {
|
|
101
|
+
s11 = repeat0(s21.length - s11.length) + s11;
|
|
102
|
+
}
|
|
103
|
+
else if (s11.length > s21.length) {
|
|
104
|
+
s21 = repeat0(s11.length - s21.length) + s21;
|
|
105
|
+
}
|
|
106
|
+
numstr1 = s11 + s12;
|
|
107
|
+
numstr2 = s21 + s22;
|
|
108
|
+
var flag = 1;
|
|
109
|
+
if (neg1 ^ neg2) {
|
|
110
|
+
if (numstr1 > numstr2) {
|
|
111
|
+
neg = neg1;
|
|
112
|
+
}
|
|
113
|
+
else if (numstr1 < numstr2) {
|
|
114
|
+
neg = neg2;
|
|
115
|
+
[numstr1, numstr2] = [numstr2, numstr1];
|
|
116
|
+
}
|
|
117
|
+
flag = 0;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
var neg = neg1 && neg2;
|
|
121
|
+
}
|
|
122
|
+
var res = [];
|
|
123
|
+
var end = (numstr1.length / 15 | 0) * 15;
|
|
124
|
+
var rest = 0;
|
|
125
|
+
while (end >= 0) {
|
|
126
|
+
var s1 = numstr1.slice(end, end + 15);
|
|
127
|
+
var s2 = numstr2.slice(end, end + 15);
|
|
128
|
+
var s = +s1 + (flag ? +s2 : -s2) + rest;
|
|
129
|
+
if (s < 0) {
|
|
130
|
+
s = +("1" + repeat0(s1.length)) + s;
|
|
131
|
+
rest = -1;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
rest = 0;
|
|
135
|
+
}
|
|
136
|
+
s = s.toFixed(0);
|
|
137
|
+
if (s.length > s1.length) {
|
|
138
|
+
rest = 1;
|
|
139
|
+
res.push(s.slice(1))
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (s.length < s1.length) s = repeat0(s1.length - s.length) + s;
|
|
143
|
+
res.push(s);
|
|
144
|
+
}
|
|
145
|
+
end -= 15;
|
|
146
|
+
}
|
|
147
|
+
if (rest) res.push(rest);
|
|
148
|
+
res = res.reverse().join('');
|
|
149
|
+
return fixme(neg, res, nl);
|
|
150
|
+
}
|
|
151
|
+
static prd(numstr1, numstr2) {
|
|
152
|
+
var [neg1, s11, s12] = prepare(numstr1);
|
|
153
|
+
var [neg2, s21, s22] = prepare(numstr2);
|
|
154
|
+
var d = s12.length + s22.length;
|
|
155
|
+
numstr1 = s11 + s12;
|
|
156
|
+
numstr2 = s21 + s22;
|
|
157
|
+
if (numstr1.length < numstr2.length) [numstr1, numstr2] = [numstr2, numstr1];
|
|
158
|
+
var ns1 = split(numstr1, 7);
|
|
159
|
+
var ns2 = split(numstr2, 7);
|
|
160
|
+
var res = [];
|
|
161
|
+
var i = 0;
|
|
162
|
+
for (var cx = 0, dx = ns1.length; cx < dx; cx++) {
|
|
163
|
+
var s1 = ns1[cx];
|
|
164
|
+
for (var cy = 0, dy = ns2.length; cy < dy; cy++) {
|
|
165
|
+
var s2 = ns2[cy];
|
|
166
|
+
var i = cx + cy;
|
|
167
|
+
var rest = +res[i] || 0;
|
|
168
|
+
var s = s1 * s2 + rest;
|
|
169
|
+
s = String(s);
|
|
170
|
+
if (s.length > 7) {
|
|
171
|
+
rest = +s.slice(0, s.length - 7);
|
|
172
|
+
res[i] = s.slice(s.length - 7);
|
|
173
|
+
res[i + 1] = (+res[i + 1] || 0) + rest;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
if (s.length < 7) s = repeat0(7 - s.length) + s;
|
|
177
|
+
res[i] = s;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
res = res.reverse().join('');
|
|
182
|
+
return fixme(neg1 ^ neg2, res, d);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
var testAdd = function (a, b, s) {
|
|
2
|
+
assert(BigNumber.add(a, b), s, `${a} + ${b}`);
|
|
3
|
+
};
|
|
4
|
+
var testPrd = function (a, b, s) {
|
|
5
|
+
assert(BigNumber.prd(a, b), s, `${a} * ${b}`);
|
|
6
|
+
};
|
|
7
|
+
testAdd(0x1fffffffffffff, 1, '9007199254740992');
|
|
8
|
+
testAdd(0x1fffffffffffff, 2, '9007199254740993');
|
|
9
|
+
testAdd(0x1fffffffffffff, 3, '9007199254740994');
|
|
10
|
+
testAdd(0x1fffffffffffff, 3, '9007199254740994');
|
|
11
|
+
testAdd("900719925474099.2", 0.1, '900719925474099.3');
|
|
12
|
+
testAdd("900719925474099.2", 0.1, '900719925474099.3');
|
|
13
|
+
testAdd("900719925474099.3", -0.2, '900719925474099.1');
|
|
14
|
+
testAdd("900719925474099.39007199254740992", "-900719925474099.39007199254740992", '0');
|
|
15
|
+
testAdd("900719925474099.39007199254740992", 0.2, '900719925474099.59007199254740992');
|
|
16
|
+
testAdd("900719925474099.39007199254740992", "-900719925474099.39007", '0.00000199254740992');
|
|
17
|
+
testAdd("90071992547409939007.199254740992", 0.2, '90071992547409939007.399254740992');
|
|
18
|
+
testAdd("-90071992547409939007.199254740992", 0.2, '-90071992547409939006.999254740992');
|
|
19
|
+
var getrandomint = function () {
|
|
20
|
+
var n = BigInt(Math.random() * new Date | 0) * BigInt(Math.random() * new Date | 0) * BigInt(Math.random() * new Date | 0);
|
|
21
|
+
return n;
|
|
22
|
+
}
|
|
23
|
+
testPrd(1, 2, '2');
|
|
24
|
+
testPrd(1, 0.2, '0.2');
|
|
25
|
+
testPrd("9007199254740992.1", 0.1, '900719925474099.21');
|
|
26
|
+
testPrd("9007199254740992.1", 0.01, '90071992547409.921');
|
|
27
|
+
for (var cx = 0, dx = 1000; cx < dx; cx++) {
|
|
28
|
+
var n1 = getrandomint();
|
|
29
|
+
var n2 = getrandomint();
|
|
30
|
+
var s = String(n1 + n2);
|
|
31
|
+
testAdd(n1, n2, s);
|
|
32
|
+
testPrd(n1, n2, String(n1 * n2));
|
|
33
|
+
}
|
|
34
|
+
assert(BigNumber.fix(2, 2), '2.00');
|
|
35
|
+
assert(BigNumber.fix(2.234, 6), '2.234000');
|
|
36
|
+
assert(BigNumber.fix(2.235, 6), '2.235000');
|
|
37
|
+
assert(BigNumber.fix(2.235, 2), '2.24');
|
|
38
|
+
assert(BigNumber.fix(2.234, 2), '2.23');
|
|
39
|
+
assert(BigNumber.fix(2.2351, 2), '2.24');
|
|
40
|
+
assert(BigNumber.fix(2.2349, 2), '2.23');
|
|
41
|
+
assert(BigNumber.round(2.2349), '2');
|
|
42
|
+
assert(BigNumber.round(2.4999), '2');
|
|
43
|
+
assert(BigNumber.round(2.5000), '3');
|
|
44
|
+
assert(BigNumber.round(2.5100), '3');
|
|
45
|
+
assert(BigNumber.ceil(2.5100), '3');
|
|
46
|
+
assert(BigNumber.ceil(2.000), '2');
|
|
47
|
+
assert(BigNumber.floor(2.000), '2');
|
|
48
|
+
assert(BigNumber.floor(2.999), '2');
|
|
49
|
+
assert(BigNumber.ceil(2.001), '3');
|
|
50
|
+
assert(BigNumber.ceil(2.999), '3');
|
|
51
|
+
assert(BigNumber.fix("9007199254740992.234", 6), '9007199254740992.234000');
|
package/coms/basic/cross_.js
CHANGED
|
@@ -58,6 +58,18 @@ function toResponse() {
|
|
|
58
58
|
if (this.responseType === 'json') return JSON.stringify(this.response);
|
|
59
59
|
return this.response;
|
|
60
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* @this {XMLHttpRequest}
|
|
63
|
+
*/
|
|
64
|
+
var XMLHttpRequest_abort = function () {
|
|
65
|
+
removeFromList(requests, this);
|
|
66
|
+
delete this.abort;
|
|
67
|
+
if (isFunction(this.abort)) this.abort(this);
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* @param { () => XMLHttpRequest } jsonp
|
|
71
|
+
* @this { () => XMLHttpRequest }
|
|
72
|
+
*/
|
|
61
73
|
function cross_(jsonp, digest = noop, method, url, headers) {
|
|
62
74
|
var originDomain = getDomainPath(url);
|
|
63
75
|
if (!originDomain) throw new Error("路径格式错误!");
|
|
@@ -326,11 +338,7 @@ function cross_(jsonp, digest = noop, method, url, headers) {
|
|
|
326
338
|
onerrors.push(oh);
|
|
327
339
|
flush();
|
|
328
340
|
};
|
|
329
|
-
|
|
330
|
-
xhr.abort = function () {
|
|
331
|
-
removeFromList(requests, this);
|
|
332
|
-
if (isFunction(abort)) abort.call(this);
|
|
333
|
-
};
|
|
341
|
+
xhr.abort = XMLHttpRequest_abort;
|
|
334
342
|
xhr.delCookies = function () {
|
|
335
343
|
delCookies(originDomain);
|
|
336
344
|
xhr.nocookie = true;
|
|
@@ -394,8 +402,7 @@ cross_.bind = function () {
|
|
|
394
402
|
extend(cross_, {
|
|
395
403
|
requests,
|
|
396
404
|
abortAll() {
|
|
397
|
-
var
|
|
398
|
-
for (var r of rs) r.abort();
|
|
405
|
+
for (var r of requests) r.abort();
|
|
399
406
|
},
|
|
400
407
|
setHost,
|
|
401
408
|
addReform,
|
package/coms/basic/submit_.js
CHANGED
|
@@ -21,6 +21,25 @@ function submit(fields, data) {
|
|
|
21
21
|
}
|
|
22
22
|
else {
|
|
23
23
|
params[f.key] = data[f.key];
|
|
24
|
+
var tmp = /\:(\d+)?(?:\.(\d+))?$/.exec(f.type);
|
|
25
|
+
if (tmp) var [, , fixed] = tmp;
|
|
26
|
+
else if (/^(money|price)$/i.test(f.type)) fixed = 2;
|
|
27
|
+
fixed = +fixed;
|
|
28
|
+
if (fixed) {
|
|
29
|
+
var v = params[f.key];
|
|
30
|
+
if (v) {
|
|
31
|
+
var d = v.replace(/^[^\.]*\.?/, '').length;
|
|
32
|
+
if (d === v.length - 1) v = "0" + v;
|
|
33
|
+
if (d > 0 && d < fixed) {
|
|
34
|
+
v = v + new Array(fixed + 1 - d).join("0");
|
|
35
|
+
}
|
|
36
|
+
else if (d === 0) {
|
|
37
|
+
v = v.replace(/\.$/, '') + '.' + new Array(fixed + 1).join("0");
|
|
38
|
+
}
|
|
39
|
+
params[f.key] = v;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
24
43
|
}
|
|
25
44
|
}
|
|
26
45
|
if (checks.length + select.length + inputs.length) {
|
package/coms/basic/valid.js
CHANGED
|
@@ -6,6 +6,27 @@ function valid(field, data) {
|
|
|
6
6
|
}
|
|
7
7
|
return;
|
|
8
8
|
}
|
|
9
|
+
var tmp;
|
|
10
|
+
if (tmp = /\:(\d+)(?:\.(\d+))?$/.exec(field.type)) {
|
|
11
|
+
var [, a, b] = tmp;
|
|
12
|
+
var value = data[field.key];
|
|
13
|
+
a = +a;
|
|
14
|
+
b = +b;
|
|
15
|
+
if (a) {
|
|
16
|
+
if (!b) {
|
|
17
|
+
if (value.length > a) return `不能超过${a}个字符`;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
if (value.replace(/\.[\s\S]*$/, '').length > a) return `整数部分不能超过${a}位`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (b) {
|
|
24
|
+
var digits = value.replace(/^[^\.]+\./, '');
|
|
25
|
+
if (digits.length > b) {
|
|
26
|
+
return `小数部分不能超过${b}位`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
9
30
|
if (field.valid instanceof Function) {
|
|
10
31
|
var e = field.valid(data[field.key]);
|
|
11
32
|
if (e) return e;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<div class="head">
|
|
2
|
+
扫码支付
|
|
3
|
+
<close @click="closeView()"></close>
|
|
4
|
+
</div>
|
|
5
|
+
<div class="body">
|
|
6
|
+
<item>
|
|
7
|
+
<label>原始价格:</label>
|
|
8
|
+
<span v-model="(+price).toFixed(2)"></span>元
|
|
9
|
+
</item>
|
|
10
|
+
<item>
|
|
11
|
+
<label>支付渠道:</label>
|
|
12
|
+
<select ng-model="paytype">
|
|
13
|
+
<option disabled value="0">请选择</option>
|
|
14
|
+
<option v-repeat="(o,i) in paytypes" icon_=o.icon value_="i+1" -html="o.name"></option>
|
|
15
|
+
<!-- <option icon="/page/weixin.ico" value="2">微信</option> -->
|
|
16
|
+
</select>
|
|
17
|
+
</item>
|
|
18
|
+
<item>
|
|
19
|
+
<label>渠道费:</label>
|
|
20
|
+
<span b-bind="waycost"></span>元
|
|
21
|
+
</item>
|
|
22
|
+
<item ng-if="+paytype">
|
|
23
|
+
<label>应支付:</label>
|
|
24
|
+
<span style="color: red;">
|
|
25
|
+
<span v-model=finalpay></span>元
|
|
26
|
+
</span>
|
|
27
|
+
</item>
|
|
28
|
+
<item ng-if="+paytype">
|
|
29
|
+
<iframe _src="paysite" allowtransparency="true" scrolling="no">
|
|
30
|
+
</iframe>
|
|
31
|
+
</item>
|
|
32
|
+
<item>
|
|
33
|
+
</item>
|
|
34
|
+
</div>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
var paytype = data.getInstance("paytype");
|
|
2
|
+
function main(paytypes, price, subject = '网站扫码支付') {
|
|
3
|
+
var page = view();
|
|
4
|
+
page.innerHTML = payment;
|
|
5
|
+
renderWithDefaults(page, {
|
|
6
|
+
get paytype() {
|
|
7
|
+
return paytype.value || '0';
|
|
8
|
+
},
|
|
9
|
+
set paytype(value) {
|
|
10
|
+
data.patchInstance("paytype", { value }, true);
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
get waycost() {
|
|
14
|
+
var pay = this.paytypes[this.paytype - 1];
|
|
15
|
+
if (!pay) return 0;
|
|
16
|
+
var cost = pay.cost;
|
|
17
|
+
if (isFunction(cost)) cost = cost.call(pay, price);
|
|
18
|
+
return BigNumber.fix(cost, 2);
|
|
19
|
+
},
|
|
20
|
+
get paysite() {
|
|
21
|
+
var pay = this.paytypes[this.paytype - 1];
|
|
22
|
+
if (!pay) return 'about:blank';
|
|
23
|
+
var url = pay.url;
|
|
24
|
+
if (isFunction(url)) url = url.call(pay, this.finalpay, subject);
|
|
25
|
+
else if (url) url += encode62.timeencode(this.finalpay + "," + subject);
|
|
26
|
+
return url;
|
|
27
|
+
},
|
|
28
|
+
get finalpay() {
|
|
29
|
+
return BigNumber.fix(BigNumber.add(this.price, this.waycost), 2);
|
|
30
|
+
},
|
|
31
|
+
paytypes,
|
|
32
|
+
price,
|
|
33
|
+
closeView() {
|
|
34
|
+
remove(page);
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
drag.on(page.firstChild, page);
|
|
38
|
+
resize.on(page);
|
|
39
|
+
data.bindInstance("paytype", function (type) {
|
|
40
|
+
console.log(type)
|
|
41
|
+
});
|
|
42
|
+
var frame = page.querySelector("iframe");
|
|
43
|
+
bind("message")(frame, function (e) {
|
|
44
|
+
var id = e.data;
|
|
45
|
+
cast(page, 'payment', id);
|
|
46
|
+
});
|
|
47
|
+
return page;
|
|
48
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
& {
|
|
2
|
+
border: 1px solid #000;
|
|
3
|
+
position: absolute;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
label {
|
|
7
|
+
display: inline-block;
|
|
8
|
+
padding: 0 16px 0 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
>.head {
|
|
12
|
+
-webkit-app-region: no-drag;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.body {
|
|
16
|
+
item {
|
|
17
|
+
display: block;
|
|
18
|
+
padding: 0 16px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
iframe {
|
|
22
|
+
width: 256px;
|
|
23
|
+
height: 256px;
|
|
24
|
+
overflow: hidden;
|
|
25
|
+
border: none;
|
|
26
|
+
display: block;
|
|
27
|
+
margin: 20px auto;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
money {
|
|
31
|
+
display: block;
|
|
32
|
+
text-align: center;
|
|
33
|
+
color: red;
|
|
34
|
+
}
|
|
35
|
+
}
|