@@ -1,8 +1,8 @@ | |||
//分页数据 | |||
export enum PageData { | |||
NUM = 1, //页码 从第几页开始 | |||
SIZE = 10, //每页加载数 | |||
NO_MORE_SIZE = 2, //如果列表已无数据,可设置列表的总数量要大于等于2条才显示无更多数据 | |||
NUM = 1, //页码 从第几页开始 | |||
SIZE = 10, //每页加载数 | |||
NO_MORE_SIZE = 2, //如果列表已无数据,可设置列表的总数量要大于等于2条才显示无更多数据 | |||
} | |||
//订单状态 | |||
@@ -50,7 +50,7 @@ export enum OrderTypes { | |||
'EXCHANGE_CARD_TYPE' = '储值卡转记账卡', | |||
'REPLACEMENT_CARD' = '更换卡', | |||
'REPLACEMENT_SIGNATURE' = '更换签', | |||
'SUPPLEMENT_OBU' = '增补OBU', | |||
'SUPPLEMENT_OBU' = '增补OBU', | |||
'OFFICAL_SUPPLEMENT_OBU' = '公务车增补OBU', | |||
'同时换卡换签' = '暂无同时换卡换签枚举', | |||
'ETC注销' = '暂无ETC注销枚举', |
@@ -282,7 +282,7 @@ | |||
easing: "easeInOutCubic" | |||
}) | |||
const state = reactive({ | |||
type: 0, //0客车 1货车 | |||
type: 0, //1客车 2货车 | |||
userType: 1, //1个人 2单位 | |||
notice: "", | |||
swiperList: [], |
@@ -1,129 +1,126 @@ | |||
<!-- 取消订单 --> | |||
<template> | |||
<view class="form"> | |||
<form-builder | |||
:formData="state.formData" | |||
:config="config" | |||
@submit="doCancelOrder" | |||
/> | |||
</view> | |||
<view class="form"> | |||
<form-builder :formData="state.formData" :config="config" @submit="doCancelOrder" /> | |||
</view> | |||
</template> | |||
<script setup lang="ts"> | |||
import { reactive } from "vue"; | |||
import { onLoad } from "@dcloudio/uni-app"; | |||
import { request } from "@/utils/network/request.js"; | |||
import { msg, confirm, getOrderStatusName } from "@/utils/utils"; | |||
import { cancelOrder,cancelOrderNew } from "@/utils/network/api"; | |||
import { getItem, StorageKeys } from "@/utils/storage"; | |||
import { reactive } from "vue"; | |||
import { onLoad } from "@dcloudio/uni-app"; | |||
import { request } from "@/utils/network/request.js"; | |||
import { msg, confirm, getOrderStatusName } from "@/utils/utils"; | |||
import { cancelOrder, cancelOrderNew } from "@/utils/network/api"; | |||
import { getItem, StorageKeys } from "@/utils/storage"; | |||
const config = { | |||
submitName: "取消订单", //按钮名称(默认提交) | |||
titleWidth: 160, //标题最小宽度 | |||
}; | |||
const config = { | |||
submitName: "取消订单", //按钮名称(默认提交) | |||
titleWidth: 160, //标题最小宽度 | |||
}; | |||
const state = reactive({ | |||
orderInfo: {} as any, //订单数据 | |||
formData: [ | |||
{ | |||
title: "订单编号", | |||
inputType: "number", | |||
type: 2, | |||
value: "orderNumber", | |||
bg: true, | |||
hint: "订单编号", | |||
disabled: true, | |||
}, | |||
{ | |||
title: "订单车牌号", | |||
type: 2, | |||
value: "carNumber", | |||
bg: true, | |||
hint: "订单车牌号", | |||
disabled: true, | |||
}, | |||
{ | |||
title: "订单状态", | |||
type: 2, | |||
value: "orderStatus", | |||
bg: true, | |||
hint: "订单状态", | |||
disabled: true, | |||
}, | |||
{ | |||
title: "请输入取消原因", | |||
required: true, | |||
type: 5, | |||
vertical: 2, | |||
value: "orderReason", | |||
maxlength: 100, | |||
bg: true, | |||
hint: "限制100字符以内", | |||
emptyHint: "请输入取消的原因", | |||
}, | |||
], | |||
}); | |||
const state = reactive({ | |||
orderInfo: {} as any, //订单数据 | |||
formData: [ | |||
{ | |||
title: "订单编号", | |||
inputType: "number", | |||
type: 2, | |||
value: "orderNumber", | |||
bg: true, | |||
hint: "订单编号", | |||
disabled: true, | |||
}, | |||
{ | |||
title: "订单车牌号", | |||
type: 2, | |||
value: "carNumber", | |||
bg: true, | |||
hint: "订单车牌号", | |||
disabled: true, | |||
}, | |||
{ | |||
title: "订单状态", | |||
type: 2, | |||
value: "orderStatus", | |||
bg: true, | |||
hint: "订单状态", | |||
disabled: true, | |||
}, | |||
{ | |||
title: "请输入取消原因", | |||
required: true, | |||
type: 5, | |||
vertical: 2, | |||
value: "orderReason", | |||
maxlength: 100, | |||
bg: true, | |||
hint: "限制100字符以内", | |||
emptyHint: "请输入取消的原因", | |||
}, | |||
], | |||
}); | |||
//取消订单 | |||
const doCancelOrder = (e: any) => { | |||
confirm( | |||
"是否确认取消订单", | |||
() => { | |||
const options = { | |||
type: 2, | |||
data: { | |||
id: state.orderInfo.id, | |||
source: "WECHAT", | |||
reason: e.orderReason, | |||
opId: getItem(StorageKeys.OpenId), | |||
}, | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
// #ifdef MP-WEIXIN | |||
request(cancelOrder, options).then((res) => { | |||
cancelOrderSuccess(); | |||
}); | |||
// #endif | |||
// #ifdef MP-ALIPAY | |||
request(cancelOrderNew, options).then((res) => { | |||
cancelOrderSuccess(); | |||
}); | |||
// #endif | |||
}, | |||
"取消确认" | |||
); | |||
}; | |||
//取消订单 | |||
const doCancelOrder = (e : any) => { | |||
confirm( | |||
"是否确认取消订单", | |||
() => { | |||
const options = { | |||
type: 2, | |||
data: { | |||
id: state.orderInfo.id, | |||
source: "WECHAT", | |||
reason: e.orderReason, | |||
// opId: getItem(StorageKeys.OpenId), | |||
openId: getItem(StorageKeys.OpenId), | |||
}, | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
console.log("options", options) | |||
// #ifdef MP-WEIXIN | |||
request(cancelOrder, options).then((res) => { | |||
cancelOrderSuccess(); | |||
}); | |||
// #endif | |||
// #ifdef MP-ALIPAY | |||
request(cancelOrderNew, options).then((res) => { | |||
cancelOrderSuccess(); | |||
}); | |||
// #endif | |||
}, | |||
"取消确认" | |||
); | |||
}; | |||
const cancelOrderSuccess = () => { | |||
const content = | |||
state.orderInfo.orderStep == 4 | |||
? "您的订单已取消" | |||
: "您的订单已取消,我们将在1-2个工作日内将费用原路退回"; | |||
confirm( | |||
content, | |||
() => { | |||
uni.$emit("refreshOrder"); | |||
uni.navigateBack(); | |||
}, | |||
"取消成功", | |||
false | |||
); | |||
}; | |||
const cancelOrderSuccess = () => { | |||
const content = | |||
state.orderInfo.orderStep == 4 | |||
? "您的订单已取消" | |||
: "您的订单已取消,我们将在1-2个工作日内将费用原路退回"; | |||
confirm( | |||
content, | |||
() => { | |||
uni.$emit("refreshOrder"); | |||
uni.navigateBack(); | |||
}, | |||
"取消成功", | |||
false | |||
); | |||
}; | |||
onLoad((options) => { | |||
state.orderInfo = JSON.parse(options.data) ?JSON.parse(options.data): {}; | |||
state.formData[0].hint = state.orderInfo.orderId; | |||
state.formData[1].hint = state.orderInfo.vehiclePlate; | |||
state.formData[2].hint = getOrderStatusName(state.orderInfo.orderStep); | |||
}); | |||
onLoad((options) => { | |||
console.log("options", options) | |||
state.orderInfo = JSON.parse(options.data) ? JSON.parse(options.data) : {}; | |||
state.formData[0].hint = state.orderInfo.orderId; | |||
state.formData[1].hint = state.orderInfo.vehiclePlate; | |||
state.formData[2].hint = getOrderStatusName(state.orderInfo.orderStep); | |||
}); | |||
</script> | |||
<style lang="scss" scoped> | |||
.form { | |||
border-top: 1px solid #f7f7f7; | |||
padding: 20rpx; | |||
} | |||
</style> | |||
.form { | |||
border-top: 1px solid #f7f7f7; | |||
padding: 20rpx; | |||
} | |||
</style> |
@@ -279,8 +279,11 @@ | |||
}); | |||
// #endif | |||
// #ifdef MP-WEIXIN | |||
// uni.redirectTo({ | |||
// url: `/subpackage/orders/interestsList?orderId=${state.form.orderId}&&clientFee=${getItem("clientFee")}&&id=${getItem("productId")}`// url: `/subpackage/orders/sign-up?orderId=${state.form.orderId}&&clientFee=${getItem("clientFee")}&&id=${getItem("productId")}`, | |||
// }); | |||
uni.redirectTo({ | |||
url: `/subpackage/orders/interestsList?orderId=${state.form.orderId}&&clientFee=${getItem("clientFee")}&&id=${getItem("productId")}`// url: `/subpackage/orders/sign-up?orderId=${state.form.orderId}&&clientFee=${getItem("clientFee")}&&id=${getItem("productId")}`, | |||
url: `/subpackage/orders/product-detail?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}&&isValueCard=${getItem("isValueCard")}`, | |||
}); | |||
// #endif | |||
@@ -18,7 +18,7 @@ | |||
记账卡 | |||
</view> --> | |||
<view style="margin-top: 15rpx" class="tip"> | |||
{{ item.cardTypeArr }} | |||
{{ item['releaseProductStandards']['productStandards']['cardTypeArr'] }} | |||
</view> | |||
</view> | |||
<view class="money"> | |||
@@ -77,8 +77,11 @@ | |||
} else { | |||
state.isValueCard = 3 | |||
} | |||
// uni.redirectTo({ | |||
// url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isSign=${state.isSign}&isValueCard=${state.isValueCard}`, | |||
// }); | |||
uni.redirectTo({ | |||
url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isSign=${state.isSign}&isValueCard=${state.isValueCard}`, | |||
url: `/subpackage/orders/interestsList?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`, | |||
}); | |||
} | |||
const savaHandle = (val) => { | |||
@@ -88,7 +91,7 @@ | |||
setItem("isValueCard", val.isValueCard); | |||
state.isSign = val.isSign; | |||
// 判断是几张卡 | |||
console.log("val.cardTypeArr.split(", ")", val.cardTypeArr.split(",")) | |||
console.log("state.dataArray[i]['releaseProductStandards']['productStandards']", val['releaseProductStandards']['productStandards']) | |||
// if (val.promoteName.indexOf('选装') != -1) { | |||
// if (val.cardTypeArr.split(",")[0] == "记账卡") { | |||
// state.isValueCard = 2 | |||
@@ -103,23 +106,26 @@ | |||
// return | |||
// } | |||
if (val.cardTypeArr.split(",").length == 1) { | |||
if (val.cardTypeArr.split(",")[0] == "记账卡") { | |||
if (val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",").length == 1) { | |||
if (val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",")[0] == "记账卡") { | |||
state.isValueCard = 2 | |||
} else if (val.cardTypeArr.split(",")[0] == '储值卡') { | |||
} else if (val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",")[0] == '储值卡') { | |||
state.isValueCard = 1 | |||
} else { | |||
state.isValueCard = 3 | |||
} | |||
// uni.redirectTo({ | |||
// url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`, | |||
// }); | |||
uni.redirectTo({ | |||
url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`, | |||
url: `/subpackage/orders/interestsList?promoteId=${val['promoteId']}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`, | |||
}); | |||
} else { | |||
state.radiolist1 = []; | |||
// 处理卡的数据 | |||
for (var i = 0; i < val.cardTypeArr.split(",").length; i++) { | |||
for (var i = 0; i < val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",").length; i++) { | |||
const obj = {}; | |||
obj["name"] = val.cardTypeArr.split(",")[i]; | |||
obj["name"] = val['releaseProductStandards']['productStandards']['cardTypeArr'].split(",")[i]; | |||
obj["disabled"] = false; | |||
state.radiolist1.push(obj) | |||
} | |||
@@ -141,8 +147,10 @@ | |||
state.userType = option.userType; | |||
state.type = option.type; | |||
var data = { | |||
type: state.type, | |||
source: state.sysType //请求方来源 | |||
userType: state.userType, | |||
// source: state.sysType, //请求方来源 | |||
agencyId: '52010106004', | |||
vanType: state.type | |||
}; | |||
const options = { | |||
type: 2, | |||
@@ -155,20 +163,20 @@ | |||
// console.log(res.bizContent); | |||
const data = stringToJson(res.bizContent); | |||
console.log(data); | |||
// console.log(typeof(data)); | |||
state.dataArray = data.csmsnPromoteDistPro ? data.csmsnPromoteDistPro : []; | |||
state.dataArray = data.list ? data.list : []; | |||
console.log("state.dataArray", state.dataArray); | |||
for (var i = 0; i < state.dataArray.length; i++) { | |||
const cardTypeArr = [] | |||
for (var j = 0; j < state.dataArray[i].cardType.length; j++) { | |||
if (state.dataArray[i].cardType[j] == '1') { | |||
for (var j = 0; j < state.dataArray[i]['releaseProductStandards']['productStandards'].cardType.length; j++) { | |||
if (state.dataArray[i]['releaseProductStandards']['productStandards'].cardType[j] == '1') { | |||
cardTypeArr.push('储值卡') | |||
} else if (state.dataArray[i].cardType[j] == '2') { | |||
} else if (state.dataArray[i]['releaseProductStandards']['productStandards'].cardType[j] == '2') { | |||
cardTypeArr.push('记账卡') | |||
} else if (state.dataArray[i].cardType[j] == '3') { | |||
} else if (state.dataArray[i]['releaseProductStandards']['productStandards'].cardType[j] == '3') { | |||
cardTypeArr.push('预存卡') | |||
} | |||
} | |||
state.dataArray[i].cardTypeArr = cardTypeArr.toString() | |||
state.dataArray[i]['releaseProductStandards']['productStandards']['cardTypeArr'] = cardTypeArr.toString() | |||
} | |||
console.log("state.dataArray", state.dataArray) | |||
}); |
@@ -49,12 +49,12 @@ | |||
<image :src="`${$imgUrl}common/arror-right.png`" class="icon"></image> | |||
</view> | |||
</view> | |||
<view class="as-layout-horizontal agreement"> | |||
<!-- <view class="as-layout-horizontal agreement"> | |||
<checkbox-group @change="checkboxChange"> | |||
<checkbox :checked="state.checked" style="transform: scale(0.8)" />我已阅读并同意 | |||
</checkbox-group> | |||
<text style="color:#007AFF;text-decoration: underline;" @click="downAuthD()">《用户协议》</text> | |||
</view> | |||
</view> --> | |||
<view style="margin-top: 30rpx" class="action"> | |||
<button type="default" class="button" @click="nextAction()"> | |||
下一步 | |||
@@ -79,6 +79,7 @@ | |||
</view> | |||
<view class="phone"> | |||
{{ item.consigneeTel }} | |||
<text class="default" v-if="item.defaultAddress==1">默认</text> | |||
</view> | |||
</view> | |||
<view class="address"> | |||
@@ -119,7 +120,8 @@ | |||
productReCode, | |||
getGlobalParam, | |||
infoQuery, | |||
envs | |||
envs, | |||
addProduct | |||
} from "@/utils/network/api.js"; | |||
import { request } from "@/utils/network/request.js"; | |||
import { reactive, ref } from "vue"; | |||
@@ -145,6 +147,7 @@ | |||
longitude: "", | |||
latitude: "", | |||
detailedAddress: '', //通过经纬度转的地址 | |||
cardType: '' //卡类型 | |||
}, | |||
show: false, | |||
addressArray: [], | |||
@@ -267,10 +270,10 @@ | |||
msg("请输入正确的申办车牌"); | |||
return; | |||
} | |||
if (!state.checked) { | |||
msg("请勾选协议!") | |||
return; | |||
} | |||
// if (!state.checked) { | |||
// msg("请勾选协议!") | |||
// return; | |||
// } | |||
//1.优先车牌校验 2.在进行订单创建 | |||
var vehicleData = { | |||
vehiclePlate: state.data.vehiclePlate, | |||
@@ -304,18 +307,19 @@ | |||
console.log(data); | |||
//提交产品信息 | |||
productReCodeAction(data.orderId).then((result) => { | |||
console.log(state.data); | |||
console.log(result); | |||
if (state.data.userType == 1) { | |||
uni.navigateTo({ | |||
url: `/subpackage/orders/opening-account-people?orderId=${data.orderId}&&vehiclePlateColor=${state.data.vehiclePlateColor}&isSign=${state.isValueCard}&type=${state.data.type}`, | |||
}); | |||
} else { | |||
uni.navigateTo({ | |||
url: `/subpackage/orders/opening-account-unit?orderId=${data.orderId}&&vehiclePlateColor=${state.data.vehiclePlateColor}&isSign=${state.isValueCard}&type=${state.data.type}`, | |||
}); | |||
} | |||
console.log("产品信息", result); | |||
// 加购权益产品 | |||
addProductRequest().then((res) => { | |||
if (state.data.userType == 1) { | |||
uni.navigateTo({ | |||
url: `/subpackage/orders/opening-account-people?orderId=${data.orderId}&&vehiclePlateColor=${state.data.vehiclePlateColor}&isSign=${state.isValueCard}&type=${state.data.type}`, | |||
}); | |||
} else { | |||
uni.navigateTo({ | |||
url: `/subpackage/orders/opening-account-unit?orderId=${data.orderId}&&vehiclePlateColor=${state.data.vehiclePlateColor}&isSign=${state.isValueCard}&type=${state.data.type}`, | |||
}); | |||
} | |||
}) | |||
}) | |||
} | |||
}); | |||
@@ -389,6 +393,7 @@ | |||
state.data.userType = option.userType; | |||
state.data.promoteId = option.promoteId; | |||
state.isValueCard = option.isValueCard | |||
state.data.cardType = option.isValueCard | |||
console.log("订单选择推广发行产品接口", option) | |||
getInfo(); | |||
uni.getLocation({ | |||
@@ -465,10 +470,6 @@ | |||
}) | |||
const productReCodeAction = (orderId) => { | |||
// var data = { | |||
// productId: state.data.productId, | |||
// orderId: orderId, | |||
// }; | |||
var data = { | |||
promoteId: state.data.promoteId, | |||
orderId: orderId, | |||
@@ -491,6 +492,30 @@ | |||
reject(error); | |||
}); | |||
}; | |||
const addProductRequest = () => { | |||
const options = { | |||
type: 2, | |||
data: { | |||
orderId: state.orderId, //订单编号 | |||
openId: getItem(StorageKeys.OpenId), //操作人 id | |||
equityId: state.data.promoteId, //权益Id | |||
totalAmount: allMoney * 100, //总金额 | |||
isRepeatPurchase: 0 | |||
}, | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
console.log("optionss", options); | |||
return new Promise(async (resolve, reject) => { | |||
const res = await request(addProduct, options); | |||
const data = stringToJson(res.bizContent); | |||
console.log("111") | |||
resolve(data); | |||
}).catch((error) => { | |||
console.log("222") | |||
reject(error); | |||
}); | |||
} | |||
</script> | |||
<style lang="scss" scoped> | |||
@@ -680,4 +705,12 @@ | |||
align-items: center; | |||
justify-content: center; | |||
} | |||
.default { | |||
border: 1rpx solid #00b38b; | |||
border-radius: 5rpx; | |||
padding: 2rpx 4rpx; | |||
color: #00b38b; | |||
margin-left: 4rpx; | |||
} | |||
</style> |
@@ -1,4 +1,4 @@ | |||
s<template> | |||
<template> | |||
<view class="content"> | |||
<view class="item" v-for="(item,index) in state.list" :key='index'> | |||
<view class="title"> | |||
@@ -20,9 +20,6 @@ s<template> | |||
</view> | |||
</view> | |||
</view> | |||
<!-- <button type="default" class="button" @click="savaHandle()"> | |||
开通服务 | |||
</button> --> | |||
<button type="default" class="button" @click="addInterestsList()"> | |||
加购权益 | |||
</button> | |||
@@ -32,7 +29,7 @@ s<template> | |||
<script setup lang="ts"> | |||
import { onLoad, onShow } from "@dcloudio/uni-app"; | |||
import { reactive } from "vue"; | |||
import { queryInterestsList } from "@/utils/network/api.js"; | |||
import { equityProductsApi } from "@/utils/network/api.js"; | |||
import { stringToJson } from "@/utils/network/encryption"; | |||
import { request } from "@/utils/network/request"; | |||
import { etcQYAction } from "@/utils/network/api.js"; | |||
@@ -65,19 +62,34 @@ s<template> | |||
clientFee: "", | |||
list: [], //权益数据 | |||
choiceValue: [], //选择的权益数据的下标 | |||
choiceValueComplete: [] //选择的权益数据的具体数据 | |||
choiceValueComplete: [], //选择的权益数据的具体数据 | |||
isValueCard: "", | |||
type: 0, | |||
userType: 0, | |||
promoteId: "", //产品id | |||
}) | |||
onLoad((option : any) => { | |||
getList(option.orderId); | |||
getOpenID(); | |||
// getList("promoteId", option); | |||
console.log("promoteId", option) | |||
state.orderId = option.orderId; | |||
state.clientFee = option.clientFee; | |||
state.id = option.id; | |||
state.userType = option.userType; | |||
state.type = option.type; | |||
state.isValueCard = option.isValueCard; | |||
state.promoteId = option.promoteId; | |||
getList(); | |||
getOpenID(); | |||
console.log("option", option) | |||
}) | |||
const addInterestsList = () => { | |||
uni.redirectTo({ | |||
url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`, | |||
}); | |||
return; | |||
state.choiceValueComplete = []; | |||
for (var i = 0; i < state.choiceValue.length; i++) { | |||
state.choiceValueComplete.push(state.list[state.choiceValue[i]]) | |||
@@ -121,11 +133,11 @@ s<template> | |||
}; | |||
console.log("optionss", optionss); | |||
request(addProduct, optionss).then((res) => { | |||
// uni.navigateTo({ | |||
// url: `/subpackage/orders/order_payment?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}&&isValueCard=${state.detailsObj.isValueCard}`, | |||
// uni.redirectTo({ | |||
// url: `/subpackage/orders/product-detail?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}&&isValueCard=${state.detailsObj.isValueCard}`, | |||
// }); | |||
uni.redirectTo({ | |||
url: `/subpackage/orders/product-detail?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}&&isValueCard=${state.detailsObj.isValueCard}`, | |||
url: `/subpackage/orders/essential-information?promoteId=${getItem("promoteId")}&userType=${state.userType}&type=${state.type}&isValueCard=${state.isValueCard}`, | |||
}); | |||
}); | |||
@@ -134,20 +146,22 @@ s<template> | |||
} | |||
const getList = (id) => { | |||
const getList = () => { | |||
const options = { | |||
type: 2, | |||
data: { "orderId": id }, | |||
data: { | |||
"promoteId": state.promoteId, | |||
}, | |||
method: 'POST', | |||
showLoading: true, | |||
} | |||
request(queryInterestsList, options).then((res) => { | |||
request(equityProductsApi, options).then((res) => { | |||
const data = stringToJson(res.bizContent); | |||
for (var i = 0; i < data.data.length; i++) { | |||
data.data[i]['isShow'] = false; | |||
} | |||
state.list = data.data | |||
console.log("222", state.list) | |||
console.log("222", state) | |||
}) | |||
} | |||
const change = (e) => { | |||
@@ -162,22 +176,6 @@ s<template> | |||
success: function (e) { | |||
console.log(e); | |||
getOpenid(e.code); | |||
// uni.request({ | |||
// url: `https://api.weixin.qq.com/sns/jscode2session?appid=${wechatAppID}&secret=${wechatSecret}&js_code=${e.code}&grant_type=authorization_code`, | |||
// success: (res : any) => { | |||
// state.openid = res.data.openid; | |||
// setItem("QYorder", state); | |||
// console.log(res); | |||
// }, | |||
// fail: (err : any) => { | |||
// uni.showToast({ | |||
// title: "网络异常,请重试!" + err.errcode, | |||
// icon: "error", | |||
// duration: 500, | |||
// }); | |||
// return; | |||
// }, | |||
// }); | |||
}, | |||
}); | |||
//#endif | |||
@@ -203,79 +201,6 @@ s<template> | |||
}); | |||
// #endif | |||
} | |||
const savaHandle = () => { | |||
state.choiceValueComplete = []; | |||
for (var i = 0; i < state.choiceValue.length; i++) { | |||
state.choiceValueComplete.push(state.list[state.choiceValue[i]]) | |||
} | |||
let items = encodeURIComponent(JSON.stringify(state.choiceValueComplete)); | |||
console.log("state.choiceValueComplete", state.choiceValueComplete) | |||
console.log("openid*******", state.openid); | |||
//如果获取openId成功 | |||
if (state.openid) { | |||
var data = { | |||
orderId: state.orderId, | |||
subOpenId: state.openid, | |||
}; | |||
const options = { | |||
type: 2, | |||
data: data, | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
request(etcQYAction, options).then((res) => { | |||
const data = stringToJson(res.bizContent); | |||
if (data.userState === "UNAUTHORIZED") { | |||
uni.navigateToMiniProgram({ | |||
appId: "wxbcad394b3d99dac9", | |||
path: "pages/route/index", | |||
extraData: { | |||
appid: "wxcb1388c809fe25a9", | |||
sub_appid: "wx008c60533388527a", | |||
mch_id: "1500877591", | |||
sub_mch_id: "1622652848", | |||
nonce_str: data.nonceStr, | |||
sign_type: "HMAC-SHA256", | |||
trade_scene: "HIGHWAY", | |||
plate_number: data.plateNumber, | |||
sub_openid: data.subOpenId, | |||
sign: data.sign, | |||
}, | |||
success(res) { | |||
console.log(res); | |||
}, | |||
complete(res) { | |||
console.log(res); | |||
}, | |||
fail(res) { | |||
console.log(res); | |||
// 未成功跳转到车主小程序 | |||
}, | |||
}); | |||
} else if (data.userState === "NORMAL") { | |||
msg("已开通车主服务"); | |||
uni.navigateTo({ | |||
url: `/subpackage/orders/product-detail?orderId=${state.orderId}&&clientFee=${state.clientFee}&&id=${state.id}&&data=${items}`, | |||
}); | |||
} else if (data.userState === "PAUSED") { | |||
msg("已暂停车主服务"); | |||
return; | |||
} else if (data.userState === "OVERDUE") { | |||
msg("用户已开通车主服务,但欠费状态。提示用户还款,请跳转到车主服务"); | |||
return; | |||
} | |||
}); | |||
} else { | |||
//如果获取openId失败 | |||
uni.showToast({ | |||
title: "网络异常,请重试!", | |||
icon: "none", | |||
duration: 1000, | |||
}); | |||
return; | |||
} | |||
}; | |||
const changeIsShow = (index) => { | |||
console.log(index, state.list[index]['isShow'], !state.list[index]['isShow']) | |||
state.list[index]['isShow'] = !state.list[index]['isShow'] |
@@ -72,13 +72,15 @@ | |||
<u-input inputAlign="right" class="clearBg" placeholder='请输入部门名称' v-model="state.form.department" /> | |||
</u-form-item> | |||
<u-form-item label="社会信用代码"> | |||
<u-input inputAlign="right" class="clearBg" placeholder='请输入社会信用代码' v-model="state.form.userIdNum" /> | |||
<u-input inputAlign="right" class="clearBg" placeholder='请输入社会信用代码' | |||
v-model="state.form.userIdNum" /> | |||
</u-form-item> | |||
<u-form-item label="经办人姓名"> | |||
<u-input inputAlign="right" class="clearBg" placeholder='请输入经办人姓名' v-model="state.form.agentName" /> | |||
</u-form-item> | |||
<u-form-item label="经办人身份证号"> | |||
<u-input inputAlign="right" class="clearBg" placeholder='请输入经办人身份证号' v-model="state.form.agentIdNum" /> | |||
<u-input inputAlign="right" class="clearBg" placeholder='请输入经办人身份证号' | |||
v-model="state.form.agentIdNum" /> | |||
</u-form-item> | |||
<u-form-item label="经办人联系方式"> | |||
<u-input inputAlign="right" class="clearBg" placeholder='请输入经办人联系方式' v-model="state.form.tel" /> | |||
@@ -126,7 +128,7 @@ | |||
onLoad, | |||
onPageScroll, | |||
} from "@dcloudio/uni-app"; | |||
import { | |||
import { | |||
setItem, | |||
getItem, | |||
} from "@/utils/storage"; | |||
@@ -134,9 +136,9 @@ import { | |||
msg, | |||
checkStr | |||
} from "@/utils/utils"; | |||
const scrollTop =ref(0);//滚动距离 | |||
const scrollTop = ref(0);//滚动距离 | |||
const state = reactive({ | |||
form: { | |||
orderId: "", //订单ID | |||
@@ -167,7 +169,7 @@ import { | |||
}, | |||
orderId: "", | |||
vehiclePlateColor: '', | |||
isSign:'' | |||
isSign: '' | |||
}); | |||
const savaHandle = () => { | |||
@@ -176,63 +178,91 @@ import { | |||
} else { | |||
state.form.agentGender = 'WOMAN' | |||
} | |||
if (!state.form.posImgUrl) { | |||
msg('请上传营业执照'); | |||
return; | |||
} | |||
if (!state.form.agentPosImgUrl) { | |||
msg('上传身份证的人像面'); | |||
return; | |||
} | |||
if (!state.form.agentNegImgUrl) { | |||
msg('上传身份证的国徽面'); | |||
return; | |||
} | |||
if (!state.form.proxyUrl) { | |||
msg('上传身份证的委托书'); | |||
return; | |||
} | |||
if (!state.form.userName) { | |||
msg('请输入公司名称'); | |||
return; | |||
} | |||
if (!state.form.department) { | |||
msg('请输入社会信用代码'); | |||
return; | |||
} | |||
if (!state.form.agentName) { | |||
msg('请输入经办人姓名'); | |||
return; | |||
} | |||
if (!checkStr(state.form.agentIdNum, 'card')) { | |||
msg('请输入正确身份证'); | |||
msg('请输入正确的经办人身份证号'); | |||
return; | |||
} | |||
if (!checkStr(state.form.tel, 'mobile')) { | |||
msg('请输入正确手机号'); | |||
msg('请输入正确的经办人联系方式'); | |||
return; | |||
} | |||
//如果未登录||新用户 | |||
// if (!getItem('openId')) { | |||
let data = { | |||
userType: "ENTERPRISE", | |||
idNum: state.form.userIdNum, | |||
idType: state.form.userIdType, | |||
mobile: state.form.tel, | |||
userName: state.form.userName, | |||
gender: 'UNKOWN', | |||
certifyChannel: "BAIDUOCR", | |||
address: state.form.address, | |||
agentIdNum: state.form.agentIdNum, | |||
agentIdType: state.form.agentIdType, | |||
agentName: state.form.agentName, | |||
department: state.form.department, | |||
userIdImgUrl: state.form.posImgUrl, | |||
userIdImgBase64: "", | |||
} | |||
const options = { | |||
type: 2, | |||
data: data, | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
request(register, options).then((res) => { | |||
let result = stringToJson(res.bizContent); | |||
if (result.accessToken && result.openId) { | |||
setItem('token', result.accessToken) | |||
setItem('openId', result.openId) | |||
state.form.opId = result.openId; | |||
let data = state.form; | |||
const options = { | |||
type: 2, | |||
data: data, | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
request(etcCompanyCardInfoSubmit, options).then((res) => { | |||
// let result = stringToJson(res.bizContent); | |||
console.log(res); | |||
uni.redirectTo({ | |||
url: `/subpackage/orders/car-release?orderId=${state.orderId}&vehiclePlateColor=${state.vehiclePlateColor}&type=1&isSign=${state.isSign}`, | |||
}); | |||
let data = { | |||
userType: "ENTERPRISE", | |||
idNum: state.form.userIdNum, | |||
idType: state.form.userIdType, | |||
mobile: state.form.tel, | |||
userName: state.form.userName, | |||
gender: 'UNKOWN', | |||
certifyChannel: "BAIDUOCR", | |||
address: state.form.address, | |||
agentIdNum: state.form.agentIdNum, | |||
agentIdType: state.form.agentIdType, | |||
agentName: state.form.agentName, | |||
department: state.form.department, | |||
userIdImgUrl: state.form.posImgUrl, | |||
userIdImgBase64: "", | |||
} | |||
const options = { | |||
type: 2, | |||
data: data, | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
request(register, options).then((res) => { | |||
let result = stringToJson(res.bizContent); | |||
if (result.accessToken && result.openId) { | |||
setItem('token', result.accessToken) | |||
setItem('openId', result.openId) | |||
state.form.opId = result.openId; | |||
let data = state.form; | |||
const options = { | |||
type: 2, | |||
data: data, | |||
method: "POST", | |||
showLoading: true, | |||
}; | |||
request(etcCompanyCardInfoSubmit, options).then((res) => { | |||
// let result = stringToJson(res.bizContent); | |||
console.log(res); | |||
uni.redirectTo({ | |||
url: `/subpackage/orders/car-release?orderId=${state.orderId}&vehiclePlateColor=${state.vehiclePlateColor}&type=1&isSign=${state.isSign}`, | |||
}); | |||
} | |||
}) | |||
}); | |||
} | |||
}) | |||
// }else{ | |||
// var data = state.form; | |||
// const options = { | |||
@@ -249,28 +279,28 @@ import { | |||
// }); | |||
// } | |||
}; | |||
onLoad((option: any) => { | |||
onLoad((option : any) => { | |||
state.form.orderId = option.orderId; | |||
state.orderId = option.orderId; | |||
state.vehiclePlateColor = option.vehiclePlateColor; | |||
state.form.opId = getItem('openId')?getItem('openId'):''; | |||
state.isSign=option.isSign; | |||
state.form.opId = getItem('openId') ? getItem('openId') : ''; | |||
state.isSign = option.isSign; | |||
}); | |||
//监听页面滚动 | |||
onPageScroll((e) => { | |||
scrollTop.value = e.scrollTop; | |||
}); | |||
//营业执照Orc接口调用 | |||
const cardImageOcrYY = () => { | |||
uni.chooseImage({ | |||
count: 1, //只能选取一张照片 | |||
sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有 | |||
sourceType: ["camera", "album"], //从相册选择 | |||
success: function(res) { | |||
success: function (res) { | |||
pathToBase64(res.tempFilePaths[0]) | |||
.then((path) => { | |||
var data = { | |||
@@ -288,7 +318,7 @@ import { | |||
if (data.result) { | |||
state.form.userName = stringToJson(data.result | |||
.businessLicense)[ | |||
'名称']; | |||
'名称']; | |||
state.form.userIdNum = stringToJson(data.result | |||
.businessLicense)[ | |||
'统一社会信用代码']; | |||
@@ -297,17 +327,17 @@ import { | |||
}); | |||
}) | |||
.catch((error) => {}); | |||
.catch((error) => { }); | |||
}, | |||
}); | |||
}; | |||
const cardImageOcr = (val: any) => { | |||
const cardImageOcr = (val : any) => { | |||
var imageType = val; | |||
uni.chooseImage({ | |||
count: 1, //只能选取一张照片 | |||
sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有 | |||
sourceType: ["camera", "album"], //从相册选择 | |||
success: function(res) { | |||
success: function (res) { | |||
pathToBase64(res.tempFilePaths[0]) | |||
.then((path) => { | |||
var data = { | |||
@@ -337,12 +367,12 @@ import { | |||
} | |||
}); | |||
}) | |||
.catch((error) => {}); | |||
.catch((error) => { }); | |||
}, | |||
}); | |||
}; | |||
//委托书获取图片给后端 | |||
const cardFileImageUpdateyy = (val: any) => { | |||
const cardFileImageUpdateyy = (val : any) => { | |||
var data = { | |||
fileBase64: val, | |||
}; | |||
@@ -362,7 +392,7 @@ import { | |||
count: 1, //只能选取一张照片 | |||
sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有 | |||
sourceType: ["camera", "album"], //从相册选择 | |||
success: function(res) { | |||
success: function (res) { | |||
pathToBase64(res.tempFilePaths[0]) | |||
.then((path) => { | |||
var data = { | |||
@@ -379,13 +409,13 @@ import { | |||
state.form.proxyUrl = data.data.url; | |||
}); | |||
}) | |||
.catch((error) => {}); | |||
.catch((error) => { }); | |||
}, | |||
}); | |||
}; | |||
//替换图片地址 | |||
const strReplace = (str: string) => { | |||
const strReplace = (str : string) => { | |||
let imgUrl = str.replace("http://192.168.101.145:9000", envs[process.env.NODE_ENV].baseUrl); | |||
imgUrl = imgUrl.replace("http://100.64.2.113:9000", envs[process.env.NODE_ENV].baseUrl); | |||
return imgUrl; | |||
@@ -521,9 +551,14 @@ import { | |||
line-height: 24rpx; | |||
margin-bottom: 60rpx; | |||
} | |||
} | |||
::v-deep .u-input__input{ | |||
::v-deep .u-input__input { | |||
background: transparent; | |||
} | |||
</style> | |||
::v-deep .u-form-item--left .u-form-item--left__content { | |||
padding-right: 0px; | |||
} | |||
</style> |
@@ -186,8 +186,8 @@ | |||
//如果获取openId成功 | |||
if (state.openid) { | |||
var data = { | |||
orderId: state.orderId, | |||
// orderId: "20231012114651162505354", | |||
// orderId: state.orderId, | |||
orderId: "20231012114651162505354", | |||
subOpenId: state.openid, | |||
}; | |||
const options = { |
@@ -29,7 +29,8 @@ export const aliPayConfigId = "6a9a54bc01f6443123452b1234"; //支付配置编号 | |||
export const aliPayConfigIdTwo = "6a9a54bc01f644312543761234"; | |||
export const wechatAppID = "wx8fba957179c1329a"; //九州小程序APPid:wx008c60533388527a | |||
export const wechatSecret = "699c10826113ddb350fbe58a96e2b015"; //九州小程序AppSecret:95197718b43b497f02732bd9f8011080 | |||
// export const sm4Key = "5dc11f854ceca1473e1a5075ed16eb226b4543a9a05fe50f7fba40f898099ce34abba69a07a20509f315f94d808a4d0e988935588858f65a"; | |||
// export const sm4Key = | |||
// "5dc11f854ceca1473e1a5075ed16eb226b4543a9a05fe50f7fba40f898099ce34abba69a07a20509f315f94d808a4d0e988935588858f65a"; | |||
export const sm4Key = "5dc11f854ceca147"; | |||
//字典 | |||
@@ -75,7 +76,8 @@ export const exchangeProcess = '886' //8.101.ASS-换货/换卡签审核接口 | |||
//产品选择 | |||
// export const etcQueryProduct = "48"; //获取产品根据orderId获取 | |||
export const etcQueryProduct = "098bff3fc88e48bf9cafc3b5679b4d07"; //获取产品 根据客货类型获取 | |||
// export const etcQueryProduct = "098bff3fc88e48bf9cafc3b5679b4d07"; //获取产品 根据客货类型获取 | |||
export const etcQueryProduct = "f01002fa6ded4162afaec1139e503641"; //获取产品 根据客货类型获取 | |||
// export const productReCode = '914'//订单产品选择接口 | |||
export const productReCode = '198172b1858d474fa8e35225d65014d7' //订单选择推广发行产品 | |||
@@ -248,4 +250,5 @@ export const getOpenidApi = "53c0698b512a44539ea05cc88157e68b" //获取微信小 | |||
export const getAgreementApi = "32a9d99a781a4bf2af29a46d903702bd" //根据订单编号获取渠道产品的补充协议 | |||
export const mobileIsRepeatApi = "19d58812148d41bbb7d435ab93928787" //个人账号重复注册校验 | |||
export const transferRecordApi = "323bc6e1f3304c83921155fc220e9e37" //过户记录查询 | |||
export const agreementConfirmApi = "96fa039a85f54655af06d980c8ddc057" //协议确认接口 | |||
export const agreementConfirmApi = "96fa039a85f54655af06d980c8ddc057" //协议确认接口 | |||
export const equityProductsApi = "56db1aa8b9854f2f8c2428f3393e5045" //查询加购权益产品 |
@@ -59,8 +59,8 @@ export function request(code, options = {}, start = false) { | |||
rbacSource: 'MINI_PROGRAM', | |||
accessToken: getItem(StorageKeys.Token) | |||
} | |||
// options.url = envs[process.env.NODE_ENV].baseUrl + '/api/interfaceMidGroundIn' | |||
options.url = envs[process.env.NODE_ENV].baseUrl + '/ifzt/api/interfaceMidGroundIn' | |||
options.url = envs[process.env.NODE_ENV].baseUrl + '/api/interfaceMidGroundIn' | |||
// options.url = envs[process.env.NODE_ENV].baseUrl + '/ifzt/api/interfaceMidGroundIn' | |||
//默认json数据格式提交` | |||
let contentType = 'application/x-www-form-urlencoded' | |||
@@ -13,7 +13,7 @@ | |||
* var sm4 = new SM4Util(); | |||
sm4.encryptData_CBC(''); | |||
*/ | |||
import * as base64js from '../node-model/base64-js' | |||
import * as base64js from '../node-model/base64-js' | |||
/** | |||
* 国密SM4加密算法 | |||
@@ -21,493 +21,494 @@ import * as base64js from '../node-model/base64-js' | |||
* @email 1216113487@qq.com | |||
* @company 中科软 | |||
*/ | |||
function SM4_Context () { | |||
this.mode = 1 | |||
this.isPadding = true | |||
this.sk = new Array(32) | |||
function SM4_Context() { | |||
this.mode = 1 | |||
this.isPadding = true | |||
this.sk = new Array(32) | |||
} | |||
function SM4 () { | |||
this.SM4_ENCRYPT = 1 | |||
this.SM4_DECRYPT = 0 | |||
const SboxTable = [0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, | |||
0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, | |||
0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, | |||
0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, | |||
0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, | |||
0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, | |||
0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, | |||
0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, | |||
0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, | |||
0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, | |||
0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, | |||
0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, | |||
0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, | |||
0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, | |||
0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, | |||
0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48] | |||
const FK = [0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc] | |||
const CK = [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, | |||
0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, | |||
0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, | |||
0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, | |||
0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, | |||
0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, | |||
0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, | |||
0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279] | |||
this.GET_ULONG_BE = function (b, i) { | |||
return (b[i] & 0xff) << 24 | ((b[i + 1] & 0xff) << 16) | ((b[i + 2] & 0xff) << 8) | (b[i + 3] & 0xff) & 0xffffffff | |||
} | |||
this.PUT_ULONG_BE = function (n, b, i) { | |||
var t1 = (0xFF & (n >> 24)) | |||
var t2 = (0xFF & (n >> 16)) | |||
var t3 = (0xFF & (n >> 8)) | |||
var t4 = (0xFF & (n)) | |||
b[i] = t1 > 128 ? t1 - 256 : t1 | |||
b[i + 1] = t2 > 128 ? t2 - 256 : t2 | |||
b[i + 2] = t3 > 128 ? t3 - 256 : t3 | |||
b[i + 3] = t4 > 128 ? t4 - 256 : t4 | |||
} | |||
this.SHL = function (x, n) { | |||
return (x & 0xFFFFFFFF) << n | |||
} | |||
this.ROTL = function (x, n) { | |||
// const s = this.SHL(x, n); | |||
// const ss = x >> (32 - n); | |||
return this.SHL(x, n) | x >> (32 - n) | |||
} | |||
this.sm4Lt = function (ka) { | |||
let bb = 0 | |||
let c = 0 | |||
const a = new Array(4) | |||
const b = new Array(4) | |||
this.PUT_ULONG_BE(ka, a, 0) | |||
b[0] = this.sm4Sbox(a[0]) | |||
b[1] = this.sm4Sbox(a[1]) | |||
b[2] = this.sm4Sbox(a[2]) | |||
b[3] = this.sm4Sbox(a[3]) | |||
bb = this.GET_ULONG_BE(b, 0) | |||
c = bb ^ this.ROTL(bb, 2) ^ this.ROTL(bb, 10) ^ this.ROTL(bb, 18) ^ this.ROTL(bb, 24) | |||
return c | |||
} | |||
this.sm4F = function (x0, x1, x2, x3, rk) { | |||
return x0 ^ this.sm4Lt(x1 ^ x2 ^ x3 ^ rk) | |||
} | |||
this.sm4CalciRK = function (ka) { | |||
let bb = 0 | |||
let rk = 0 | |||
const a = new Array(4) | |||
const b = new Array(4) | |||
this.PUT_ULONG_BE(ka, a, 0) | |||
b[0] = this.sm4Sbox(a[0]) | |||
b[1] = this.sm4Sbox(a[1]) | |||
b[2] = this.sm4Sbox(a[2]) | |||
b[3] = this.sm4Sbox(a[3]) | |||
bb = this.GET_ULONG_BE(b, 0) | |||
rk = bb ^ this.ROTL(bb, 13) ^ this.ROTL(bb, 23) | |||
return rk | |||
} | |||
this.sm4Sbox = function (inch) { | |||
const i = inch & 0xFF | |||
const retVal = SboxTable[i] | |||
return retVal > 128 ? retVal - 256 : retVal | |||
} | |||
this.sm4_setkey_enc = function (ctx, key) { | |||
if (ctx == null) { | |||
alert("ctx is null!") | |||
return false | |||
} | |||
if (key == null || key.length !== 16) { | |||
alert("key error!") | |||
return false | |||
} | |||
ctx.mode = this.SM4_ENCRYPT | |||
this.sm4_setkey(ctx.sk, key) | |||
} | |||
//生成解密密钥 | |||
this.sm4_setkey_dec = function (ctx, key) { | |||
if (ctx == null) { | |||
Error("ctx is null!") | |||
} | |||
if (key == null || key.length !== 16) { | |||
Error("2key error!") | |||
} | |||
// var i = 0; | |||
ctx.mode = 0 | |||
this.sm4_setkey(ctx.sk, key) | |||
ctx.sk = ctx.sk.reverse() | |||
} | |||
this.sm4_setkey = function (SK, key) { | |||
const MK = new Array(4) | |||
const k = new Array(36) | |||
// var i = 0; | |||
MK[0] = this.GET_ULONG_BE(key, 0) | |||
MK[1] = this.GET_ULONG_BE(key, 4) | |||
MK[2] = this.GET_ULONG_BE(key, 8) | |||
MK[3] = this.GET_ULONG_BE(key, 12) | |||
k[0] = MK[0] ^ FK[0] | |||
k[1] = MK[1] ^ FK[1] | |||
k[2] = MK[2] ^ FK[2] | |||
k[3] = MK[3] ^ FK[3] | |||
for (let i = 0; i < 32; i++) { | |||
k[(i + 4)] = (k[i] ^ this.sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ CK[i])) | |||
SK[i] = k[(i + 4)] | |||
} | |||
} | |||
this.padding = function (input, mode) { | |||
let p | |||
if (input == null) { | |||
return null | |||
} | |||
let ret = null | |||
if (mode === this.SM4_ENCRYPT) { | |||
p = parseInt(16 - input.length % 16) | |||
ret = input.slice(0) | |||
for (let i = 0; i < p; i++) { | |||
ret[input.length + i] = p | |||
} | |||
} else { | |||
p = input[input.length - 1] | |||
ret = input.slice(0, input.length - p) | |||
} | |||
return ret | |||
} | |||
this.sm4_one_round = function (sk, input, output) { | |||
let i = 0 | |||
const ulbuf = new Array(36) | |||
ulbuf[0] = this.GET_ULONG_BE(input, 0) | |||
ulbuf[1] = this.GET_ULONG_BE(input, 4) | |||
ulbuf[2] = this.GET_ULONG_BE(input, 8) | |||
ulbuf[3] = this.GET_ULONG_BE(input, 12) | |||
while (i < 32) { | |||
ulbuf[(i + 4)] = this.sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]) | |||
i++ | |||
} | |||
this.PUT_ULONG_BE(ulbuf[35], output, 0) | |||
this.PUT_ULONG_BE(ulbuf[34], output, 4) | |||
this.PUT_ULONG_BE(ulbuf[33], output, 8) | |||
this.PUT_ULONG_BE(ulbuf[32], output, 12) | |||
} | |||
this.sm4_crypt_ecb = function (ctx, input) { | |||
if (input == null) { | |||
alert("input is null!") | |||
} | |||
if ((ctx.isPadding) && (ctx.mode == this.SM4_ENCRYPT)) { | |||
input = this.padding(input, this.SM4_ENCRYPT) | |||
} | |||
let i = 0 | |||
let length = input.length | |||
let bous = [] | |||
for (; length > 0; length -= 16) { | |||
var out = new Array(16) | |||
var ins = input.slice(i * 16, (16 * (i + 1))) | |||
this.sm4_one_round(ctx.sk, ins, out) | |||
bous = bous.concat(out) | |||
i++ | |||
} | |||
let output = bous | |||
if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) { | |||
output = this.padding(output, this.SM4_DECRYPT) | |||
} | |||
for (i = 0; i < output.length; i++) { | |||
if (output[i] < 0) { | |||
output[i] = output[i] + 256 | |||
} | |||
} | |||
return output | |||
} | |||
this.sm4_crypt_cbc = function (ctx, iv, input) { | |||
let out | |||
let ins | |||
let out1 | |||
let k | |||
if (iv == null || iv.length !== 16) { | |||
alert("iv error!") | |||
} | |||
if (input == null) { | |||
alert("input is null!") | |||
} | |||
if (ctx.isPadding && ctx.mode === this.SM4_ENCRYPT) { | |||
input = this.padding(input, this.SM4_ENCRYPT) | |||
} | |||
let i = 0 | |||
let length = input.length | |||
let bous = [] | |||
if (ctx.mode === this.SM4_ENCRYPT) { | |||
k = 0 | |||
for (; length > 0; length -= 16) { | |||
out = new Array(16) | |||
out1 = new Array(16) | |||
ins = input.slice(k * 16, (16 * (k + 1))) | |||
for (i = 0; i < 16; i++) { | |||
out[i] = (ins[i] ^ iv[i]) | |||
} | |||
this.sm4_one_round(ctx.sk, out, out1) | |||
iv = out1.slice(0, 16) | |||
bous = bous.concat(out1) | |||
k++ | |||
} | |||
} | |||
else { | |||
let temp = [] | |||
k = 0 | |||
for (; length > 0; length -= 16) { | |||
out = new Array(16) | |||
out1 = new Array(16) | |||
ins = input.slice(k * 16, (16 * (k + 1))) | |||
temp = ins.slice(0, 16) | |||
this.sm4_one_round(ctx.sk, ins, out) | |||
for (i = 0; i < 16; i++) { | |||
out1[i] = (out[i] ^ iv[i]) | |||
} | |||
iv = temp.slice(0, 16) | |||
bous = bous.concat(out1) | |||
k++ | |||
} | |||
} | |||
let output = bous | |||
if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) { | |||
output = this.padding(output, this.SM4_DECRYPT) | |||
} | |||
for (i = 0; i < output.length; i++) { | |||
if (output[i] < 0) { | |||
output[i] = output[i] + 256 | |||
} | |||
} | |||
return output | |||
} | |||
function SM4() { | |||
this.SM4_ENCRYPT = 1 | |||
this.SM4_DECRYPT = 0 | |||
const SboxTable = [0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, | |||
0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, | |||
0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, | |||
0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, | |||
0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, | |||
0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, | |||
0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, | |||
0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, | |||
0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, | |||
0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, | |||
0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, | |||
0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, | |||
0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, | |||
0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, | |||
0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, | |||
0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48 | |||
] | |||
const FK = [0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc] | |||
const CK = [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, | |||
0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, | |||
0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, | |||
0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, | |||
0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, | |||
0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, | |||
0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, | |||
0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 | |||
] | |||
this.GET_ULONG_BE = function(b, i) { | |||
return (b[i] & 0xff) << 24 | ((b[i + 1] & 0xff) << 16) | ((b[i + 2] & 0xff) << 8) | (b[i + 3] & 0xff) & | |||
0xffffffff | |||
} | |||
this.PUT_ULONG_BE = function(n, b, i) { | |||
var t1 = (0xFF & (n >> 24)) | |||
var t2 = (0xFF & (n >> 16)) | |||
var t3 = (0xFF & (n >> 8)) | |||
var t4 = (0xFF & (n)) | |||
b[i] = t1 > 128 ? t1 - 256 : t1 | |||
b[i + 1] = t2 > 128 ? t2 - 256 : t2 | |||
b[i + 2] = t3 > 128 ? t3 - 256 : t3 | |||
b[i + 3] = t4 > 128 ? t4 - 256 : t4 | |||
} | |||
this.SHL = function(x, n) { | |||
return (x & 0xFFFFFFFF) << n | |||
} | |||
this.ROTL = function(x, n) { | |||
// const s = this.SHL(x, n); | |||
// const ss = x >> (32 - n); | |||
return this.SHL(x, n) | x >> (32 - n) | |||
} | |||
this.sm4Lt = function(ka) { | |||
let bb = 0 | |||
let c = 0 | |||
const a = new Array(4) | |||
const b = new Array(4) | |||
this.PUT_ULONG_BE(ka, a, 0) | |||
b[0] = this.sm4Sbox(a[0]) | |||
b[1] = this.sm4Sbox(a[1]) | |||
b[2] = this.sm4Sbox(a[2]) | |||
b[3] = this.sm4Sbox(a[3]) | |||
bb = this.GET_ULONG_BE(b, 0) | |||
c = bb ^ this.ROTL(bb, 2) ^ this.ROTL(bb, 10) ^ this.ROTL(bb, 18) ^ this.ROTL(bb, 24) | |||
return c | |||
} | |||
this.sm4F = function(x0, x1, x2, x3, rk) { | |||
return x0 ^ this.sm4Lt(x1 ^ x2 ^ x3 ^ rk) | |||
} | |||
this.sm4CalciRK = function(ka) { | |||
let bb = 0 | |||
let rk = 0 | |||
const a = new Array(4) | |||
const b = new Array(4) | |||
this.PUT_ULONG_BE(ka, a, 0) | |||
b[0] = this.sm4Sbox(a[0]) | |||
b[1] = this.sm4Sbox(a[1]) | |||
b[2] = this.sm4Sbox(a[2]) | |||
b[3] = this.sm4Sbox(a[3]) | |||
bb = this.GET_ULONG_BE(b, 0) | |||
rk = bb ^ this.ROTL(bb, 13) ^ this.ROTL(bb, 23) | |||
return rk | |||
} | |||
this.sm4Sbox = function(inch) { | |||
const i = inch & 0xFF | |||
const retVal = SboxTable[i] | |||
return retVal > 128 ? retVal - 256 : retVal | |||
} | |||
this.sm4_setkey_enc = function(ctx, key) { | |||
if (ctx == null) { | |||
alert("ctx is null!") | |||
return false | |||
} | |||
if (key == null || key.length !== 16) { | |||
alert("key error!") | |||
return false | |||
} | |||
ctx.mode = this.SM4_ENCRYPT | |||
this.sm4_setkey(ctx.sk, key) | |||
} | |||
//生成解密密钥 | |||
this.sm4_setkey_dec = function(ctx, key) { | |||
if (ctx == null) { | |||
Error("ctx is null!") | |||
} | |||
if (key == null || key.length !== 16) { | |||
Error("2key error!") | |||
} | |||
// var i = 0; | |||
ctx.mode = 0 | |||
this.sm4_setkey(ctx.sk, key) | |||
ctx.sk = ctx.sk.reverse() | |||
} | |||
this.sm4_setkey = function(SK, key) { | |||
const MK = new Array(4) | |||
const k = new Array(36) | |||
// var i = 0; | |||
MK[0] = this.GET_ULONG_BE(key, 0) | |||
MK[1] = this.GET_ULONG_BE(key, 4) | |||
MK[2] = this.GET_ULONG_BE(key, 8) | |||
MK[3] = this.GET_ULONG_BE(key, 12) | |||
k[0] = MK[0] ^ FK[0] | |||
k[1] = MK[1] ^ FK[1] | |||
k[2] = MK[2] ^ FK[2] | |||
k[3] = MK[3] ^ FK[3] | |||
for (let i = 0; i < 32; i++) { | |||
k[(i + 4)] = (k[i] ^ this.sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ CK[i])) | |||
SK[i] = k[(i + 4)] | |||
} | |||
} | |||
this.padding = function(input, mode) { | |||
let p | |||
if (input == null) { | |||
return null | |||
} | |||
let ret = null | |||
if (mode === this.SM4_ENCRYPT) { | |||
p = parseInt(16 - input.length % 16) | |||
ret = input.slice(0) | |||
for (let i = 0; i < p; i++) { | |||
ret[input.length + i] = p | |||
} | |||
} else { | |||
p = input[input.length - 1] | |||
ret = input.slice(0, input.length - p) | |||
} | |||
return ret | |||
} | |||
this.sm4_one_round = function(sk, input, output) { | |||
let i = 0 | |||
const ulbuf = new Array(36) | |||
ulbuf[0] = this.GET_ULONG_BE(input, 0) | |||
ulbuf[1] = this.GET_ULONG_BE(input, 4) | |||
ulbuf[2] = this.GET_ULONG_BE(input, 8) | |||
ulbuf[3] = this.GET_ULONG_BE(input, 12) | |||
while (i < 32) { | |||
ulbuf[(i + 4)] = this.sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]) | |||
i++ | |||
} | |||
this.PUT_ULONG_BE(ulbuf[35], output, 0) | |||
this.PUT_ULONG_BE(ulbuf[34], output, 4) | |||
this.PUT_ULONG_BE(ulbuf[33], output, 8) | |||
this.PUT_ULONG_BE(ulbuf[32], output, 12) | |||
} | |||
this.sm4_crypt_ecb = function(ctx, input) { | |||
if (input == null) { | |||
alert("input is null!") | |||
} | |||
if ((ctx.isPadding) && (ctx.mode == this.SM4_ENCRYPT)) { | |||
input = this.padding(input, this.SM4_ENCRYPT) | |||
} | |||
let i = 0 | |||
let length = input.length | |||
let bous = [] | |||
for (; length > 0; length -= 16) { | |||
var out = new Array(16) | |||
var ins = input.slice(i * 16, (16 * (i + 1))) | |||
this.sm4_one_round(ctx.sk, ins, out) | |||
bous = bous.concat(out) | |||
i++ | |||
} | |||
let output = bous | |||
if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) { | |||
output = this.padding(output, this.SM4_DECRYPT) | |||
} | |||
for (i = 0; i < output.length; i++) { | |||
if (output[i] < 0) { | |||
output[i] = output[i] + 256 | |||
} | |||
} | |||
return output | |||
} | |||
this.sm4_crypt_cbc = function(ctx, iv, input) { | |||
let out | |||
let ins | |||
let out1 | |||
let k | |||
if (iv == null || iv.length !== 16) { | |||
alert("iv error!") | |||
} | |||
if (input == null) { | |||
alert("input is null!") | |||
} | |||
if (ctx.isPadding && ctx.mode === this.SM4_ENCRYPT) { | |||
input = this.padding(input, this.SM4_ENCRYPT) | |||
} | |||
let i = 0 | |||
let length = input.length | |||
let bous = [] | |||
if (ctx.mode === this.SM4_ENCRYPT) { | |||
k = 0 | |||
for (; length > 0; length -= 16) { | |||
out = new Array(16) | |||
out1 = new Array(16) | |||
ins = input.slice(k * 16, (16 * (k + 1))) | |||
for (i = 0; i < 16; i++) { | |||
out[i] = (ins[i] ^ iv[i]) | |||
} | |||
this.sm4_one_round(ctx.sk, out, out1) | |||
iv = out1.slice(0, 16) | |||
bous = bous.concat(out1) | |||
k++ | |||
} | |||
} else { | |||
let temp = [] | |||
k = 0 | |||
for (; length > 0; length -= 16) { | |||
out = new Array(16) | |||
out1 = new Array(16) | |||
ins = input.slice(k * 16, (16 * (k + 1))) | |||
temp = ins.slice(0, 16) | |||
this.sm4_one_round(ctx.sk, ins, out) | |||
for (i = 0; i < 16; i++) { | |||
out1[i] = (out[i] ^ iv[i]) | |||
} | |||
iv = temp.slice(0, 16) | |||
bous = bous.concat(out1) | |||
k++ | |||
} | |||
} | |||
let output = bous | |||
if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) { | |||
output = this.padding(output, this.SM4_DECRYPT) | |||
} | |||
for (i = 0; i < output.length; i++) { | |||
if (output[i] < 0) { | |||
output[i] = output[i] + 256 | |||
} | |||
} | |||
return output | |||
} | |||
} | |||
export function SM4Util () { | |||
// 和后端key一致 | |||
// 当时用CBC模式的时候 | |||
this.iv = "ZkR_SiNoSOFT=568" | |||
this.hexString = false | |||
// ECB模式加密 | |||
this.encryptData_ECB = function (plainText) { | |||
try { | |||
const sm4 = new SM4() | |||
const ctx = new SM4_Context() | |||
ctx.isPadding = true | |||
ctx.mode = sm4.SM4_ENCRYPT | |||
const keyBytes = this.stringToByte(this.secretKey) | |||
sm4.sm4_setkey_enc(ctx, keyBytes) | |||
const encrypted = sm4.sm4_crypt_ecb(ctx, this.stringToByte(plainText)) | |||
const cipherText = base64js.fromByteArray(encrypted) | |||
if (cipherText != null && cipherText.trim().length > 0) { | |||
cipherText.replace(/(\s*|\t|\r|\n)/g, "") | |||
} | |||
return cipherText | |||
} catch (e) { | |||
console.error(e) | |||
return null | |||
} | |||
} | |||
//解密_ECB | |||
this.decryptData_ECB = function (cipherText) { | |||
try { | |||
let sm4 = new SM4() | |||
let ctx = new SM4_Context() | |||
ctx.isPadding = true | |||
ctx.mode = sm4.SM4_ENCRYPT | |||
let keyBytes = this.stringToByte(this.secretKey) | |||
sm4.sm4_setkey_dec(ctx, keyBytes) | |||
let decrypted = sm4.sm4_crypt_ecb(ctx, base64js.toByteArray(cipherText)) | |||
return utf8ByteToUnicodeStr(decrypted) | |||
} catch (e) { | |||
console.error(e) | |||
return null | |||
} | |||
} | |||
// CBC模式加密 | |||
this.encryptData_CBC = function (plainText,secretKey) { | |||
try { | |||
plainText = JSON.stringify(plainText) | |||
const sm4 = new SM4() | |||
const ctx = new SM4_Context() | |||
ctx.isPadding = true | |||
ctx.mode = sm4.SM4_ENCRYPT | |||
const keyBytes = this.stringToByte(secretKey.substring(0,16)) | |||
const ivBytes = this.stringToByte(this.iv) | |||
sm4.sm4_setkey_enc(ctx, keyBytes) | |||
const encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, this.stringToByte(plainText)) | |||
const cipherText = base64js.fromByteArray(encrypted) | |||
if (cipherText != null && cipherText.trim().length > 0) { | |||
cipherText.replace(/(\s*|\t|\r|\n)/g, "") | |||
} | |||
return cipherText | |||
} | |||
catch (e) { | |||
console.error(e) | |||
return null | |||
} | |||
} | |||
//解密_CBC | |||
this.decryptData_CBC = function (cipherText,secretKey) { | |||
try { | |||
let sm4 = new SM4() | |||
let ctx = new SM4_Context() | |||
ctx.isPadding = true | |||
ctx.mode = sm4.SM4_ENCRYPT | |||
let keyBytes = this.stringToByte(secretKey.substring(0,16)) | |||
let ivBytes = this.stringToByte(this.iv) | |||
sm4.sm4_setkey_dec(ctx, keyBytes) | |||
let decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, base64js.toByteArray(cipherText.data.bizContent)) | |||
let bizContent = utf8ByteToUnicodeStr(decrypted) | |||
// let begin = bizContent.indexOf('{'); | |||
// let end = bizContent.lastIndexOf('}'); | |||
// cipherText.data.bizContent = bizContent.substring(begin,end+1) | |||
cipherText.data.bizContent = bizContent; | |||
return cipherText | |||
} catch (e) { | |||
console.error(e) | |||
return null | |||
} | |||
} | |||
this.stringToByte = function (str) { | |||
const bytes = [] | |||
let len, c | |||
len = str.length | |||
for (let i = 0; i < len; i++) { | |||
c = str.charCodeAt(i) | |||
if (c >= 0x010000 && c <= 0x10FFFF) { | |||
bytes.push(((c >> 18) & 0x07) | 0xF0) | |||
bytes.push(((c >> 12) & 0x3F) | 0x80) | |||
bytes.push(((c >> 6) & 0x3F) | 0x80) | |||
bytes.push((c & 0x3F) | 0x80) | |||
} else if (c >= 0x000800 && c <= 0x00FFFF) { | |||
bytes.push(((c >> 12) & 0x0F) | 0xE0) | |||
bytes.push(((c >> 6) & 0x3F) | 0x80) | |||
bytes.push((c & 0x3F) | 0x80) | |||
} else if (c >= 0x000080 && c <= 0x0007FF) { | |||
bytes.push(((c >> 6) & 0x1F) | 0xC0) | |||
bytes.push((c & 0x3F) | 0x80) | |||
} else { | |||
bytes.push(c & 0xFF) | |||
} | |||
} | |||
return bytes | |||
} | |||
this.byteToString = function (arr) { | |||
if (typeof arr === 'string') { | |||
return arr | |||
} | |||
let str = '', | |||
_arr = arr | |||
for (let i = 0; i < _arr.length; i++) { | |||
const one = _arr[i].toString(2), | |||
v = one.match(/^1+?(?=0)/) | |||
if (v && one.length === 8) { | |||
const bytesLength = v[0].length | |||
let store = _arr[i].toString(2).slice(7 - bytesLength) | |||
for (let st = 1; st < bytesLength; st++) { | |||
store += _arr[st + i].toString(2).slice(2) | |||
} | |||
str += String.fromCharCode(parseInt(store, 2)) | |||
i += bytesLength - 1 | |||
} else { | |||
str += String.fromCharCode(_arr[i]) | |||
} | |||
} | |||
return str | |||
} | |||
function utf8ByteToUnicodeStr (utf8Bytes) { | |||
var unicodeStr = "" | |||
for (var pos = 0; pos < utf8Bytes.length;) { | |||
var flag = utf8Bytes[pos] | |||
var unicode = 0 | |||
if ((flag >>> 7) === 0) { | |||
unicodeStr += String.fromCharCode(utf8Bytes[pos]) | |||
pos += 1 | |||
} else if ((flag & 0xFC) === 0xFC) { | |||
unicode = (utf8Bytes[pos] & 0x3) << 30 | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 24 | |||
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 18 | |||
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 12 | |||
unicode |= (utf8Bytes[pos + 4] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 5] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 6 | |||
} else if ((flag & 0xF8) === 0xF8) { | |||
unicode = (utf8Bytes[pos] & 0x7) << 24 | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 18 | |||
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 12 | |||
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 4] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 5 | |||
} else if ((flag & 0xF0) === 0xF0) { | |||
unicode = (utf8Bytes[pos] & 0xF) << 18 | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 12 | |||
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 3] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 4 | |||
} else if ((flag & 0xE0) === 0xE0) { | |||
unicode = (utf8Bytes[pos] & 0x1F) << 12;; | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 2] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 3 | |||
} else if ((flag & 0xC0) === 0xC0) { //110 | |||
unicode = (utf8Bytes[pos] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 2 | |||
} else { | |||
unicodeStr += String.fromCharCode(utf8Bytes[pos]) | |||
pos += 1 | |||
} | |||
} | |||
return unicodeStr | |||
} | |||
export function SM4Util() { | |||
// 和后端key一致 | |||
// 当时用CBC模式的时候 | |||
this.iv = "ZkR_SiNoSOFT=568" | |||
this.hexString = false | |||
// ECB模式加密 | |||
this.encryptData_ECB = function(plainText) { | |||
try { | |||
const sm4 = new SM4() | |||
const ctx = new SM4_Context() | |||
ctx.isPadding = true | |||
ctx.mode = sm4.SM4_ENCRYPT | |||
const keyBytes = this.stringToByte(this.secretKey) | |||
sm4.sm4_setkey_enc(ctx, keyBytes) | |||
const encrypted = sm4.sm4_crypt_ecb(ctx, this.stringToByte(plainText)) | |||
const cipherText = base64js.fromByteArray(encrypted) | |||
if (cipherText != null && cipherText.trim().length > 0) { | |||
cipherText.replace(/(\s*|\t|\r|\n)/g, "") | |||
} | |||
return cipherText | |||
} catch (e) { | |||
console.error(e) | |||
return null | |||
} | |||
} | |||
//解密_ECB | |||
this.decryptData_ECB = function(cipherText) { | |||
try { | |||
let sm4 = new SM4() | |||
let ctx = new SM4_Context() | |||
ctx.isPadding = true | |||
ctx.mode = sm4.SM4_ENCRYPT | |||
let keyBytes = this.stringToByte(this.secretKey) | |||
sm4.sm4_setkey_dec(ctx, keyBytes) | |||
let decrypted = sm4.sm4_crypt_ecb(ctx, base64js.toByteArray(cipherText)) | |||
return utf8ByteToUnicodeStr(decrypted) | |||
} catch (e) { | |||
console.error(e) | |||
return null | |||
} | |||
} | |||
// CBC模式加密 | |||
this.encryptData_CBC = function(plainText, secretKey) { | |||
try { | |||
plainText = JSON.stringify(plainText) | |||
const sm4 = new SM4() | |||
const ctx = new SM4_Context() | |||
ctx.isPadding = true | |||
ctx.mode = sm4.SM4_ENCRYPT | |||
const keyBytes = this.stringToByte(secretKey.substring(0, 16)) | |||
const ivBytes = this.stringToByte(this.iv) | |||
sm4.sm4_setkey_enc(ctx, keyBytes) | |||
const encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, this.stringToByte(plainText)) | |||
const cipherText = base64js.fromByteArray(encrypted) | |||
if (cipherText != null && cipherText.trim().length > 0) { | |||
cipherText.replace(/(\s*|\t|\r|\n)/g, "") | |||
} | |||
return cipherText | |||
} catch (e) { | |||
console.error(e) | |||
return null | |||
} | |||
} | |||
//解密_CBC | |||
this.decryptData_CBC = function(cipherText, secretKey) { | |||
try { | |||
let sm4 = new SM4() | |||
let ctx = new SM4_Context() | |||
ctx.isPadding = true | |||
ctx.mode = sm4.SM4_ENCRYPT | |||
let keyBytes = this.stringToByte(secretKey.substring(0, 16)) | |||
let ivBytes = this.stringToByte(this.iv) | |||
sm4.sm4_setkey_dec(ctx, keyBytes) | |||
let decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, base64js.toByteArray(cipherText.data.bizContent)) | |||
let bizContent = utf8ByteToUnicodeStr(decrypted) | |||
// let begin = bizContent.indexOf('{'); | |||
// let end = bizContent.lastIndexOf('}'); | |||
// cipherText.data.bizContent = bizContent.substring(begin,end+1) | |||
cipherText.data.bizContent = bizContent; | |||
return cipherText | |||
} catch (e) { | |||
console.error(e) | |||
return null | |||
} | |||
} | |||
this.stringToByte = function(str) { | |||
const bytes = [] | |||
let len, c | |||
len = str.length | |||
for (let i = 0; i < len; i++) { | |||
c = str.charCodeAt(i) | |||
if (c >= 0x010000 && c <= 0x10FFFF) { | |||
bytes.push(((c >> 18) & 0x07) | 0xF0) | |||
bytes.push(((c >> 12) & 0x3F) | 0x80) | |||
bytes.push(((c >> 6) & 0x3F) | 0x80) | |||
bytes.push((c & 0x3F) | 0x80) | |||
} else if (c >= 0x000800 && c <= 0x00FFFF) { | |||
bytes.push(((c >> 12) & 0x0F) | 0xE0) | |||
bytes.push(((c >> 6) & 0x3F) | 0x80) | |||
bytes.push((c & 0x3F) | 0x80) | |||
} else if (c >= 0x000080 && c <= 0x0007FF) { | |||
bytes.push(((c >> 6) & 0x1F) | 0xC0) | |||
bytes.push((c & 0x3F) | 0x80) | |||
} else { | |||
bytes.push(c & 0xFF) | |||
} | |||
} | |||
return bytes | |||
} | |||
this.byteToString = function(arr) { | |||
if (typeof arr === 'string') { | |||
return arr | |||
} | |||
let str = '', | |||
_arr = arr | |||
for (let i = 0; i < _arr.length; i++) { | |||
const one = _arr[i].toString(2), | |||
v = one.match(/^1+?(?=0)/) | |||
if (v && one.length === 8) { | |||
const bytesLength = v[0].length | |||
let store = _arr[i].toString(2).slice(7 - bytesLength) | |||
for (let st = 1; st < bytesLength; st++) { | |||
store += _arr[st + i].toString(2).slice(2) | |||
} | |||
str += String.fromCharCode(parseInt(store, 2)) | |||
i += bytesLength - 1 | |||
} else { | |||
str += String.fromCharCode(_arr[i]) | |||
} | |||
} | |||
return str | |||
} | |||
function utf8ByteToUnicodeStr(utf8Bytes) { | |||
var unicodeStr = "" | |||
for (var pos = 0; pos < utf8Bytes.length;) { | |||
var flag = utf8Bytes[pos] | |||
var unicode = 0 | |||
if ((flag >>> 7) === 0) { | |||
unicodeStr += String.fromCharCode(utf8Bytes[pos]) | |||
pos += 1 | |||
} else if ((flag & 0xFC) === 0xFC) { | |||
unicode = (utf8Bytes[pos] & 0x3) << 30 | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 24 | |||
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 18 | |||
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 12 | |||
unicode |= (utf8Bytes[pos + 4] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 5] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 6 | |||
} else if ((flag & 0xF8) === 0xF8) { | |||
unicode = (utf8Bytes[pos] & 0x7) << 24 | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 18 | |||
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 12 | |||
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 4] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 5 | |||
} else if ((flag & 0xF0) === 0xF0) { | |||
unicode = (utf8Bytes[pos] & 0xF) << 18 | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 12 | |||
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 3] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 4 | |||
} else if ((flag & 0xE0) === 0xE0) { | |||
unicode = (utf8Bytes[pos] & 0x1F) << 12;; | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 2] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 3 | |||
} else if ((flag & 0xC0) === 0xC0) { //110 | |||
unicode = (utf8Bytes[pos] & 0x3F) << 6 | |||
unicode |= (utf8Bytes[pos + 1] & 0x3F) | |||
unicodeStr += String.fromCharCode(unicode) | |||
pos += 2 | |||
} else { | |||
unicodeStr += String.fromCharCode(utf8Bytes[pos]) | |||
pos += 1 | |||
} | |||
} | |||
return unicodeStr | |||
} | |||
} |