unicloud函数url化访问(java版本)

本文介绍了在uni-app项目中如何处理私有函数的公网访问调用,涉及客户端信息头生成、请求头构造以及使用HmacSHA256进行签名的方法,以确保数据安全。

官方文档 使用场景 | uni-app官网uni-app,uniCloud,serverlessicon-default.png?t=N7T8https://uniapp.dcloud.net.cn/uniCloud/http.html

解决私有函数公网访问调用:

import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;
import java.util.Map;

@Slf4j
public class UniSign {
    static String requestAuthSecret = "testSecret";

    /**
     * 获取设备信息头 *
     * @return
     */
    public static Map<String,String> getClientInfo(){
        Map<String,String> clientInfo = new HashMap<>();
        clientInfo.put("uniPlatform", "app");
        clientInfo.put("appId", "__UNI__ACD00000");
        return clientInfo;
    }

    /**
     * 获取请求头 *
     * @return
     */
    public static Map<String, String> getHeders(Map<String,Object> params){
        String nonce = RandomUtil.randomString(15);
        long timestamp = System.currentTimeMillis();

        Map<String, String> headers = new HashMap<String, String>();
        headers.put("uni-id-nonce", nonce);
        headers.put("uni-id-timestamp", String.valueOf(timestamp));
        headers.put("Content-Type", "application/json");
        String signature = UniSign.getSignature(params, nonce, timestamp);
        headers.put("uni-id-signature", signature);
        return headers;

    }

    /**
     * 内部推送消息 * 
     * @param params_push
     * @param host
     */
    public static void pushUniMsg(Map<String,Object> params_push,String host){

        Map<String,Object> data_log = new HashMap<>();
        data_log.put("params",params_push);
        data_log.put("clientInfo",UniSign.getClientInfo());

        HttpResponse response1 = HttpRequest.post(host + "/push/sendPushMsg")
                .headerMap(UniSign.getHeders(params_push),false)
                .body(JSONUtil.parseObj(data_log).toString())
                .execute();
        log.info("uniimsendpush 请求:{},返回:",JSONUtil.toJsonStr(params_push),response1.body());
    }

    public static void main(String[] args) {

//        Map<String,String> params_log = new HashMap<>();
//        params_log.put("fid","8888");
//        params_log.put("uid","9999");
//
//
//
//        JSONObject object = new JSONObject();
//        object.put("text","体验一下1");
//        object.put("url","pages/index");
//
//        Map<String,Object> params_push = new HashMap<>();
//        params_push.put("cid","e98ec0e2f82a2304bb9bf3c8a86ab8ac");
//        params_push.put("uid","65238b98213929cbcec4d143");
//        params_push.put("requestId", UUID.randomUUID());
//        params_push.put("title","提醒");
//        params_push.put("sendType", Arrays.asList("notice","push"));
//        params_push.put("content","体验一下2");
//        params_push.put("payload",object);

        // 注册
        Map<String,Object> params_reg = new HashMap<>();
        params_reg.put("externalUid","30744");
        params_reg.put("nickname","用户30744");
        params_reg.put("avatar","/wgt/216%2A216.png");


        Map<String,Object> data_reg = new HashMap<>();
        data_reg.put("params",params_reg);
        data_reg.put("clientInfo",UniSign.getClientInfo());
        HttpResponse response = HttpRequest.post("http://url/cdxjim/externalRegister")
                .headerMap(UniSign.getHeders(params_reg),false)
                .body(JSONUtil.parseObj(data_reg).toString())
                .execute();
        log.info("uniid---reg:{}",response.body());


    }

    public static String getSignature(Map<String, Object> params, String nonce, long timestamp) {
        String paramsStr = getParamsString(params);
        String algorithm = "HmacSHA256";
        Mac hmacSha256;
        String digestHexString = null;

        try {
            hmacSha256 = Mac.getInstance(algorithm);

            String key = new StringBuilder().append(requestAuthSecret).append(nonce).toString();
            String message = new StringBuilder().append(timestamp).append(paramsStr).toString();

            byte[] keyBytes = key.getBytes("utf-8");
            byte[] messageBytes = message.getBytes("utf-8");

            hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm));
            byte[] digestBytes = hmacSha256.doFinal(messageBytes);

            digestHexString = byteArrayToHexString(digestBytes);
        } catch (Exception e) {
            System.out.println("[ERROR] not supposed to happen: " + e.getMessage());
        }

        return digestHexString.toUpperCase();
    }

    private static String getParamsString(Map<String, Object> params) {

        String[] keys = params.keySet().toArray(new String[0]);
        Arrays.sort(keys);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keys.length; i++) {
            String key = keys[i];
            if (i != 0) {
                sb.append("&");
            }
            sb.append(key).append("=").append(params.get(key));
        }

        return sb.toString();
    }

    private static String byteArrayToHexString(byte[] b) {
        StringBuilder hs = new StringBuilder();
        String stmp;
        for (int n = 0; b != null && n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0XFF);
            if (stmp.length() == 1)
                hs.append('0');
            hs.append(stmp);
        }
        return hs.toString();
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值