You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

nfc.vue 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <!--设备选择 -->
  2. <template>
  3. <view class="devices">
  4. <view class="hint">
  5. <view class="orange-txt as-layout-horizontal as-gravity-center-start tishi">
  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. import {
  28. login
  29. } from "../../utils/network/api";
  30. const tools = require("../../static/etcUtil/tools.js");
  31. const NFCAPI = require('../../static/nfc/NFCAPI.js');
  32. const cmd = require("../../static/etcUtil/cmdConfig.js");
  33. const routeType = ref(null); //来源 1激活 2圈存 3信息重写 4信息读取
  34. const state = reactive({
  35. fee: "",
  36. cardId: ""
  37. });
  38. onLoad((option) => {
  39. routeType.value = option.routeType ? option.routeType : "1";
  40. state.cardId = option.cardId;
  41. if (option.fee) {
  42. state.fee = option.fee;
  43. }
  44. console.log("传过来的参数", option)
  45. });
  46. //已准备
  47. onReady(() => {
  48. scanNfc();
  49. })
  50. function load() {
  51. scanNfc();
  52. }
  53. function scanNfc() {
  54. tools.showLoadingAlert("扫描NFC中");
  55. //先断开所有设备
  56. NFCAPI.remove(() => {
  57. //开始扫描设备
  58. NFCAPI.startScanDevice((res) => {
  59. tools.hideLoadingAlert();
  60. if (res.code != 0) {
  61. console.log("1111111")
  62. if (res.code == 1203) {
  63. tools.showModalAlert("扫描超时请重新扫描NFC标签", function(res) {
  64. if (res.confirm) {
  65. scanNfc();
  66. }
  67. }, null, "", true)
  68. } else {
  69. tools.showToastAlert(res.msg);
  70. }
  71. return;
  72. } else {
  73. console.log("2222")
  74. NFCAPI.connectDevice(function() {
  75. if (res.code != 0) {
  76. tools.showToastAlert(res.msg);
  77. return;
  78. }
  79. //获取卡信息
  80. transCmd(function(items) {
  81. getCardId(items, function() {
  82. if (routeType.value == "2") {
  83. tools.toUrl(
  84. `/pages/recharge/recharge-weixin?connectSuccess=1&&cardId=${state.cardId}&&fee=${state.fee}&&transWay=nfc`
  85. ); //跳转到圈存界面
  86. }
  87. })
  88. })
  89. });
  90. }
  91. })
  92. })
  93. }
  94. function getCardId(resultCmdArr: any, callback: any) {
  95. var that = this;
  96. console.log(resultCmdArr, '==============123')
  97. if (resultCmdArr.length == 4) {
  98. var str = resultCmdArr[2].substring(resultCmdArr[2].length - 4, resultCmdArr[2].length); //判断是否为9000
  99. var str3 = resultCmdArr[3].substring(resultCmdArr[3].length - 4, resultCmdArr[3].length); //判断是否为9000
  100. if (str == "9000" || str3 == "9000") {
  101. if (resultCmdArr[2].length > 86 || resultCmdArr[3] >= 12) {
  102. var card = {
  103. cardNo: resultCmdArr[2].substring(20, 40),
  104. startTime: resultCmdArr[2].substring(40, 48),
  105. endTime: resultCmdArr[2].substring(48, 56),
  106. version: resultCmdArr[2].substring(18, 19) >= 4 ? "4x" : "2x",
  107. money: hex2int(resultCmdArr[3].substring(0, 8)),
  108. v_userType: parseInt(resultCmdArr[2].substring(80, 82), 16)
  109. };
  110. console.log("写命令拿到卡号:" + JSON.stringify(card))
  111. var jizhangka = card.cardNo.substring(8, 10);
  112. if (jizhangka == '23') {
  113. console.log('记账卡');
  114. tools.alertFback("不支持记账卡圈存", function() {
  115. //返回首页
  116. uni.reLaunch({
  117. url: 'pages/index/index'
  118. })
  119. })
  120. return;
  121. }
  122. // that.setData({
  123. // cardNo: card.cardNo,
  124. // cardMoney: card.money > 0 ? card.money : 0,
  125. // })
  126. callback(card.cardNo);
  127. } else {
  128. tools.showToastAlert("CMD_READBINARY指令长度不符" + resultCmdArr[2]);
  129. }
  130. return;
  131. }
  132. } else {
  133. tools.showToastAlert("回包长度不符");
  134. }
  135. }
  136. /**
  137. * 十六进制字符串转十进制
  138. */
  139. function hex2int(hex) {
  140. var len = hex.length,
  141. a = new Array(len),
  142. code;
  143. for (var i = 0; i < len; i++) {
  144. code = hex.charCodeAt(i);
  145. if (48 <= code && code < 58) {
  146. code -= 48;
  147. } else {
  148. code = (code & 0xdf) - 65 + 10;
  149. }
  150. a[i] = code;
  151. }
  152. return a.reduce(function(acc, c) {
  153. acc = 16 * acc + c;
  154. return acc;
  155. }, 0);
  156. }
  157. function transCmd(callback: any) {
  158. tools.showLoadingAlert('透传指令中');
  159. var cmdArr = [cmd.HOME_DIRECTORY, cmd.APPLICATION_DIRECTORY, cmd.CMD_READBINARY, cmd.CMD_GETBALANCE];
  160. NFCAPI.transCmd(cmdArr, function(res) {
  161. tools.hideLoadingAlert();
  162. console.log(res);
  163. if (res.code == 0) {
  164. callback(res.data);
  165. } else {
  166. tools.showToastAlert(res.msg);
  167. }
  168. });
  169. }
  170. </script>
  171. <style lang='scss' scoped>
  172. image {
  173. width: 40rpx;
  174. height: 40rpx;
  175. margin-right: 20rpx;
  176. }
  177. .devices {
  178. padding: 30rpx;
  179. }
  180. .btn {
  181. margin-top: 30rpx;
  182. }
  183. .tishi {
  184. margin-bottom: 20rpx;
  185. }
  186. </style>