parent
3c33f9688b
commit
21ced08f55
@ -0,0 +1,11 @@
|
||||
package au.com.royalpay.payment.manage.support.serverless;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* Create by davep at 2019-08-08 15:56
|
||||
*/
|
||||
public interface ServerlessFunctionTrigger {
|
||||
|
||||
JSONObject triggerFunction(String function,JSONObject params);
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package au.com.royalpay.payment.manage.support.serverless.qcloud;
|
||||
|
||||
import au.com.royalpay.payment.manage.support.serverless.ServerlessFunctionTrigger;
|
||||
import au.com.royalpay.payment.manage.support.serverless.qcloud.support.ServerLessFunctionInvokeRequest;
|
||||
import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.converter.StringHttpMessageConverter;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* Create by davep at 2019-08-12 9:31
|
||||
*/
|
||||
@Service
|
||||
public class QCloudServerlessTrigger implements ServerlessFunctionTrigger {
|
||||
private Logger logger = LoggerFactory.getLogger(getClass());
|
||||
private RestTemplate restTemplate;
|
||||
private String secretId;
|
||||
private String secretKey;
|
||||
private String region;
|
||||
|
||||
public QCloudServerlessTrigger(@Value("${qcloud.secret-id}") String secretId,
|
||||
@Value("${qcloud.secret-key}") String secretKey,
|
||||
@Value("${qcloud.scf.region}") String region) {
|
||||
this.secretId = secretId;
|
||||
this.secretKey = secretKey;
|
||||
this.region = region;
|
||||
this.restTemplate = new RestTemplateBuilder()
|
||||
.messageConverters(new StringHttpMessageConverter(StandardCharsets.UTF_8))
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public JSONObject triggerFunction(String function, JSONObject params) {
|
||||
ServerLessFunctionInvokeRequest request = new ServerLessFunctionInvokeRequest(secretId, secretKey, region, function, params);
|
||||
ResponseEntity<String> resp = restTemplate.exchange(request.request(), String.class);
|
||||
JSONObject data = JSON.parseObject(resp.getBody());
|
||||
JSONObject response = data.getJSONObject("Response");
|
||||
String requestId = response.getString("RequestId");
|
||||
JSONObject result = response.getJSONObject("Result");
|
||||
int invokeResult = result.getIntValue("InvokeResult");
|
||||
if (invokeResult != 0) {
|
||||
String errMsg = result.getString("ErrMsg");
|
||||
logger.error("Invoking function [{}] failed,request id={},invoke result={},errMsg={}", function, requestId, invokeResult, errMsg);
|
||||
throw new ServerErrorException("Invoke function " + function + " failed:[" + errMsg + "]");
|
||||
} else {
|
||||
String retMsg = result.getString("RetMsg");
|
||||
return StringUtils.isNotEmpty(retMsg) ? JSON.parseObject(retMsg) : null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
package au.com.royalpay.payment.manage.support.serverless.qcloud.support;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.util.MimeTypeUtils;
|
||||
|
||||
/**
|
||||
* Create by davep at 2019-08-12 17:13
|
||||
*/
|
||||
public class ServerLessFunctionInvokeRequest extends QCloudV3Request {
|
||||
private final String functionName;
|
||||
private final JSONObject clientContext;
|
||||
|
||||
public ServerLessFunctionInvokeRequest(String secretId, String secretKey, String region, String functionName, JSONObject clientContext) {
|
||||
super(secretId, secretKey, region);
|
||||
this.functionName = functionName;
|
||||
this.clientContext = clientContext == null ? new JSONObject() : clientContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String host() {
|
||||
return "scf.tencentcloudapi.com";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String uri() {
|
||||
return "/";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HttpMethod method() {
|
||||
return HttpMethod.POST;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String action() {
|
||||
return "Invoke";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String version() {
|
||||
return "2018-04-16";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String contentType() {
|
||||
return MimeTypeUtils.APPLICATION_JSON_VALUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String requestPayload() {
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("FunctionName", functionName);
|
||||
data.put("ClientContext", clientContext.toJSONString());
|
||||
return data.toJSONString();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String queryStringParams() {
|
||||
return "";
|
||||
}
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
package au.com.royalpay.payment.manage.valid;
|
||||
|
||||
import au.com.royalpay.payment.manage.support.serverless.qcloud.support.ServerLessFunctionInvokeRequest;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.apache.commons.lang3.RandomUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.net.util.Base64;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.converter.StringHttpMessageConverter;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Create by davep at 2019-08-08 16:21
|
||||
*/
|
||||
public class QCloudSignTest {
|
||||
|
||||
private String function = "export_merchants";
|
||||
private String region = "ap-hongkong";
|
||||
private String secretId = "AKIDlHdjgWzZliPvBauZFfrnW0MaZOyHdTPz";
|
||||
private String secretKey = "YswoQDsIZfWEqEAEvMXS8Yic84lFn9Jp";
|
||||
|
||||
@Test
|
||||
public void printUrl() throws NoSuchAlgorithmException, InvalidKeyException {
|
||||
String host = "scf.tencentcloudapi.com/";
|
||||
String method = "GET";
|
||||
Map<String, String> paramsMap = new HashMap<>();
|
||||
paramsMap.put("Action", "Invoke");
|
||||
paramsMap.put("Version", "2018-04-16");
|
||||
paramsMap.put("Region", region);
|
||||
paramsMap.put("FunctionName", function);
|
||||
paramsMap.put("ClientContext", "{\"client_moniker\":\"PINE\"}");
|
||||
paramsMap.put("Nonce", "" + RandomUtils.nextInt(0, 999999));
|
||||
paramsMap.put("Timestamp", "" + System.currentTimeMillis() / 1000);
|
||||
paramsMap.put("SignatureMethod", "HmacSHA256");
|
||||
paramsMap.put("SecretId", secretId);
|
||||
|
||||
String[] params = paramsMap.entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).toArray(String[]::new);
|
||||
|
||||
Arrays.sort(params);
|
||||
String base = method + host + "?" + StringUtils.join(params, "&");
|
||||
String key = secretKey;
|
||||
|
||||
Mac sha256HMAC = Mac.getInstance("HmacSHA256");
|
||||
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA256");
|
||||
sha256HMAC.init(secretKey);
|
||||
byte[] finalBytes = sha256HMAC.doFinal(base.getBytes());
|
||||
String sign = Base64.encodeBase64String(finalBytes);
|
||||
paramsMap.put("Signature", sign);
|
||||
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://" + host);
|
||||
for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
|
||||
builder.queryParam(entry.getKey(), entry.getValue());
|
||||
}
|
||||
System.out.println(builder.build(false).encode().toUriString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void v3Test() {
|
||||
RestTemplate restTemplate = new RestTemplateBuilder()
|
||||
.messageConverters(new StringHttpMessageConverter(StandardCharsets.UTF_8))
|
||||
.build();
|
||||
JSONObject params = new JSONObject();
|
||||
params.put("client_moniker", "PINE");
|
||||
ServerLessFunctionInvokeRequest request = new ServerLessFunctionInvokeRequest(secretId, secretKey, region, function, params);
|
||||
ResponseEntity<String> resp = restTemplate.exchange(request.request(), String.class);
|
||||
System.out.println(resp.getBody());
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in new issue