index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. const fs = require('fs')
  2. process.on('message', async (message, setHandle) => {
  3. let path = message.split('=')[0]
  4. let m = message.split('=')[1]
  5. let posConfig = await getPosConfigData(path)
  6. // 模拟交易成功
  7. if (posConfig && posConfig.mock && JSON.parse(m).tradeType === 'C') {
  8. process.send('00621485******8058 C000000000001000491907921687738091 130804630025191046300569111160804145549D_U 0000000000010000000000000804145549000491921687738091 130804 001')
  9. process.exit(0)
  10. }
  11. // 模拟退货成功
  12. if (posConfig && posConfig.mock && JSON.parse(m).tradeType === 'R') {
  13. process.send('00621485******8058 C000000000001000491308921687738091 130804630025191046300569111160804145549D_U 0000000000010000000000000804145549000491921687738091 130804 001')
  14. process.exit(0)
  15. }
  16. // console.log('子进程接收到消息' + m, __dirname)
  17. const ffi = require('ffi')
  18. let posPath = require('path').join(posConfig.softposPath, 'softpos.dll')
  19. const isExist = fs.existsSync(posPath)
  20. if (!isExist) {
  21. // 未找到支付程序
  22. exit()
  23. }
  24. if (process.env.NODE_ENV !== 'development') {
  25. posPath = posPath.replace('app.asar', 'app.asar.unpacked')
  26. }
  27. const kernel32 = ffi.Library('kernel32', {
  28. 'SetDllDirectoryA': ['bool', ['string']]
  29. })
  30. kernel32.SetDllDirectoryA(posConfig.softposPath)
  31. console.log('软件路径', posPath)
  32. let softpos = ffi.Library(posPath, {
  33. 'CreditTransABC': ['int', ['char*', 'char*']]
  34. })
  35. try {
  36. let output = Buffer.alloc(287)
  37. let input = Buffer.alloc(287)
  38. input.write(getPayParams(JSON.parse(m)))
  39. softpos.CreditTransABC(input, output)
  40. // 输出结果
  41. process.send(output.toString('utf-8'))
  42. process.kill(process.pid)
  43. process.exit(0)
  44. } catch (e) {
  45. console.log('错误', e)
  46. }
  47. // sendHandle是一个 net.Socket 或 net.Server 对象
  48. })
  49. process.on('uncaughtException', function (err) {
  50. console.log('捕获到一个未被处理的错误:', err)
  51. })
  52. function exit () {
  53. process.send(0)
  54. process.kill(process.pid)
  55. process.exit(0)
  56. }
  57. function getPayParams (params) {
  58. let { termId, salerId, tradeType, total, payType, codeInfo, originalInfo } = params
  59. termId = termId.padEnd(10)
  60. salerId = salerId.padEnd(10)
  61. total = total.padStart(12, '0')
  62. codeInfo = codeInfo.padEnd(32)
  63. originalInfo = originalInfo.padEnd(96)
  64. console.log({
  65. termId, salerId, tradeType, total, payType, codeInfo, originalInfo
  66. })
  67. return termId + salerId + tradeType + total + payType + codeInfo + originalInfo
  68. }
  69. function getPosConfigData (path) {
  70. return new Promise((resolve, reject) => {
  71. let configFile = path
  72. console.log(configFile)
  73. let fs = require('fs')
  74. fs.open(configFile, 'r', (err, data) => {
  75. if (err) {
  76. console.log(err)
  77. resolve()
  78. return
  79. }
  80. resolve(JSON.parse(fs.readFileSync(configFile)))
  81. })
  82. })
  83. }