1.1 什么是模板小程序

模板小程序是一种特殊的小程序,模板小程序可以被投放到增值服务中,提供给客户购买使用。

模板小程序由服务商开发,服务商是指为智能小程序提供模板开发服务、定制化开发服务的第三方合作伙伴。

服务商可根据需要使用智能小程序的能力开发具备模板化、定制化的小程序,同时也可以将小程序提供的能力与云开发项目结合起来,开发出独特色的小程序功能。

1.2 如何成为服务商

首先,需要在涂鸦 IoT 平台注册成功一个账号,并完成企业认证。 然后,涂鸦进行合作联系,涂鸦在线下评估企业是否具备服务商能力后,确认成为服务商。

1.3 为完成开发服务需要以下步骤

创建模板小程序

开发者使用 IoT 账号登录到小程序开发者平台,并点击新建小程序

输入小程序名称,小程序类型选择智能小程序,开发模式选择模板小程序,即可完成创建一个模板小程序。

设置服务域名业务域名

选择模板小程序,进入小程序管理后台,点击选择开发设置

点击多区服务器域名模块中的立即查看按钮,进入域名配置业务

选择需要设置的区数据中心,然后将服务器域名配置到 request 合法域名下,其他的域名设置可按需求自行选择配置。

开发者可以自行选择后端服务的开发语言(java、php、NodeJs、GO 等),并在需要调用云开发能力时,可将小程序与云开发应用关联,然后进行前后端开发。

创建云开发项目

开发者使用 IoT 账号登录到 IoT 平台,选择云开发菜单,点击创建云项目;

创建成功后,即可获取云开发项目的 Client ID 及 Client secret。

云项目开发文档可参考云开发文档

关联模板小程序

返回到模板小程序后台,选择开发设置,点击云项目模块的添加按钮

由于模板小程序是由服务商(第三方合作伙伴)开发提供,实际使用时,如果需要使用用户数据,根据相关法规要求,需要用户授权后才能获取用户数据,授权流程如下:

小程序代码示例

小程序前端需要先调用 ty.login 先进行前端登录,并获取到状态的 code 值,然后再调用 ty.getuserInfosync 获取用户基本信息,然后再进行用户登录,服务端可使用涂鸦云返回的 uid 做用户数据打通。

import {
	getStorageSync,
	getSystemInfoSync,
	login,
	removeStorageSync,
	request,
	setStorageSync,
	getUserInfo,
	showModal,
} from "@ray-js/ray";

const { code } = await login({});
const { nickName, avatorUrl } = new Promise((resolve, reject) =>
	getUserInfo({ success: resolve, failure: reject })
);
request({
	url: `https://wwww.xxx.com/login`,
	method: "POST",
	header: {
		"Content-Type": "application/json",
	},
	data: {
		code,
		nickName,
		avatorUrl,
	},
	success: ({ data }: any) => {
		// 由于小程序没有 cookie,这时使用 storage 管理登录态
		setStorageSync({
			key: "session",
			data,
		});
	},
	failure: () => {
		showModal({
			title: "提示",
			content: "登录失败",
			showCancel: false,
		});
	},
});

服务端示例

这里使用 Nodejs Koa 实现

const Koa = require("koa");
const KoaRouter = require("koa-router");
const crypto = require("crypto");
const axios = require("axios");
const bodyParser = require("koa-bodyparser");

const app = new Koa();
const router = new KoaRouter();
const accessKey = "云开发 Client ID";
const secretKey = "云开发 Client Secret";

// 登录接口
router.post(`/login`, async (ctx) => {
	const { code, nickName, avatorUrl } = ctx.request.body;
	// 加密处理
	const contentHash = crypto.createHash("sha256").update("").digest("hex");
	const t = +new Date();
	const nonce = "";
	const stringToSign = ["GET", contentHash, "", path].join("\n");
	const signStr = [accessKey, t, nonce, stringToSign].join("");
	const sign = crypto
		.createHmac("sha256", secretKey)
		.update(signStr, "utf8")
		.digest("hex")
		.toUpperCase();
	const { data } = await axios({
		url: `https://openapi.tuyacn.com/v1.0/token?code=${code}&grant_type=2`,
		method: "GET",
		headers: {
			t,
			sign,
			client_id: accessKey,
			sign_method: "HMAC-SHA256",
			Dev_lang: "Nodejs",
			"Signature-Headers": "",
		},
	});
	let responseData;
	if (data.success) {
		const { uid } = data.result;
		responseData = {
			success: true,
			result: {
				sessionId: "1234567890", // 服务端自己生成一个唯一id,用于管理前端登录状态
			},
		};
	} else
		responseData = {
			success: false,
			errMsg: data.msg,
			errCode: data.code,
		};
	{
	}
	ctx.body = responseData;
});

app.use(bodyParser()).use(router.allowedMethods()).use(router.routes());

app.listen(3000, async () => {
	console.log(`Server start on http://localhost:9000`);
});

开发完成模板小程序后,可通过小程序开发者工具上传代码到开发者平台;

然后在小程序版本管理页面的开发版本中找到相应的版本,进行提审;

等待涂鸦审核通过后,可联系涂鸦将模板小程序增加到增值服务平台。