实施与上线
为了成功地将 Smile 融入您的流程,我们建议通过以下3个步骤来实现:
- 收集需求 - 探索您的使用用例,以及您想通过 Smile 数据实现什么目标
- 设计 - 设计您的用户流程以及与 Smile 的集成
- 实施与上线(本指南)--设置和启动集成的详细步骤
第1步:实施 Smile Wink
如果想让用户在您的网站或应用程序上连接他们的就业账户,您需要集成 Smile Wink Widget。请看下面的配置示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="smileicon32.webp" sizes="32x32">
<link rel="icon" href="smileicon192.webp" sizes="192x192">
<title>Smile Wink</title>
</head>
<body>
<script src="https://web.smileapi.io/v2/smile.v2.js"></script>
<script type="text/javascript">
const smileLinkModal = new SmileLinkModal({
// .....
/**
* User Token: 从你的后端服务里面获取,你的后端服务需要调用 SmileAPI /tokens 或者 /users 接口来获取。
*/
userToken: '<usertoken>',
/**
* 使用模板来控制集成在你APP或者网站上的WinkWidget的页面样式与数据
* 你可以在 Smile 的开发者控制台创建并获取 TemplateID
* https://developer-portal.smileapi.io/link/template
*/
templateId: "<ID of wink template >",
/**
* 账号创建时的回调.
*/
onAccountCreated: ({ accountId, userId, providerId }) => {
console.log('Account created: ', accountId, ' User ID:', userId, ' Provider ID:', providerId)
},
/**
* 账号登录成功时的回调.
*/
onAccountConnected: ({ accountId, userId, providerId }) => {
console.log('Account connected: ', accountId, ' User ID:', userId, ' Provider ID:', providerId)
},
/**
* 账号撤销链接的回调.
*/
onAccountRemoved: ({ accountId, userId, providerId }) => {
console.log('Account removed: ', accountId, ' User ID:', userId, ' Provider ID:', providerId)
},
/**
* Token 失效时的回调
*/
onTokenExpired: () => {
console.log('Token expired');
},
/**
* Smile 的 WinkWidget 关闭时回调。如果你想知道用户通过哪种方式关闭的 WinkWidget,你可以像下面的实例一样传递参数:
* onClose:({reason})=>{}
* 如果 reason == "close", 说明用户点击了右上角的关闭图标
* 如果 reason == "close", 说明用户在尝试通过 Wink Widget 连接时发生错误后点击了 "EXIT" 按钮
* 如果 reason == "exit", 说明用户点击了链接成功页面的 "DONE" 按钮
*/
onClose: ({ reason }) => {
console.log('Link closed, reason:', reason)
},
/**
* 账号链接出错时的回调
*/
onAccountError: ({ accountId, userId, providerId, errorCode }) => {
console.log('Account error: ', accountId, ' User ID:', userId, ' Provider ID:', providerId, 'Error Code:', errorCode)
},
/**
* 数据上传时的回调
*/
onUploadsCreated: ({ uploads, userId }) => {
console.log('Uploads: ', uploads, ' User ID:', userId);
},
/**
* 撤销已上传的数据时的回调
*/
onUploadsRemoved: ({ uploads, userId }) => {
console.log('Uploads: ', uploads, ' User ID:', userId);
},
/**
* 当页面UI发生改变时推送的事件
* @param eventName 事件名称
* @param eventTime 发生时间
* @param mode 沙箱|生产环境
* @param userId 用户ID
* @param account Account对象
* @param archive Archive对象
* Uploads revoke callback.
*/
onUIEvent: ({ eventName, eventTime, mode, userId, account, archive }) => {
console.log('eventName:', eventName,
"eventTime:", eventTime,
"mode:", mode,
"userId:", userId,
"account:", account,
"archive:", archive);
}
});
smileLinkModal.open()
</script>
</body>
</html>
User tokens (Link tokens)
User tokens 是临时的(5小时后失效)访问密钥,通过它开始您与 Smile 链接的过程。
新用户的链接初始化:
- 通过调用
/users
端点创建一个带有源数据的新的 Smile 用户,类似于您的产品/系统中的用户标识。您将收到一个 SmileuserId
。我们建议您在系统中保存这个 SmileuserId
,以便将来参考与使用。 - 通过调用
/tokens
endpoint ,使用userId
来创建一个新的 user token。您将收到相应的userToken
。 - 我们在您的 Smile Wink 初始化中提供
userToken
。请确保 user token 在服务器端被请求,您的client_id
和client_secret
将永远不会暴露在前端。
**老用户的链接初始化或刷新 Link token**
- 通过调用
/tokens
endpoint 获得一个新的 user token,其userId
是您之前保存的。 - 我们在您的 Smile Wink 初始化中提供
userToken
。请确保 user token 在服务器端被请求,您的client_id
和client_secret
永远不会暴露在前端。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="smileicon32.webp" sizes="32x32">
<link rel="icon" href="smileicon192.webp" sizes="192x192">
<title>Smile Wink</title>
</head>
<body>
<script src="https://web.smileapi.io/v2/smile.v2.js"></script>
<script type="text/javascript">
const smileLinkModal = new SmileLinkModal({
// .....
/**
* 来自 Smile API 的user token 是从您的后端服务进行传递的。
*/
userToken: '<usertoken>', // 在这里输入您的 user token
// .....
});
smileLinkModal.open()
</script>
</body>
</html>
第2步: 连接测试账户并检索 transactions、estimated incomes (eincome) 和 contributions 数据
如果想要使用 Sandbox,您可以使用以下示例凭证:
User Name | Full Name | Mobile Phone | Password | Verification Code | |
---|---|---|---|---|---|
George | George Palomero Jr. | [email protected] | (+63) 9559991234 | 123456 | 1234 |
Ryan | Ryan Ng | [email protected] | (+62) 8119994321 | 654321 | 1234 |
Christina | Christina Tan | [email protected] | (+65) 99996789 | YGUS1 | 1234 |
Anisha | Anisha Bhatia | [email protected] | (+91) 9511198765 | 123456 | 1234 |
在进行下一步之前,请确保您测试过您的实施。点击提供商列表中的一个提供商,并使用其中一个 sandbox 凭证来连接所选的提供商。
我们建议在 sandbox 模式下订阅 Smile API 的 webhook payload,以检索测试帐户的个人信息、就业信息和社保缴费信息。通过 Smile API 的 Webhook payload,您可以同时从一个特定数据点或多个数据点获取不同字段。
您可以通过 Developer Portal 沙盒模式中的 Webhook 部分启用 Webhook payload,通过订阅下面列出的以下 Webhook 事件并在“Include Payload”设置中选择“True”,您可以相应地检索三个数据点的数据。
事件类型 | 详情 |
---|---|
TASK_FINISHED | 返回所选数据点的 payload。 |
ACCOUNT_SYNC_TASK_FINISHED | 返回新同步数据点的 payload。 |
TRANSACTIONS_ADDED | 检索交易信息数据字段。 |
EINCOMES_ADDED | 检索就业信息数据字段。 |
CONTRIBUTIONS_ADDED | 检索社保缴费信息数据字段。 |
对于交易信息,从 TRANSACTIONS_ADDED
事件获取以下字段:
- Amount
- Start date
- End date
下面是一个示例响应:
[{
"id": "t-123abc456def789abc123def456abc78",
"date": "2022-08-31",
"currency": "PHP",
"amount": -16.9,
"metadata": {
"createdAt": "2022-09-02T23:36:12Z",
"sourceId": "a-123abc456def789abc123def456abc78",
"sourceType": "ACCOUNT",
"userId": "tenantId-123abc456def789abc123def456abc78",
"providerId": "abccorp",
"accountId": "a-123abc456def789abc123def456abc78"
},
"description": "Platform fee",
"referenceId": "Order ID-996438805066"
}, {
"id": "t-123abc456def789abc123def456abc78",
"date": "2022-08-29",
"currency": "PHP",
"amount": 550,
"metadata": {
"createdAt": "2022-09-02T23:36:12Z",
"sourceId": "a-123abc456def789abc123def456abc78",
"sourceType": "ACCOUNT",
"userId": "tenantId-123abc456def789abc123def456abc78",
"providerId": "abccorp",
"accountId": "a-123abc456def789abc123def456abc78"
},
"description": "Order revenue",
"referenceId": "Order ID-994728692055"
}, {
"id": "t-123abc456def789abc123def456abc78",
"date": "2022-08-28",
"currency": "PHP",
"amount": 250,
"metadata": {
"createdAt": "2022-09-02T23:36:12Z",
"sourceId": "a-123abc456def789abc123def456abc78",
"sourceType": "ACCOUNT",
"userId": "tenantId-123abc456def789abc123def456abc78",
"providerId": "abccorp",
"accountId": "a-123abc456def789abc123def456abc78"
},
"description": "Rider incentive",
"referenceId": "Order ID-234728692099"
}]
对于预估收入(eincomes)信息,从 EINCOMES__ADDED
事件获取以下字段:
- Amount
- Month
下面是一个示例响应:
[
{
"id":"einc-cd80c6779ef7423c8af5b38b57e4b1eb",
"month":"2022-11",
"currency":"PHP",
"baseAmount":8500,
"metadata":{
"createdAt":"2022-12-07T09:33:11Z",
"sourceId":"a-94f56ca9c3ae42b5acc0c5bd64017f4b",
"sourceType":"ACCOUNT",
"userId":"smilebond-7892a2010b444bbe98916db4969e1863",
"providerId":"sss_ph",
"accountId":"a-94f56ca9c3ae42b5acc0c5bd64017f4b"
}
},
{
"id":"einc-cefcc7e769cd48ea8c4e58d3653b3cab",
"month":"2022-10",
"currency":"PHP",
"baseAmount":8500,
"metadata":{
"createdAt":"2022-12-07T09:33:11Z",
"sourceId":"a-94f56ca9c3ae42b5acc0c5bd64017f4b",
"sourceType":"ACCOUNT",
"userId":"smilebond-7892a2010b444bbe98916db4969e1863",
"providerId":"sss_ph",
"accountId":"a-94f56ca9c3ae42b5acc0c5bd64017f4b"
}
}
]
对于社保缴费信息,从 CONTRIBUTIONS_ADDED
事件获取以下字段:
- Employer name
- Job title
- Start date
- End date
下面是一个示例响应:
[{
"id": "con-123abc456def789abc123def456abc78",
"date": "2022-06-30",
"currency": "PHP",
"amount": 2250,
"referenceId": null,
"metadata": {
"createdAt": "2022-08-24T05:14:37Z",
"sourceId": "a-123abc456def789abc123def456abc78",
"sourceType": "ACCOUNT",
"userId": "tenantId-123abc456def789abc123def456abc78",
"providerId": "sss_ph",
"accountId": "a-123abc456def789abc123def456abc78"
}
}, {
"id": "con-123abc456def789abc123def456abc78",
"date": "2022-05-31",
"currency": "PHP",
"amount": 2250,
"referenceId": null,
"metadata": {
"createdAt": "2022-08-24T05:14:37Z",
"sourceId": "a-123abc456def789abc123def456abc78",
"sourceType": "ACCOUNT",
"userId": "tenantId-123abc456def789abc123def456abc78",
"providerId": "sss_ph",
"accountId": "a-123abc456def789abc123def456abc78"
}
}, {
"id": "con-123abc456def789abc123def456abc78",
"date": "2022-04-30",
"currency": "PHP",
"amount": 2250,
"referenceId": null,
"metadata": {
"createdAt": "2022-08-24T05:14:37Z",
"sourceId": "a-123abc456def789abc123def456abc78",
"sourceType": "ACCOUNT",
"userId": "tenantId-123abc456def789abc123def456abc78",
"providerId": "sss_ph",
"accountId": "a-123abc456def789abc123def456abc78"
}
}]
关于其他数据字段,请参考 Smile API reference 并通过选择各自的 Webhook 事件来订阅其他 payload。
第3步:将 transaction, eincome 以及 contribution 数据输入您的信用决策引擎
您可以使用 Smile 的数据来进一步计算与您的产品相匹配的因子,然后将这些因子发送到您的信用决策引擎。通常情况下,因子可以分为以下几类:
- 累计的收入/社保缴费月数
- 最近3/6/9/12个月的收入/社保缴费数目
- 最近6/12/24个月的收入/社保缴费额度差值
第4步:设置 webhooks
如果想要定期收到用户的账户,identity,contribution 以及 employment 数据的更新,请订阅 webhooks 。
Webhooks 在每次发生事件时向您的系统发送通知,例如,当一个账户被连接、移除或更新时。
为了监控新的以及现有的账户,Smile 建议您订阅以下 webhooks:
事件 | 事件类型 | 详情 |
---|---|---|
帐户连接成功 | ACCOUNT_CONNECTED | 当用户成功连接其工作账户时发送 |
帐户断线成功 | ACCOUNT_DISCONNECTED | 当用户断开或撤销其工作账户的连接时发送 |
帐户连接失败 | ACCOUNT_FAILED | 当账户连接失败时发送 |
为了监控 identity, contribution 以及 employment 数据的变化,Smile 建议通过开发者门户中的 Webhook 部分订阅以下 Webhooks 事件,然后通过在“Include Payloads”设置中选择“True”来检索相应的数据。
但请注意,Webhook Payload 仅适用于“TASK_FINISHED”和“Account_SYNC_TASK_FINISHED”的 Webhook 事件。

