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

const HError = require('core-module/HError')

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

const RESULT_CODE = {
  SUCCESS: '9000',
  PENDING: '8000',
  FAIL: '4000',
}

class PayError extends HError {
  mapErrorMessage(code) {
    code = code.toString()
    switch (code) {
    case RESULT_CODE.FAIL:
      return '订单支付失败'
    case '6001':
      return '用户中途取消'
    case '6002':
      return '网络连接出错'
    case '6004':
      return '支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态'
    case '99':
      return '用户点击忘记密码导致快捷界面退出' // only iOS
    default:
      return '未知错误'
    }
  }
}

/**
 * 支付宝支付
 * @function
 * @name pay
 * @memberof BaaS
 * @param {BaaS.PaymentParams} params 参数
 * @return {Promise<any>}
 */
const createPayFn = BaaS => params => {
  const API = BaaS._config.API
  let paramsObj = {}

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

  paramsObj.gateway_type = 'alipay'

  return BaaS._baasRequest({
    url: API.PAY,
    method: 'POST',
    data: paramsObj,
  }).then(res => {
    const data = res.data || {}
    return new Promise((resolve, reject) => {
      my.tradePay({
        tradeNO: data.trade_no,
        success: res => {
          if (res.resultCode == RESULT_CODE.SUCCESS || res.resultCode == RESULT_CODE.PENDING) {
            res.transaction_no = data.transaction_no
            res.trade_no = data.trade_no
            return resolve(res)
          } else {
            return reject(new PayError(res.resultCode))
          }
        },
        fail: () => {
          return reject(new PayError(RESULT_CODE.FAIL))
        }
      })
    })
  })
}

module.exports = function (BaaS) {
  BaaS.pay = createPayFn(BaaS)
}