手册
介绍
左侧边栏包含指向相应部分的链接:
- 用户名 - 链接到个人资料。
- 仪表盘 - 以图表和图形的形式查看当前状态。
- 应用程序 - 应用管理。
- 解锁代码 - 自动生成的解锁码或您下载的解锁码。
- 付款 - 用户收款历史。
- 手册 - 当前的用户手册。
仪表盘
您可以为仪表板中的所有小部件设置通用过滤器:
- 货币 - 仪表盘中用于转换收支金额的货币。
- 时期 - 指仪表盘中图表和表格所显示的数据的时间范围。它决定了用于分析和展示有关付款、申请及其他参数的信息和统计数据的周期。
余额
余额包括以下金额:
- 总额 - 所选时期内所有用户付款的总金额,不包括支付系统和PayToUse的费用。
- 净额 - 所选时期内所有付款的总金额减去支付系统和PayToUse的费用。
- 待处理金额 - 指定时期的所有付款总额减去支付系统和PayToUse的费用,等待提取到开发商的账户。付款后7天就可以提取。
- 可用金额 - 所有时间的所有付款总额减去支付系统和PayToUse的费用,可用于提取到开发商的账户。
付款
支付小部件包括按应用程序分组的所选时期内的付款表。
表字段:
- 应用程序 - 申请。表格中仅显示在所选期间内已完成付款的申请。
- 付款 - 付款数量。
- 总额 - 所选时期内所有用户付款的总金额,不包括支付系统和PayToUse的费用。
- 净额 - 所选时期内所有付款的总金额减去支付系统和PayToUse的费用。
图表显示了每天净额和总额值的动态。
新用户
新用户图表显示了每天的两个动态值:
- 新用户 - 新的API调用的数量。只有当device参数--唯一的设备标识符--在向API发送请求时被传递,API访问才会被记录。这个参数对设备来说必须是真正唯一的。 (查看发送请求)
- 付款 - 同期按日支付的数量。
转化
转化率指标是评估您的销售效率将新用户转化为付款的指标。
图表显示了付款与新用户的数量比例,以百分比表示。
应用程序
当您进入此部分时,将打开您的应用程序列表。
应用程序表中的列列表:
- # - 唯一的应用程序标识符。用于验证应用程序代码或显示支付表单时。
- 名称 - 应用程序名称。该名称仅在报告和仪表盘中向您显示。点击应用程序名称可打开应用程序编辑页面。
- 状态 - 应用程序的当前状态。可能是:
- 创建时间 - 该应用程序刚刚创建,尚未进行配置。
- 已发布 - 应用程序正在运行。
- 创建时间 - 应用程序创建日期。
- 其他控制按钮:
- 删除 - 从列表中删除应用程序。
创建或编辑应用程序
为了接受付款,您必须连续填写所有必要的应用程序数据并激活应用程序。
创建新应用程序的按钮位于应用程序列表的标题栏中。
应用程序
创建应用程序时可用的字段:
- 名称 - 应用程序的名称,只有你能在报告或仪表板上看到。该名称将显示在已保存的应用程序的页眉处。只要应用程序没有被保存,就会显示 "新应用程序 "而不是名称。该字段是必须输入的。
- 联系邮箱 - 发送给用户的信息副本将被发送到的电子邮件地址。这个地址也在 "回复到 "字段中指定,用于回复用户收到的带有代码的电子邮件。该字段是必须输入的。默认情况下,该字段是用开发者配置文件中的值填充的。该值可以改变为不同的值。
- 应用程序类型 - 应用程序类型。如果您选择“应用程序组”类型,系统将显示用于分组的应用程序列表。该列表中仅包含已生成解锁码的单个应用程序。
- 允许付款反馈 - 向付款表单添加一个字段,供用户输入自由文本。反馈将添加到开发人员的电子邮件副本中。还可以在付款详细信息中看到反馈。
开始输入更改值,保存按钮将出现。保存按钮允许您在不转到下一页的情况下保存更改。下一页按钮保存更改并移动到下一页。您始终可以返回以稍后进行更改。
在页面顶部,仅显示已保存的应用程序页面供导航使用。您可以点击“下一步”或直接跳转至页面顶部的相应部分。
描述
从列表中选择一种语言,然后单击“添加”。
将显示一个标签页,其中包含所选语言的本地化应用文本。
可用语言:
- 德语
- 英语
- 法语
- 西班牙语
- 俄语
- 简体中文
描述中的字段用于在付款表单上显示信息,并在向用户的回复消息中显示:
- 名称 - 所选语言的应用程序名称。该名称将显示在支付表单和支付通知邮件中。默认情况下,添加语言时会自动填入应用程序名称。您可以为每种语言设置不同的名称。必填字段。
- 描述 - 应用程序的简要描述。显示在支付表单的应用程序名称下方。此字段为可选字段。如果您不想显示任何描述,可以留空。
- 回复 - 支付成功后将通过电子邮件发送给用户的补充信息。该回复内容将添加在电子邮件末尾的标准回复之后。
必须至少添加一种语言才能保存并进入下一页。
在付款表单中显示的语言是根据用户在浏览器设置中指定的偏好自动确定的。您可以为应用程序保存应用程序语言。
开始输入或更改值,然后会出现“保存”按钮。保存按钮允许您在不转到下一页的情况下保存更改。下一页按钮保存更改并转到下一页。您始终可以返回以稍后进行更改。
在页面顶部,仅显示已保存的应用程序页面供导航使用。您可以点击“下一步”或直接跳转至页面顶部的相应部分。
价格
该页面包含与付款相关的价格列表和字段:
- 试用期 - 试用期的长度。
- 时间单位 - 试用期的时间单位。例如,如果您指定为 7 天,则表示在应用程序首次调用 API 后的 7 天内,系统将返回试用期已过期的响应。首次设备调用的时间会被保存下来。
- 价格计算方法 - 价格计算方法从列表中选择:
- 根据期限计算价格 - 在支付表单中,用户指定激活码的有效期,系统将根据下表自动计算价格。用户将在回复邮件中收到一串自动生成的解锁码。
- 根据价格计算期限 - 在支付表单中,用户从列表中选择一个价格或自行输入价格,系统将根据下表自动计算出相应时长。用户将在响应消息中收到一个自动生成的代码。
- 永久代码 - 在支付表单中,用户可从列表中选择一个价格,或自行输入价格。支付完成后,用户将在回复邮件中收到一个代码,该代码来自下方的列表,且与所选价格相对应。
- 捐赠 - 在支付表单中,用户可从列表中选择价格,或自行输入价格。对于捐赠类应用,系统不会生成解锁码。
价格以美元为单位。最低价格为1美元。
开始输入或更改值,然后会出现“保存”按钮。保存按钮允许您在不转到下一页的情况下保存更改。下一页按钮保存更改并转到下一页。您始终可以返回以稍后进行更改。
在页面顶部,仅显示已保存的应用程序页面供导航使用。您可以点击“下一步”或直接跳转至页面顶部的相应部分。
预览
此页面设置以下值:
- 代码长度 - 生成的代码的长度(如果适用)。
- 代码字符集 - 产生代码的字符集:
- 数字代码 - 仅使用数字 0、1、2、3、4、5、6、7、8、9 生成代码。代码中可能包含前导零。验证代码时,前导零是重要的。
- 字母数字代码 - 使用字符 1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G、H、I、G、K、L、M、N、P、Q、R、S、T、U、V、X、Y、Z 生成代码。代码使用大写字符生成并发送给用户。验证代码时,字符的大小写不重要。
- 检查代码的链接 - 用于代码验证的示例链接。
- 支付链接 - 支付链接。您可以复制该链接,并将其粘贴到发布该申请的网站上的申请描述中。 需要传递的参数:
- app - 应用程序的唯一标识符。必填参数。
- amount - 购买时将在价格栏中指定的金额。默认价格会被忽略。但是,该金额不能低于最低价格,也不能低于为应用程序设置的最低价格。可选参数。
要开始接受付款,您需要使用“启动”按钮激活应用程序。在激活应用程序之前,请确保输入的所有数据都是正确的。应用程序生成的密钥无法更改。
代码验证
检查应用程序的解锁代码分3个步骤进行:
- 编写并发送用于代码验证的请求
- API端的检查
- 接收并处理 API 响应
发送请求
要验证代码,您的应用程序用户必须在应用程序设置中的字段中输入它。
<properties>
<property id="UnlockCode" type="string"></property>
<property id="UnlockResult" type="string">Checking...</property>
...
<properties>
<settings>
<setting propertyKey="@Properties.UnlockCode" title="@Strings.UnlockCode">
<settingConfig type="alphaNumeric" maxLength="12"/>
</setting>
<setting propertyKey="@Properties.UnlockResult" title="@Strings.UnlockResult">
<settingConfig type="alphaNumeric" readonly="true"/>
</setting>
...
</settings>
然后,您需要向付费使用 API 服务器发送请求:
function onTemporalEvent() as Void {
var ds = System.getDeviceSettings();
return Toybox.Communications.makeWebRequest(
"https://api.pay-to-use.com", // API URL
{
"device" => ds.uniqueIdentifier, // 设备唯一标识符
"app" => "6", // 您的应用程序 ID
"model" => ds.partNumber, // 设备部件编号
"code" => Application.Properties.getValue("UnlockCode") // 您的应用程序中的解锁代码值
},
{
:method => Communications.HTTP_REQUEST_METHOD_POST,
:headers => { "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON },
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
},
method(:onReceive)
);
}
API 请求参数:
- url - https://api.pay-to-use.com。必须使用HTTPS。
- 请求的正文(传递的值)。键值对字典:
- device - 设备的唯一标识符。
- app - 您的应用程序的唯一标识符。
- model - 设备型号标识符。可选参数。该数据用于显示新设备的统计信息。
- code - 用户在您的应用程序设置中输入的解锁代码。
- 请求选项:
- :method - API 支持 GET 和 POST 请求方法。
- :headers - 对于 POST 方法,参数需要以 JSON 格式传递。
- :responseType - 响应以 JSON 格式返回。
- responseCallback - 链接到回调方法,该方法应该接受两个参数:
- responseCode - 服务器响应头代码。
- data - 如果请求成功,则为内容,否则为 null。
API端的检查
如果没有向 API 传递参数,则 API 返回 HTTP/1.1 404 Not Found 头。
如果至少向 API 传递了一个参数,则 API 返回头 HTTP/1.1 200 OK。
服务器响应包括:
- response - 响应代码
- msg - 响应的文本描述
- expires - UNIXTIME 时间戳(如果适用)
进行检查以确保传入的应用程序标识符是正确的。 支付时应用程序必须处于 已发布 状态。 如果出错,将返回响应代码 301。
如果传输了唯一设备标识符,则会搜索并存储该设备标识符。 如果在检查或保存时出现错误,则返回错误代码 402。 如果发现此类返回代码,请立即写信给支持团队,地址为 [email protected]
如果代码通过,那么对于 根据期限计算价格 和 根据价格计算期限 计算方法的应用程序,将执行以下步骤:
- 如果传输的是空代码,它将从前面步骤中定义的唯一设备标识符中分离出来。
- 如果传送了一个非空的代码,而它没有被激活,那么该代码的激活取决于购买该代码时指定的价格条件,与激活的日期无关。
- 如果未传输代码或传输的代码未找到,则返回错误代码 201。
- 已激活的代码与设备进行检查,如果在激活期间传输了与存储的唯一设备标识符不同的唯一设备标识符,则返回错误代码 202。
- 如果传输的代码没有到期日期并且所有先前的检查都已通过,则返回代码 101。
- 如果代码是有时间限制的,则执行检查。如果密钥未过期,则返回代码 101。如果代码已过期,则返回错误代码 203。
- 此类应用程序要求代码绑定到设备。如果未传输唯一设备标识符,则返回错误代码 304。
对于标记为 永久代码 的应用,系统仅会检查购买时该优惠码是否有效。 如果找到代码,则返回代码 101。如果找不到代码,则返回错误代码 201。
对于使用捐赠计算方法的应用程序,代码不被检查。 始终返回代码 101。
如果前面的检查没有通过,就会检查测试期。 如果自设备首次联系以来的时间已经过去比当前应用程序设置的时间长,则返回错误代码 204。 如果试用期尚未到期,则返回错误代码 102。
如果仅传输应用程序 ID,而没有传输解锁代码或唯一设备 ID,则返回错误代码 303。
如果返回的响应是 500,您应该写信至 [email protected] 请求支持
以下是所有返回的代码表:
| 返回 | 消息 |
|---|---|
| 101 |
根据期限计算价格 和 根据价格计算期限 计算方法:
|
| |
永久代码:
| |
捐赠:
| |
| 102 | |
| 201 | |
| 202 | |
| 203 | |
| 204 | |
| 301 | |
| 302 | |
| 303 | |
| 304 | |
| 401 | |
| 402 | |
| 500 | |
检查响应
然后您应该检查 Pay-to-use API 服务器的响应:
function onReceive(responseHeader, data) as Void {
if (responseHeader == 200) { Toybox.Background.exit(data); }
}
您可以检查所有标题和代码,您可以为用户方便显示自己的消息,但在最简单的形式中,验证将看起来像这样:
function onBackgroundData(data) as Void {
if (data.hasKey("response")) {
if (data.hasKey("msg")) {
// 您可以在属性字段中使用名称“UnlockResult”显示data["msg"]。
Application.Properties.setValue("UnlockResult", data["msg"]);
}
if (data["response"].toString().substring(0, 1).equals("2")) {
// 代码验证失败
// 付费功能不可用
...
} else {
// 代码检查成功或错误是您的错误或 API 的错误
// 付费功能可用
...
}
}
}解锁代码
当您进入此部分时,将打开一个解锁代码列表。
解锁代码列表
您可以在顶部搜索栏中搜索电子邮件字段或代码。找到的代码将显示在列表中。您可以使用电子邮件或代码的全部或部分作为搜索标准。匹配项将以颜色突出显示。搜索和过滤器同时工作,彼此不排斥。
用户的最后使用的过滤器会被保存。也就是说,下次进入页面时,最后使用的过滤器将自动应用。解锁代码列表提供以下过滤器:
- 列 - 选择在解锁代码列表中显示的表列。
- 应用程序 - 仅显示所选应用程序的解锁代码。
- 状态 - 仅显示处于所选状态的解锁码。
解锁代码表中的列列表:
- 应用程序 - 您的应用程序。您可以按照链接编辑其设置。
- 代码 - 解锁代码。
- 电子邮件 - 与解锁码注册关联的电子邮件地址。该地址用于在网站的我的购买部分搜索客户解锁码。该部分对用户开放。
- 期限 - 已发送代码的有效期(在应用程序设置中指定)。该代码的有效期是根据生成时应用程序设置中的条件设定的。
- 状态 - 解锁代码状态。 (查看解锁代码状态)
- 创建时间 - 解锁代码创建日期。
- 已激活 - 代码的激活日期。该日期设定为该特定用户设备首次连接 PayToUse API 服务并提交此代码的时刻。此时,代码的状态将变为 已激活。只有未激活的代码才能被激活。如果由 ID 不同的设备提交已激活的代码,API 将返回错误代码 202。每个代码仅能与一台设备绑定。
- 到期时间 - 代码激活到期日期。对于在代码激活时具有有限有效期的代码进行设置。对于没有限制有效期的代码,到期日期保持为空白。
- 已删除 - 代码删除日期。删除后,代码状态设置为未知。
- 支付编号 - 该笔付款的唯一序列号。您可以点击链接查看付款详情。
- 用于执行解锁代码相关操作的按钮。例如,删除。
解锁代码状态
在生命周期内,解锁码会经历不同的状态,这些状态可通过代码状态进行追踪。
| 状态 | 描述 |
|---|---|
| 可用 | 状态分配给未执行任何操作的解锁代码,或者如果代码的设备链接被重置。 |
| 已激活 | 该状态适用于设置了激活日期的代码。当设备首次成功访问PayToUse API服务时,激活日期将被设置。此外,激活代码时还会设置代码的过期日期。 |
| 过期 | 该状态适用于已过期的代码。解除代码与设备的关联不会重置代码的过期日期。使用此状态检查代码将返回错误203。 (查看API端的检查) |
| 未知 | 当代码被删除时,将设置该状态。使用此状态检查代码将返回错误201。 (查看API端的检查) |
付款
当您进入此部分时,将打开用户付款列表。
以下支付系统用于接收付款:
支付系统费用之后,PayToUse将收取13%的费用。我们一直在努力降低费用。
如果在支付系统中出现任何争议或退款,支付系统的处罚会重新发放给开发商。因此,你不应该允许这种情况的发生。在有争议的情况下,不收取PayToUse费用。
付款列表
您可以在顶部搜索栏中搜索电子邮件字段或发送的代码。找到的付款将显示在列表中。您可以将电子邮件或发送的代码的全部或部分用作搜索标准。匹配项将以颜色高亮显示。搜索和过滤器同时工作,彼此不互斥。
最后使用的过滤器将保存给用户。也就是说,下次您进入页面时,将自动应用上次使用的过滤器。对付款列表可用的过滤器有:
- 列 - 选择要在付款列表中显示的表列。
- 应用程序 - 仅显示所选应用程序的付款记录。
- 系统 - 仅显示来自所选支付系统的付款。
- 状态 - 仅显示具有所选状态的付款。
付款表中的列列表:
- 应用程序 - 您的应用程序。您可以按照链接编辑其设置。
- # - 付款的唯一序列号。当用户在支付系统中从支付表格到支付页面时,它被自动分配给支付。你可以点击该链接查看付款的细节。
- 备注 - 用户在付款表单中输入的消息。
- 系统 - 用户选择的支付系统。
- 状态 - 付款状态。 (查看付款状态)
- 电子邮件 - 用户在付款表单中填写的电子邮件地址。
- 期限 - 发送代码的有效期限(在应用程序设置中指定)。
- 创建时间 - 付款创建日期。
- 发票金额 - 向用户收取的付款金额。根据应用程序的设置,在支付表格中指定。
- 付款日期 - 付款日期。
- 付款金额 - 由支付系统确认的支付金额。
- 发送的代码 - 发送给用户的代码。
- 可用金额 - 可提取金额。
- 支付金额 - 用于付款的提取金额。
无法更改付款。
付款状态
在整个生命周期中,款项会流经不同的状态,这些状态可通过付款状态进行追踪。
| 状态 | 描述 |
|---|---|
| 不完整 | 给尚未执行任何操作的支付分配了状态。支付创建于用户从付款表单切换到付款系统表单的时刻。支付被分配一个唯一的序列号,以及支付的基本属性:金额、支付系统、日期。 |
| 成功 | 该状态分配给从支付系统接收到正面响应的支付。下一步是向用户发送包含生成的代码或其他数据的电子邮件,具体取决于应用程序的设置。如果支付保留在此状态,则需要特别注意,因为尚未执行后续操作。 |
| 错误 | 该状态分配给从支付系统接收到负面答复的支付。不会执行后续步骤。需要特别注意此类支付,因为支付系统一侧的状态可能会延迟处理。 |
| 待处理 | 该状态分配给从支付系统接收到正面答复的支付,所有后续步骤均已成功完成。此状态的支付不可提款。支付将在7天内自动转移到下一个状态。 |
| 可用 | 该状态的支付可提款。 |
| 发送中 | 此状态用于下一次提款中包含的支付。如果提款被取消或拒绝,支付状态将返回可用状态。 |
| 已发送 | 此状态用于已进行提款的支付。等待确认收款。 |
| 已完成 | 此状态用于成功提款的支付。您可以通过在相应部分确认提款来手动设置状态。支付提款后14天状态也会自动更改。 |
| 已退款 | 已发出退款的支付转移到此状态。发出退款时会收取退款费用。该费用将从提款金额中扣除。 |
提款
当您进入此部分时,将打开您的提款列表。
提款列表
用户的上次使用的过滤器将被存储。也就是说,下次进入页面时,将自动应用上次使用的过滤器。提款列表可用的过滤器包括:
- 列 - 在提款列表中仅显示选定的列。
- 状态 - 只显示处于选定状态的提款。
提款表中的列列表:
- # - 提款的唯一序列号。它是在提款保存时自动分配给提款的。您可以点击该链接查看提款的详细信息。
- 状态 - 提款状态。 (查看提款状态)
- 创建时间 - 提款请求的日期。
- 金额 - 提款金额。
- 提款 - 提款发送的日期。
- 用于取款行动的按钮。例如,确认。
您可以在提现处于已发送状态时确认提现。
提款状态
在其生命周期中,提款会进入不同的状态,这可以通过提款状态来追踪。
| 状态 | 描述 |
|---|---|
| 待处理 | 状态分配给在创建时没有执行任何操作的提现。 |
| 已取消 | 此状态分配给已取消的提现。提现可能因多种原因而取消。例如,未指定资金接收方式。此提现的所有款项都会进入 可用 状态,可再次提现。 |
| 已发送 | 当提现款项发送时,此状态被设置。 |
| 已完成 | 手动提现收到开发人员确认收款时设置此状态。或在发送后14天自动设置。 |
| 已拒绝 | 当银行或支付系统在发送后退还资金时,此状态用于提现。此提现的所有款项都会进入 可用 状态,并可再次提现。 |
API
概述
API PayToUse 具有以下功能:
- 检查解锁码的激活状态,并在必要时进行激活。
- 从 NightScout 应用中获取血糖数据。
- 获取指定位置的当前天气数据。
所有信息均可通过单次请求进行获取和返回。
API 端点
您可以使用以下任一端点:
- https://api.pay-to-use.com
- https://api.p2u.io
这两个端点都支持GET和POST请求。
Request parameters
- device: 字符串 (必填) — 唯一设备标识符
- app: 整数 (必填) — 您的申请编号
- model: 字符串 (可选的) — 设备型号代码,用于收集和显示使用该应用的设备的统计数据
- code: 字符串 (可选的) — 解锁码
- bg: 关联数组 (可选的) — 用于从 NightScout 应用中获取血糖水平的数据
- url: 字符串 (可选的) — NightScout 应用的地址
- weather: 关联数组 (可选的) — 用于查询当前天气的数据
- appid: 字符串 (可选的) — 天气 API 访问密钥
- lat: 浮点数 (可选的) — 纬度
- lon: 浮点数 (可选的) — 经度
- provider: 整数 (可选的) — 天气服务提供商
支持的天气服务提供商列表
1. OpenWeatherMap
- 描述: OpenWeatherMap 提供全球天气数据,包括实时天气、历史数据以及 16 天预报。凭借广泛的地理覆盖范围和频繁的更新,OpenWeatherMap 已成为需要获取当前天气和长期预报的应用程序的热门选择。
- 提供的数据: 实时温度、湿度、风速、空气质量、降水概率等信息。提供当前及预报数据,包括部分地区的逐分钟天气数据。
- 服务提供商选择: 请在请求的天气部分添加provider = 1,以选择 OpenWeatherMap 作为天气服务提供商。
- 使用说明: 提供免费和付费两种服务等级,用户可通过 API 密钥认证访问数据。付费套餐包含高级数据层和增值功能。
- API文档: 点击此处查看。
2. QWeather
- 描述: QWeather(又名HeWeather)提供以中国为重点的全面天气数据,同时也包含国际数据。该应用提供丰富的详细信息,包括实时天气、预报、空气质量信息以及预警。
- 提供的数据: 当前气温、湿度、紫外线指数、污染指数、每日及每小时预报,以及恶劣天气预警。该应用以详尽的空气质量数据和实时更新的天气变化信息而著称。
- 服务提供商选择: 请在请求的天气部分添加provider = 2,以选择 QWeather 作为天气提供商。
- 使用说明: QWeather 提供 API 访问服务,包含免费和高级两个层级。免费层级提供的数据有限,而高级选项则涵盖更多数据点和地点。
- API文档: 点击此处查看。
3. MET Weather (MET Norway)
- 描述: 由挪威气象局(MET Norway)提供的 MET Weather API,可访问各种开放的气象数据,包括预报、历史数据以及挪威和北欧地区的专项数据。MET Weather 以其准确性和透明度著称,非常适合需要高度可靠气象数据的应用程序。
- 提供的数据: 当前天气状况、预报、降水、气温、风力数据及紫外线指数。MET Weather 提供针对北欧地区的专项数据,同时也支持全球天气信息。
- 服务提供商选择: 请在请求的天气部分添加provider = 3,以选择 MET Weather 作为天气提供商。
- 使用说明: MET Weather 提供的所有数据均可在知识共享许可协议下免费使用,允许免费用于非商业和商业用途。挪威气象局以其环境数据而闻名,是备受信赖的数据提供商,尤其在欧洲地区。
- API文档: 点击此处查看。
请求示例
function onTemporalEvent() as Void {
var ds = System.getDeviceSettings();
if (!ds.phoneConnected) { // 检查设备是否已连接到手机,以便发送请求
return;
}
var id = ds.uniqueIdentifier;
if (id == null) { // 验证设备是否已被分配了一个唯一的标识符
return;
}
var request = {};
var lockCheck = Application.Storage.getValue("LastCodeCheckTimestamp");
if (lockCheck == null || lockCheck <= Time.now().value()) { // 如有必要,发送代码
request.put("code", Application.Properties.getValue("UnlockCode"));
}
var ns_url = Application.Properties.getValue("NS");
if (!ns_url.equals("")) { // 如有需要,将发送 NightScout 应用的链接
request.put("bg", { "url" => ns_url });
}
var wP = Application.Properties.getValue("Weather");
if (wP != 0) { // 如有需要,发送天气查询参数
var lat = Application.Properties.getValue("latitude");
var lon = Application.Properties.getValue("longitude");
if (!lat.equals("") && !lon.equals("")) {
request.put("weather", {
"appid" => Application.Properties.getValue("appID"),
"lat" => lat,
"lon" => lon,
"provider" => wP
});
}
}
if (!request.isEmpty()) {
// 填写所需的请求参数
request.put("device", id);
request.put("app", p2uAppID); // 您的应用程序 ID
request.put("model", ds.partNumber);
Toybox.Communications.makeWebRequest(
"https://api.p2u.io", // API端点
request,
{
:method => 3, // Communications.HTTP_REQUEST_METHOD_POST
:headers => {
"Content-Type" => 1 // Communications.REQUEST_CONTENT_TYPE_JSON
},
:responseType => 0 // Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
},
method(:onReceive)
);
}
}
API响应
该 API 返回一个 JSON 对象,其中包含解锁状态、血糖水平和天气信息。
响应参数
解锁码验证结果(如果已发送请求):
- response: 整数 — 返回码
- msg: 字符串 — 关于验证结果的通知
- expires: 整数 — 代码的过期时间戳(UNIXTIMESTAMP 格式)
- qr: array — 用于购买或验证序列号的二维码(如适用)
NightScout 应用响应(如果已发送请求):
- bg: 关联数组 — 来自 NightScout 应用的格式化回复
- value: 整数 — 血糖水平(单位:毫克/分升)
- date: 整数 — 代码过期的时间戳(UNIXTIMESTAMP 格式)
- direction: 字符串 — 血糖水平变化的趋势
天气 API 响应(如果已发送请求):
- weather: 关联数组 — 来自天气 API 的格式化响应
- provider: 整数 — 天气数据提供商标识符
- weather: array — 当前天气状况。可能返回一个或两个值;如果返回两个值,则分别代表白天和晚上的天气状况
- temp: 浮点数 — 当前温度(摄氏度)
- feels_like: 浮点数 — 体感温度(摄氏度)
Внимание! Отсутствует для MET Norway - pressure: 整数 — 大气压(以百帕为单位)
- humidity: 整数 — 湿度(%)
- precipitation: 整数 — 降水概率(%)
Внимание! Отсутствует для MET Norway - wind: 整数 — 风向(度)
- wind_speed: 浮点数 — 风速(米/秒)
- temp_low: 浮点数 — 今天的最低气温(摄氏度)
- temp_high: 浮点数 — 今天的最高气温(摄氏度)
- sunrise_today: 整数 — 今天日出的时间戳(UNIXTIMESTAMP 格式)
- sunset_today: 整数 — 今天日落时间戳(UNIXTIMESTAMP 格式)
- sunrise_tomorrow: 整数 — 明天日出的时间戳(UNIXTIMESTAMP 格式)
- sunset_tomorrow: 整数 — 明天日落时间戳(UNIXTIMESTAMP 格式)
- aqi: 关联数组 — 空气质量指数
- level: 整数 — 空气质量指数等级
- value: 整数 — 空气质量指数值
示例回复
{
"response": 103,
"msg": "Free for beta tester",
"expires": 0,
"qr": [
"11111110111011010110101111111",
"10000010111001001101001000001",
"10111010101100110110101011101",
"10111010110101000001001011101",
"10111010000001010100001011101",
"10000010100110001101001000001",
"11111110101010101010101111111",
"00000000010010110111100000000",
"11001110000100100100100101111",
"11111100011011011010011111111",
"01111011100111111100101000001",
"01111100101100110111011011011",
"00110110101010100101110000010",
"11001000010001011000001011111",
"01101010001001110100000001101",
"10111101100010100101100110011",
"01010111111100110100100100010",
"10000100111011011000101111011",
"00000110110110110100100000101",
"00111100011100001100101100011",
"11110111110010100111111111001",
"00000000111001011101100010001",
"11111110010001011111101011101",
"10000010100010100111100010010",
"10111010101101100111111111001",
"10111010010010110000010000001",
"10111010001111111110000001111",
"10000010111101011111101101011",
"11111110100011011110110010010"
],
"bg": {
"value": -102,
"date": 1730546101,
"direction": ""
},
"weather": {
"provider": 1,
"weather": [
89
],
"temp": 0.27,
"feels_like": -3.14,
"pressure": 999,
"humidity": 78,
"precipitation": 0,
"wind": 120,
"wind_speed": 2.96,
"temp_low": -3.8,
"temp_high": 0.27,
"sunrise_today": 1730527969,
"sunset_today": 1730551770,
"sunrise_tomorrow": 1730614492,
"sunset_tomorrow": 1730638051,
"aqi": {
"level": 1,
"value": 38
}
}
}
备注
- 包含“bg”的请求需要连接到NightScout应用。
- 对于每个包含代码的请求,API 会自动检查该代码的状态,若处于非活动状态,则将其激活。
- 请注意,API 参数可能会随着时间的推移进行更新或修改,以提升功能、兼容性和安全性。建议您定期查阅 API 文档,了解可能影响集成或使用的任何变更。
Garmin
有关 Garmin SDK 气象函数和常量的详细说明,请参阅此链接。您可以存储从 API 获取的值或 Garmin SDK 气象函数的计算结果(具体取决于所选的气象服务提供商),以确保屏幕上显示的数值保持一致。
| ID | 描述 | 天 | 夜晚 |
|---|---|---|---|
| 0 | 清除 |
0x53 |
0x54 |
| 40 | 一般级别 | ||
| 23 | 少云 |
0x55 |
0x56 |
| 1 | 局部多云 |
0x57 |
0x58 |
| 22 | 多云间晴 | ||
| 2 | 多云 |
0x59 |
|
| 52 | 薄云 | ||
| 20 | 多云 |
0x5A |
|
| 45 | 多云,有雨 | ||
| 31 | 小雨 |
0x3E |
|
| 14 | 小雨 |
0x42 |
|
| 24 | 阵雨 | ||
| 3 | 雨 |
0x43 |
|
| 25 | 阵雨 | ||
| 27 | 有阵雨的可能性 |
0x46 |
|
| 11 | Scattered showers | ||
| 15 | 倾盆大雨 | ||
| 26 | 阵雨 | ||
| 28 | 有雷暴的可能性 |
0x36 |
0x37 |
| 12 | Scattered thunderstorms |
0x38 |
|
| 6 | 雷暴 |
0x39 |
|
| 8 | 雾 |
0x4E |
|
| 9 | 朦胧 | ||
| 29 | 薄雾 | ||
| 39 | 阴霾 | ||
| 30 | 灰尘 |
0x4F |
|
| 35 | 土沙色 | ||
| 33 | 大雾 | ||
| 38 | 火山灰 | ||
| 37 | 沙尘暴 | ||
| 13 | 未知降水 | ||
| 5 | 有风 |
0x52 |
|
| 36 | 斯夸尔 | ||
| 48 | 小雪 | ||
| 32 | 龙卷风 |
0x50 |
|
| 41 | 飓风 | ||
| 42 | 热带风暴 | ||
| 50 | 雨夹雪 |
0x45 |
|
| 7 | 雨雪混合天气 | ||
| 18 | 小雨夹雪 | ||
| 19 | 大雨、大雪 | ||
| 21 | 雨雪 | ||
| 49 | Freezing rain | ||
| 44 | 降雨或降雪的可能性 | ||
| 47 | 多云,有雨或雪 | ||
| 34 | 冰 | ||
| 51 | 冰雪 | ||
| 43 | 降雪概率 |
0x4C |
0x4D |
| 16 | 小雪 | ||
| 46 | 多云,有降雪可能 |
0x4A |
|
| 4 | 雪 | ||
| 17 | 大雪 |
0x4B |
|
| 10 | 冰雹 |
0x3A |
|
打开天气地图
请点击此处查看 OpenWeatherMap 的图标集作为示例。
| ID | 描述 | 天 | 夜晚 |
|---|---|---|---|
| 2xx | 雷雨 | ||
| 200 | 雷暴,伴有小雨 |
0x36 |
0x37 |
| 201 | 雷暴,伴有雨 |
0x38 |
|
| 202 | 雷暴,伴有大雨 | ||
| 210 | 小雷暴 | ||
| 211 | 雷雨 |
0x39 |
|
| 212 | 强雷暴 |
0x3B |
|
| 221 | 零星雷暴 | ||
| 230 | 雷暴,伴有小毛雨 |
0x3A |
|
| 231 | 雷暴,伴有毛毛雨 | ||
| 232 | 雷暴,伴有强毛雨 | ||
| 3xx | 小雨 | ||
| 300 | 小毛雨 |
0x3C |
0x3D |
| 301 | 小雨 |
0x3E |
|
| 302 | 强阵雨 |
0x3F |
|
| 310 | 毛毛细雨 |
0x40 |
|
| 311 | 细雨 | ||
| 312 | 强细雨 |
0x41 |
|
| 313 | 阵雨和毛毛雨 | ||
| 314 | 阵雨和毛毛雨 | ||
| 321 | 短时毛毛雨 | ||
| 5xx | 雨 | ||
| 500 | 小雨 |
0x42 |
|
| 501 | 中雨 |
0x43 |
|
| 502 | 强降雨 |
0x44 |
|
| 503 | 暴雨 | ||
| 504 | 极端降雨 | ||
| 511 | Freezing rain |
0x45 |
|
| 520 | 小雨 |
0x46 |
|
| 521 | 阵雨 | ||
| 522 | 强降雨 | ||
| 531 | 零星阵雨 | ||
| 6xx | 雪 | ||
| 600 | 小雪 |
0x4C |
0x4D |
| 601 | 雪 |
0x4A |
|
| 602 | 大雪 | ||
| 611 | 雨夹雪 |
0x45 |
|
| 612 | 小雨夹雪 | ||
| 613 | 短时雨夹雪 | ||
| 615 | 小雨夹雪 | ||
| 616 | 雨和雪 | ||
| 620 | 小雪 |
0x4B |
|
| 621 | 飘雪 | ||
| 622 | 大雪 | ||
| 7xx | 环境音 | ||
| 701 | 薄雾 |
0x4E |
|
| 711 | 大雾 |
0x4F |
|
| 721 | 阴霾 | ||
| 731 | 沙尘旋涡 | ||
| 741 | 雾 | ||
| 751 | 土沙色 |
0x4F |
|
| 761 | 灰尘 | ||
| 762 | 火山灰 | ||
| 771 | 飑 |
0x52 |
|
| 781 | 龙卷风 |
0x50 |
|
| 800 | 清除 | ||
| 800 | 晴 |
0x53 |
0x54 |
| 80x | 云 | ||
| 801 | 多云 11%-25% |
0x55 |
0x56 |
| 802 | 多云,云量25%-50% |
0x57 |
0x58 |
| 803 | 多云 51%-84% |
0x59 |
|
| 804 | 多云 85%-100% |
0x5A |
|
QWeather
您可以点击此处查看原始的天气图标集
| ID | 描述 | 天 | 夜晚 |
|---|---|---|---|
| 302 | 雷阵雨 |
0x36 |
0x37 |
| 303 | 雷暴 |
0x38 |
|
| 310 | 暴雨 |
0x39 |
|
| 317 | 阵雨至大雨 | ||
| 304 | 冰雹 |
0x3A |
|
| 311 | 暴雨 |
0x3B |
|
| 312 | 强降雨 | ||
| 318 | 大雨至暴雨 | ||
| 309 | 毛毛雨 |
0x3C |
0x3D |
| 404 | 雨夹雪 |
0x3E |
|
| 305 | 小雨 |
0x42 |
|
| 314 | 小到中雨 | ||
| 306 | 中雨 |
0x43 |
|
| 315 | 中到大雨 | ||
| 399 | 雨 | ||
| 308 | 极端降雨 |
0x44 |
|
| 316 | 大雨转暴雨 | ||
| 313 | 冻雨 |
0x45 |
|
| 405 | 雨与雪 | ||
| 300 | 阵雨 |
0x46 |
|
| 301 | 阵雨 | ||
| 307 | 大雨 | ||
| 350 | 阵雨 | ||
| 351 | 阵雨 | ||
| 400 | 小雪 |
0x4C |
0x4D |
| 408 | 小雪至中雪 | ||
| 499 | 雪 | ||
| 401 | 中雪 |
0x4A |
|
| 402 | 大雪 | ||
| 409 | 中到大雪 | ||
| 410 | 大雪至暴风雪 | ||
| 403 | 暴风雪 |
0x4B |
|
| 406 | 阵雨、雨夹雪 | ||
| 407 | 飘雪 | ||
| 456 | 阵雨、雨夹雪 | ||
| 457 | 飘雪 | ||
| 503 | 土沙色 |
0x4E |
|
| 504 | 灰尘 | ||
| 507 | 沙尘暴 | ||
| 508 | 沙尘暴 | ||
| 511 | 轻度雾霾 | ||
| 512 | 浓雾 | ||
| 513 | 严重雾霾 | ||
| 500 | 薄雾 |
0x4F |
|
| 501 | 雾 | ||
| 502 | 阴霾 | ||
| 509 | 浓雾 | ||
| 510 | 浓雾 | ||
| 514 | 浓雾 | ||
| 515 | 特大雾 | ||
| 100 | 阳光 |
0x53 |
0x54 |
| 150 | 清除 | ||
| 101 | 多云 |
0x55 |
0x56 |
| 151 | 多云 | ||
| 102 | 多云 |
0x57 |
0x58 |
| 152 | 多云 | ||
| 103 | 局部多云 |
0x59 |
|
| 153 | 局部多云 | ||
| 104 | 阴天 |
0x5A |
|
MET天气
请点击此处查看 MET Weather 的图标集作为示例。
| ID | 描述 | 天 | 夜晚 |
|---|---|---|---|
| lightrainshowers | 小阵雨 |
0x36 |
0x37 |
| lightrainshowersandthunder | 小雷阵雨 | ||
| rainshowersandthunder | 雷阵雨 | ||
| heavyrainshowersandthunder | 强雷阵雨 | ||
| heavyrainandthunder | 强雷雨 |
0x38 |
|
| rainandthunder | 雷雨 | ||
| lightrainandthunder | 弱雷雨 |
0x39 |
|
| heavysleetandthunder | 大雨夹雪,伴有雷电 |
0x3B |
|
| lightsleetandthunder | 小雨夹雪,伴有雷电 |
0x3A |
|
| lightssleetshowersandthunder | 短时小雨夹雪,伴有雷电 | ||
| sleetandthunder | 雨夹雪,伴有雷电 | ||
| lightsleetshowers | 短时小雨夹雪 |
0x3C |
0x3D |
| sleetshowers | 短时雨夹雪 | ||
| sleetshowersandthunder | 短时雨夹雪,伴有雷电 | ||
| heavysleetshowers | 短时大雨夹雪 | ||
| heavysleetshowersandthunder | 短时大雨夹雪,伴有雷电 | ||
| lightsleet | 小雨夹雪 |
0x3E |
|
| sleet | 雨夹雪 |
0x3F |
|
| heavysleet | 大雨夹雪 |
0x45 |
|
| lightrain | 小雨 |
0x42 |
|
| rain | 雨 |
0x43 |
|
| heavyrain | 倾盆大雨 |
0x44 |
|
| rainshowers | 阵雨 |
0x46 |
|
| heavyrainshowers | 强阵雨 | ||
| heavysnow | 大雪 |
0x4B |
|
| heavysnowandthunder | 强雷雪 | ||
| snow | 雪 | ||
| snowandthunder | 雷雪 | ||
| lightsnowshowers | 小阵雪 |
0x4C |
0x4D |
| lightssnowshowersandthunder | 小雷阵雪 | ||
| snowshowers | 阵雪 | ||
| snowshowersandthunder | 雷阵雪 | ||
| heavysnowshowers | 强阵雪 | ||
| heavysnowshowersandthunder | 强雷阵雪 | ||
| lightsnow | 小雪 |
0x4A |
|
| lightsnowandthunder | 小雷雪 | ||
| fog | 雾 |
0x4F |
|
| clearsky | 晴 |
0x53 |
0x54 |
| fair | 一般级别 |
0x55 |
0x56 |
| partlycloudy | 局部多云 |
0x57 |
0x58 |
| cloudy | 多云 |
0x59 |
|