事件 | 事件类型 | 详情 |
---|---|---|
任务开始 | TASK_STARTED | 当用户账户的数据同步开始时发送 |
任务结束 | TASK_FINISHED | 当用户账户的数据同步结束时发送,包含已被同步的数据端点 |
或者您可以订阅特定数据端点的相关事件
事件 | 事件类型 | 详情 |
---|---|---|
添加了社保缴费数据 | CONTRIBUTIONS_ADDED | 当用户提供的社保缴费数据被添加时发送 |
添加了预估收入数据 | EINCOMES_ADDED | 当用户提供的预估收入数据被添加时发送 |
添加了交易数据 | TRANSACTIONS_ADDED | 当用户提供的交易数据被添加时发送 |
... | ... | ... |
第5步:上线运行并扩大规模
在 Sandbox 模式下成功实施并测试成功后,您可以切换到 Production 模式进行发布。
更改 API Keys
API Key 可以在 Developer Portal 的 API Key 部分找到。在切换到 Production 模式时请使用 Production密钥。
循序渐进
对于您的第一个 Production 账户,您可以使用自己的账户进行测试,或者在一个自由职业者的工作平台(如 Upwork)上创建一个账户并连接。
上线运行并扩大规模
在您的个人账户测试成功后,您可以对真实用户进行测试。我们建议从一个小的用户子集开始,以确保一切正常。然后,将这个子集逐渐推进到您的全部用户群。
Updated about 1 year ago