@antmove/wx-alipay
Version:
transform wechat miniprogram to alipay miniprogram tool.
668 lines (596 loc) • 19.7 kB
JavaScript
const logUtils = require('./log.js')
const hasProxy = typeof Proxy !== 'undefined'
let _Proxy = function() {}
if (hasProxy) { _Proxy = Proxy }
module.exports = {
...logUtils,
/**
* defineGetter
*/
defineGetter(obj = {}, descObj = {}, cb = () => {}) {
if (!hasProxy) {
return obj
}
return new _Proxy(obj, {
get(target, attr) {
if (typeof attr === 'string' && descObj[attr] && descObj[attr].type === 0) {
cb && cb(target, attr)
}
return target[attr]
},
})
},
/**
* sourceObj : 要操作对象
* wxAttr: 微信key值
* alipayAttr: 支付宝key值
**/
objectMap(sourceObj = {}, wxAttr, alipayAttr) {
if (!hasProxy) {
Object.defineProperty(sourceObj, wxAttr, {
get() {
return sourceObj[alipayAttr]
},
})
return sourceObj
}
return new _Proxy(sourceObj, {
get(target, attr) {
if (attr === wxAttr) {
return target[alipayAttr]
}
},
})
},
// 类型转换
changeType(str) {
const hexA = new Array(0)
if (typeof attr === 'string') {
// 十六进制字符串转字节数组
let pos = 0
let len = str.length
if (len % 2 !== 0) {
return null
}
len /= 2
for (let i = 0; i < len; i++) {
const s = str.substr(pos, 2)
const v = parseInt(s, 16)
hexA.push(v)
pos += 2
}
return hexA
}
},
// https://github.com/wandergis/coordtransform/blob/master/index.js
gcj02towgs84(_lng, _lat) {
const lat = +_lat
const lng = +_lng
const ee = 0.00669342162296594323
const a = 6378245.0
if (out_of_china(lng, lat)) {
return [lng, lat]
} else {
let dlat = transformlat(lng - 105.0, lat - 35.0)
let dlng = transformlng(lng - 105.0, lat - 35.0)
const radlat = (lat / 180.0) * Math.PI
let magic = Math.sin(radlat)
magic = 1 - (ee * magic * magic)
const sqrtmagic = Math.sqrt(magic)
dlat = (dlat * 180.0) / (((a * (1 - ee)) / (magic * sqrtmagic)) * Math.PI)
dlng = (dlng * 180.0) / ((a / sqrtmagic) * Math.cos(radlat) * Math.PI)
const mglat = lat + dlat
const mglng = lng + dlng
return [(lng * 2) - mglng, (lat * 2) - mglat]
}
},
ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
(bit) => {
return (`00${bit.toString(16)}`).slice(-2)
},
)
return hexArr.join('')
},
/**
* change attr for object
* replace attr by newAttr
*/
changeObjAttr(obj = {}, attr, newAttr) {
if (obj[attr] !== undefined) {
obj[newAttr] = obj[attr]
delete obj[attr]
} else {
console.warn(`${attr} attribute is missing!`)
}
return obj
},
fnAppClass,
browserPath,
mapAuthSetting,
}
function out_of_china(lng, lat) {
// 纬度3.86~53.55,经度73.66~135.05
return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55)
}
function transformlat(lng, lat) {
let ret = -100.0 + (2.0 * lng) + (3.0 * lat) + (0.2 * lat * lat) + (0.1 * lng * lat) + (0.2 * Math.sqrt(Math.abs(lng)))
ret += (((20.0 * Math.sin(6.0 * lng * Math.PI)) + (20.0 * Math.sin(2.0 * lng * Math.PI))) * 2.0) / 3.0
ret += (((20.0 * Math.sin(lat * Math.PI)) + (40.0 * Math.sin((lat / 3.0) * Math.PI))) * 2.0) / 3.0
ret += (((160.0 * Math.sin((lat / 12.0) * Math.PI)) + (320 * Math.sin((lat * Math.PI) / 30.0))) * 2.0) / 3.0
return ret
}
function transformlng(lng, lat) {
let ret = 300.0 + lng + (2.0 * lat) + (0.1 * lng * lng) + (0.1 * lng * lat) + (0.1 * Math.sqrt(Math.abs(lng)))
ret += (((20.0 * Math.sin(6.0 * lng * Math.PI)) + (20.0 * Math.sin(2.0 * lng * Math.PI))) * 2.0) / 3.0
ret += (((20.0 * Math.sin(lng * Math.PI)) + (40.0 * Math.sin((lng / 3.0) * Math.PI))) * 2.0) / 3.0
ret += (((150.0 * Math.sin((lng / 12.0) * Math.PI)) + (300.0 * Math.sin((lng / 30.0) * Math.PI))) * 2.0) / 3.0
return ret
}
function fnAppClass() {
const fn = {
$data: {},
add(key, cb = () => {}) {
fn.$data[key] = fn.$data[key] || []
fn.$data[key].push(cb)
return fn
},
insert(key, cb = () => {}) {
fn.$data[key] = fn.$data[key] || []
fn.$data[key].unshift(cb)
},
getFn(key) {
return fn.$data[key]
},
bind(key, ctx = {}) {
fn.$data[key] = fn.$data[key] || []
fn.add(key, ctx[key])
ctx[key] = function(...params) {
const self = this
fn.getFn(key)
.forEach((cb) => {
cb.apply(self, params)
})
}
},
}
return fn
}
function assertPath(path) {
if (typeof path !== 'string') {
throw new TypeError(`Path must be a string. Received ${JSON.stringify(path)}`)
}
}
// Resolves . and .. elements in a path with directory names
function normalizeStringPosix(path, allowAboveRoot) {
let res = ''
let lastSegmentLength = 0
let lastSlash = -1
let dots = 0
let code
for (let i = 0; i <= path.length; ++i) {
if (i < path.length) { code = path.charCodeAt(i) } else if (code === 47 /* /*/) { break } else { code = 47 /* /*/ }
if (code === 47 /* /*/) {
if (lastSlash === i - 1 || dots === 1) {
// NOOP
} else if (lastSlash !== i - 1 && dots === 2) {
if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /* .*/ || res.charCodeAt(res.length - 2) !== 46 /* .*/) {
if (res.length > 2) {
const lastSlashIndex = res.lastIndexOf('/')
if (lastSlashIndex !== res.length - 1) {
if (lastSlashIndex === -1) {
res = ''
lastSegmentLength = 0
} else {
res = res.slice(0, lastSlashIndex)
lastSegmentLength = res.length - 1 - res.lastIndexOf('/')
}
lastSlash = i
dots = 0
continue
}
} else if (res.length === 2 || res.length === 1) {
res = ''
lastSegmentLength = 0
lastSlash = i
dots = 0
continue
}
}
if (allowAboveRoot) {
if (res.length > 0) { res += '/..' } else { res = '..' }
lastSegmentLength = 2
}
} else {
if (res.length > 0) { res += `/${path.slice(lastSlash + 1, i)}` } else { res = path.slice(lastSlash + 1, i) }
lastSegmentLength = i - lastSlash - 1
}
lastSlash = i
dots = 0
} else if (code === 46 /* .*/ && dots !== -1) {
++dots
} else {
dots = -1
}
}
return res
}
function _format(sep, pathObject) {
const dir = pathObject.dir || pathObject.root
const base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '')
if (!dir) {
return base
}
if (dir === pathObject.root) {
return dir + base
}
return dir + sep + base
}
const posix = {
// path.resolve([from ...], to)
resolve: function resolve(...args) {
let resolvedPath = ''
let resolvedAbsolute = false
let cwd
for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
let path
if (i >= 0) { path = args[i] } else {
if (cwd === undefined) { cwd = process.cwd() }
path = cwd
}
assertPath(path)
// Skip empty entries
if (path.length === 0) {
continue
}
resolvedPath = `${path}/${resolvedPath}`
resolvedAbsolute = path.charCodeAt(0) === 47 /* /*/
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
// Normalize the path
resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute)
if (resolvedAbsolute) {
if (resolvedPath.length > 0) { return `/${resolvedPath}` }
return '/'
} else if (resolvedPath.length > 0) {
return resolvedPath
}
return '.'
},
normalize: function normalize(path) {
assertPath(path)
if (path.length === 0) { return '.' }
const isAbsolute = path.charCodeAt(0) === 47 /* /*/
const trailingSeparator = path.charCodeAt(path.length - 1) === 47 /* /*/
// Normalize the path
path = normalizeStringPosix(path, !isAbsolute)
if (path.length === 0 && !isAbsolute) { path = '.' }
if (path.length > 0 && trailingSeparator) { path += '/' }
if (isAbsolute) { return `/${path}` }
return path
},
isAbsolute: function isAbsolute(path) {
assertPath(path)
return path.length > 0 && path.charCodeAt(0) === 47 /* /*/
},
join: function join(...p) {
if (p.length === 0) { return '.' }
let joined
for (let i = 0; i < p.length; ++i) {
const arg = p[i]
assertPath(arg)
if (arg.length > 0) {
if (joined === undefined) { joined = arg } else { joined += `/${arg}` }
}
}
if (joined === undefined) { return '.' }
return posix.normalize(joined)
},
relative: function relative(from, to) {
assertPath(from)
assertPath(to)
if (from === to) { return '' }
from = posix.resolve(from)
to = posix.resolve(to)
if (from === to) { return '' }
// Trim any leading backslashes
let fromStart = 1
for (; fromStart < from.length; ++fromStart) {
if (from.charCodeAt(fromStart) !== 47 /* /*/) { break }
}
const fromEnd = from.length
const fromLen = fromEnd - fromStart
// Trim any leading backslashes
let toStart = 1
for (; toStart < to.length; ++toStart) {
if (to.charCodeAt(toStart) !== 47 /* /*/) { break }
}
const toEnd = to.length
const toLen = toEnd - toStart
// Compare paths to find the longest common path from root
const length = fromLen < toLen ? fromLen : toLen
let lastCommonSep = -1
let i = 0
for (; i <= length; ++i) {
if (i === length) {
if (toLen > length) {
if (to.charCodeAt(toStart + i) === 47 /* /*/) {
// We get here if `from` is the exact base path for `to`.
// For example: from='/foo/bar'; to='/foo/bar/baz'
return to.slice(toStart + i + 1)
} else if (i === 0) {
// We get here if `from` is the root
// For example: from='/'; to='/foo'
return to.slice(toStart + i)
}
} else if (fromLen > length) {
if (from.charCodeAt(fromStart + i) === 47 /* /*/) {
// We get here if `to` is the exact base path for `from`.
// For example: from='/foo/bar/baz'; to='/foo/bar'
lastCommonSep = i
} else if (i === 0) {
// We get here if `to` is the root.
// For example: from='/foo'; to='/'
lastCommonSep = 0
}
}
break
}
const fromCode = from.charCodeAt(fromStart + i)
const toCode = to.charCodeAt(toStart + i)
if (fromCode !== toCode) { break } else if (fromCode === 47 /* /*/) { lastCommonSep = i }
}
let out = ''
// Generate the relative path based on the path difference between `to`
// and `from`
for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
if (i === fromEnd || from.charCodeAt(i) === 47 /* /*/) {
if (out.length === 0) { out += '..' } else { out += '/..' }
}
}
// Lastly, append the rest of the destination (`to`) path that comes after
// the common path parts
if (out.length > 0) { return out + to.slice(toStart + lastCommonSep) }
toStart += lastCommonSep
if (to.charCodeAt(toStart) === 47 /* /*/) { ++toStart }
return to.slice(toStart)
},
_makeLong: function _makeLong(path) {
return path
},
dirname: function dirname(path) {
assertPath(path)
if (path.length === 0) { return '.' }
let code = path.charCodeAt(0)
const hasRoot = code === 47 /* /*/
let end = -1
let matchedSlash = true
for (let i = path.length - 1; i >= 1; --i) {
code = path.charCodeAt(i)
if (code === 47 /* /*/) {
if (!matchedSlash) {
end = i
break
}
} else {
// We saw the first non-path separator
matchedSlash = false
}
}
if (end === -1) { return hasRoot ? '/' : '.' }
if (hasRoot && end === 1) { return '//' }
return path.slice(0, end)
},
basename: function basename(path, ext) {
if (ext !== undefined && typeof ext !== 'string') { throw new TypeError('"ext" argument must be a string') }
assertPath(path)
let start = 0
let end = -1
let matchedSlash = true
let i
if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
if (ext.length === path.length && ext === path) { return '' }
let extIdx = ext.length - 1
let firstNonSlashEnd = -1
for (i = path.length - 1; i >= 0; --i) {
const code = path.charCodeAt(i)
if (code === 47 /* /*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
start = i + 1
break
}
} else {
if (firstNonSlashEnd === -1) {
// We saw the first non-path separator, remember this index in case
// we need it if the extension ends up not matching
matchedSlash = false
firstNonSlashEnd = i + 1
}
if (extIdx >= 0) {
// Try to match the explicit extension
if (code === ext.charCodeAt(extIdx)) {
if (--extIdx === -1) {
// We matched the extension, so mark this as the end of our path
// component
end = i
}
} else {
// Extension does not match, so our result is the entire path
// component
extIdx = -1
end = firstNonSlashEnd
}
}
}
}
if (start === end) { end = firstNonSlashEnd } else if (end === -1) { end = path.length }
return path.slice(start, end)
}
for (i = path.length - 1; i >= 0; --i) {
if (path.charCodeAt(i) === 47 /* /*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
start = i + 1
break
}
} else if (end === -1) {
// We saw the first non-path separator, mark this as the end of our
// path component
matchedSlash = false
end = i + 1
}
}
if (end === -1) { return '' }
return path.slice(start, end)
},
extname: function extname(path) {
assertPath(path)
let startDot = -1
let startPart = 0
let end = -1
let matchedSlash = true
// Track the state of characters (if any) we see before our first dot and
// after any path separator we find
let preDotState = 0
for (let i = path.length - 1; i >= 0; --i) {
const code = path.charCodeAt(i)
if (code === 47 /* /*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
startPart = i + 1
break
}
continue
}
if (end === -1) {
// We saw the first non-path separator, mark this as the end of our
// extension
matchedSlash = false
end = i + 1
}
if (code === 46 /* .*/) {
// If this is our first dot, mark it as the start of our extension
if (startDot === -1) { startDot = i } else if (preDotState !== 1) { preDotState = 1 }
} else if (startDot !== -1) {
// We saw a non-dot and non-path separator before our dot, so we should
// have a good chance at having a non-empty extension
preDotState = -1
}
}
if (startDot === -1 || end === -1
// We saw a non-dot character immediately before the dot
|| preDotState === 0
// The (right-most) trimmed path component is exactly '..'
|| (preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)) {
return ''
}
return path.slice(startDot, end)
},
format: function format(pathObject) {
if (pathObject === null || typeof pathObject !== 'object') {
throw new TypeError(`The "pathObject" argument must be of type Object. Received type ${typeof pathObject}`)
}
return _format('/', pathObject)
},
parse: function parse(path) {
assertPath(path)
const ret = { root: '', dir: '', base: '', ext: '', name: '' }
if (path.length === 0) { return ret }
let code = path.charCodeAt(0)
const isAbsolute = code === 47 /* /*/
let start
if (isAbsolute) {
ret.root = '/'
start = 1
} else {
start = 0
}
let startDot = -1
let startPart = 0
let end = -1
let matchedSlash = true
let i = path.length - 1
// Track the state of characters (if any) we see before our first dot and
// after any path separator we find
let preDotState = 0
// Get non-dir info
for (; i >= start; --i) {
code = path.charCodeAt(i)
if (code === 47 /* /*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
startPart = i + 1
break
}
continue
}
if (end === -1) {
// We saw the first non-path separator, mark this as the end of our
// extension
matchedSlash = false
end = i + 1
}
if (code === 46 /* .*/) {
// If this is our first dot, mark it as the start of our extension
if (startDot === -1) { startDot = i } else if (preDotState !== 1) { preDotState = 1 }
} else if (startDot !== -1) {
// We saw a non-dot and non-path separator before our dot, so we should
// have a good chance at having a non-empty extension
preDotState = -1
}
}
if (startDot === -1 || end === -1
// We saw a non-dot character immediately before the dot
|| preDotState === 0
// The (right-most) trimmed path component is exactly '..'
|| (preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)) {
if (end !== -1) {
if (startPart === 0 && isAbsolute) { ret.base = path.slice(1, end); ret.name = path.slice(1, end) } else { ret.base = path.slice(startPart, end); ret.name = path.slice(startPart, end) }
}
} else {
if (startPart === 0 && isAbsolute) {
ret.name = path.slice(1, startDot)
ret.base = path.slice(1, end)
} else {
ret.name = path.slice(startPart, startDot)
ret.base = path.slice(startPart, end)
}
ret.ext = path.slice(startDot, end)
}
if (startPart > 0) { ret.dir = path.slice(0, startPart - 1) } else if (isAbsolute) { ret.dir = '/' }
return ret
},
sep: '/',
delimiter: ':',
win32: null,
posix: null,
}
posix.posix = posix
function browserPath() {
return posix
}
function mapAuthSetting(obj) {
const keys = [
['scope.userLocation', 'location'],
['scope.writePhotosAlbum', 'album'],
['scope.camera', 'camera'],
['scope.userInfo', 'userInfo'],
['scope.address', 'aliaddress'],
['scope.werun', 'alipaysports']
]
const authSetting = {}
keys.forEach((item) => {
const value = obj[item[1]]
if (typeof value !== 'undefined') {
authSetting[item[0]] = value
}
})
return authSetting
}