選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

nfc.vue 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <!--设备选择 -->
  2. <template>
  3. <view class="devices">
  4. <view class="hint">
  5. <view class="orange-txt as-layout-horizontal as-gravity-center-start">
  6. <image :src="`${$imgUrl}common/icon-hint.png`" mode="aspectFill"></image>
  7. <view>温馨提示:</view>
  8. </view>
  9. <view>1、请在手机设置中打开NFC功能。</view>
  10. <view>2、请将ETC储值卡对准手机NFC天线位置(手机背部顶端),不灵敏或无响应时,请及时调整卡片位置。</view>
  11. <view>3、充值过程请保证卡片在手机背部,请勿移开。</view>
  12. </view>
  13. <view class="btn">
  14. <submit-button title="点击重新扫描NFC标签" @submit="load"></submit-button>
  15. </view>
  16. </view>
  17. </template>
  18. <script setup lang='ts'>
  19. import {
  20. onLoad,
  21. onReady
  22. } from "@dcloudio/uni-app";
  23. import {
  24. ref,
  25. reactive
  26. } from "vue";
  27. const tools = require("../../static/etcUtil/tools.js");
  28. const NFCAPI = require('../../static/nfc/NFCAPI.js');
  29. const cmd = require("../../static/etcUtil/cmdConfig.js");
  30. const routeType = ref(null); //来源 1激活 2圈存 3信息重写 4信息读取
  31. const state = reactive({
  32. fee: "",
  33. cardId: ""
  34. });
  35. onLoad((option) => {
  36. routeType.value = option.routeType ? option.routeType : "1";
  37. state.cardId = option.cardId;
  38. if (option.fee) {
  39. state.fee = option.fee;
  40. }
  41. console.log("传过来的参数", option)
  42. });
  43. //已准备
  44. onReady(() => {
  45. scanNfc();
  46. })
  47. function load() {
  48. scanNfc();
  49. }
  50. function scanNfc() {
  51. tools.showLoadingAlert("扫描蓝牙中");
  52. //先断开所有设备
  53. NFCAPI.remove(() => {
  54. //开始扫描设备
  55. NFCAPI.startScanDevice((res) => {
  56. tools.hideLoadingAlert();
  57. if (res.code != 0) {
  58. if (res.code == 1203) {
  59. tools.showModalAlert("扫描超时请重新扫描NFC标签", function(res) {
  60. if (res.confirm) {
  61. scanNfc();
  62. }
  63. }, null, "", true)
  64. } else {
  65. tools.showToastAlert(res.msg);
  66. }
  67. return;
  68. } else {
  69. NFCAPI.connectDevice(function() {
  70. if (res.code != 0) {
  71. tools.showToastAlert(res.msg);
  72. return;
  73. }
  74. //获取卡信息
  75. transCmd(function() {
  76. getCardId(res, function() {
  77. if (routeType.value == "2") {
  78. tools.toUrl(
  79. `/pages/recharge/recharge?connectSuccess=1&&cardId=${state.cardId}&&fee=${state.fee}`
  80. ); //跳转到圈存界面
  81. }
  82. })
  83. })
  84. });
  85. }
  86. })
  87. })
  88. }
  89. function getCardId(resultCmdArr: any, callback: any) {
  90. var that = this;
  91. if (resultCmdArr.length == 4) {
  92. var str = resultCmdArr[2].substring(resultCmdArr[2].length - 4, resultCmdArr[2].length); //判断是否为9000
  93. var str3 = resultCmdArr[3].substring(resultCmdArr[3].length - 4, resultCmdArr[3].length); //判断是否为9000
  94. if (str == "9000" || str3 == "9000") {
  95. if (resultCmdArr[2].length > 86 || resultCmdArr[3] >= 12) {
  96. var card = {
  97. cardNo: resultCmdArr[2].substring(20, 40),
  98. startTime: resultCmdArr[2].substring(40, 48),
  99. endTime: resultCmdArr[2].substring(48, 56),
  100. version: resultCmdArr[2].substring(18, 19) >= 4 ? "4x" : "2x",
  101. money: that.hex2int(resultCmdArr[3].substring(0, 8)),
  102. v_userType: parseInt(resultCmdArr[2].substring(80, 82), 16)
  103. };
  104. console.log("写命令拿到卡号:" + JSON.stringify(card))
  105. var jizhangka = card.cardNo.substring(8, 10);
  106. if (jizhangka == '23') {
  107. console.log('记账卡');
  108. tools.alertFback("不支持记账卡圈存", function() {
  109. //返回首页
  110. uni.reLaunch({
  111. url: 'pages/index/index'
  112. })
  113. })
  114. return;
  115. }
  116. that.setData({
  117. cardNo: card.cardNo,
  118. cardMoney: card.money > 0 ? card.money : 0,
  119. })
  120. callback(card.cardNo);
  121. } else {
  122. tools.showToastAlert("CMD_READBINARY指令长度不符" + resultCmdArr[2]);
  123. }
  124. return;
  125. }
  126. } else {
  127. tools.showToastAlert("回包长度不符");
  128. }
  129. }
  130. function transCmd(callback: any) {
  131. tools.showLoadingAlert('透传指令中');
  132. var cmdArr = [cmd.HOME_DIRECTORY, cmd.APPLICATION_DIRECTORY, cmd.CMD_READBINARY, cmd.CMD_GETBALANCE];
  133. NFCAPI.transCmd(cmdArr, function(res) {
  134. tools.hideLoadingAlert();
  135. console.log(res);
  136. if (res.code == 0) {
  137. callback(res.data);
  138. } else {
  139. tools.showToastAlert(res.msg);
  140. }
  141. });
  142. }
  143. </script>
  144. <style lang='scss' scoped>
  145. </style>