官方文档 使用场景 | uni-app官网uni-app,uniCloud,serverless
https://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();
}
}
本文介绍了在uni-app项目中如何处理私有函数的公网访问调用,涉及客户端信息头生成、请求头构造以及使用HmacSHA256进行签名的方法,以确保数据安全。
2759






