bindCard.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. <template>
  2. <view>
  3. <view class="step ddflex">
  4. <view :class="'li' + (stepOne ? ' ing' : '') + (stepOneComplete ? ' end' : '')">
  5. <view class="num">1</view>
  6. <image src="../../static/promote/images/gou_h.png" class="s-gou"></image>
  7. <text>验证身份信息</text>
  8. </view>
  9. <view :class="'li' + (stepTwo ? ' ing' : '') + (stepTwoComplete ? ' end' : '')">
  10. <view class="num">2</view>
  11. <image src="../../static/promote/images/gou_h.png" class="s-gou"></image>
  12. <text>验证银行卡信息</text>
  13. </view>
  14. </view>
  15. <block v-if="stepOne">
  16. <view class="form">
  17. <view class="li cards">
  18. <label class="label">身份证信息</label>
  19. <view class="card ddflex">
  20. <view class="linsence" @click="uploadImgs(1)">
  21. <image :src="fileInfo.legalPersonidPositivePic ? fileInfo.legalPersonidPositivePic : '../../static/promote/images/card_front.png'"></image>
  22. <view>身份证人像面</view>
  23. </view>
  24. <view class="linsence" @click="uploadImgs(2)">
  25. <image :src="fileInfo.egalPersonidOppositePic ? fileInfo.egalPersonidOppositePic : '../../static/promote/images/card_back.png'"></image>
  26. <view>身份证国徽面</view>
  27. </view>
  28. </view>
  29. </view>
  30. <view class="li ddflex">
  31. <label class="label">姓名</label>
  32. <view class="item fflex"><input v-model="rName" placeholder="上传身份证人像面自动获取" placeholder-class="placeholder" class="ipt" /></view>
  33. </view>
  34. <view class="li ddflex">
  35. <label class="label">身份证号</label>
  36. <view class="item fflex"><input v-model="rCode" placeholder="上传身份证人像面自动获取" placeholder-class="placeholder" class="ipt" /></view>
  37. </view>
  38. <view class="li ddflex">
  39. <label class="label">有效期限</label>
  40. <view class="item ddflex fflex">
  41. <input v-model="rValidDate" placeholder="上传身份证国徽面自动获取" placeholder-class="placeholder" class="ipt fflex" />
  42. <!-- <view class="chang ddflex">
  43. <image src="../../static/promote/images/gou1.png"></image>
  44. 长期
  45. </view> -->
  46. </view>
  47. </view>
  48. <view class="li dflex">
  49. <label class="label">所在城市</label>
  50. <view class="item dflex flex">
  51. <input :disabled="true" v-model="address" placeholder="点击右侧图标获取" placeholder-class="placeholder" class="ipt flex" />
  52. <image src="../../static/promote/images/dzico.png" class="location" @click="chooseLocation()"></image>
  53. </view>
  54. </view>
  55. </view>
  56. <view class="next" @click="toStepTwo">下一步</view>
  57. </block>
  58. <block v-if="stepTwo">
  59. <view class="form">
  60. <view class="li cards">
  61. <label class="label">银行卡</label>
  62. <view class="linsence" @click="uploadImgs(3)">
  63. <image :src="bankUrl ? bankUrl : '../../static/promote/images/card.png'"></image>
  64. <view>上传储蓄银行卡正面照</view>
  65. </view>
  66. </view>
  67. <view class="li dflex">
  68. <label class="label">户名</label>
  69. <view class="item flex"><input :disabled="true" v-model="rName" placeholder="请输入户主名称" placeholder-class="placeholder" class="ipt" /></view>
  70. </view>
  71. <view class="li ddflex">
  72. <label class="label">开户银行</label>
  73. <view class="item fflex">
  74. <picker :class="'pickers ' + (bankName ? 'active' : '')" @change="bindPickerBank" range-key="name" :range="bankList">
  75. <view v-if="bankName" class="ipt">{{ bankName }}</view>
  76. <view v-else class="ipt_g">请选择开户银行</view>
  77. <image src="../../../static/pages/images/crico1.png" class="rico"></image>
  78. </picker>
  79. </view>
  80. </view>
  81. <view class="li ddflex">
  82. <label class="label">银行卡号</label>
  83. <view class="item fflex"><input v-model="bankNo" placeholder="上传后自动获取" placeholder-class="placeholder" class="ipt" /></view>
  84. </view>
  85. <view class="li flexs dflex">
  86. <label class="label">预留手机</label>
  87. <view class="item flex">
  88. <input type="number" v-model="bankAcctPhone" maxlength="11" placeholder="请输入银行预留手机号" placeholder-class="placeholder" class="ipt" />
  89. </view>
  90. </view>
  91. </view>
  92. <view class="next" @click="submit()">确定绑卡</view>
  93. </block>
  94. </view>
  95. </template>
  96. <script>
  97. const app = getApp();
  98. // const util = require('../../../utils/util.js');
  99. const req = require('../../../utils/request.js');
  100. const hfParams = require('../../../utils/hfParams.js');
  101. var QQMapWX = require('../../../utils/qqmap.js');
  102. export default {
  103. data() {
  104. return {
  105. isEdit: false,
  106. stepOne: true,
  107. stepOneComplete: false,
  108. stepTwo: false,
  109. stepTwoComplete: false,
  110. fileInfo: {
  111. legalPersonidPositivePic: '', //正面
  112. egalPersonidOppositePic: '' //反面
  113. },
  114. //身份信息
  115. rName: '',
  116. rCode: '',
  117. rValidDate: '',
  118. location: '',
  119. addIds: '',
  120. address: '', //区域
  121. addressDetails: '',
  122. cityList: [],
  123. bankList: [],
  124. bankUrl: '', //银行卡图片
  125. bankPosition: -1, //下标
  126. bankName: '', //银行名字
  127. bankAcctName: '', //户名
  128. bankNo: '', //卡号
  129. bankAcctPhone: '',
  130. settlementInfo: '',
  131. isEnd: false //是否为查看编辑
  132. };
  133. },
  134. onLoad(opt) {
  135. this.cityList = hfParams.mArea();
  136. this.bankList = hfParams.bank();
  137. if (opt.isEnd) {
  138. this.isEnd = opt.isEnd;
  139. //默认选中上面的标签
  140. let pages = getCurrentPages(); //获取所有页面栈实例列表
  141. let prevPage = pages[pages.length - 2]; //上一页页面实例
  142. this.settlementInfo = prevPage.$vm.settlementInfo;
  143. if (this.settlementInfo) {
  144. this.addIds = this.settlementInfo.provCode + ',' + this.settlementInfo.areaCode;
  145. this.address = this.settlementInfo.address;
  146. this.rName = this.settlementInfo.cardName;
  147. this.bankName = this.getBankName(this.settlementInfo.bankCode);
  148. this.bankAcctName = this.settlementInfo.cardName;
  149. this.bankUrl = this.settlementInfo.bankUrl;
  150. this.bankNo = this.settlementInfo.cardNo.replace(/[\t\r\f\n\s]*/g,'');
  151. this.fileInfo = JSON.parse(this.settlementInfo.fileJson);
  152. this.rCode = this.settlementInfo.legalCertId;
  153. this.rValidDate = this.settlementInfo.legalCertIdExpires;
  154. this.bankAcctPhone = this.settlementInfo.legalMp;
  155. }
  156. }
  157. },
  158. methods: {
  159. getBankName(code) {
  160. for (var i = 0; i < this.bankList.length; i++) {
  161. var bankObj = this.bankList[i];
  162. if (bankObj.code == code) {
  163. this.bankPosition = i;
  164. return bankObj.name;
  165. }
  166. }
  167. },
  168. toStepTwo() {
  169. if (!this.fileInfo.legalPersonidPositivePic) {
  170. req.msg('请上传身份证人像面');
  171. return;
  172. }
  173. if (!this.fileInfo.egalPersonidOppositePic) {
  174. req.msg('请上传身份证国徽面');
  175. return;
  176. }
  177. if (!this.rName) {
  178. req.msg('姓名不能为空');
  179. return;
  180. }
  181. if (!this.rCode) {
  182. req.msg('身份证号不能为空');
  183. return;
  184. }
  185. if (!this.rValidDate) {
  186. req.msg('身份证有效期不能为空');
  187. return;
  188. }
  189. if (!this.addIds) {
  190. req.msg('请选择所在地区');
  191. return;
  192. }
  193. this.stepOne = false;
  194. this.stepOneComplete = true;
  195. this.stepTwo = true;
  196. },
  197. uploadImgs(type) {
  198. // if (!this.isEdit) {
  199. // return;
  200. // }
  201. let that = this;
  202. uni.chooseImage({
  203. count: 1,
  204. sizeType: ['original', 'compressed'],
  205. sourceType: ['album', 'camera'],
  206. success(res) {
  207. uni.showLoading({
  208. title: '上传中'
  209. });
  210. req.uploadFile('/api/upload', res.tempFilePaths[0], res => {
  211. uni.hideLoading();
  212. if (type == 1) {
  213. //正面
  214. that.fileInfo.legalPersonidPositivePic = res.src;
  215. that.ocrCard(res.src, 1);
  216. } else if (type == 2) {
  217. //反面
  218. that.fileInfo.egalPersonidOppositePic = res.src;
  219. that.ocrCard(res.src, 2);
  220. } else if (type == 3) {
  221. that.bankUrl = res.src;
  222. uni.showLoading({
  223. title: '识别中'
  224. });
  225. req.getRequest('/baiduAI/bank', { imgUrl: res.src }, json => {
  226. uni.hideLoading();
  227. if (json.result) {
  228. that.bankNo = json.result.bank_card_number;
  229. that.initCheckBank(json.result.bank_name);
  230. }
  231. });
  232. }
  233. });
  234. }
  235. });
  236. },
  237. ocrCard(imgUrl, type) {
  238. uni.showLoading({
  239. title: '识别中'
  240. });
  241. //front back
  242. var idCardDide = type == 1 ? 'front' : 'back';
  243. req.getRequest('/baiduAI/ocrIdcard', { imgUrl: imgUrl, idCardDide: idCardDide }, json => {
  244. uni.hideLoading();
  245. if (type == 1) {
  246. this.rName = json.words_result.姓名.words;
  247. this.rCode = json.words_result.公民身份号码.words;
  248. } else if (type == 2) {
  249. var dataStr = json.words_result.失效日期.words;
  250. if (dataStr === '长期') {
  251. this.rValidDate = '2099-12-31';
  252. } else {
  253. var y = dataStr.slice(0, 4);
  254. var m = dataStr.slice(4, 6);
  255. var d = dataStr.slice(6, 8);
  256. this.rValidDate = y + '-' + m + '-' + d;
  257. }
  258. }
  259. });
  260. },
  261. initCheckBank(name) {
  262. for (var i = 0; i < this.bankList.length; i++) {
  263. var bankObj = this.bankList[i];
  264. if (bankObj.name == name) {
  265. this.bankPosition = i;
  266. this.bankName = name;
  267. }
  268. }
  269. },
  270. chooseLocation() {
  271. var tha = this;
  272. uni.chooseLocation({
  273. success: res => {
  274. if (res.name) {
  275. tha.location = res;
  276. tha.addressDetails = res.address;
  277. tha.reverseGeocoder(res);
  278. }
  279. },
  280. fail: () => {
  281. uni.getSetting({
  282. success: function(res) {
  283. var statu = res.authSetting;
  284. console.log(statu);
  285. if (!statu['scope.userLocation']) {
  286. console.log(123);
  287. uni.showModal({
  288. title: '是否授权当前位置',
  289. content: '需要获取您的地理位置,请确认授权,否则地图功能将无法使用',
  290. success(tip) {
  291. if (tip.confirm) {
  292. uni.openSetting({
  293. success: function(data) {
  294. if (data.authSetting['scope.userLocation'] === true) {
  295. //授权成功之后,再调用chooseLocation选择地方
  296. setTimeout(function() {
  297. uni.chooseLocation({
  298. success: res => {
  299. if (res.name) {
  300. tha.location = res;
  301. tha.addressDetails = res.address;
  302. console.log('地址数据addressDetail》》》:', tha.addressDetails);
  303. tha.reverseGeocoder(res);
  304. }
  305. }
  306. });
  307. }, 1000);
  308. }
  309. }
  310. });
  311. }
  312. }
  313. });
  314. }
  315. }
  316. });
  317. }
  318. });
  319. },
  320. reverseGeocoder(location) {
  321. QQMapWX.initMap(req.public.mapLBSKEY);
  322. QQMapWX.reverseGeocoder(location, data => {
  323. this.address = data.ad_info.province + ' ' + data.ad_info.city; //+ ' ' + data.ad_info.district
  324. for (var i = 0; i < this.cityList.length; i++) {
  325. var cityObj = this.cityList[i];
  326. if (data.ad_info.province.indexOf(cityObj.label) != -1) {
  327. for (var k = 0; k < cityObj.children.length; k++) {
  328. var areaObj = cityObj.children[k];
  329. if (data.ad_info.city.indexOf(areaObj.label) != -1) {
  330. this.addIds = cityObj.value + ',' + areaObj.value;
  331. }
  332. }
  333. }
  334. }
  335. console.log('解析后的地址地址数据:', this.address + '》》》' + this.addIds);
  336. });
  337. },
  338. bindPickerBank(event) {
  339. this.bankPosition = event.detail.value;
  340. this.bankName = this.bankList[this.bankPosition].name;
  341. },
  342. submit() {
  343. if (!this.bankUrl) {
  344. req.msg('请上传银行卡正面照');
  345. return;
  346. }
  347. if (!this.bankName) {
  348. req.msg('请选择开户银行');
  349. return;
  350. }
  351. if (!this.bankNo) {
  352. req.msg('请输入银行卡号');
  353. return;
  354. }
  355. if (!this.bankAcctPhone) {
  356. req.msg('请输入银行预留手机号');
  357. return;
  358. }
  359. var addIds = this.addIds.split(',');
  360. var params = {
  361. provCode: addIds[0],
  362. areaCode: addIds[1], //商户所在地区
  363. address: this.address,
  364. bankAcctType: 2,
  365. cardName: this.rName,
  366. bankCode: this.bankList[this.bankPosition].code,
  367. bankUrl: this.bankUrl,
  368. cardNo: this.bankNo.replace(/[\t\r\f\n\s]*/g,''),
  369. fileJson: JSON.stringify(this.fileInfo),
  370. haveLicenseNo: 2,
  371. legalCertName: this.rName,
  372. legalCertId: this.rCode,
  373. legalCertIdExpires: this.rValidDate,
  374. isOpen: 0,
  375. legalMp: this.bankAcctPhone
  376. };
  377. req.postRequest('/api/v3/settlement/create', params, json => {
  378. req.msg('添加成功');
  379. setTimeout(() => {
  380. uni.navigateBack();
  381. }, 1500);
  382. });
  383. }
  384. }
  385. };
  386. </script>
  387. <style>
  388. @import './bindCard.css';
  389. </style>