# 微信公众号API

# 配置文件

打开 uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json 文件,配置里面的

"h5-weixin" 微信公众号

"h5-weixin": {
  "oauth": {
    "weixin": {
      "appid": "",
      "appsecret": ""
    }
  }
},
1
2
3
4
5
6
7
8

配置完需要上传 uni-config-center 这个公共模块才会生效

# 微信公众号万能API调用接口

特别注意

微信公众号调用api需要白名单授权,传送门 (opens new window)

如何获取我本地电脑的IP (opens new window)

unicloud如何获取固定IP

let requestRes = await vk.openapi.weixin.h5.request({
  method: "GET",
  url: "wxaapi/newtmpl/gettemplate",
  data: {

  }
});
1
2
3
4
5
6
7

请求参数

参数 说明 类型 默认值 可选值
method 请求模式,分为GET和POST(不区分大小写) String POST GET
url 微信接口路径 String - -
data 请求数据 Object - -
appid 可不填,不填会自动从uni-id配置的h5-weixin节点里获取appid String - -
appsecret 可不填,不填会自动从uni-id配置的h5-weixin节点里获取appsecret String - -

url参数详解

生成带参数的二维码 为例

请求地址

POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN

methodPOST

urlcgi-bin/qrcode/create

最终代码

let requestRes = await vk.openapi.weixin.h5.request({
  method: "POST",
  url: "cgi-bin/qrcode/create",
  data: {
    expire_seconds: 604800, // 单位秒,最大2592000秒
    action_name: "QR_STR_SCENE",
    action_info:{
      scene:{
        scene_str: "001", // 注意,这里只能是字符串,且只有scene_str一个参数
      }
    }
  }
});
1
2
3
4
5
6
7
8
9
10
11
12
13

公共返回参数

参数 说明 类型
code 0代表成功,其他均为失败 Number
msg 失败时的提示内容 String

其他返回参数参考微信公众号服务端API文档 传送门 (opens new window)

# 获取固定IP

unicloud如何获取固定IP?

# 腾讯云空间

# 阿里云空间

直接把下面的ip都加进去即可。

代理服务器IP列表

47.92.132.2
47.92.152.34
47.92.87.58
47.92.207.183
8.142.185.204
1
2
3
4
5

# 支付宝云空间

直接把下面的ip都加进去即可。

固定出口IP列表

47.97.38.108
112.124.10.115
1
2

注意:上面的IP是云端运行时的IP,若是本地运行云函数,则需要把自己电脑的外网IP加进去

# 常见问题

# 如何调用上传临时素材接口?

上传素材接口与其他接口不一样,因为涉及到formData格式的参数

代码块

let {
  base64, //前端通过vk.pubfn.fileToBase64将图片转为base64
} = data;

if (!base64) return { code:-1, msg:"base64不能为空" };

let base64Str = "base64,";
let base64Index = base64.indexOf(base64Str);
if (base64Index > -1) base64 = base64.substring(base64Index + base64Str.length);
let dataBuffer = new Buffer(base64, 'base64');

let	formData = new vk.formDataUtil.FormData();
formData.append('media', dataBuffer, {
  filename: `${Date.now()}.png`,
  contentType: 'image/png'
});

let type = "image";
let requestRes = await vk.openapi.weixin.h5.request({
  method: "POST",
  url: `cgi-bin/media/upload?type=${type}`,
  content: formData.getBuffer(),
  headers: formData.getHeaders(),
  useContent: false
});

console.log('requestRes: ', requestRes)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 如何回复消息?

因微信公众号回复消息需要返回xml格式,因此我们需要使用返回集成响应 (opens new window)

代码示例

let params = {
  ToUserName: "", // 用户openid
  FromUserName: "", // 微信公众号原始id(gh_开头的那个)
  CreateTime: parseInt(Date.now() / 1000), // 时间戳(到秒)
  MsgType: "text", // 消息类型
  Content: "你好", // 消息内容
};
let xml = `
<xml>
  <ToUserName><![CDATA[${params.ToUserName}]]></ToUserName>
  <FromUserName><![CDATA[${params.FromUserName}]]></FromUserName>
  <CreateTime>${params.CreateTime}</CreateTime>
  <MsgType><![CDATA[${params.MsgType}]]></MsgType>
  <Content><![CDATA[${params.Content}]]></Content>
</xml>
`;
return {
  mpserverlessComposedResponse: true, // 强制字字段为true
  statusCode: 200, // 返回200状态码
  headers: {
    'content-type': 'application/xml', // 返回xml格式
  },
  body: xml, // xml内容
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24