Skip to content

微应用后端开发

服务端接口

通用服务端接口封装于公共模块的MiniAppCommonService服务类中,通过注入该服务类获取服务类的实例,使用示例:

java
@Resource
private MiniAppCommonService miniAppCommonService;

@Resource
private MiniAppPayService miniAppPayService;
    
ApplicationVo application = miniAppCommonService.getApplication();
// ...

在使用服务端接口之前需要先正确配置微应用的appKey和appSecret,该配置主要用于微应用后端向 Mos 服务端发起请求时,对请求参数进行签名,具体的签名方式开发者无需关心,公共服务已经封装好了,开发者注入相应服务后,直接调用具体方法名即可。

接口BaseURL

接口签名

如果直接用 HTTP 的方式调用,请求体 Body 中必须增加以下字段:

  • appKey:微应用 App Key
  • sign:签名

签名生成规则:将包含appKey在内的所有参数按升序排序然后转换为QueryString的格式(例如 key1=value1&key2=value2...),再在末尾拼接上 secret=appSecret,最后对这个字符串进行 MD5 即得到签名,Java 示例代码如下:

java
import org.springframework.util.DigestUtils;

/**
 * 获取签名
 *
 * @param request 请求,这里用 Object 作为示例,实际应该替换为请求体对应的类型或请求基类
 * @return 签名
 */
public String getSign(Object request) {
    // 将请求转换为Key有序的 TreeMap 默认升序,"appKey" 也需要包含在内
    Map<String, String> requestSortedMap = JSON.parseObject(JSON.toJSONString(request), new TypeReference<TreeMap<String, String>>() {
    });
    requestSortedMap.put("appKey", "<your_app_key>");

    // 请求转换为 QueryString 格式,如 key1=value1&key2=value2...
    StringBuilder qsBuilder = new StringBuilder();
    for (Map.Entry<String, String> entry : requestSortedMap.entrySet()) {
        // "sign" 或空值不参与签名
        if ("sign".equals(entry.getKey()) || entry.getValue() == null || entry.getValue().isEmpty()) {
            continue;
        }
        qsBuilder.append(entry.getKey()).append("=").append(entry.getValue().trim()).append("&");
    }
    // 在末尾拼接上 "secret=your_app_secret"
    qsBuilder.append("secret=").append("<your_app_secret>");

    // MD5处理
    return DigestUtils.md5DigestAsHex(qsBuilder.toString().getBytes(StandardCharsets.UTF_8));
}

登录鉴权

获取应用信息

API:MiniAppCommonService.getApplication() HTTP:POST /open-apis/application/v1/getApplication

获取微应用应用信息

参数

响应

属性类型说明
appNameString应用名称
appKeyString应用key
appSecretString应用密匙
descriptionString应用描述
statusBoolean应用状态
notifyUrlString应用回调地址

通用登录

API:MiniAppCommonService.miniAppLogin(String code)

公共模块提供的通用登录接口,通过在小程端获取的 code 和 JWT 生成身份令牌。微应用模块新建后会自带一个默认的登录拦截器com.testproject.mos.miniapp.xxx.interceptor.LoginInterceptor在这个拦截器中会校验微应用前端传过来的令牌,微应用前端使用 Bearer token 的格式传递,Http Header:

Authorization: Bearer <token>

鉴权通过后,用户可以通过「获取当前用户信息」接口获取登录用户对应的 openid 和语言类型,从而获取微应用自身的用户信息(微应用自身的用户信息需要自己建立用户表,且用户表中必须有一列存储 openid)。

如果通用登录无法满足用户需求,用户可以通过重写登录拦截器,并自行编写登录和获取当前用户信息的接口。

注意:不要修改公共模块的代码

参数

属性类型必填说明
codeString通过微应用 mos.login 获取的 code

响应 TokenVo

属性类型说明
tokenString身份令牌

获取当前用户信息

API:MiniAppCommonService.getMiniAppUser()

公共模块提供的通用获取当前登录用户的方法,需要配合通用登录接口和默认的登录拦截器才可生效。

参数

响应 MiniAppUserBo

属性类型说明
appKeyString应用key
openidString用户唯一标识
languageTypeLanguageEnum语言类型

通过 code 换取Mos会话信息

API:MiniAppCommonService.code2session(String code) HTTP:POST /open-apis/mp/v1/auth/code2session

获取微应用应用信息

参数

属性类型必填说明
codeString通过微应用 mos.login 获取的 code

响应 MosSessionVo

属性类型说明
openidString用户唯一标识
sessionKeyString会话Key,暂时没用

支付

在开发支付相关功能之前需要先申请成为Mos商户,获取对应的商户ID(mcId),支付流程需要用到。

创建预支付订单

API:MiniAppPayService.prepay(CreatePrepayOrderAo ao) HTTP:POST /open-apis/mp/v1/pay/prepay

创建预支付订单

参数 CreatePrepayOrderAo

属性类型必填说明
mcIdString商户ID
nonceStrString随机字符串,需保证系统内唯一
descString订单描述
outTradeNoString商户微应用系统订单号
currencyString货币单位 USD-美元 | KHR-瑞尔
totalAmountString订单金额
notifyUrlString回调地址
openidString用户唯一标识
expireTimeString订单失效时间,时间戳,精确到毫秒

响应 PrepayOrderVo

属性类型说明
prepayIdString预支付订单ID

查询订单

API:MiniAppPayService.orderQuery(OrderQueryAo ao) HTTP:POST /open-apis/mp/v1/pay/orderQuery

查询订单

参数 OrderQueryAo

属性类型必填说明
nonceStrString随机字符串,需保证系统内唯一
outTradeNoString商户微应用系统订单号

响应 OrderQueryVo

属性类型说明
openidString用户唯一标识
prepayIdString预支付订单ID
outTradeNoString商户微应用系统订单号
countryString国家编码
currencyString货币单位
totalAmountString订单金额
descString商品描述
statusString订单状态
expireTimeLong订单失效时间
createTimeLong创建时间