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.
203 lines
5.4 KiB
203 lines
5.4 KiB
'use strict';
|
|
|
|
const crypto = require('crypto')
|
|
|
|
const {
|
|
HTTP_STATUS
|
|
} = require('./consts.js')
|
|
|
|
const {
|
|
BridgeError
|
|
} = require('./bridge-error.js')
|
|
|
|
class WeixinServer {
|
|
|
|
constructor(options = {}) {
|
|
this._appid = options.appid
|
|
this._secret = options.secret
|
|
}
|
|
|
|
getAccessToken() {
|
|
return uniCloud.httpclient.request(WeixinServer.AccessToken_Url, {
|
|
dataType: 'json',
|
|
method: 'POST',
|
|
contentType: 'json',
|
|
data: {
|
|
appid: this._appid,
|
|
secret: this._secret,
|
|
grant_type: "client_credential"
|
|
}
|
|
})
|
|
}
|
|
|
|
// 使用客户端获取的 code 从微信服务器换取 openid,code 仅可使用一次
|
|
codeToSession(code) {
|
|
return uniCloud.httpclient.request(WeixinServer.Code2Session_Url, {
|
|
dataType: 'json',
|
|
data: {
|
|
appid: this._appid,
|
|
secret: this._secret,
|
|
js_code: code,
|
|
grant_type: 'authorization_code'
|
|
}
|
|
})
|
|
}
|
|
|
|
getUserEncryptKey({
|
|
access_token,
|
|
openid,
|
|
session_key
|
|
}) {
|
|
console.log(access_token, openid, session_key);
|
|
const signature = crypto.createHmac('sha256', session_key).update('').digest('hex')
|
|
return uniCloud.httpclient.request(WeixinServer.User_Encrypt_Key_Url, {
|
|
dataType: 'json',
|
|
method: 'POST',
|
|
dataAsQueryString: true,
|
|
data: {
|
|
access_token,
|
|
openid: openid,
|
|
signature: signature,
|
|
sig_method: 'hmac_sha256'
|
|
}
|
|
})
|
|
}
|
|
|
|
getH5AccessToken() {
|
|
return uniCloud.httpclient.request(WeixinServer.AccessToken_H5_Url, {
|
|
dataType: 'json',
|
|
method: 'GET',
|
|
data: {
|
|
appid: this._appid,
|
|
secret: this._secret,
|
|
grant_type: "client_credential"
|
|
}
|
|
})
|
|
}
|
|
|
|
getH5Ticket(access_token) {
|
|
return uniCloud.httpclient.request(WeixinServer.Ticket_Url, {
|
|
dataType: 'json',
|
|
dataAsQueryString: true,
|
|
method: 'POST',
|
|
data: {
|
|
access_token
|
|
}
|
|
})
|
|
}
|
|
|
|
getH5AccessTokenForEip() {
|
|
return uniCloud.httpProxyForEip.postForm(WeixinServer.AccessToken_H5_Url, {
|
|
appid: this._appid,
|
|
secret: this._secret,
|
|
grant_type: "client_credential"
|
|
}, {
|
|
dataType: 'json'
|
|
})
|
|
}
|
|
|
|
getH5TicketForEip(access_token) {
|
|
return uniCloud.httpProxyForEip.postForm(WeixinServer.Ticket_Url, {
|
|
access_token
|
|
}, {
|
|
dataType: 'json',
|
|
dataAsQueryString: true
|
|
})
|
|
}
|
|
}
|
|
|
|
WeixinServer.AccessToken_Url = 'https://api.weixin.qq.com/cgi-bin/stable_token'
|
|
WeixinServer.Code2Session_Url = 'https://api.weixin.qq.com/sns/jscode2session'
|
|
WeixinServer.User_Encrypt_Key_Url = 'https://api.weixin.qq.com/wxa/business/getuserencryptkey'
|
|
WeixinServer.AccessToken_H5_Url = 'https://api.weixin.qq.com/cgi-bin/token'
|
|
WeixinServer.Ticket_Url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi'
|
|
|
|
WeixinServer.GetMPAccessToken = function(options) {
|
|
return new WeixinServer(options).getAccessToken()
|
|
}
|
|
|
|
WeixinServer.GetCodeToSession = function(options) {
|
|
return new WeixinServer(options).codeToSession(options.code)
|
|
}
|
|
|
|
WeixinServer.GetUserEncryptKey = function(options) {
|
|
return new WeixinServer(options).getUserEncryptKey(options)
|
|
}
|
|
|
|
WeixinServer.GetH5AccessToken = function(options) {
|
|
return new WeixinServer(options).getH5AccessToken()
|
|
}
|
|
|
|
WeixinServer.GetH5Ticket = function(options) {
|
|
return new WeixinServer(options).getH5Ticket(options.access_token)
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
function isAliyun() {
|
|
return (uniCloud.getCloudInfos()[0].provider === 'aliyun')
|
|
}
|
|
|
|
WeixinServer.GetResponseData = function(response) {
|
|
console.log("WeixinServer::response", response)
|
|
|
|
if (!(response.status === HTTP_STATUS.SUCCESS || response.statusCodeValue === HTTP_STATUS.SUCCESS)) {
|
|
throw new BridgeError(response.status || response.statusCodeValue, response.status || response.statusCodeValue)
|
|
}
|
|
|
|
const responseData = response.data || response.body
|
|
|
|
if (responseData.errcode !== undefined && responseData.errcode !== 0) {
|
|
throw new BridgeError(responseData.errcode, responseData.errmsg)
|
|
}
|
|
|
|
return responseData
|
|
}
|
|
|
|
WeixinServer.GetMPAccessTokenData = async function(options) {
|
|
const response = await new WeixinServer(options).getAccessToken()
|
|
return WeixinServer.GetResponseData(response)
|
|
}
|
|
|
|
WeixinServer.GetCodeToSessionData = async function(options) {
|
|
const response = await new WeixinServer(options).codeToSession(options.code)
|
|
return WeixinServer.GetResponseData(response)
|
|
}
|
|
|
|
WeixinServer.GetUserEncryptKeyData = async function(options) {
|
|
const response = await new WeixinServer(options).getUserEncryptKey(options)
|
|
return WeixinServer.GetResponseData(response)
|
|
}
|
|
|
|
WeixinServer.GetH5AccessTokenData = async function(options) {
|
|
const ws = new WeixinServer(options)
|
|
let response
|
|
if (isAliyun()) {
|
|
response = await ws.getH5AccessTokenForEip()
|
|
if (typeof response === 'string') {
|
|
response = JSON.parse(response)
|
|
}
|
|
} else {
|
|
response = await ws.getH5AccessToken()
|
|
}
|
|
return WeixinServer.GetResponseData(response)
|
|
}
|
|
|
|
WeixinServer.GetH5TicketData = async function(options) {
|
|
const ws = new WeixinServer(options)
|
|
let response
|
|
if (isAliyun()) {
|
|
response = await ws.getH5TicketForEip(options.access_token)
|
|
if (typeof response === 'string') {
|
|
response = JSON.parse(response)
|
|
}
|
|
} else {
|
|
response = await ws.getH5Ticket(options.access_token)
|
|
}
|
|
return WeixinServer.GetResponseData(response)
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
WeixinServer
|
|
}
|