WeFund开放接口签名认证

更新时间:2026-06-06 12:00:00开放接口

所有开放接口请求都需要经过签名认证。

前期准备

内容

备注

开放接口签名 token

长度为 44 的 Base64 字符串,请开发同学私聊「苏」获取。该 token 严格保密,请保存在服务端配置中,禁止暴露在前端/源码中。

appid

微信/抖音 appid;具体使用哪个 appid,接口文档会详细备注。

如何构造请求签名

以付费上报为例,假设请求主体(Body)参数如下,接下来将演示一步步如何构造请求签名

{
  "type": "mgpay",
  "message": {
    "dteventtime": "2025-09-10 15:59:13",
    "vgameappid": "wxe18cf7a89e455e99",
    "gameplat": "wx",
    "platid": 0,
    "vroleid": "",
    "openid": "oDNqJ7dvfOWgy07dFdlKbFCfQphA",
    "unionid": "",
    "alliedid": "",
    "orderid": "1217752501201407033233368018",
    "iamount": 0,
    "imoney": 100,
    "productid": "1246464644",
    "productname": "Image形象店-深圳腾大-QQ公仔"
  }
}

获取 appid 和签名 token

示例:

  • appid: wxe18cf7a89e455e99
  • 开放接口签名 token:2c1j9Q5Noun3fkWbac9g3qJ4jQ4gHV5iIXTqYqsv0w4=
HTTP 请求方法\n
URL\n
随机字符串\n
请求时间戳\n
请求参数串\n
token令牌\n

构造签名串

签名串一共有六个部分,每一行为一个参数。结尾以 \n(换行符,ASCII 编码值为 0x0A)结束,如果参数为空,也需要附加一个 \n。

POST

以付费上报接口为例:

/api/v3/mgpay/s2s

第一步,获取HTTP请求的方法

$ date +%s
1761831579

第二步,获取请求的绝对URL,请注意需要去除域名部分。

$ hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random
65620C313D7687660181C396A6BEA9E7

第三步,获取发起请求时的系统当前时间戳,即格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒(北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒)起至现在的总秒数,作为请求时间戳。Wefund 会拒绝处理很久之前发起的请求,请保持自身系统的时间准确。

第四步,生成一个请求随机串,我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。这里,我们使用命令行直接生成一个。

{}

第五步,获取请求中的请求主体(Body)和请求查询参数(Query)

{
  "type": "mgpay",
  "message": {
    "dteventtime": "2025-09-10 15:59:13",
    "vgameappid": "wxe18cf7a89e455e99",
    "gameplat": "wx",
    "platid": 0,
    "vroleid": "",
    "openid": "oDNqJ7dvfOWgy07dFdlKbFCfQphA",
    "unionid": "",
    "alliedid": "",
    "orderid": "1217752501201407033233368018",
    "iamount": 0,
    "imoney": 100,
    "productid": "1246464644",
    "productname": "Image形象店-深圳腾大-QQ公仔"
  }
}

查询参数为空

message=alliedid%3D%26dteventtime%3D2025-09-10%2B15%253A59%253A13%26gameplat%3Dwx%26iamount%3D0%26imoney%3D100%26openid%3DoDNqJ7dvfOWgy07dFdlKbFCfQphA%26orderid%3D1217752501201407033233368018%26platid%3D0%26productid%3D1246464644%26productname%3DImage%25E5%25BD%25A2%25E8%25B1%25A1%25E5%25BA%2597-%25E6%25B7%25B1%25E5%259C%25B3%25E8%2585%25BE%25E5%25A4%25A7-QQ%25E5%2585%25AC%25E4%25BB%2594%26unionid%3D%26vgameappid%3Dwxe18cf7a89e455e99%26vroleid%3D&type=mgpay

请求主体如下

