|
@@ -0,0 +1,176 @@
|
|
|
+const sm4 = require('../js/SM4');
|
|
|
+const SM4Exten = require('../js/SM4Exten');
|
|
|
+const miniprogramsm4 = require("../miniprogram_npm/miniprogram-sm-crypto/index").sm4;
|
|
|
+const secretId = "D2BCF8DE-AA24-4BF6-9C34-C8DD325E412B";//小程序应用ID
|
|
|
+const Secret = "6C680A47B87740138DFB299FC69A64E1";//小程序应用密钥
|
|
|
+const api_root = 'http://192.168.0.202:5006/'
|
|
|
+const CurrentBuId = '12345678-9abc-def0-1234-56789abcdef0';
|
|
|
+
|
|
|
+function request(path, method = 'GET', data = null) {
|
|
|
+
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ var sign_method = "HMAC_SM4";
|
|
|
+ var url = api_root + path;
|
|
|
+ var nonce = generateRandomString();
|
|
|
+ const timestamp = Date.now();
|
|
|
+ let jsonString = (data != null && method != 'GET') ? JSON.stringify(data) : '';
|
|
|
+ console.log('request :' + jsonString);
|
|
|
+ var stringToSign = "sign_method=" +sign_method +
|
|
|
+ "&secret_id=" +secretId+
|
|
|
+ "&nonce=" + nonce +
|
|
|
+ "×tamp=" + timestamp +
|
|
|
+ jsonString;
|
|
|
+ debugger
|
|
|
+ console.log('加密串 :' + stringToSign);
|
|
|
+ let key = stringToHex(Secret);//key转16进制
|
|
|
+ key = getFirst32Chars(key);//截取前16位
|
|
|
+ let signature = miniprogramsm4.encrypt(stringToSign, key)//sm4加密
|
|
|
+ //signature = signature.toUpperCase();
|
|
|
+ signature = stringToBase64(signature);//加密字符串转base64
|
|
|
+ console.log('signature :' + signature);
|
|
|
+ wx.request({
|
|
|
+ header: {
|
|
|
+ "sign_method": sign_method,
|
|
|
+ "secret_id": secretId,
|
|
|
+ "nonce": nonce,
|
|
|
+ "timestamp": timestamp,
|
|
|
+ "signature": signature,
|
|
|
+ "CurrentBuId" : CurrentBuId
|
|
|
+ },
|
|
|
+ url: url,
|
|
|
+ method: method,
|
|
|
+ data: data,
|
|
|
+ success: res => {
|
|
|
+ console.log("success");
|
|
|
+ resolve(res);
|
|
|
+ },
|
|
|
+ fail: res => {
|
|
|
+ console.log("request fail");
|
|
|
+ resolve(res);
|
|
|
+ },
|
|
|
+ })
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+//字符串转base64
|
|
|
+function stringToBase64(str) {
|
|
|
+ // 定义Base64字符集
|
|
|
+ const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
|
+
|
|
|
+ // 将字符串转换为UTF-8字节数组
|
|
|
+ let utf8Bytes = [];
|
|
|
+ for (let i = 0; i < str.length; i++) {
|
|
|
+ let charCode = str.charCodeAt(i);
|
|
|
+
|
|
|
+ if (charCode < 128) { // 1字节字符
|
|
|
+ utf8Bytes.push(charCode);
|
|
|
+ } else if (charCode < 2048) { // 2字节字符
|
|
|
+ utf8Bytes.push((charCode >> 6) | 192);
|
|
|
+ utf8Bytes.push((charCode & 63) | 128);
|
|
|
+ } else if (charCode < 65536) { // 3字节字符
|
|
|
+ utf8Bytes.push((charCode >> 12) | 224);
|
|
|
+ utf8Bytes.push(((charCode >> 6) & 63) | 128);
|
|
|
+ utf8Bytes.push((charCode & 63) | 128);
|
|
|
+ } else { // 4字节字符
|
|
|
+ utf8Bytes.push((charCode >> 18) | 240);
|
|
|
+ utf8Bytes.push(((charCode >> 12) & 63) | 128);
|
|
|
+ utf8Bytes.push(((charCode >> 6) & 63) | 128);
|
|
|
+ utf8Bytes.push((charCode & 63) | 128);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ let base64Str = '';
|
|
|
+ let paddingCount = 0;
|
|
|
+
|
|
|
+ // 处理每3个字节(24位),转换为4个Base64字符
|
|
|
+ for (let i = 0; i < utf8Bytes.length; i += 3) {
|
|
|
+ let byte1 = utf8Bytes[i];
|
|
|
+ let byte2 = i + 1 < utf8Bytes.length ? utf8Bytes[i + 1] : 0;
|
|
|
+ let byte3 = i + 2 < utf8Bytes.length ? utf8Bytes[i + 2] : 0;
|
|
|
+
|
|
|
+ let chunk = (byte1 << 16) | (byte2 << 8) | byte3;
|
|
|
+
|
|
|
+ let char1 = base64Chars[(chunk >> 18) & 63];
|
|
|
+ let char2 = base64Chars[(chunk >> 12) & 63];
|
|
|
+ let char3 = i + 1 < utf8Bytes.length ? base64Chars[(chunk >> 6) & 63] : '=';
|
|
|
+ let char4 = i + 2 < utf8Bytes.length ? base64Chars[chunk & 63] : '=';
|
|
|
+
|
|
|
+ base64Str += char1 + char2 + char3 + char4;
|
|
|
+
|
|
|
+ // 计算需要填充的'='号数量
|
|
|
+ if (i + 2 >= utf8Bytes.length) {
|
|
|
+ paddingCount = (utf8Bytes.length - i) % 3;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return base64Str;
|
|
|
+}
|
|
|
+//截取字符串
|
|
|
+function getFirst32Chars(str) {
|
|
|
+ if (typeof str !== 'string') {
|
|
|
+ throw new Error('Input must be a string');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果字符串长度小于等于32,则返回整个字符串;否则返回前32个字符
|
|
|
+ return str.length <= 32 ? str : str.slice(0, 32);
|
|
|
+}
|
|
|
+
|
|
|
+//字符串转16进制
|
|
|
+function stringToHex(str) {
|
|
|
+ let hex = '';
|
|
|
+ for (let i = 0; i < str.length; i++) {
|
|
|
+ // 获取字符的字符编码
|
|
|
+ const charCode = str.charCodeAt(i);
|
|
|
+ // 将字符编码转换为16进制,并确保始终为两位数(不足两位前面补0)
|
|
|
+ const hexValue = charCode.toString(16).padStart(2, '0');
|
|
|
+ hex += hexValue;
|
|
|
+ }
|
|
|
+ return hex;
|
|
|
+}
|
|
|
+
|
|
|
+function generateRandomString(minLength = 6, maxLength = 10) {
|
|
|
+ // 定义字符集
|
|
|
+ const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
|
+
|
|
|
+ // 生成随机长度
|
|
|
+ const length = Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength;
|
|
|
+
|
|
|
+ let result = '';
|
|
|
+ for (let i = 0; i < length; i++) {
|
|
|
+ // 随机选择一个字符
|
|
|
+ const randomIndex = Math.floor(Math.random() * charset.length);
|
|
|
+ result += charset[randomIndex];
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+//获取站点信息
|
|
|
+function request_getSite(data) {
|
|
|
+ return request('api/Nozzle/GetNozzleInfo?Nozzleid='+ data, "GET",data);
|
|
|
+}
|
|
|
+//支付
|
|
|
+function request_wechatPay(data) {
|
|
|
+ return request('api/Transactions/UnifiedOrder?trxid='+ data, "GET",data);
|
|
|
+}
|
|
|
+
|
|
|
+//获取站点信息与用户信息
|
|
|
+function request_GetSiteInfo(data) {
|
|
|
+ return request('api/Site/GetSiteInfo', "GET",data);
|
|
|
+}
|
|
|
+
|
|
|
+//小程序用户查询未支付订单
|
|
|
+function request_GetMiniProgramTransactionsUnpaidQuery(data) {
|
|
|
+ return request('api/Transactions/GetMiniProgramTransactionsUnpaidQuery', "GET",data);
|
|
|
+}
|
|
|
+
|
|
|
+//小程序用户根据抢号查询未支付订单
|
|
|
+function request_GetMiniProgramTransactionsUnpaidNozzle(data) {
|
|
|
+ return request('api/Transactions/GetMiniProgramTransactionsUnpaidNozzle', "GET",data);
|
|
|
+}
|
|
|
+
|
|
|
+export default {
|
|
|
+ request_getSite,
|
|
|
+ request_wechatPay
|
|
|
+}
|