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.

142 lines
3.5 KiB

3 years ago
  1. 'use strict';
  2. const {
  3. wxConfigMp,
  4. wxConfigApp,
  5. aliConfigMp,
  6. aliConfigApp,
  7. } = require('config')
  8. const uniPay = require('unipay')
  9. const db = uniCloud.database();
  10. exports.main = async (event, context) => {
  11. let uniPayInstance
  12. let payType;
  13. const path = event.path.substring(1);
  14. switch (path.split('/')[1]) {
  15. case 'wxpay_mp-weixin':
  16. uniPayInstance = uniPay.initWeixin(wxConfigMp)
  17. payType = 'wxpay';
  18. break;
  19. case 'alipay_mp-alipay':
  20. uniPayInstance = uniPay.initAlipay(aliConfigMp)
  21. payType = 'alipay';
  22. break;
  23. case 'wxpay_app-plus':
  24. uniPayInstance = uniPay.initWeixin(wxConfigApp)
  25. payType = 'wxpay';
  26. break;
  27. case 'alipay_app-plus':
  28. uniPayInstance = uniPay.initAlipay(aliConfigApp)
  29. payType = 'alipay';
  30. break;
  31. default:
  32. await db.collection('log').add({
  33. err: '参数错误',
  34. event
  35. })
  36. return {
  37. code: -1,
  38. msg: '参数错误'
  39. }
  40. }
  41. let verifyResult = await uniPayInstance.verifyPaymentNotify(event)
  42. if (!verifyResult) {
  43. return {}
  44. }
  45. let {
  46. outTradeNo,
  47. totalFee,
  48. transactionId,
  49. resultCode
  50. } = verifyResult
  51. const orderType = path.split('/')[0];
  52. let orderDb;
  53. if(orderType === 'payOrder'){
  54. orderDb = db.collection('mix-order');
  55. }else if(orderType === 'recharge'){
  56. orderDb = db.collection('mix-recharge');
  57. }else{
  58. return {}
  59. }
  60. const orderList = await orderDb.where({
  61. order_number: outTradeNo
  62. }).get()
  63. if (orderList.data.length === 0) {
  64. return {}
  65. }
  66. const orderDetail = orderList.data[0]
  67. if (totalFee !== orderDetail.price_data.pay_price * 100 || (resultCode !== 'SUCCESS' && resultCode !== 'FINISHED')) {
  68. return {}
  69. }
  70. //订单已支付
  71. if(orderDetail.pay_status === 1){
  72. return {};
  73. }
  74. const userData = await db.collection('mix-uni-id-users').doc(orderDetail.uid).get();
  75. //更新订单信息
  76. if(orderType === 'payOrder'){
  77. //商品订单
  78. const timeline = orderDetail.timeline;
  79. timeline.unshift({
  80. time: + new Date(),
  81. title: '订单支付成功',
  82. type: '支付订单'
  83. })
  84. await orderDb.doc(orderDetail._id).update({
  85. pay_type: payType,
  86. pay_status: 1,
  87. status: 1,
  88. status_tip: '订单支付成功,商品正在出库',
  89. timeline
  90. })
  91. //记录流水
  92. await db.collection('mix-money-log').add({
  93. uid: orderDetail.uid,
  94. title: '支付订单 ' + outTradeNo,
  95. type: 'pay_order',
  96. add_time: + new Date,
  97. money: - orderDetail.price_data.pay_price,
  98. username: userData.data[0].username,
  99. pay_type: payType
  100. })
  101. }else if(orderType === 'recharge'){
  102. //余额充值
  103. const transaction = await db.startTransaction();
  104. let res = await transaction.collection('mix-recharge').doc(orderDetail._id).update({
  105. pay_type: payType,
  106. pay_status: 1
  107. })
  108. if(res.updated !== 1){
  109. await transaction.rollback()
  110. return {}
  111. }
  112. res = await transaction.collection('mix-uni-id-users').doc(orderDetail.uid).update({
  113. money: db.command.inc(+orderDetail.price_data.pay_price)
  114. })
  115. if(res.updated !== 1){
  116. await transaction.rollback()
  117. return {}
  118. }
  119. //记录流水
  120. res = await transaction.collection('mix-money-log').add({
  121. uid: orderDetail.uid,
  122. title: '余额充值-' + (payType === 'wxpay' ? '微信' : '支付宝'),
  123. type: 'recharge',
  124. add_time: + new Date,
  125. money: +orderDetail.price_data.pay_price,
  126. username: userData.data[0].username,
  127. pay_type: payType
  128. })
  129. if(res.id){
  130. await transaction.commit()
  131. }else{
  132. await transaction.rollback()
  133. }
  134. return {};
  135. }
  136. return {}
  137. };