POST\n
/api/v3/mgpay/s2s\n
sVdQa6uXYHZHbqtD\n
1757491153\n
message=alliedid%3D%26dteventtime%3D2025-09-10%2B15%253A59%253A13%26gameplat%3Dwx%26iamount%3D0%26imoney%3D100%26openid%3DoDNqJ7dvfOWgy07dFdlKbFCfQphA%26orderid%3D1217752501201407033233368018%26platid%3D0%26productid%3D1246464644%26productname%3DImage%25E5%25BD%25A2%25E8%25B1%25A1%25E5%25BA%2597-%25E6%25B7%25B1%25E5%259C%25B3%25E8%2585%25BE%25E5%25A4%25A7-QQ%25E5%2585%25AC%25E4%25BB%2594%26unionid%3D%26vgameappid%3Dwxe18cf7a89e455e99%26vroleid%3D&type=mgpay\n
2c1j9Q5Noun3fkWbac9g3qJ4jQ4gHV5iIXTqYqsv0w4=\n

第六步,使用 Wefund Canonicalize 算法 将查询参数和请求主体转换为查询串。

第七步,按照前述规则,构造的请求签名串如下(注:body 为一行):

计算签名值

$ echo -n -e \
'POST\n/api/v3/mgpay/s2s\nsVdQa6uXYHZHbqtD\n1757491153\nmessage=alliedid%3D%26dteventtime%3D2025-09-10%2B15%253A59%253A13%26gameplat%3Dwx%26iamount%3D0%26imoney%3D100%26openid%3DoDNqJ7dvfOWgy07dFdlKbFCfQphA%26orderid%3D1217752501201407033233368018%26platid%3D0%26productid%3D1246464644%26productname%3DImage%25E5%25BD%25A2%25E8%25B1%25A1%25E5%25BA%2597-%25E6%25B7%25B1%25E5%259C%25B3%25E8%2585%25BE%25E5%25A4%25A7-QQ%25E5%2585%25AC%25E4%25BB%2594%26unionid%3D%26vgameappid%3Dwxe18cf7a89e455e99%26vroleid%3D&type=mgpay\n2c1j9Q5Noun3fkWbac9g3qJ4jQ4gHV5iIXTqYqsv0w4=\n' \
| openssl dgst -sha256 -binary \
| openssl base64 -A

这里使用 SHA-256 算法计算签名。

7qCpS345YfqrCkbRTpfiHucFN+pKJxQgodirGx66eS4=

SHA-256 是加密哈希函数,对任意长度的内容输出固定 256 位(32 字节),常用于完整性校验、数字签名的消息摘要等。

得出的签名值如下,可以用一些校验工具校验你通过命令行或者你的代码得到的签名值是否和以下值一样,一样则表示计算过程无误,如果不一致则请检查签名的参数是否一致、签名串是否有严格换行等。

1.认证类型:目前为 WEFUNDOPEN-SHA256。
2.签名信息:
    a.发起请求的小游戏 appid
    b.请求随机串 nonce_str,和上面构造签名串的随机串要保持一致
    c.时间戳 timestamp,和你上面构造签名串的时间戳要保持一致,单位秒
    d.签名值 signature,上面算出来的签名值

设置 HTTP 头

Authorization : WEFUNDOPEN-SHA256 appid="xx",nonce_str="xx",timestamp="xx",signature="xx"

开放接口要求请求通过 HTTP Authorization 头来传递签名,Authorization 由认证类型和签名信息两个部分组成。

最终 Authorization 头部结构如下所示:

⚠️注意事项:

Authorization: WEFUNDOPEN-SHA256 appid="wxe18cf7a89e455e99",nonce_str="sVdQa6uXYHZHbqtD",timestamp="1757491153",signature="7qCpS345YfqrCkbRTpfiHucFN+pKJxQgodirGx66eS4="
  1. 认证类型 WEFUNDOPEN-SHA256 和签名信息之间有个空格。
  2. 签名信息的值需要用双引号("")包裹
  3. 签名信息之间用逗号(,)分隔,且最末尾为逗号
  4. 签名信息,无顺序要求。

示例 Authorization:(注意:示例因为排版可能存在换行,实际数据应在一行)

注意事项

  1. 即使请求参数为空也需要加上换行 \n。
  2. Authorization 的 时间戳 timestamp、请求随机串 nonce_str,须和计算签名时传入的值是一致的。

相关文档