Skip to content

附录1:向webhook发送post+get+put+patch请求

pppscn edited this page Dec 5, 2022 · 2 revisions

1、请求方式: GET

1.1 webParams 为空

将在 WebServer 的基础上,追加 3、post form 参数列表 所列的节点经过 urlEncode 的值

例如:

WebServerhttps://ppps.cn/demo

最终请求地址https://ppps.cn/demo?from=15888888888&content=123456

1.2 webParams 非空【v2.4.0版本以上支持】

将在 WebServer 的基础上,追加经过处理后的 webParams

处理方式: 替换 3、post form 参数列表 所列的节点经过 urlEncode 的值(例如:将 短信内容(content) 替换报文中的 [msg] 标签)

注意事项: webParams 中如果有特殊字符自行 urlEncode,程序只会替换列表中的key对应的标签

例如:

WebServerhttps://api2.pushdeer.com/message/push?pushkey=1234567890

webParamstext=[msg]

最终请求地址https://api2.pushdeer.com/message/push?pushkey=1234567890&text=123456


2、请求方式: POST/PUT/PATCH

2.1 webParams 非空,包含 [msg] 标签、(v3.0.5+删除限制) 并且以 { 开头的 json 报文

短信内容(content) 替换报文中的 [msg] 标签(其他标签见 4、webParams 可用标签列表),然后以 application/json;charset=utf-8 形式 POST 提交

2.2 webParams 非空,包含 [msg] 标签、(v3.0.5+删除限制) 不以 { 开头的 from=[from]&content=[content] 形式提供表单节点

短信内容(content) 经过 URLEncoder.encode(content, "UTF-8") 处理后,替换报文中的 [msg] 标签(其他标签见 4、webParams 可用标签列表),然后以 application/x-www-form-urlencoded 形式 POST 提交

2.3 webParams 为空

将以 application/x-www-form-urlencoded 形式 POST 提交 2、参数列表 所列节点的表单(PS. 此形式适用于 附录1


3、post form 参数列表

key 类型 说明
from string 来源手机号 / App包名
content string 短信内容 / 通知内容(经过自定义模板加工)
timestamp string 当前时间戳,单位是毫秒,(建议验证与请求调用时间误差不能超过1小时,防止重放欺骗)
sign string 当设置secret时,生成的sign签名,用于发送端校验,规则见下方sign校验规则

timestamp+"\n"+密钥 当做签名字符串,使用 HmacSHA256 算法计算签名,然后进行 Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)

参数 说明
timestamp 当前时间戳,单位是毫秒,(建议验证与请求调用时间误差不能超过1小时,防止重放欺骗)
secret 密钥,web通知设置页面,secret

4、webParams 可用标签列表(【注意】v2.4.3+ 适用)

key 类型 说明
[from] string 来源手机号 / App包名
[content]、[msg] string 短信内容 / 通知内容(经过自定义模板加工)
[org_content] string 短信 / 通知 原始内容
[timestamp] string 当前时间戳,单位是毫秒,(建议验证与请求调用时间误差不能超过1小时,防止重放欺骗)
[sign] string 当设置secret时,生成的sign签名,用于发送端校验,规则见下方sign校验规则
[device_mark] string 通用设置中自定义的设备名称
[app_version] string 当前APK的固有属性
[card_slot]、[title] string 短信/来电的卡槽信息 或 APP通知的标题
[receive_time] string 短信/来电/APP通知的接收时间

附录:

1、一个现成的 webhook 服务端站点:可以在线查看 消息通知

来自:TSMS

登录之后,可以获取到一个带token的链接(类似:https://api.sl.willanddo.com/api/msg/pushMsg?token=123456)

此链接填写到 WebServerwebParams 留空 ,即可通过该站点直接查看提交的消息列表

2、sign 签名计算示例:

//java

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class Test {
    public static void main(String[] args) throws Exception {
        Long timestamp = System.currentTimeMillis();
        String secret = "this is secret";

        String stringToSign = timestamp + "\n" + secret;
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
        System.out.println(sign);
    }

}
#python 3.8
import time
import hmac
import hashlib
import base64
import urllib.parse

timestamp = str(round(time.time() * 1000))
secret = 'this is secret'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)
#python 2.7
import time
import hmac
import hashlib
import base64
import urllib

timestamp = long(round(time.time() * 1000))
secret = 'this is secret'
secret_enc = bytes(secret).encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = bytes(string_to_sign).encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)
<?php
class Sign
{
    private string $secret;
    public function __construct($secret)
    {
        $this->secret = $secret;
    }

    public function generateSign($timestamp): string
    {
        $beforeSign = $timestamp . "\n" . $this->secret;
        $sign = hash_hmac('sha256', $beforeSign, $this->secret, true);
        return urlencode(base64_encode($sign));
    }
}


$secret = 'This is your secret';
$timestamp = 'This is the timestamp of your request';
$sign = new Sign($secret);
echo $sign->generateSign($timestamp);

by felixwann