Schema 规则介绍
服务 Schema 体系说明
Attribute
属性组成,属性描述服务需要的字段和对应的规则,Schema 结构如下:
Attribute 定义
<=
。>=
。<
。>
。示例
single(单值属性类型)
<attribute id="serviceName" name="服务名称" type="single" valueType="text">
<value/>
<rules>
<rule type="maxLength" name="最大长度" value="15"/>
<rule type="minLength" name="最小长度" value="2"/>
<rule type="required" name="必填" value="true"/>
<rule type="pattern" name="正则表达式" value="[\\u4E00-\\u9FA5A-Za-z0-9_+\\-()()]+"/>
<rule type="devTip" name="开发者提示" value="字数限制2~15个字填写格式:可以由中文、数字、英文、下划线、+、-组成 审核提醒: 1.服务名称代表小程序内的某个功能或一类服务,服务名称不可重复且需代表不同的功能 2.服务名称不可与小程序名称重复 3.二级服务需要与小程序本身提供的服务相关,如租赁类小程序的服务名称需要与租赁服务有关"/>
</rules>
</attribute>
multi(多值属性类型)
<attribute id="area" name="服务区域" type="multi" valueType="text">
<values/>
<rules>
<rule type="devTip" name="开发者提示" value="传值为字符串List,6位行政区编码,可以填省或者市或者区,全国填1,可以填多个;如果一个省下面所有的市都支持,则填写省的行政编码即可;举例:服务覆盖区域包含浙江省,江苏苏州和太仓。"/>
<rule type="maxSize" name="最大条目数" value="256"/>
<rule type="minSize" name="最小条目数" value="1"/>
<rule type="required" name="必填" value="true"/>
</rules>
</attribute>
complex(复合类型)
<attribute id="businessHours" name="营业时间" type="complex" valueType="object">
<attributes>
<attribute id="startHour" name="开始时间" type="single" valueType="text">
<rules>
<rule type="required" name="是否必填" value="true"/>
<rule type="pattern" name="正则表达式" value="([0-1][0-9]|2[0-3]):([0-5][0-9])"/>
</rules>
<value/>
</attribute>
<attribute id="closeHour" name="结束时间" type="single" valueType="text">
<rules>
<rule type="required" name="是否必填" value="true"/>
<rule type="pattern" name="正则表达式" value="([0-1][0-9]|2[0-3]):([0-5][0-9])"/>
</rules>
<value/>
</attribute>
multiComplex(多组复合类型)
<attribute id="serviceUrl" name="服务链接" type="multiComplex" valueType="object">
<attributes>
<attribute id="carrierType" name="载体类型" type="single" valueType="enum">
<rules>
<rule type="required" name="必填" value="true"/>
<rule type="maxSize" name="最大条目数" value="1"/>
<rule type="minSize" name="最小条目数" value="1"/>
</rules>
<options>
<option displayName="支付宝小程序" value="SC_MINI_APP"/>
<option displayName="高德小程序" value="AMAP_MINI_APP"/>
<option displayName="UC小程序地址" value="UC_MINI_APP"/>
<option displayName="夸克小程序地址" value="QUARK_MINI_APP"/>
</options>
<value/>
</attribute>
<attribute id="carrierUrl" name="载体url" type="single" valueType="text">
<rules>
<rule type="required" name="必填" value="true"/>
</rules>
<value/>
</attribute>
</attributes>
</attribute>
<attribute id="poi" name="poi信息" type="multiComplex" valueType="object">
<attributes>
<attribute id="shopId" name="门店ID" type="single" valueType="text">
<rules>
<rule type="required" name="是否必填" value="false"/>
<rule type="devTip" name="开发者提示" value="如果服务对应的门店已创建过支付宝门店(https://opendocs.alipay.com/mini/0149jo),可以只传对应的shopID;门店ID和(门店名称+城市码+地址)二选一。"/>
</rules>
<value/>
</attribute>
<attribute id="poiName" name="门店名称" type="single" valueType="text">
<rules>
<rule type="required" name="是否必填" value="false"/>
<rule type="devTip" name="开发者提示" value="服务对应的线下门店名称,需要填写标准,门店ID和(门店名称+城市码+地址)二选一。"/>
</rules>
<value/>
</attribute>
<attribute id="address" name="地址" type="single" valueType="text">
<rules>
<rule type="required" name="是否必填" value="false"/>
<rule type="devTip" name="开发者提示" value="服门店详细地址,具体到门牌号,支付宝测会基于这个信息去高德转换经纬度信息,需要填写标准,门店ID和(门店名称+城市码+地址)二选一。"/>
</rules>
<value/>
</attribute>
<attribute id="cityCode" name="城市码" type="single" valueType="text">
<rules>
<rule type="required" name="是否必填" value="false"/>
<rule type="devTip" name="开发者提示" value="服务对应线下门店所属城市6位行政编码,门店ID和(门店名称+城市码+地址)二选一。"/>
</rules>
<value/>
</attribute>
<attribute id="poiCarrierType" name="载体类型" type="single" valueType="enum">
<rules>
<rule type="required" name="是否必填" value="false"/>
<rule type="maxSize" name="最大条目数" value="1"/>
<rule type="minSize" name="最小条目数" value="1"/>
</rules>
<options>
<option displayName="支付宝小程序" value="SC_MINI_APP"/>
<option displayName="高德小程序" value="AMAP_MINI_APP"/>
<option displayName="UC小程序地址" value="UC_MINI_APP"/>
<option displayName="夸克小程序地址" value="QUARK_MINI_APP"/>
</options>
<value/>
</attribute>
<attribute id="poiCarrierUrl" name="载体url" type="single" valueType="text">
<rules>
<rule type="required" name="是否必填" value="false"/>
<rule type="devTip" name="开发者提示" value="1.支付宝小程序链接格式为alipays://platformapi/startapp?appId=2019042063892039&amp;page=pages/home&amp;query=class_id=0,其中alipays://platformapi/startapp?appId=为固定值,appId为服务所属小程序的APPID,若跳转时需携带参数可用 &amp;query=a=1&amp;b=2 方式拼接传递。 2.载体链接必须为小程序内的链接且唯一。"/>
</rules>
<value/>
</attribute>
</attributes>
</attribute>
完整的 Schema 示例
<?xml version="1.0" encoding="utf-8"?>
<serviceSchema>
<attribute id="serviceName" name="服务名称" type="single" valueType="text">
<value/>
<rules>
<rule type="required" name="必填" value="true"/>
<rule type="maxLength" name="最大长度" value="15"/>
<rule type="minLength" name="最小长度" value="2"/>
<rule type="pattern" name="正则表达式" value="[\\u4E00-\\u9FA5A-Za-z0-9_+\\-()()]+"/>
<rule type="devTip" name="开发者提示" value="字数限制2~15个字填写格式:可以由中文、数字、英文、下划线、+、-组成 审核提醒: 1.服务名称代表小程序内的某个功能或服务,服务名称不可重复且需代表不同的功能 2.服务名称不可与小程序名称重复 3.服务名称需要与小程序本身提供的服务相关,如租赁类小程序的服务名称需要与租赁服务有关"/>
</rules>
</attribute>
<attribute id="serviceDesc" name="服务描述" type="single" valueType="text">
<value/>
<rules>
<rule type="required" name="必填" value="true"/>
<rule type="maxLength" name="最大长度" value="100"/>
<rule type="minLength" name="最小长度" value="5"/>
<rule type="devTip" name="开发者提示" value="请描述具体的服务内容,字数限制为5-100字审核提醒: 1.要清楚介绍服务功能,例如提供了什么功能,便于通过审核 2.请不要填写无意义的内容3.请不要出现向外部应用引流的文案"/>
</rules>
</attribute>
<attribute id="serviceUrl" name="服务链接" type="multiComplex" valueType="object">
<attributes>
<attribute id="carrierType" name="载体类型" type="single" valueType="enum">
<rules>
<rule type="required" name="必填" value="true"/>
<rule type="maxSize" name="最大条目数" value="1"/>
<rule type="minSize" name="最小条目数" value="1"/>
</rules>
<options>
<option displayName="支付宝小程序" value="SC_MINI_APP"/>
<option displayName="高德小程序" value="AMAP_MINI_APP"/>
<option displayName="UC小程序地址" value="UC_MINI_APP"/>
<option displayName="夸克小程序地址" value="QUARK_MINI_APP"/>
</options>
<value/>
</attribute>
<attribute id="carrierUrl" name="载体url" type="single" valueType="text">
<rules>
<rule type="required" name="必填" value="true"/>
</rules>
<value/>
</attribute>
</attributes>
</attribute>
<attribute id="poi" name="poi信息" type="complex" valueType="object">
<attributes>
<attribute id="poiName" name="门店名称" type="single" valueType="text">
<rules>
<rule type="required" name="必填" value="false"/>
<rule type="devTip" name="开发者提示" value="服务对应的线下门店名称,需要填写标准"/>
</rules>
<value/>
</attribute>
<attribute id="shopId" name="门店ID" type="single" valueType="text">
<rules>
<rule type="required" name="必填" value="false"/>
<rule type="devTip" name="开发者提示" value="服务对应的线下门店id,通过支付宝门店创建接口ant.merchant.expand.shop.create创建门店后唯一标识,如果已经创建则填对应的shopId"/>
</rules>
<value/>
</attribute>
<attribute id="address" name="地址" type="single" valueType="text">
<rules>
<rule type="required" name="必填" value="false"/>
<rule type="devTip" name="开发者提示" value="服门店详细地址,具体到门牌号,支付宝测会基于这个信息去高德转换经纬度信息,需要填写标准"/>
</rules>
<value/>
</attribute>
<attribute id="cityCode" name="城市码" type="single" valueType="text">
<rules>
<rule type="required" name="必填" value="false"/>
<rule type="devTip" name="开发者提示" value="服务对应线下门店所属城市6位行政编码"/>
</rules>
<value/>
</attribute>
</attributes>
<rules>
<rule type="devTip" name="开发者提示" value="门店id和(adress+门店名称+cityCode)二选一,有门店id传shopId,没有门店id就填门店详细地址adress;如果选择adress,对应的门店名称和门店所在城市码必须传"/>
<rule type="required" name="必填" value="true"/>
<rule type="maxSize" name="最大条目数" value="1"/>
<rule type="minSize" name="最小条目数" value="1"/>
</rules>
</attribute>
<attribute id="businessHours" name="营业时间" type="complex" valueType="object">
<attributes>
<attribute id="startHour" name="开始时间" type="single" valueType="text">
<rules>
<rule type="required" name="必填" value="true"/>
<rule type="pattern" name="正则表达式" value="([0-1][0-9]|2[0-3]):([0-5][0-9])"/>
</rules>
<value/>
</attribute>
<attribute id="closeHour" name="结束时间" type="single" valueType="text">
<rules>
<rule type="required" name="必填" value="true"/>
<rule type="pattern" name="正则表达式" value="([0-1][0-9]|2[0-3]):([0-5][0-9])"/>
</rules>
<value/>
</attribute>
<attribute id="weekDays" name="周几" type="multi" valueType="enum">
<rules>
<rule type="maxSize" name="最大条目数" value="7"/>
<rule type="minSize" name="最小条目数" value="1"/>
<rule type="required" name="必填" value="true"/>
</rules>
<options>
<option displayName="周一" value="monday"/>
<option displayName="周二" value="tuesday"/>
<option displayName="周三" value="wednesday"/>
<option displayName="周四" value="thursday"/>
<option displayName="周五" value="friday"/>
<option displayName="周六" value="saturday"/>
<option displayName="周日" value="sunday"/>
</options>
<values/>
</attribute>
</attributes>
<rules>
<rule type="required" name="必填" value="true"/>
<rule type="devTip" name="开发者提示" value="请严格按照,weekDays请输入monday,tuesday,wednesday,thursday,friday,saturday,sunday的集合,startHour中是开始时间(格式例09:00),closeHour是结束时间(格式例09:00)"/>
<rule type="maxSize" name="最大条目数" value="1"/>
<rule type="minSize" name="最小条目数" value="0"/>
</rules>
</attribute>
<attribute id="A2021031700370062" name="品牌名称" type="single" valueType="text">
<value/>
<rules>
<rule type="required" name="必填" value="true"/>
<rule type="maxLength" name="最大长度" value="20"/>
<rule type="minLength" name="最小长度" value="1"/>
</rules>
</attribute>
<attribute id="contactTele" name="门店电话" type="single" valueType="text">
<value/>
<rules>
<rule type="required" name="必填" value="true"/>
<rule type="pattern" name="正则表达式" value="1[3-9]\\d{9}|0\\d{2,3}-[1-9]\\d{6,7}-?\\d{0,10}"/>
<rule type="devTip" name="开发者提示" value="请输入合法的手机号码或者固定号码,其中固定号码的区号3到4位,电话7到8位,分机号选填(例:固定电话:0834-1133567 或者 0834-1133567-1234 "/>
</rules>
</attribute>
</serviceSchema>
完整提报服务内容示例
<?xml version="1.0" encoding="utf-8"?>
<serviceSchema>
<attribute id="serviceName" name="服务名称" type="single" valueType="text">
<value>服务提报demo</value>
</attribute>
<attribute id="serviceDesc" name="服务描述" type="single" valueType="text">
<value>服务提报demo</value>
</attribute>
<attribute id="serviceUrl" name="服务链接" type="multiComplex" valueType="object">
<attributes>
<attribute id="carrierType" name="载体类型" type="single" valueType="enum">
<value>SC_MINI_APP</value>
</attribute>
<attribute id="carrierUrl" name="载体url" type="single" valueType="text">
<value>alipays://platformapi/startapp?appId=2018999902363017&b=1</value>
</attribute>
</attributes>
<attributes>
<attribute id="carrierType" name="载体类型" type="single" valueType="enum">
<value>AMAP_MINI_APP</value>
</attribute>
<attribute id="carrierUrl" name="载体url" type="single" valueType="text">
<value>amapuri://applets/platformapi/startapp?appId=2019042363892048&213</value>
</attribute>
</attributes>
</attribute>
<attribute id="poi" name="poi信息" type="complex" valueType="object">
<attributes>
<attribute id="shopId" name="门店ID" type="single" valueType="text">
<value/>
</attribute>
<attribute id="poiName" name="门店名称" type="single" valueType="text">
<value>测试门店名称</value>
</attribute>
<attribute id="address" name="地址" type="single" valueType="text">
<value>文三路18号</value>
</attribute>
<attribute id="cityCode" name="城市码" type="single" valueType="text">
<value>330100</value>
</attribute>
</attributes>
</attribute>
<attribute id="businessHours" name="营业时间" type="complex" valueType="object">
<attributes>
<attribute id="startHour" name="开始时间" type="single" valueType="text">
<value>09:00</value>
</attribute>
<attribute id="closeHour" name="结束时间" type="single" valueType="text">
<value>23:00</value>
</attribute>
<attribute id="weekDays" name="周几" type="multi" valueType="enum">
<values>
<value>monday</value>
</values>
</attribute>
</attributes>
</attribute>
<attribute id="A2021031700370062" name="品牌名称" type="single" valueType="text">
<value>支付宝</value>
</attribute>
<attribute id="contactTele" name="门店电话" type="single" valueType="text">
<value>13566666666</value>
</attribute>
</serviceSchema>
提报服务 SDK

