1.使用vant调起支付表单支付失败
解决方式:动态创建form表单提交参数。
var tempForm = document.createElement("form");
tempForm.id = "tempForm1";
tempForm.method = "post";
tempForm.action = "/scanpay/paymentGateway/";
var hmhtOrderAmt = document.createElement("input");
hmhtOrderAmt.type = "hidden";
hmhtOrderAmt.name = "mhtOrderAmt";
hmhtOrderAmt.value = this.money;
tempForm.appendChild(hmhtOrderAmt);
//添加临时form
document.body.appendChild(tempForm);
//必须手动的触发,否则只能看到页面刷新而没有打开新窗口
tempForm.submit();
//移除临时创建的form
document.body.removeChild(tempForm);
```
2.使用自定义数字键盘时系统默认键盘弹起
解决方式:设置输入框为只读状态,自定义光标。
html
<div class="iptStyle">
<van-field
v-model="money"
class="order-money-ipt"
type="number"
name="mhtOrderAmt"
placeholder="0.00"
:border="false"
:center="true"
readonly
@touchstart.native.stop="showKeyboard"
id="input"
>
<span slot="label" class="order-unit">¥</span>
</van-field>
<div v-show="outlineCss" class="ipt">{{this.money}}</div>
</div>
showKeyboard() {
this.show = true;
this.outlineCss = true;
if (this.money.length > 0) {
let iptElement = document.getElementById("input");
iptElement.style.opacity = "0";
}
}
.ipt {
position: absolute;
top: 50%;
margin-top: -1.333438rem;
left: 5.95rem;
font-size: 2rem;
height: 2.666875rem;
line-height: 2.666875rem;
&::after {
content: "";
animation: cursor-blinks 1.5s infinite steps(1, start);
position: absolute;
width: 2px;
height: 2.666875rem;
right: 0;
top: 2.5px;
background: rgb(0, 0, 0);
border-radius: 2px;
}
}
3.数据加密问题RSA、AES
(1).RSA加密解密工具类(加密公钥)
jsencrypt.js
/*****
* RSA加密解密工具类
* **/
import encryption from "./encryption.js"; //加密
let publicKey = "" //使用RSA签名验签工具获取公钥
let privateKey = '' //使用RSA签名验签工具获取私钥
//加密方法
export function encrypt(data) {
let encryptor = new JSEncrypt()
encryptor.setPublicKey(publicKey) // 设置公钥
return encryptor.encrypt(data) // 对需要加密的数据进行加密
}
export function decrypt(rsaDta) {
let decryptor = new JSEncrypt(); // 新建JSEncrypt对象
let b = encryption.decrypt(privateKey);
decryptor.setPrivateKey(b); // 设置私钥
const data = decryptor.decrypt(rsaDta); // 进行解密
return data
}
(2).AES加密解密工具类(加密私钥)
/*****
* AES加密解密工具类
* **/
import Vue from 'vue'
import CryptoJS from 'crypto-js'
export default { //加密
encrypt(word) {
let key = CryptoJS.enc.Utf8.parse( ' ti4TaU8dKRrsBrPYtO5lrvrALcjPL4OY ' );//后端提供
let srcs = CryptoJS.enc.Utf8.parse(word);
let encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
return encrypted.toString();
},
//解密
decrypt(word) {
var key = CryptoJS.enc.Utf8.parse('ti4TaU8dKRrsBrPYtO5lrvrALcjPL4OY');//ti4TaU8dKRrsBrPYtO5lrvrALcjPL4OY 后端提供
var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
使用:
引入 import { encrypt } from "../../utils/jsencrypt.js"; //加密
加密参数 this.formData.bankCardId = encrypt(this.bankCardId);
解密同理。
4.复制参数使用深拷贝
(1).JSON.parse(JSON.stringify(value))
不可以拷贝undefined , function, RegExp 等类型;
(2)Object.assign(target, source)
不适合多层嵌套
(3)递归拷贝
相对于另外两种方式,此方式可拷贝类型更广泛。