Source: sdk-file/src/wechat/pay.js

const BaaS = require('core-module/baas')
const HError = require('core-module/HError')
const polyfill = BaaS._polyfill

const API = BaaS._config.API


const keysMap = {
  merchandiseSchemaID: 'merchandise_schema_id', // optional
  merchandiseRecordID: 'merchandise_record_id', // optional
  merchandiseSnapshot: 'merchandise_snapshot', // optional
  profitSharing: 'profit_sharing', // optional
  merchandiseDescription: 'merchandise_description', // required
  totalCost: 'total_cost', // required
}

/**
 * 微信支付
 * @function
 * @memberof BaaS
 * @param {BaaS.PaymentParams} params 参数
 * @return {Promise<any>}
 */
const pay = (params) => {
  let paramsObj = {}

  for (let key in params) {
    paramsObj[keysMap[key]] = params[key]
  }

  paramsObj.gateway_type = 'weixin_tenpay'

  return BaaS._baasRequest({
    url: API.PAY,
    method: 'POST',
    data: paramsObj,
  }).then(function (res) {
    let data = res.data || {}
    return new Promise((resolve, reject) => {
      polyfill.wxPaymentRequest({
        appId: data.appId,
        timeStamp: data.timeStamp,
        nonceStr: data.nonceStr,
        package: data.package,
        signType: 'MD5',
        paySign: data.paySign,
        success: function (res) {
          res.transaction_no = data.transaction_no
          res.trade_no = data.trade_no
          return resolve(res)
        },
        complete: function (res) {
          // 兼容:微信 6.5.2 及之前版本中,用户取消支付不会触发 fail 回调,只会触发 complete 回调,回调 errMsg 为 'requestPayment:cancel'
          if (res.errMsg == 'requestPayment:fail cancel') {
            reject(new HError(607))
          }
        },
        fail: function (err) {
          // 微信不使用状态码来区分支付取消和支付失败,这里返回自定义状态码和微信的错误信息,便于用户判断和排错
          if (err.errMsg == 'requestPayment:fail cancel') {
            reject(new HError(607))
          } else {
            reject(new HError(608, err.errMsg))
          }
        },
      })
    })
  })
}

module.exports = pay