SDK 提供的主要接口
Java 示例
schema xml 文本反序列化属性列表
List<Attribute> ServiceSchemaReader.readXmlForList(String schemaXml)
//基于xml格式的的服务schema解析成服务属性模型列表
schema xml 文件反序列化属性列表
List<Attribute> ServiceSchemaReader.readXmlForList(File xmlfile)
//读取本地服务schema xml文件并解析成属性模型列表
schema xml 文本反序列化属性 Map
Map<String,Attribute> ServiceSchemaReader.readXmlForMap(String schemaXml)
//基于xml格式的服务schema字符串解析成服务属性列表,Map的key为属性id
schema xml 文件反序列化属性 Map
Map<String,Attribute> ServiceSchemaReader.readXmlForMap(File xmlfile)
//读取本地服务schema xml文件并解析成服务属性列表,Map的key为属性id
属性列表序列化服务 schema xml 文本
String ServiceSchemaWriter.writeSchemaXmlString(List<Attribute> attributes)
//将构建好的服务属性列表序列化成服务schema xml字符串
PHP 示例
schema xml 文本反序列化 属性列表
<?php
//基于xml格式的的服务schema解析成服务属性模型数组(数组的key为属性id)
public static function readXmlForArrayByFile($filePath)
//读取本地服务schema xml文件并解析成属性模型数组(数组的key为属性id)
public static function readXmlForArrayByString($xmlString)
?>
属性列表序列化服务 schema xml 文本
<?php
//将构建好的服务属性数组序列化成服务schema xml字符串
public static function writeSchemaXmlString(array $attributesArr)
//将构建好的服务属性数组序列化成服务schema xml字符串(含<rules>和<options>标签)
public static function writeFullchemaXmlString(array $attributesArr)
?>
集成 SDK
Java SDK
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.13.32.ALL</version>
</dependency>
PHP SDK
SDK 使用 Demo
Java 示例
single 类型
Map<String,Attribute> attributeMap = ServiceSchemaReader.readXmlForMap(serviceSchema);
SingleAttribute serviceName = (SingleAttribute) attributeMap.get("serviceName");
serviceName.setValue("饿了么外卖");
multi 类型
MultiAttribute area = (MultiAttribute) attributeMap.get("area");
List<String> areaCodes = new ArrayList<>();
areaCodes.add("330100");
area.setValues(areaCodes);
complex 类型
ComplexAttribute businessHours = (ComplexAttribute) attributeMap.get("businessHours");
List<Attribute> attributes = businessHours.getAttributes();
Map<String, Attribute> businessHoursAttributes = attributes.stream()
.collect(Collectors.toMap(Attribute::getId, attribute -> attribute));
SingleAttribute startHour = (SingleAttribute) businessHoursAttributes.get("startHour");
startHour.setValue("08:00");
SingleAttribute closeHour = (SingleAttribute) businessHoursAttributes.get("closeHour");
closeHour.setValue("20:00");
MultiAttribute weekDays = (MultiAttribute) businessHoursAttributes.get("weekDays");
weekDays.setValues(Lists.newArrayList("monday", "tuesday", "wednesday"));
multiComplex 类型
MultiComplexAttribute serviceUrl = (MultiComplexAttribute) attributeMap.get("serviceUrl");
List<ComplexAttribute> serviceUrlAttributes = new ArrayList<>();
//支付宝小程序
ComplexAttribute serviceUrl1 = serviceUrl.cloneAttribute();
Map<String, Attribute> serviceUrlAttr1 = serviceUrl1.getAttributes().stream()
.collect(Collectors.toMap(Attribute::getId, attribute -> attribute));
SingleAttribute carrierType1 = (SingleAttribute) serviceUrlAttr1.get("carrierType");
carrierType1.setValue("SC_MINI_APP");
SingleAttribute carrierUrl1 = (SingleAttribute) serviceUrlAttr1.get("carrierUrl");
carrierUrl1.setValue("alipays://platformapi/startapp?appId=2019071065847105&chInfo=ch_bill");
serviceUrlAttributes.add(serviceUrl1);
//高德小程序
ComplexAttribute serviceUrl2 = serviceUrl.cloneAttribute();
Map<String, Attribute> serviceUrlAttrs2 = serviceUrl2.getAttributes().stream()
.collect(Collectors.toMap(Attribute::getId, attribute -> attribute));
SingleAttribute carrierType2 = (SingleAttribute) serviceUrlAttrs2.get("carrierType");
carrierType2.setValue("AMAP_MINI_APP");
SingleAttribute carrierUrl2 = (SingleAttribute) serviceUrlAttrs2.get("carrierUrl");
carrierUrl2.setValue("amapuri://applets/platformapi/startapp?appId=2019042363892048&213");
serviceUrlAttributes.add(serviceUrl2);
serviceUrl.setAttributes(serviceUrlAttributes);
Map<String, Attribute> attributeMap = new HashMap<>();
MultiComplexAttribute poi = (MultiComplexAttribute) attributeMap.get("poi");
List<ComplexAttribute> poiAttributes = new ArrayList<>();
//poi1
ComplexAttribute poi1 = poi.cloneAttribute();
Map<String, Attribute> poiAttr1 = poi1.getAttributes().stream()
.collect(Collectors.toMap(Attribute::getId, attribute -> attribute));
SingleAttribute poiName1 = (SingleAttribute) poiAttr1.get("poiName");
poiName1.setValue("肯德基文三路店");
SingleAttribute adress1 = (SingleAttribute) poiAttr1.get("address");
adress1.setValue("文三路478号华星时代广场C座1层");
SingleAttribute cityCode1 = (SingleAttribute) poiAttr1.get("cityCode");
cityCode1.setValue("330100");//杭州市编码
poiAttributes.add(poi1);
//poi2
ComplexAttribute poi2 = poi.cloneAttribute();
Map<String, Attribute> poiAttr2 = poi2.getAttributes().stream()
.collect(Collectors.toMap(Attribute::getId, attribute -> attribute));
SingleAttribute poiName2 = (SingleAttribute) poiAttr2.get("poiName");
poiName2.setValue("麦当劳(杭州西湖银泰店)");
SingleAttribute adress2 = (SingleAttribute) poiAttr2.get("address");
adress2.setValue("延安路98号西湖银泰一楼L1-96号商铺(近吴山广场)");
SingleAttribute cityCode2 = (SingleAttribute) poiAttr2.get("cityCode");
cityCode2.setValue("330100");//杭州市编码
poiAttributes.add(poi2);
poi.setAttributes(poiAttributes);
PHP 示例
single 类型
<?php
$result = ServiceSchemaReader::readXmlForArrayByString($xml_string);
$result['serviceName']>setValues("饿了么外卖");
?>
multi 类型
<?php
$result = ServiceSchemaReader::readXmlForArrayByString($xml_string);
$result['area']>setValues(array("330100"));
?>
complex 类型
<?php
$result = ServiceSchemaReader::readXmlForArrayByString($xml_string);
foreach ($result['poi']->getValues() as $attr){
if($attr->getId() == 'poiName'){
$attr->setValues('肯德基文三路店');
}elseif ($attr->getId() == 'address'){
$attr->setValues('文三路478号华星时代广场C座1层');
}elseif ($attr->getId() == 'cityCode'){
$attr->setValues('330100');
}
}
?>
multiComplex 类型
<?php
$result = ServiceSchemaReader::readXmlForArrayByString($xml_string);
foreach ($result['serviceUrl']->getValues() as $item){
foreach ($item->getValues() as $attr) {
if($attr->getId() == 'carrierType'){
$attr->setValues('SC_MINI_APP');
}elseif ($attr->getId() == 'carrierUrl'){
$attr->setValues('alipays://platformapi/startapp?appId=2019071065847105&chInfo=ch_bill');
}
}
}
?>